From 1f9ff1af90eb15607c160bc8ef2239cfef1d58c7 Mon Sep 17 00:00:00 2001 From: Alex Kuzmin <6849426+alxkzmn@users.noreply.github.com> Date: Tue, 5 Sep 2023 17:35:01 +0800 Subject: [PATCH] Add inclusion verifier to the smart contract (#149) * Add inclusion verifier to the smart contract * Code review fixes * Fix tests * Remove unused struct --- backend/build.rs | 9 +- .../src/contracts/abi/InclusionVerifier.json | 1 + .../{Verifier.json => SolvencyVerifier.json} | 0 backend/src/contracts/abi/Summa.json | 2 +- .../contracts/generated/inclusion_verifier.rs | 43403 ++++++++++++++++ backend/src/contracts/generated/mod.rs | 3 +- .../{verifier.rs => solvency_verifier.rs} | 0 .../src/contracts/generated/summa_contract.rs | 5442 +- backend/src/contracts/tests.rs | 21 +- contracts/scripts/deploy.ts | 21 +- contracts/src/InclusionVerifier.sol | 11 + contracts/src/InclusionVerifier.yul | 1481 + contracts/src/Summa.sol | 54 +- contracts/test/Summa.ts | 306 +- zk_prover/README.md | 65 +- zk_prover/examples/gen_inclusion_verifier.rs | 71 + zk_prover/examples/gen_solvency_verifier.rs | 4 +- .../inclusion_proof_solidity_calldata.json | 7 + ... => solvency_proof_solidity_calldata.json} | 0 19 files changed, 48584 insertions(+), 2317 deletions(-) create mode 100644 backend/src/contracts/abi/InclusionVerifier.json rename backend/src/contracts/abi/{Verifier.json => SolvencyVerifier.json} (100%) create mode 100644 backend/src/contracts/generated/inclusion_verifier.rs rename backend/src/contracts/generated/{verifier.rs => solvency_verifier.rs} (100%) create mode 100644 contracts/src/InclusionVerifier.sol create mode 100644 contracts/src/InclusionVerifier.yul create mode 100644 zk_prover/examples/gen_inclusion_verifier.rs create mode 100644 zk_prover/examples/inclusion_proof_solidity_calldata.json rename zk_prover/examples/{proof_solidity_calldata.json => solvency_proof_solidity_calldata.json} (100%) diff --git a/backend/build.rs b/backend/build.rs index 26caeecb..6d3cc39d 100644 --- a/backend/build.rs +++ b/backend/build.rs @@ -9,9 +9,14 @@ fn main() { "Summa", ), ( - "src/contracts/generated/verifier.rs", + "src/contracts/generated/solvency_verifier.rs", "SolvencyVerifier", - "Verifier", + "SolvencyVerifier", + ), + ( + "src/contracts/generated/inclusion_verifier.rs", + "InclusionVerifier", + "InclusionVerifier", ), ]; diff --git a/backend/src/contracts/abi/InclusionVerifier.json b/backend/src/contracts/abi/InclusionVerifier.json new file mode 100644 index 00000000..bc936963 --- /dev/null +++ b/backend/src/contracts/abi/InclusionVerifier.json @@ -0,0 +1 @@ +{"_format":"hh-sol-artifact-1","contractName":"Verifier","sourceName":"src/InclusionVerifier.sol","abi":[{"inputs":[{"internalType":"uint256[]","name":"pubInputs","type":"uint256[]"},{"internalType":"bytes","name":"proof","type":"bytes"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"bytecode":"0x608060405234801561001057600080fd5b50615467806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063bd205a9014610030575b600080fd5b61004361003e366004615329565b610057565b604051901515815260200160405180910390f35b60006001610063615252565b6000805160206154128339815191526100d9565b6000805160206153f283398151915280831081831016908380096000805160206153f28339815191528384096000805160206153f283398151915284820990506000805160206153f28339815191526003820891909114919091169392505050565b8060208701510660208301528060408701510660408301527f26c12b9fd7eb1bb33a25341ab4af2db334bf0ac2db5f18a2184820a841f48ea6600083015260208501518060608401526040860151806080850152846101388284610077565b169450505060608501518060a084015260808601518060c08501528461015e8284610077565b169450505060a08501518060e084015260c086015180610100850152846101858284610077565b16945050506101206000830120610120830152610120820151818106610140840152806101608401525060e085015180610180840152610100860151806101a0850152846101d38284610077565b1694505050610120850151806101c0840152610140860151806101e0850152846101fd8284610077565b60a061016087012061020087018190528581066102208801526102408701521694506001915050610260830153602161024083012061026083018190528181066102808401526102a08301526101608501516102c083018190526101808601516102e08401819052846102708284610077565b16945050506101a0850151806103008401526101c0860151806103208501528461029a8284610077565b16945050506101e08501518061034084015261020086015180610360850152846102c48284610077565b169450505061022085015180610380840152610240860151806103a0850152846102ee8284610077565b16945050506101206102a08301206103c08301526103c08201518181066103e0840152806104008401525061026085015180610420840152610280860151806104408501528461033e8284610077565b16945050506102a0850151806104608401526102c086015180610480850152846103688284610077565b16945050506102e0850151806104a0840152610300860151806104c0850152846103928284610077565b1694505050610320850151806104e084015261034086015180610500850152846103bc8284610077565b16945050506103608501518061052084015261038086015180610540850152846103e68284610077565b1694505050610160610400830120610560830152610560820151818106610580840152806105a084015250806103a0860151066105c0830152806103c0860151066105e0830152806103e086015106610600830152806104008601510661062083015280610420860151066106408301528061044086015106610660830152806104608601510661068083015280610480860151066106a0830152806104a0860151066106c0830152806104c0860151066106e0830152806104e086015106610700830152806105008601510661072083015280610520860151066107408301528061054086015106610760830152806105608601510661078083015280610580860151066107a0830152806105a0860151066107c0830152806105c0860151066107e0830152806105e086015106610800830152806106008601510661082083015280610620860151066108408301528061064086015106610860830152806106608601510661088083015280610680860151066108a0830152806106a0860151066108c0830152806106c0860151066108e0830152806106e086015106610900830152806107008601510661092083015280610720860151066109408301528061074086015106610960830152806107608601510661098083015280610780860151066109a0830152806107a0860151066109c0830152806107c0860151066109e0830152806107e086015106610a008301526104806105a0830120610a20830152610a20820151818106610a4084015280610a60840152506001610a808301536021610a60830120610a808301819052818106610aa0840152610ac0830152610800850151610ae08301819052610820860151610b0084018190528461066f8284610077565b16945050506060610ac0830120610b20830152610b20820151818106610b4084015280610b608401525061084085015180610b8084015261086086015180610ba0850152846106be8284610077565b16945050508061058083015161058084015109610bc0830181905281908009610be0830181905281908009610c00830181905281908009610c20830181905281908009610c40830181905281908009610c60830181905281908009610c80830181905281908009610ca0830181905281908009610cc0830181905281908009610ce0830181905281908009610d00830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000610d0084015108610d20830152807f305e41e912d579f5b3193badcab128321c8ee1cb70aa396331b979553d820001610d2084015109610d40830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610d4084015109610d60830152807f0daef86f88c440658be430f38559b834662c0dbd4d47a55d6e97fb49c41a2cff61058084015108610d80830152807f2498c2d3affa1baaf6419dbccb6a054bb87359c02eade5aeacd86c84757b9051610d4084015109610da0830152807f0bcb8b9f3137847ec20ea7f9b61753116fc08e884b0b8ae29709890f7a846fb061058084015108610dc0830152807f096b9f8b8598b7c387fb69abf236b0d5e04e24d275ee98244443eda5d3bc4035610d4084015109610de0830152807f26f8aee75b98e8663054dc0a8f4aa78747e5c37603cad86cff9e07ee1c43bfcc61058084015108610e00830152807f28771071ab1633014eae27cfc16d5ebe08a8fe2fc9e85044e4a45f82c14cd825610d4084015109610e20830152807f07ed3e01361b6d2869a21de6c013f99f1f8aea18afd1204c5f3d96112eb327dc61058084015108610e40830152807f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e3610d4084015109610e60830152807f2580851320f595ca8a679cc2157d8b7d4846bc8eed1b25b092d6dfa64b1c4e1e61058084015108610e80830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a610d4084015109610ea0830152807f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e761058084015108610ec0830152806001610d4084015109610ee0830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000061058084015108610f00830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f610d4084015109610f20830152807f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa261058084015108610f40830152610d808201518181610dc085015109905080610f608401528181610e0085015109905080610f808401528181610e4085015109905080610fa08401528181610e8085015109905080610fc08401528181610ec085015109905080610fe08401528181610f00850151099050806110008401528181610f40850151099050806110208401528181610d208501510990508061104084015250602061108083015260206110a083015260206110c08301526110408201516110e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6111008301526000805160206154128339815191526111208301528260016020611060850160c0611080870160055afa141692506110608201516000610d208401519050828261102086015109610d20850152828282099150610f408401519050828261100086015109610f40850152828282099150610f0084015190508282610fe086015109610f00850152828282099150610ec084015190508282610fc086015109610ec0850152828282099150610e8084015190508282610fa086015109610e80850152828282099150610e4084015190508282610f8086015109610e40850152828282099150610e0084015190508282610f6086015109610e00850152828282099150610dc084015190508282610d8086015109610dc085015282828209610d808501819052610d608501518493509091500961114083015280610dc0830151610da08401510961116083015280610e00830151610de08401510961118083015280610e40830151610e20840151096111a083015280610e80830151610e60840151096111c083015280610ec0830151610ea0840151096111e083015280610f00830151610ee08401510961120083015280610f40830151610f20840151096112208301528060208301516112008401510981818360408601516112208701510908611240840152506106e08201516105c0830151829190086112608301819052819080096112808301819052819080096112a0830152806112a0830151611260840151096112c0830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad56112c0840151096112e0830152806107008301516105e0840151086113008301819052819080096113208301819052819080096113408301528061134083015161130084015109611360830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e861136084015109611380830152806113808301516112e0840151086113a08301528061060083015182036113a0840151086113c083018190526107808301518291096113e0830152806113e08301516103e084015109611400830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff96112c084015109611420830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c86113608401510961144083015280611440830151611420840151086114608301528061062083015182036114608401510861148083018190526107808301518291096114a0830152806114a0830151611400840151086114c0830152806114c08301516103e0840151096114e08301528061064083015182036112c08401510861150083018190526107a0830151829109611520830152806115208301516114e084015108611540830152806115408301516103e084015109611560830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad561064084015109611580830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8611300840151096115a0830152806115a0830151611580840151086115c083018190526106a08301518291086115e0830181905281908009611600830181905281908009611620830152806116208301516115e084015109611640830152807f13abec390ada7f4370819ab1c7846f210554569d9b29d1ea8dbebd0fa8c53e6661060084015109611660830152807f1eb9e1dc19a33a624c9862a1d97d1510bd521ead5dfe0345aaf6185b1a1e60fe6106208401510961168083015280611680830151611660840151086116a0830152806116a08301518203611640840151086116c083018190526107a08301518291096116e0830152806116e083015161156084015108611700830152806117008301516103e084015109611720830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961064084015109611740830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c861130084015109611760830152806117608301516117408401510861178083018190526106c08301518291086117a0830152807f0fc1c9394db89bb2601abc49fdad4f038ce5169030a2ad69763f7875036bcb02610600840151096117c0830152807f16a9e98c493a902b9502054edc03e7b22b7eac34345961bc8abced6bd147c8be610620840151096117e0830152806117e08301516117c0840151086118008301528061180083015182036117a08401510861182083018190526107a08301518291096118408301528061184083015161172084015108611860830152806118608301516103e0840151096118808301528061076083015182036001086118a083018190526107608301518291096118c08301528061076083015182036002086118e083018190526118c08301518291096119008301528061076083015182036004086119208301819052611900830151829109611940830152806105c0830151610680840151086119608301528061060083015182036119608401510861198083018190526119408301518291096119a0830152806119a0830151611880840151086119c0830152806119c08301516103e0840151096119e083015280610620830151820361066084015108611a008301819052611940830151829109611a2083015280611a208301516119e084015108611a4083015280611a408301516103e084015109611a60830152806107c08301516113c084015109611a8083015280611a80830151611a6084015108611aa083015280611aa08301516103e084015109611ac0830152806107c083015161148084015109611ae083015280611ae0830151611ac084015108611b0083015280611b008301516103e084015109611b20830152806107e083015161150084015109611b4083015280611b40830151611b2084015108611b6083015280611b608301516103e084015109611b80830152806107e08301516116c084015109611ba083015280611ba0830151611b8084015108611bc083015280611bc08301516103e084015109611be0830152806107e083015161182084015109611c0083015280611c00830151611be084015108611c2083015280611c208301516103e084015109611c40830152806107608301518203600308611c608301819052611900830151829109611c8083015280611c8083015161198084015109611ca083015280611ca0830151611c4084015108611cc083015280611cc08301516103e084015109611ce083015280611c80830151611a0084015109611d0083015280611d00830151611ce084015108611d2083015280611d208301516103e084015109611d40830152806107608301516118e084015109611d6083015280611d60830151611c6084015109611d8083015280611d8083015161192084015109611da083015280611da083015161064084015109611dc0830152806106408301518203600108611de08301819052611dc0830151829109611e0083015280611e00830151611d4084015108611e2083015280611e208301516103e084015109611e4083015280610640830151600209611e60830152806105c083015182036105e084015108611e808301819052611e60830151829109611ea0830152806105c0830151820361060084015108611ec083015280611ec08301518203611ea084015108611ee08301528061062083015182036105e084015108611f0083015280611f008301518203611ee084015108611f208301819052611da0830151829109611f4083015280611f40830151611e4084015108611f6083015280611f608301516103e084015109611f80830152806118c0830151611c6084015109611fa083015280611fa083015161192084015109611fc0830152806105e08301516105c084015108611fe0830152806106408301518203611fe0840151086120008301819052611fc083015182910961202083015280612020830151611f8084015108612040830152806120408301516103e0840151096120608301819052612020830151829108612080830152806120808301516103e0840151096120a0830152806108e083015182036001086120c083018190526112008301518291096120e0830152806120e08301516120a084015108612100830152806121008301516103e0840151096121208301526109408201518190800961214083015280610940830151820361214084015108612160830181905261114083015182910961218083015280612180830151612120840151086121a0830152806121a08301516103e0840151096121c0830152806109208301518203610940840151086121e08301819052611200830151829109612200830152806122008301516121c084015108612220830152806122208301516103e084015109612240830152806111408301518203600108612260830152806111808301516111608401510861228083018190526111a08301518291086122a083018190526111c08301518291086122c083018190526111e08301518291086122e0830152806122e08301518203612260840151086123008301528061022083015161082084015109612320830152806123208301516106a08401510861234083018190526102808301518291086123608301528061022083015161084084015109612380830152806123808301516105c0840151086123a083018190526102808301518291086123c083018190526123608301518291096123e08301528061022083015161086084015109612400830152806124008301516105e084015108612420830181905261028083015182910861244083018190526123e08301518291096124608301528061022083015161088084015109612480830152806124808301516106c0840151086124a083018190526102808301518291086124c083018190526124608301518291096124e08301819052610900830151829109612500830152806102208301516001096125208301528061252083015161058084015109612540830152806125408301516106a0840151086125608301819052610280830151829108612580830152806102208301517f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096125a0830152806125a0830151610580840151096125c0830152806125c08301516105c0840151086125e083018190526102808301518291086126008301819052612580830151829109612620830152806102208301517f13b360d4e82fe915fed16081038f98c211427b87a281bd733c277dbadf10372b096126408301528061264083015161058084015109612660830152806126608301516105e08401510861268083018190526102808301518291086126a083018190526126208301518291096126c0830152806102208301517f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e52096126e0830152806126e083015161058084015109612700830152806127008301516106c084015108612720830181905261028083015182910861274083018190526126c083015182910961276083018190526108e0830151829109612780830152806127808301518203612500840151086127a083018190526123008301518291096127c0830152806127c0830151612240840151086127e0830152806127e08301516103e084015109612800830152806102208301516108a08401510961282083015280612820830151610640840151086128408301819052610280830151829108612860830152806102208301516108c08401510961288083015280612880830151611240840151086128a083018190526102808301518291086128c083018190526128608301518291096128e08301819052610960830151829109612900830152806102208301517ea136ba13afa6c83eb7b82fb370e228e74155e48fb8f1c1cfc33fb0da8afb4209612920830152806129208301516105808401510961294083015280612940830151610640840151086129608301819052610280830151829108612980830152806102208301517f2eb9750dce545f17d492058dd201a1251ff3d9077864583d44eaf9be9008699d096129a0830152806129a0830151610580840151096129c0830152806129c0830151611240840151086129e08301819052610280830151829108612a008301819052612980830151829109612a208301819052610940830151829109612a4083015280612a40830151820361290084015108612a608301819052612300830151829109612a8083015280612a8083015161280084015108612aa083015280612aa08301516103e084015109612ac0830152806109808301518203600108612ae08301819052611200830151829109612b0083015280612b00830151612ac084015108612b2083015280612b208301516103e084015109612b4083015261098082015181908009612b60830152806109808301518203612b6084015108612b808301819052611140830151829109612ba083015280612ba0830151612b4084015108612bc083015280612bc08301516103e084015109612be0830152806102208301516109c084015108612c0083018190526109a0830151829109612c2083015280610280830151610a0084015108612c408301819052612c20830151829109612c608301528061060083015161010009612c8083015280612c8083015182036105c084015108612ca08301819052610740830151829109612cc08301819052610220830151829108612ce08301819052610980830151829109612d008301528061028083015161072084015108612d208301819052612d00830151829109612d4083015280612d408301518203612c6084015108612d608301819052612300830151829109612d8083015280612d80830151612be084015108612da083015280612da08301516103e084015109612dc083015280610a0083015182036109c084015108612de08301819052611200830151829109612e0083015280612e00830151612dc084015108612e2083015280612e208301516103e084015109612e4083015280612300830151612de084015109612e60830152806109e083015182036109c084015108612e808301819052612e60830151829109612ea083015280612ea0830151612e4084015108612ec0830152610d0082015181908009612ee08301819052610d00830151829109612f008301819052610d00830151829109612f208301819052610d00830151829109612f4083015280610d00830151600109612f6083015280612ee0830151600109612f8083015280612f00830151600109612fa083015280612f20830151600109612fc083015280610d20830151612ec084015109612fe083015280610580830151610bc08401510961300083015280600161058084015109613020830152806130208301518203610b4084015108613040830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f61058084015109613060830152806130608301518203610b4084015108613080830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610580840151096130a0830152806130a08301518203610b40840151086130c0830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a610580840151096130e0830152806130e08301518203610b408401510861310083015280817f21054ce8b3cb9dc9b87af5c70c8f54994090ad8fa7e06caaf989ba5806b6798b610bc085015109610b4084015109818183847f0f5f018a2d66025fffd54fef74f203c3e7a33ab8d1d903e64a583b3be9498676610bc08801510961058087015109089050806131208401525080817f10ac009d2f31395e301635cd6d292978a4012197c24d6e63fb49943a70296136610bc085015109610b4084015109818183847f2696aa2788110c63ebbfd7f92b352ce93b28bbdae57b7cb94bc5885ee439e774610bc08801510961058087015109089050806131408401525080817f2510cae1618713ac17c9ef83f1a67645ed21f454d96bf1f072ca5b463e7f0c28610bc085015109610b4084015109818183847f0d6a07653c64f4112284cb8b23bf73adecaf4ee0fef51998549526f07b6defd7610bc088015109610580870151090861316084015250613040820151819060010961318083018190526130808301518291096131a083018190526131008301518291096131c0830152806001610b40840151098181837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000061058087015109089050806131e08401525080817f1d81b9bd5165d63a0d4a8370d37966eb243365d36ca235911564a783f8234cf2610bc085015109610b4084015109818183847f12e294b58fcbc9efab05c245ae07f172040082750d173b002e7d4e0ff7dcb30f610bc08801510961058087015109089050806132008401525080817f142f93c8919700eddb46a823a63f1726c05e6953fd8ba57ddf6ea70e7ebc8dcf610bc085015109610b4084015109818183847f2707d3cc5788c2cfc0ee9e5f5638da3b90cb6d8b97224a4521073ec9f10826fb610bc08801510961058087015109089050806132208401525080817f13d3d4db83b42c4d48afa6b5c9cbe3f49703d0caf1fdc301b0d4d3743ab60833610bc085015109610b4084015109818183847f223ed99d38075819043fa85ed3c54f3bfb5d62312139562ca82d9903b1b52e27610bc0880151096105808701510908613240840152506130c08201516131a08301518291900961326083015280817f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa361058085015109610b4084015109818183847f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e6105808801510961058087015109089050806132808401525080817f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e61058085015109610b4084015109818183847f1a514dd9f80de355133414990bffdc137169ffbf79f1b0988ce4dc4b27adb4e36105808801510961058087015109089050806132a08401525080817f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e861058085015109610b4084015109818183847f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d716196105808801510961058087015109089050806132c08401525080817f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161961058085015109610b4084015109818183847f20198517670312541561a1720d2538ac357df59dafa0d41bd7235a97f2f364376105808801510961058087015109086132e0840152506131008201516131808301518291900961330083015261312082015181816131408501510990508061332084015281816131608501510990508061334084015281816131e0850151099050806133608401528181613180850151099050806133808401528181613200850151099050806133a08401528181613220850151099050806133c08401528181613240850151099050806133e084015281816132608501510990508061340084015281816132808501510990508061342084015281816132a08501510990508061344084015281816131a08501510990508061346084015281816132c08501510990508061348084015281816132e0850151099050806134a08401528181613300850151099050806134c0840152506020613500830152602061352083015260206135408301526134c08201516135608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6135808301526000805160206154128339815191526135a083015282600160206134e0850160c0613500870160055afa141692506134e08201516000613300840151905082826134a0860151096133008501528282820991506132e084015190508282613480860151096132e08501528282820991506132c084015190508282613460860151096132c08501528282820991506131a084015190508282613440860151096131a08501528282820991506132a084015190508282613420860151096132a08501528282820991506132808401519050828261340086015109613280850152828282099150613260840151905082826133e086015109613260850152828282099150613240840151905082826133c086015109613240850152828282099150613220840151905082826133a086015109613220850152828282099150613200840151905082826133808601510961320085015282828209915061318084015190508282613360860151096131808501528282820991506131e084015190508282613340860151096131e08501528282820991506131608401519050828261332086015109613160850152828282099150613140840151905082826131208601510961314085015282828209613120850181905261314085015190925083915082900890508181613160850151086135c0840152506131808201516131c0830151829190096135e08301526131e08201518061360084015250806132608301516131c0840151096136208301526132008201518181613220850151089050818161324085015108613640840152506131a08201516131c08301518291900961366083015261328082015181816132a085015108613680840152506133008201516131c0830151829190096136a08301526132c082015181816132e0850151086136c0840152506135c082015161360083015182908290099050806136e084015281816136408501510990508061370084015281816136808501510990508061372084015281816136c08501510990508061374084015250602061378083015260206137a083015260206137c08301526137408201516137e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6138008301526000805160206154128339815191526138208301528260016020613760850160c0613780870160055afa1416925061376082015160006136c084015190508282613720860151096136c08501528282820991506136808401519050828261370086015109613680850152828282099150613640840151905082826136e086015109613640850152828282099150613600840151905082826135c086015109613600850152828282096135c085015250506136008201516135e08301518291900961384083015280613640830151613620840151096138608301528061368083015161366084015109613880830152806136c08301516136a0840151096138a0830152610a40820151819080096138c08301819052610a408301518291096138e08301819052610a408301518291096139008301819052610a408301518291096139208301819052610a408301518291096139408301819052610a408301518291096139608301819052610a408301518291096139808301819052610a408301518291096139a08301819052610a408301518291096139c08301819052610a408301518291096139e08301819052610a40830151829109613a008301819052610a40830151829109613a208301819052610a40830151829109613a408301819052610a40830151829109613a608301819052610a40830151829109613a808301819052610a40830151829109613aa08301819052610a40830151829109613ac08301819052610a40830151829109613ae08301819052610a40830151829109613b008301819052610a40830151829109613b20830152610aa082015181908009613b408301819052610aa0830151829109613b608301819052610aa0830151829109613b808301819052610aa0830151829109613ba0830152806131208301516105c084015109818183613140860151610600870151090890508181836131608601516106808701510908613bc084018190526135c08401518392509009613be0830152806001613be0840151830309613c00830152806131208301516105e084015109818183613140860151610620870151090890508181836131608601516106608701510908613c2084018190526135c08401518392509009613c408301819052610a408301518291820309613c6083015280610a40830151600109613c8083015280613c60830151613c0084015108613ca0830152806001613ca084015109613cc0830152806001613c8084015109613ce0830152806135e0830151600109613d00830152806131e083015161064084015109613d208301819052613840830151829109613d40830152806001613d40840151830309613d60830152806001613d0084015109613d80830152806131e0830151610a0084015109613da08301819052613840830151829109613dc08301819052610a408301518291820309613de083015280610a40830151613d0084015109613e0083015280613de0830151613d6084015108613e20830152806131e08301516106a084015109613e408301819052613840830151829109613e6083018190526138c08301518291820309613e80830152806138c0830151613d0084015109613ea083015280613e80830151613e2084015108613ec0830152806131e08301516106c084015109613ee08301819052613840830151829109613f0083018190526138e08301518291820309613f20830152806138e0830151613d0084015109613f4083015280613f20830151613ec084015108613f60830152806131e08301516106e084015109613f808301819052613840830151829109613fa083018190526139008301518291820309613fc083015280613900830151613d0084015109613fe083015280613fc0830151613f6084015108614000830152806131e08301516107008401510961402083018190526138408301518291096140408301819052613920830151829182030961406083015280613920830151613d008401510961408083015280614060830151614000840151086140a0830152806131e0830151610720840151096140c083018190526138408301518291096140e08301819052613940830151829182030961410083015280613940830151613d0084015109614120830152806141008301516140a084015108614140830152806131e0830151610740840151096141608301819052613840830151829109614180830181905261396083015182918203096141a083015280613960830151613d00840151096141c0830152806141a0830151614140840151086141e0830152806131e08301516107608401510961420083018190526138408301518291096142208301819052613980830151829182030961424083015280613980830151613d0084015109614260830152806142408301516141e084015108614280830152806131e0830151610780840151096142a083018190526138408301518291096142c083018190526139a083015182918203096142e0830152806139a0830151613d0084015109614300830152806142e083015161428084015108614320830152806131e08301516107a084015109614340830181905261384083015182910961436083018190526139c08301518291820309614380830152806139c0830151613d00840151096143a083015280614380830151614320840151086143c0830152806131e08301516107c0840151096143e0830181905261384083015182910961440083018190526139e08301518291820309614420830152806139e0830151613d0084015109614440830152806144208301516143c084015108614460830152806131e08301516107e08401510961448083018190526138408301518291096144a08301819052613a0083015182918203096144c083015280613a00830151613d00840151096144e0830152806144c083015161446084015108614500830152806131e08301516108208401510961452083018190526138408301518291096145408301819052613a20830151829182030961456083015280613a20830151613d008401510961458083015280614560830151614500840151086145a0830152806131e0830151610840840151096145c083018190526138408301518291096145e08301819052613a40830151829182030961460083015280613a40830151613d0084015109614620830152806146008301516145a084015108614640830152806131e08301516108608401510961466083018190526138408301518291096146808301819052613a6083015182918203096146a083015280613a60830151613d00840151096146c0830152806146a0830151614640840151086146e0830152806131e08301516108808401510961470083018190526138408301518291096147208301819052613a80830151829182030961474083015280613a80830151613d0084015109614760830152806147408301516146e084015108614780830152806131e08301516108a0840151096147a083018190526138408301518291096147c08301819052613aa083015182918203096147e083015280613aa0830151613d0084015109614800830152806147e083015161478084015108614820830152806131e08301516108c08401510961484083018190526138408301518291096148608301819052613ac0830151829182030961488083015280613ac0830151613d00840151096148a083015280614880830151614820840151086148c0830152806135e0830151612f60840151096148e0830152806135e0830151612f8084015109614900830152806135e0830151612fa084015109614920830152806135e0830151612fc084015109614940830152806131e0830151612fe08401510961496083018190526138408301518291096149808301819052613ae083015182918203096149a083015280613ae0830151613d00840151096149c083015280613ae08301516148e0840151096149e083015280613ae083015161490084015109614a0083015280613ae083015161492084015109614a2083015280613ae083015161494084015109614a40830152806149a08301516148c084015108614a60830152806131e083015161080084015109614a808301819052613840830151829109614aa08301819052613b008301518291820309614ac083015280613b00830151613d0084015109614ae083015280614ac0830151614a6084015108614b008301819052610aa0830151829109614b2083015280610aa0830151613d8084015109614b4083015280610aa0830151613e0084015109614b6083015280610aa0830151613ea084015109614b8083015280610aa0830151613f4084015109614ba083015280610aa0830151613fe084015109614bc083015280610aa083015161408084015109614be083015280610aa083015161412084015109614c0083015280610aa08301516141c084015109614c2083015280610aa083015161426084015109614c4083015280610aa083015161430084015109614c6083015280610aa08301516143a084015109614c8083015280610aa083015161444084015109614ca083015280610aa08301516144e084015109614cc083015280610aa083015161458084015109614ce083015280610aa083015161462084015109614d0083015280610aa08301516146c084015109614d2083015280610aa083015161476084015109614d4083015280610aa083015161480084015109614d6083015280610aa08301516148a084015109614d8083015280610aa08301516149c084015109614da083015280610aa08301516149e084015109614dc083015280610aa0830151614a0084015109614de083015280610aa0830151614a2084015109614e0083015280610aa0830151614a4084015109614e2083015280610aa0830151614ae084015109614e4083015280614b20830151613cc084015108614e6083015280613620830151600109614e80830152806132008301516108e084015109818183613220860151610900870151090890508181836132408601516109208701510908614ea084018190526138608401518392509009614ec0830152806001614ec0840151830309614ee0830152806001614e8084015109614f0083015280613b40830151614ee084015109614f2083015280613b40830151614f0084015109614f4083015280614f20830151614e6084015108614f6083015280613660830151600109614f8083015280613280830151610940840151098181836132a08601516109608701510908614fa084018190526138808401518392509009614fc0830152806001614fc0840151830309614fe0830152806001614f808401510961500083015280613280830151610980840151098181836132a08601516109a08701510908615020840181905261388084015183925090096150408301819052610a40830151829182030961506083015280610a40830151614f808401510961508083015280615060830151614fe0840151086150a08301819052613b608301518291096150c083015280613b60830151615000840151096150e083015280613b6083015161508084015109615100830152806150c0830151614f6084015108615120830152806136a0830151600109615140830152806132c08301516109c0840151098181836132e08601516109e0870151090861516084018190526138a084015183925090096151808301528060016151808401518303096151a0830152806001615140840151096151c083015280613b808301516151a0840151096151e083015280613b808301516151c084015109615200830152806151e083015161512084015108615220830152806131c083015160010961524083015280610b408301516001096152608301526001615280830181815260026152a08501526152208401516152c085015284919060409060608160075afa141692506152808201516152e08301526152a08201516153008301526060820151615320830152608082015161534083015282600160406152e0850160806152e0870160065afa1416925060a082015161536083015260c0820151615380830152613ce08201516153a0830152826001604061536085016060615360870160075afa141692506152e08201516153c08301526153008201516153e083015261536082015161540083015261538082015161542083015282600160406153c0850160806153c0870160065afa1416925060e0820151615440830152610100820151615460830152614b40820151615480830152826001604061544085016060615440870160075afa141692506153c08201516154a08301526153e08201516154c08301526154408201516154e083015261546082015161550083015282600160406154a0850160806154a0870160065afa141692506101c08201516155208301526101e0820151615540830152614b60820151615560830152826001604061552085016060615520870160075afa141692506154a08201516155808301526154c08201516155a08301526155208201516155c08301526155408201516155e0830152826001604061558085016080615580870160065afa141692507f14113d2da8037ec77f55dffb91151a8e7bb3eeea2fe44f6804703d0f82f344a06156008301527f1c5b5f4c28346cfddf08edde8db492f19a24b5f73fc2bd48dc19137a11ce53bf615620830152614b80820151615640830152826001604061560085016060615600870160075afa141692506155808201516156608301526155a08201516156808301526156008201516156a08301526156208201516156c0830152826001604061566085016080615660870160065afa141692507f0491714ea02953469195ca0768b5aafb03166b27284de7cc9ffa7b3879a959a56156e08301527f2dbaa9a59dc7fd9657798dd9c00ffc85d2033e9555b699f4d9706bc2b77dce77615700830152614ba082015161572083015282600160406156e0850160606156e0870160075afa141692506156608201516157408301526156808201516157608301526156e08201516157808301526157008201516157a0830152826001604061574085016080615740870160065afa141692507f16da8fcde785c6df1fe13aec4a088e06790750dfa9a2e9c6e05464a06b99679d6157c08301527f19fffa5d91549cdec737262e6cc5fa01c2f1c39c7b5f567d65d68e2cf3077bdb6157e0830152614bc082015161580083015282600160406157c0850160606157c0870160075afa141692506157408201516158208301526157608201516158408301526157c08201516158608301526157e0820151615880830152826001604061582085016080615820870160065afa141692507f1542d7d471049c346e9b97abc2a351948d23438019a76df2b1989c8f76b287606158a08301527f0e26e13db1f178f85dbcb83b0a617d766c0b36fc4a49bafab13b20e83d0557f36158c0830152614be08201516158e083015282600160406158a0850160606158a0870160075afa141692506158208201516159008301526158408201516159208301526158a08201516159408301526158c0820151615960830152826001604061590085016080615900870160065afa141692507f2b692b9199891f86e3fc5613991e72b47098220c9d883415244271cc74b1218d6159808301527f042f929afe4bc56206b4ace41a3d283848753d5014597bcd0ec14f8a9261c5846159a0830152614c008201516159c0830152826001604061598085016060615980870160075afa141692506159008201516159e0830152615920820151615a00830152615980820151615a208301526159a0820151615a4083015282600160406159e0850160806159e0870160065afa141692507f29c09f206a2fb04b15a3a0c220024c6b0ffa448a19fe3d4ec45ffa20748fc946615a608301527f1d27c69fbfa99caecf06376d79cbde5436726836ad63582954e2618d3899a6f6615a80830152614c20820151615aa08301528260016040615a6085016060615a60870160075afa141692506159e0820151615ac0830152615a00820151615ae0830152615a60820151615b00830152615a80820151615b208301528260016040615ac085016080615ac0870160065afa141692507f20a3113a48bc99d14016666990d982af3fc8ef6269c2f37e053bbb801e1bda37615b408301527f11874a3348a60113ed95b25c4bdb198369e449967dfe7fe3253cb39afdee2672615b60830152614c40820151615b808301528260016040615b4085016060615b40870160075afa14169250615ac0820151615ba0830152615ae0820151615bc0830152615b40820151615be0830152615b60820151615c008301528260016040615ba085016080615ba0870160065afa141692507f22ee677d2be1568a5ed89b73c8499d415c7c48b12184a48781e4f08d37755757615c208301527f16f2744bb8dae65b5c5a6e0836cd5b59014c25f2481b024dec21ccbf26a9808c615c40830152614c60820151615c608301528260016040615c2085016060615c20870160075afa14169250615ba0820151615c80830152615bc0820151615ca0830152615c20820151615cc0830152615c40820151615ce08301528260016040615c8085016080615c80870160065afa141692507f0fccf37dc6868cb450c1cc971a9005c20acf19ddb1c82b9ceae7579aaaf6e5dc615d008301527f1053a5adbb841ceb0c804c8e4188b2eb030d0a623ae199553173d818df46a8f8615d20830152614c80820151615d408301528260016040615d0085016060615d00870160075afa14169250615c80820151615d60830152615ca0820151615d80830152615d00820151615da0830152615d20820151615dc08301528260016040615d6085016080615d60870160065afa141692507f03c3c5792394acd6230174342c0fb4ceba9b35c38d4ab0ddb4a0fb177db54308615de08301527f1fd7d3ae57e2ef4c7b1023ce495503e40ca89532cbf6a740e57d9fa57d2b6f93615e00830152614ca0820151615e208301528260016040615de085016060615de0870160075afa14169250615d60820151615e40830152615d80820151615e60830152615de0820151615e80830152615e00820151615ea08301528260016040615e4085016080615e40870160065afa141692507f15b64cf223d375ca6c983ab84102a960bfeb54a0a29a085844e0e571b09f3d71615ec08301527f23d8408484b6b10b897f9b0cc33314d9060dac48f43a62a0e5660be5882a7a8e615ee0830152614cc0820151615f008301528260016040615ec085016060615ec0870160075afa14169250615e40820151615f20830152615e60820151615f40830152615ec0820151615f60830152615ee0820151615f808301528260016040615f2085016080615f20870160065afa141692507f2b069d8e2e57e6add6f216816a31936af27540959bfd7b845d3e74d84196639d615fa08301527f0840b8c0bdbb760a926c4046da2614e14d3c8b2fafc18c7471ce21298ca57c17615fc0830152614ce0820151615fe08301528260016040615fa085016060615fa0870160075afa14169250615f20820151616000830152615f40820151616020830152615fa0820151616040830152615fc0820151616060830152826001604061600085016080616000870160065afa141692507f2a6e42bf68afa452351faa949dc279f9fe3c68b126280aca278121888fcbaf736160808301527f04ddb656fb4f29069ada65c848b2ab177b495c0869aba6fe9216dab3a043f7596160a0830152614d008201516160c0830152826001604061608085016060616080870160075afa141692506160008201516160e08301526160208201516161008301526160808201516161208301526160a082015161614083015282600160406160e0850160806160e0870160065afa141692507f0182a509c08487b8c3d5b8507251cc8a46f5b313c687c1e7262d08eb8dfa4c106161608301527f0474aa258fa2d41afc65596c3ada20b889a0f27825905a2a176560b27e2d2c8e616180830152614d208201516161a0830152826001604061616085016060616160870160075afa141692506160e08201516161c08301526161008201516161e083015261616082015161620083015261618082015161622083015282600160406161c0850160806161c0870160065afa141692507f1b5b2f748768c343be69fd761df14910a926a77da095db2912e96ac9f73ab6a26162408301527f2c0bb520bc601497c6b7f1bf683c83cab3a0440c41d8fdfbae0c775a57e727f5616260830152614d40820151616280830152826001604061624085016060616240870160075afa141692506161c08201516162a08301526161e08201516162c08301526162408201516162e083015261626082015161630083015282600160406162a0850160806162a0870160065afa141692507e13dfb44248755cf12dcbac0ec5563e577e5b804ade04abc4e9baadac00e7ff6163208301527f264d42845662a911a5c37ae71cce463c1c387c12eed1a675e957440020045cb1616340830152614d60820151616360830152826001604061632085016060616320870160075afa141692506162a08201516163808301526162c08201516163a08301526163208201516163c08301526163408201516163e0830152826001604061638085016080616380870160065afa141692507f2386d5258846b3fc1e5ffca77fde43316fd15ea08e7ce940927f7212c1b37bb76164008301527f23306e0a53ba71047743578c8fb135d2b843a8dded816b5a9e0b06b72f07be96616420830152614d80820151616440830152826001604061640085016060616400870160075afa141692506163808201516164608301526163a08201516164808301526164008201516164a08301526164208201516164c0830152826001604061646085016080616460870160065afa141692506104208201516164e0830152610440820151616500830152614da082015161652083015282600160406164e0850160606164e0870160075afa141692506164608201516165408301526164808201516165608301526164e08201516165808301526165008201516165a0830152826001604061654085016080616540870160065afa141692506104608201516165c08301526104808201516165e0830152614dc082015161660083015282600160406165c0850160606165c0870160075afa141692506165408201516166208301526165608201516166408301526165c08201516166608301526165e0820151616680830152826001604061662085016080616620870160065afa141692506104a08201516166a08301526104c08201516166c0830152614de08201516166e083015282600160406166a0850160606166a0870160075afa141692506166208201516167008301526166408201516167208301526166a08201516167408301526166c0820151616760830152826001604061670085016080616700870160065afa141692506104e08201516167808301526105008201516167a0830152614e008201516167c0830152826001604061678085016060616780870160075afa141692506167008201516167e08301526167208201516168008301526167808201516168208301526167a082015161684083015282600160406167e0850160806167e0870160065afa14169250610520820151616860830152610540820151616880830152614e208201516168a0830152826001604061686085016060616860870160075afa141692506167e08201516168c08301526168008201516168e083015261686082015161690083015261688082015161692083015282600160406168c0850160806168c0870160065afa141692506103808201516169408301526103a0820151616960830152614e40820151616980830152826001604061694085016060616940870160075afa141692506168c08201516169a08301526168e08201516169c08301526169408201516169e0830152616960820151616a0083015282600160406169a0850160806169a0870160065afa141692506102c0820151616a208301526102e0820151616a40830152614f40820151616a608301528260016040616a2085016060616a20870160075afa141692506169a0820151616a808301526169c0820151616aa0830152616a20820151616ac0830152616a40820151616ae08301528260016040616a8085016080616a80870160065afa14169250610300820151616b00830152610320820151616b208301526150e0820151616b408301528260016040616b0085016060616b00870160075afa14169250616a80820151616b60830152616aa0820151616b80830152616b00820151616ba0830152616b20820151616bc08301528260016040616b6085016080616b60870160065afa14169250610340820151616be0830152610360820151616c00830152615100820151616c208301528260016040616be085016060616be0870160075afa14169250616b60820151616c40830152616b80820151616c60830152616be0820151616c80830152616c00820151616ca08301528260016040616c4085016080616c40870160065afa14169250610180820151616cc08301526101a0820151616ce0830152615200820151616d008301528260016040616cc085016060616cc0870160075afa14169250616c40820151616d20830152616c60820151616d40830152616cc0820151616d60830152616ce0820151616d808301528260016040616d2085016080616d20870160065afa14169250610ae0820151616da0830152610b00820151616dc08301526152408201518103616de0830152508160016040616da084016060616da0860160075afa14169150616d20810151616e00820152616d40810151616e20820152616da0810151616e40820152616dc0810151616e608201528160016040616e0084016080616e00860160065afa14169150610b80810151616e80820152610ba0810151616ea0820152615260810151616ec08201528160016040616e8084016060616e80860160075afa14169150616e00810151616ee0820152616e20810151616f00820152616e80810151616f20820152616ea0810151616f408201528160016040616ee084016080616ee0860160065afa14169150616ee0810151616f60820152616f00810151616f808201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2616fa08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed616fc08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b616fe08201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa617000820152610b80810151617020820152610ba08101516170408201527f1e46f29916af7be8122d38ce700e9f73b49830b4aa672d58c5fa83daa6f490386170608201527f203ccabc1b45b69a6dfd92fe117dfbdbeb48e684dccdf8cb2f466f4b860730346170808201527f0bd22dcbe71a1faeea29bf6783cbc63f06788ff9ea2488a2af9036ac52d4ae826170a08201527f23b7b2c332fca16856cc8bd1ca0b56f6872ed95ef4291917fce124bf48c136096170c08201528160016020616f608401610180616f60860160085afa616f6093909301516001149214161691505092915050565b604051806170c00160405280610386906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156152b1576152b1615272565b604052919050565b600082601f8301126152ca57600080fd5b813567ffffffffffffffff8111156152e4576152e4615272565b6152f7601f8201601f1916602001615288565b81815284602083860101111561530c57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561533c57600080fd5b823567ffffffffffffffff8082111561535457600080fd5b818501915085601f83011261536857600080fd5b813560208282111561537c5761537c615272565b8160051b61538b828201615288565b928352848101820192828101908a8511156153a557600080fd5b958301955b848710156153c3578635825295830195908301906153aa565b97505050860135925050808211156153da57600080fd5b506153e7858286016152b9565b915050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a26469706673582212207a4968b5317023c5b47a2108863e4850a34d6d7ed69ac30b2bbb0bc95c1ed01564736f6c63430008120033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063bd205a9014610030575b600080fd5b61004361003e366004615329565b610057565b604051901515815260200160405180910390f35b60006001610063615252565b6000805160206154128339815191526100d9565b6000805160206153f283398151915280831081831016908380096000805160206153f28339815191528384096000805160206153f283398151915284820990506000805160206153f28339815191526003820891909114919091169392505050565b8060208701510660208301528060408701510660408301527f26c12b9fd7eb1bb33a25341ab4af2db334bf0ac2db5f18a2184820a841f48ea6600083015260208501518060608401526040860151806080850152846101388284610077565b169450505060608501518060a084015260808601518060c08501528461015e8284610077565b169450505060a08501518060e084015260c086015180610100850152846101858284610077565b16945050506101206000830120610120830152610120820151818106610140840152806101608401525060e085015180610180840152610100860151806101a0850152846101d38284610077565b1694505050610120850151806101c0840152610140860151806101e0850152846101fd8284610077565b60a061016087012061020087018190528581066102208801526102408701521694506001915050610260830153602161024083012061026083018190528181066102808401526102a08301526101608501516102c083018190526101808601516102e08401819052846102708284610077565b16945050506101a0850151806103008401526101c0860151806103208501528461029a8284610077565b16945050506101e08501518061034084015261020086015180610360850152846102c48284610077565b169450505061022085015180610380840152610240860151806103a0850152846102ee8284610077565b16945050506101206102a08301206103c08301526103c08201518181066103e0840152806104008401525061026085015180610420840152610280860151806104408501528461033e8284610077565b16945050506102a0850151806104608401526102c086015180610480850152846103688284610077565b16945050506102e0850151806104a0840152610300860151806104c0850152846103928284610077565b1694505050610320850151806104e084015261034086015180610500850152846103bc8284610077565b16945050506103608501518061052084015261038086015180610540850152846103e68284610077565b1694505050610160610400830120610560830152610560820151818106610580840152806105a084015250806103a0860151066105c0830152806103c0860151066105e0830152806103e086015106610600830152806104008601510661062083015280610420860151066106408301528061044086015106610660830152806104608601510661068083015280610480860151066106a0830152806104a0860151066106c0830152806104c0860151066106e0830152806104e086015106610700830152806105008601510661072083015280610520860151066107408301528061054086015106610760830152806105608601510661078083015280610580860151066107a0830152806105a0860151066107c0830152806105c0860151066107e0830152806105e086015106610800830152806106008601510661082083015280610620860151066108408301528061064086015106610860830152806106608601510661088083015280610680860151066108a0830152806106a0860151066108c0830152806106c0860151066108e0830152806106e086015106610900830152806107008601510661092083015280610720860151066109408301528061074086015106610960830152806107608601510661098083015280610780860151066109a0830152806107a0860151066109c0830152806107c0860151066109e0830152806107e086015106610a008301526104806105a0830120610a20830152610a20820151818106610a4084015280610a60840152506001610a808301536021610a60830120610a808301819052818106610aa0840152610ac0830152610800850151610ae08301819052610820860151610b0084018190528461066f8284610077565b16945050506060610ac0830120610b20830152610b20820151818106610b4084015280610b608401525061084085015180610b8084015261086086015180610ba0850152846106be8284610077565b16945050508061058083015161058084015109610bc0830181905281908009610be0830181905281908009610c00830181905281908009610c20830181905281908009610c40830181905281908009610c60830181905281908009610c80830181905281908009610ca0830181905281908009610cc0830181905281908009610ce0830181905281908009610d00830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000610d0084015108610d20830152807f305e41e912d579f5b3193badcab128321c8ee1cb70aa396331b979553d820001610d2084015109610d40830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610d4084015109610d60830152807f0daef86f88c440658be430f38559b834662c0dbd4d47a55d6e97fb49c41a2cff61058084015108610d80830152807f2498c2d3affa1baaf6419dbccb6a054bb87359c02eade5aeacd86c84757b9051610d4084015109610da0830152807f0bcb8b9f3137847ec20ea7f9b61753116fc08e884b0b8ae29709890f7a846fb061058084015108610dc0830152807f096b9f8b8598b7c387fb69abf236b0d5e04e24d275ee98244443eda5d3bc4035610d4084015109610de0830152807f26f8aee75b98e8663054dc0a8f4aa78747e5c37603cad86cff9e07ee1c43bfcc61058084015108610e00830152807f28771071ab1633014eae27cfc16d5ebe08a8fe2fc9e85044e4a45f82c14cd825610d4084015109610e20830152807f07ed3e01361b6d2869a21de6c013f99f1f8aea18afd1204c5f3d96112eb327dc61058084015108610e40830152807f0ae3c95fc03c0a5f2de8a8f46c03ccdfdfed2bb98c9e4ae0b10b15eda4e3b1e3610d4084015109610e60830152807f2580851320f595ca8a679cc2157d8b7d4846bc8eed1b25b092d6dfa64b1c4e1e61058084015108610e80830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a610d4084015109610ea0830152807f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e761058084015108610ec0830152806001610d4084015109610ee0830152807f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000061058084015108610f00830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f610d4084015109610f20830152807f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa261058084015108610f40830152610d808201518181610dc085015109905080610f608401528181610e0085015109905080610f808401528181610e4085015109905080610fa08401528181610e8085015109905080610fc08401528181610ec085015109905080610fe08401528181610f00850151099050806110008401528181610f40850151099050806110208401528181610d208501510990508061104084015250602061108083015260206110a083015260206110c08301526110408201516110e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6111008301526000805160206154128339815191526111208301528260016020611060850160c0611080870160055afa141692506110608201516000610d208401519050828261102086015109610d20850152828282099150610f408401519050828261100086015109610f40850152828282099150610f0084015190508282610fe086015109610f00850152828282099150610ec084015190508282610fc086015109610ec0850152828282099150610e8084015190508282610fa086015109610e80850152828282099150610e4084015190508282610f8086015109610e40850152828282099150610e0084015190508282610f6086015109610e00850152828282099150610dc084015190508282610d8086015109610dc085015282828209610d808501819052610d608501518493509091500961114083015280610dc0830151610da08401510961116083015280610e00830151610de08401510961118083015280610e40830151610e20840151096111a083015280610e80830151610e60840151096111c083015280610ec0830151610ea0840151096111e083015280610f00830151610ee08401510961120083015280610f40830151610f20840151096112208301528060208301516112008401510981818360408601516112208701510908611240840152506106e08201516105c0830151829190086112608301819052819080096112808301819052819080096112a0830152806112a0830151611260840151096112c0830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad56112c0840151096112e0830152806107008301516105e0840151086113008301819052819080096113208301819052819080096113408301528061134083015161130084015109611360830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e861136084015109611380830152806113808301516112e0840151086113a08301528061060083015182036113a0840151086113c083018190526107808301518291096113e0830152806113e08301516103e084015109611400830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff96112c084015109611420830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c86113608401510961144083015280611440830151611420840151086114608301528061062083015182036114608401510861148083018190526107808301518291096114a0830152806114a0830151611400840151086114c0830152806114c08301516103e0840151096114e08301528061064083015182036112c08401510861150083018190526107a0830151829109611520830152806115208301516114e084015108611540830152806115408301516103e084015109611560830152807f066f6f85d6f68a85ec10345351a23a3aaf07f38af8c952a7bceca70bd2af7ad561064084015109611580830152807f2b9d4b4110c9ae997782e1509b1d0fdb20a7c02bbd8bea7305462b9f8125b1e8611300840151096115a0830152806115a0830151611580840151086115c083018190526106a08301518291086115e0830181905281908009611600830181905281908009611620830152806116208301516115e084015109611640830152807f13abec390ada7f4370819ab1c7846f210554569d9b29d1ea8dbebd0fa8c53e6661060084015109611660830152807f1eb9e1dc19a33a624c9862a1d97d1510bd521ead5dfe0345aaf6185b1a1e60fe6106208401510961168083015280611680830151611660840151086116a0830152806116a08301518203611640840151086116c083018190526107a08301518291096116e0830152806116e083015161156084015108611700830152806117008301516103e084015109611720830152807f0cc57cdbb08507d62bf67a4493cc262fb6c09d557013fff1f573f431221f8ff961064084015109611740830152807f1274e649a32ed355a31a6ed69724e1adade857e86eb5c3a121bcd147943203c861130084015109611760830152806117608301516117408401510861178083018190526106c08301518291086117a0830152807f0fc1c9394db89bb2601abc49fdad4f038ce5169030a2ad69763f7875036bcb02610600840151096117c0830152807f16a9e98c493a902b9502054edc03e7b22b7eac34345961bc8abced6bd147c8be610620840151096117e0830152806117e08301516117c0840151086118008301528061180083015182036117a08401510861182083018190526107a08301518291096118408301528061184083015161172084015108611860830152806118608301516103e0840151096118808301528061076083015182036001086118a083018190526107608301518291096118c08301528061076083015182036002086118e083018190526118c08301518291096119008301528061076083015182036004086119208301819052611900830151829109611940830152806105c0830151610680840151086119608301528061060083015182036119608401510861198083018190526119408301518291096119a0830152806119a0830151611880840151086119c0830152806119c08301516103e0840151096119e083015280610620830151820361066084015108611a008301819052611940830151829109611a2083015280611a208301516119e084015108611a4083015280611a408301516103e084015109611a60830152806107c08301516113c084015109611a8083015280611a80830151611a6084015108611aa083015280611aa08301516103e084015109611ac0830152806107c083015161148084015109611ae083015280611ae0830151611ac084015108611b0083015280611b008301516103e084015109611b20830152806107e083015161150084015109611b4083015280611b40830151611b2084015108611b6083015280611b608301516103e084015109611b80830152806107e08301516116c084015109611ba083015280611ba0830151611b8084015108611bc083015280611bc08301516103e084015109611be0830152806107e083015161182084015109611c0083015280611c00830151611be084015108611c2083015280611c208301516103e084015109611c40830152806107608301518203600308611c608301819052611900830151829109611c8083015280611c8083015161198084015109611ca083015280611ca0830151611c4084015108611cc083015280611cc08301516103e084015109611ce083015280611c80830151611a0084015109611d0083015280611d00830151611ce084015108611d2083015280611d208301516103e084015109611d40830152806107608301516118e084015109611d6083015280611d60830151611c6084015109611d8083015280611d8083015161192084015109611da083015280611da083015161064084015109611dc0830152806106408301518203600108611de08301819052611dc0830151829109611e0083015280611e00830151611d4084015108611e2083015280611e208301516103e084015109611e4083015280610640830151600209611e60830152806105c083015182036105e084015108611e808301819052611e60830151829109611ea0830152806105c0830151820361060084015108611ec083015280611ec08301518203611ea084015108611ee08301528061062083015182036105e084015108611f0083015280611f008301518203611ee084015108611f208301819052611da0830151829109611f4083015280611f40830151611e4084015108611f6083015280611f608301516103e084015109611f80830152806118c0830151611c6084015109611fa083015280611fa083015161192084015109611fc0830152806105e08301516105c084015108611fe0830152806106408301518203611fe0840151086120008301819052611fc083015182910961202083015280612020830151611f8084015108612040830152806120408301516103e0840151096120608301819052612020830151829108612080830152806120808301516103e0840151096120a0830152806108e083015182036001086120c083018190526112008301518291096120e0830152806120e08301516120a084015108612100830152806121008301516103e0840151096121208301526109408201518190800961214083015280610940830151820361214084015108612160830181905261114083015182910961218083015280612180830151612120840151086121a0830152806121a08301516103e0840151096121c0830152806109208301518203610940840151086121e08301819052611200830151829109612200830152806122008301516121c084015108612220830152806122208301516103e084015109612240830152806111408301518203600108612260830152806111808301516111608401510861228083018190526111a08301518291086122a083018190526111c08301518291086122c083018190526111e08301518291086122e0830152806122e08301518203612260840151086123008301528061022083015161082084015109612320830152806123208301516106a08401510861234083018190526102808301518291086123608301528061022083015161084084015109612380830152806123808301516105c0840151086123a083018190526102808301518291086123c083018190526123608301518291096123e08301528061022083015161086084015109612400830152806124008301516105e084015108612420830181905261028083015182910861244083018190526123e08301518291096124608301528061022083015161088084015109612480830152806124808301516106c0840151086124a083018190526102808301518291086124c083018190526124608301518291096124e08301819052610900830151829109612500830152806102208301516001096125208301528061252083015161058084015109612540830152806125408301516106a0840151086125608301819052610280830151829108612580830152806102208301517f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096125a0830152806125a0830151610580840151096125c0830152806125c08301516105c0840151086125e083018190526102808301518291086126008301819052612580830151829109612620830152806102208301517f13b360d4e82fe915fed16081038f98c211427b87a281bd733c277dbadf10372b096126408301528061264083015161058084015109612660830152806126608301516105e08401510861268083018190526102808301518291086126a083018190526126208301518291096126c0830152806102208301517f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e52096126e0830152806126e083015161058084015109612700830152806127008301516106c084015108612720830181905261028083015182910861274083018190526126c083015182910961276083018190526108e0830151829109612780830152806127808301518203612500840151086127a083018190526123008301518291096127c0830152806127c0830151612240840151086127e0830152806127e08301516103e084015109612800830152806102208301516108a08401510961282083015280612820830151610640840151086128408301819052610280830151829108612860830152806102208301516108c08401510961288083015280612880830151611240840151086128a083018190526102808301518291086128c083018190526128608301518291096128e08301819052610960830151829109612900830152806102208301517ea136ba13afa6c83eb7b82fb370e228e74155e48fb8f1c1cfc33fb0da8afb4209612920830152806129208301516105808401510961294083015280612940830151610640840151086129608301819052610280830151829108612980830152806102208301517f2eb9750dce545f17d492058dd201a1251ff3d9077864583d44eaf9be9008699d096129a0830152806129a0830151610580840151096129c0830152806129c0830151611240840151086129e08301819052610280830151829108612a008301819052612980830151829109612a208301819052610940830151829109612a4083015280612a40830151820361290084015108612a608301819052612300830151829109612a8083015280612a8083015161280084015108612aa083015280612aa08301516103e084015109612ac0830152806109808301518203600108612ae08301819052611200830151829109612b0083015280612b00830151612ac084015108612b2083015280612b208301516103e084015109612b4083015261098082015181908009612b60830152806109808301518203612b6084015108612b808301819052611140830151829109612ba083015280612ba0830151612b4084015108612bc083015280612bc08301516103e084015109612be0830152806102208301516109c084015108612c0083018190526109a0830151829109612c2083015280610280830151610a0084015108612c408301819052612c20830151829109612c608301528061060083015161010009612c8083015280612c8083015182036105c084015108612ca08301819052610740830151829109612cc08301819052610220830151829108612ce08301819052610980830151829109612d008301528061028083015161072084015108612d208301819052612d00830151829109612d4083015280612d408301518203612c6084015108612d608301819052612300830151829109612d8083015280612d80830151612be084015108612da083015280612da08301516103e084015109612dc083015280610a0083015182036109c084015108612de08301819052611200830151829109612e0083015280612e00830151612dc084015108612e2083015280612e208301516103e084015109612e4083015280612300830151612de084015109612e60830152806109e083015182036109c084015108612e808301819052612e60830151829109612ea083015280612ea0830151612e4084015108612ec0830152610d0082015181908009612ee08301819052610d00830151829109612f008301819052610d00830151829109612f208301819052610d00830151829109612f4083015280610d00830151600109612f6083015280612ee0830151600109612f8083015280612f00830151600109612fa083015280612f20830151600109612fc083015280610d20830151612ec084015109612fe083015280610580830151610bc08401510961300083015280600161058084015109613020830152806130208301518203610b4084015108613040830152807f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705f61058084015109613060830152806130608301518203610b4084015108613080830152807f22b55603586d5fc42c6c14c2fc27a028c207da8b2c71cb33d549fa4a2be5d302610580840151096130a0830152806130a08301518203610b40840151086130c0830152807f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161a610580840151096130e0830152806130e08301518203610b408401510861310083015280817f21054ce8b3cb9dc9b87af5c70c8f54994090ad8fa7e06caaf989ba5806b6798b610bc085015109610b4084015109818183847f0f5f018a2d66025fffd54fef74f203c3e7a33ab8d1d903e64a583b3be9498676610bc08801510961058087015109089050806131208401525080817f10ac009d2f31395e301635cd6d292978a4012197c24d6e63fb49943a70296136610bc085015109610b4084015109818183847f2696aa2788110c63ebbfd7f92b352ce93b28bbdae57b7cb94bc5885ee439e774610bc08801510961058087015109089050806131408401525080817f2510cae1618713ac17c9ef83f1a67645ed21f454d96bf1f072ca5b463e7f0c28610bc085015109610b4084015109818183847f0d6a07653c64f4112284cb8b23bf73adecaf4ee0fef51998549526f07b6defd7610bc088015109610580870151090861316084015250613040820151819060010961318083018190526130808301518291096131a083018190526131008301518291096131c0830152806001610b40840151098181837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000061058087015109089050806131e08401525080817f1d81b9bd5165d63a0d4a8370d37966eb243365d36ca235911564a783f8234cf2610bc085015109610b4084015109818183847f12e294b58fcbc9efab05c245ae07f172040082750d173b002e7d4e0ff7dcb30f610bc08801510961058087015109089050806132008401525080817f142f93c8919700eddb46a823a63f1726c05e6953fd8ba57ddf6ea70e7ebc8dcf610bc085015109610b4084015109818183847f2707d3cc5788c2cfc0ee9e5f5638da3b90cb6d8b97224a4521073ec9f10826fb610bc08801510961058087015109089050806132208401525080817f13d3d4db83b42c4d48afa6b5c9cbe3f49703d0caf1fdc301b0d4d3743ab60833610bc085015109610b4084015109818183847f223ed99d38075819043fa85ed3c54f3bfb5d62312139562ca82d9903b1b52e27610bc0880151096105808701510908613240840152506130c08201516131a08301518291900961326083015280817f1b9e4cecf9d91a534374fa77043701c82dc7e69e6a661b163dd63549ae8d8fa361058085015109610b4084015109818183847f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e6105808801510961058087015109089050806132808401525080817f14c60185e75885d674db4b3f7d4a5694fa6c01aa0f53557b060bc04a4172705e61058085015109610b4084015109818183847f1a514dd9f80de355133414990bffdc137169ffbf79f1b0988ce4dc4b27adb4e36105808801510961058087015109089050806132a08401525080817f0566fffbb9f283767505fb50085852d112c8c6f13d7a5194bbb3850e5828e9e861058085015109610b4084015109818183847f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d716196105808801510961058087015109089050806132c08401525080817f2afd4e77273f1cb3434a4a667929058c156b21573c3f1efc882e708597d7161961058085015109610b4084015109818183847f20198517670312541561a1720d2538ac357df59dafa0d41bd7235a97f2f364376105808801510961058087015109086132e0840152506131008201516131808301518291900961330083015261312082015181816131408501510990508061332084015281816131608501510990508061334084015281816131e0850151099050806133608401528181613180850151099050806133808401528181613200850151099050806133a08401528181613220850151099050806133c08401528181613240850151099050806133e084015281816132608501510990508061340084015281816132808501510990508061342084015281816132a08501510990508061344084015281816131a08501510990508061346084015281816132c08501510990508061348084015281816132e0850151099050806134a08401528181613300850151099050806134c0840152506020613500830152602061352083015260206135408301526134c08201516135608301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6135808301526000805160206154128339815191526135a083015282600160206134e0850160c0613500870160055afa141692506134e08201516000613300840151905082826134a0860151096133008501528282820991506132e084015190508282613480860151096132e08501528282820991506132c084015190508282613460860151096132c08501528282820991506131a084015190508282613440860151096131a08501528282820991506132a084015190508282613420860151096132a08501528282820991506132808401519050828261340086015109613280850152828282099150613260840151905082826133e086015109613260850152828282099150613240840151905082826133c086015109613240850152828282099150613220840151905082826133a086015109613220850152828282099150613200840151905082826133808601510961320085015282828209915061318084015190508282613360860151096131808501528282820991506131e084015190508282613340860151096131e08501528282820991506131608401519050828261332086015109613160850152828282099150613140840151905082826131208601510961314085015282828209613120850181905261314085015190925083915082900890508181613160850151086135c0840152506131808201516131c0830151829190096135e08301526131e08201518061360084015250806132608301516131c0840151096136208301526132008201518181613220850151089050818161324085015108613640840152506131a08201516131c08301518291900961366083015261328082015181816132a085015108613680840152506133008201516131c0830151829190096136a08301526132c082015181816132e0850151086136c0840152506135c082015161360083015182908290099050806136e084015281816136408501510990508061370084015281816136808501510990508061372084015281816136c08501510990508061374084015250602061378083015260206137a083015260206137c08301526137408201516137e08301527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff6138008301526000805160206154128339815191526138208301528260016020613760850160c0613780870160055afa1416925061376082015160006136c084015190508282613720860151096136c08501528282820991506136808401519050828261370086015109613680850152828282099150613640840151905082826136e086015109613640850152828282099150613600840151905082826135c086015109613600850152828282096135c085015250506136008201516135e08301518291900961384083015280613640830151613620840151096138608301528061368083015161366084015109613880830152806136c08301516136a0840151096138a0830152610a40820151819080096138c08301819052610a408301518291096138e08301819052610a408301518291096139008301819052610a408301518291096139208301819052610a408301518291096139408301819052610a408301518291096139608301819052610a408301518291096139808301819052610a408301518291096139a08301819052610a408301518291096139c08301819052610a408301518291096139e08301819052610a40830151829109613a008301819052610a40830151829109613a208301819052610a40830151829109613a408301819052610a40830151829109613a608301819052610a40830151829109613a808301819052610a40830151829109613aa08301819052610a40830151829109613ac08301819052610a40830151829109613ae08301819052610a40830151829109613b008301819052610a40830151829109613b20830152610aa082015181908009613b408301819052610aa0830151829109613b608301819052610aa0830151829109613b808301819052610aa0830151829109613ba0830152806131208301516105c084015109818183613140860151610600870151090890508181836131608601516106808701510908613bc084018190526135c08401518392509009613be0830152806001613be0840151830309613c00830152806131208301516105e084015109818183613140860151610620870151090890508181836131608601516106608701510908613c2084018190526135c08401518392509009613c408301819052610a408301518291820309613c6083015280610a40830151600109613c8083015280613c60830151613c0084015108613ca0830152806001613ca084015109613cc0830152806001613c8084015109613ce0830152806135e0830151600109613d00830152806131e083015161064084015109613d208301819052613840830151829109613d40830152806001613d40840151830309613d60830152806001613d0084015109613d80830152806131e0830151610a0084015109613da08301819052613840830151829109613dc08301819052610a408301518291820309613de083015280610a40830151613d0084015109613e0083015280613de0830151613d6084015108613e20830152806131e08301516106a084015109613e408301819052613840830151829109613e6083018190526138c08301518291820309613e80830152806138c0830151613d0084015109613ea083015280613e80830151613e2084015108613ec0830152806131e08301516106c084015109613ee08301819052613840830151829109613f0083018190526138e08301518291820309613f20830152806138e0830151613d0084015109613f4083015280613f20830151613ec084015108613f60830152806131e08301516106e084015109613f808301819052613840830151829109613fa083018190526139008301518291820309613fc083015280613900830151613d0084015109613fe083015280613fc0830151613f6084015108614000830152806131e08301516107008401510961402083018190526138408301518291096140408301819052613920830151829182030961406083015280613920830151613d008401510961408083015280614060830151614000840151086140a0830152806131e0830151610720840151096140c083018190526138408301518291096140e08301819052613940830151829182030961410083015280613940830151613d0084015109614120830152806141008301516140a084015108614140830152806131e0830151610740840151096141608301819052613840830151829109614180830181905261396083015182918203096141a083015280613960830151613d00840151096141c0830152806141a0830151614140840151086141e0830152806131e08301516107608401510961420083018190526138408301518291096142208301819052613980830151829182030961424083015280613980830151613d0084015109614260830152806142408301516141e084015108614280830152806131e0830151610780840151096142a083018190526138408301518291096142c083018190526139a083015182918203096142e0830152806139a0830151613d0084015109614300830152806142e083015161428084015108614320830152806131e08301516107a084015109614340830181905261384083015182910961436083018190526139c08301518291820309614380830152806139c0830151613d00840151096143a083015280614380830151614320840151086143c0830152806131e08301516107c0840151096143e0830181905261384083015182910961440083018190526139e08301518291820309614420830152806139e0830151613d0084015109614440830152806144208301516143c084015108614460830152806131e08301516107e08401510961448083018190526138408301518291096144a08301819052613a0083015182918203096144c083015280613a00830151613d00840151096144e0830152806144c083015161446084015108614500830152806131e08301516108208401510961452083018190526138408301518291096145408301819052613a20830151829182030961456083015280613a20830151613d008401510961458083015280614560830151614500840151086145a0830152806131e0830151610840840151096145c083018190526138408301518291096145e08301819052613a40830151829182030961460083015280613a40830151613d0084015109614620830152806146008301516145a084015108614640830152806131e08301516108608401510961466083018190526138408301518291096146808301819052613a6083015182918203096146a083015280613a60830151613d00840151096146c0830152806146a0830151614640840151086146e0830152806131e08301516108808401510961470083018190526138408301518291096147208301819052613a80830151829182030961474083015280613a80830151613d0084015109614760830152806147408301516146e084015108614780830152806131e08301516108a0840151096147a083018190526138408301518291096147c08301819052613aa083015182918203096147e083015280613aa0830151613d0084015109614800830152806147e083015161478084015108614820830152806131e08301516108c08401510961484083018190526138408301518291096148608301819052613ac0830151829182030961488083015280613ac0830151613d00840151096148a083015280614880830151614820840151086148c0830152806135e0830151612f60840151096148e0830152806135e0830151612f8084015109614900830152806135e0830151612fa084015109614920830152806135e0830151612fc084015109614940830152806131e0830151612fe08401510961496083018190526138408301518291096149808301819052613ae083015182918203096149a083015280613ae0830151613d00840151096149c083015280613ae08301516148e0840151096149e083015280613ae083015161490084015109614a0083015280613ae083015161492084015109614a2083015280613ae083015161494084015109614a40830152806149a08301516148c084015108614a60830152806131e083015161080084015109614a808301819052613840830151829109614aa08301819052613b008301518291820309614ac083015280613b00830151613d0084015109614ae083015280614ac0830151614a6084015108614b008301819052610aa0830151829109614b2083015280610aa0830151613d8084015109614b4083015280610aa0830151613e0084015109614b6083015280610aa0830151613ea084015109614b8083015280610aa0830151613f4084015109614ba083015280610aa0830151613fe084015109614bc083015280610aa083015161408084015109614be083015280610aa083015161412084015109614c0083015280610aa08301516141c084015109614c2083015280610aa083015161426084015109614c4083015280610aa083015161430084015109614c6083015280610aa08301516143a084015109614c8083015280610aa083015161444084015109614ca083015280610aa08301516144e084015109614cc083015280610aa083015161458084015109614ce083015280610aa083015161462084015109614d0083015280610aa08301516146c084015109614d2083015280610aa083015161476084015109614d4083015280610aa083015161480084015109614d6083015280610aa08301516148a084015109614d8083015280610aa08301516149c084015109614da083015280610aa08301516149e084015109614dc083015280610aa0830151614a0084015109614de083015280610aa0830151614a2084015109614e0083015280610aa0830151614a4084015109614e2083015280610aa0830151614ae084015109614e4083015280614b20830151613cc084015108614e6083015280613620830151600109614e80830152806132008301516108e084015109818183613220860151610900870151090890508181836132408601516109208701510908614ea084018190526138608401518392509009614ec0830152806001614ec0840151830309614ee0830152806001614e8084015109614f0083015280613b40830151614ee084015109614f2083015280613b40830151614f0084015109614f4083015280614f20830151614e6084015108614f6083015280613660830151600109614f8083015280613280830151610940840151098181836132a08601516109608701510908614fa084018190526138808401518392509009614fc0830152806001614fc0840151830309614fe0830152806001614f808401510961500083015280613280830151610980840151098181836132a08601516109a08701510908615020840181905261388084015183925090096150408301819052610a40830151829182030961506083015280610a40830151614f808401510961508083015280615060830151614fe0840151086150a08301819052613b608301518291096150c083015280613b60830151615000840151096150e083015280613b6083015161508084015109615100830152806150c0830151614f6084015108615120830152806136a0830151600109615140830152806132c08301516109c0840151098181836132e08601516109e0870151090861516084018190526138a084015183925090096151808301528060016151808401518303096151a0830152806001615140840151096151c083015280613b808301516151a0840151096151e083015280613b808301516151c084015109615200830152806151e083015161512084015108615220830152806131c083015160010961524083015280610b408301516001096152608301526001615280830181815260026152a08501526152208401516152c085015284919060409060608160075afa141692506152808201516152e08301526152a08201516153008301526060820151615320830152608082015161534083015282600160406152e0850160806152e0870160065afa1416925060a082015161536083015260c0820151615380830152613ce08201516153a0830152826001604061536085016060615360870160075afa141692506152e08201516153c08301526153008201516153e083015261536082015161540083015261538082015161542083015282600160406153c0850160806153c0870160065afa1416925060e0820151615440830152610100820151615460830152614b40820151615480830152826001604061544085016060615440870160075afa141692506153c08201516154a08301526153e08201516154c08301526154408201516154e083015261546082015161550083015282600160406154a0850160806154a0870160065afa141692506101c08201516155208301526101e0820151615540830152614b60820151615560830152826001604061552085016060615520870160075afa141692506154a08201516155808301526154c08201516155a08301526155208201516155c08301526155408201516155e0830152826001604061558085016080615580870160065afa141692507f14113d2da8037ec77f55dffb91151a8e7bb3eeea2fe44f6804703d0f82f344a06156008301527f1c5b5f4c28346cfddf08edde8db492f19a24b5f73fc2bd48dc19137a11ce53bf615620830152614b80820151615640830152826001604061560085016060615600870160075afa141692506155808201516156608301526155a08201516156808301526156008201516156a08301526156208201516156c0830152826001604061566085016080615660870160065afa141692507f0491714ea02953469195ca0768b5aafb03166b27284de7cc9ffa7b3879a959a56156e08301527f2dbaa9a59dc7fd9657798dd9c00ffc85d2033e9555b699f4d9706bc2b77dce77615700830152614ba082015161572083015282600160406156e0850160606156e0870160075afa141692506156608201516157408301526156808201516157608301526156e08201516157808301526157008201516157a0830152826001604061574085016080615740870160065afa141692507f16da8fcde785c6df1fe13aec4a088e06790750dfa9a2e9c6e05464a06b99679d6157c08301527f19fffa5d91549cdec737262e6cc5fa01c2f1c39c7b5f567d65d68e2cf3077bdb6157e0830152614bc082015161580083015282600160406157c0850160606157c0870160075afa141692506157408201516158208301526157608201516158408301526157c08201516158608301526157e0820151615880830152826001604061582085016080615820870160065afa141692507f1542d7d471049c346e9b97abc2a351948d23438019a76df2b1989c8f76b287606158a08301527f0e26e13db1f178f85dbcb83b0a617d766c0b36fc4a49bafab13b20e83d0557f36158c0830152614be08201516158e083015282600160406158a0850160606158a0870160075afa141692506158208201516159008301526158408201516159208301526158a08201516159408301526158c0820151615960830152826001604061590085016080615900870160065afa141692507f2b692b9199891f86e3fc5613991e72b47098220c9d883415244271cc74b1218d6159808301527f042f929afe4bc56206b4ace41a3d283848753d5014597bcd0ec14f8a9261c5846159a0830152614c008201516159c0830152826001604061598085016060615980870160075afa141692506159008201516159e0830152615920820151615a00830152615980820151615a208301526159a0820151615a4083015282600160406159e0850160806159e0870160065afa141692507f29c09f206a2fb04b15a3a0c220024c6b0ffa448a19fe3d4ec45ffa20748fc946615a608301527f1d27c69fbfa99caecf06376d79cbde5436726836ad63582954e2618d3899a6f6615a80830152614c20820151615aa08301528260016040615a6085016060615a60870160075afa141692506159e0820151615ac0830152615a00820151615ae0830152615a60820151615b00830152615a80820151615b208301528260016040615ac085016080615ac0870160065afa141692507f20a3113a48bc99d14016666990d982af3fc8ef6269c2f37e053bbb801e1bda37615b408301527f11874a3348a60113ed95b25c4bdb198369e449967dfe7fe3253cb39afdee2672615b60830152614c40820151615b808301528260016040615b4085016060615b40870160075afa14169250615ac0820151615ba0830152615ae0820151615bc0830152615b40820151615be0830152615b60820151615c008301528260016040615ba085016080615ba0870160065afa141692507f22ee677d2be1568a5ed89b73c8499d415c7c48b12184a48781e4f08d37755757615c208301527f16f2744bb8dae65b5c5a6e0836cd5b59014c25f2481b024dec21ccbf26a9808c615c40830152614c60820151615c608301528260016040615c2085016060615c20870160075afa14169250615ba0820151615c80830152615bc0820151615ca0830152615c20820151615cc0830152615c40820151615ce08301528260016040615c8085016080615c80870160065afa141692507f0fccf37dc6868cb450c1cc971a9005c20acf19ddb1c82b9ceae7579aaaf6e5dc615d008301527f1053a5adbb841ceb0c804c8e4188b2eb030d0a623ae199553173d818df46a8f8615d20830152614c80820151615d408301528260016040615d0085016060615d00870160075afa14169250615c80820151615d60830152615ca0820151615d80830152615d00820151615da0830152615d20820151615dc08301528260016040615d6085016080615d60870160065afa141692507f03c3c5792394acd6230174342c0fb4ceba9b35c38d4ab0ddb4a0fb177db54308615de08301527f1fd7d3ae57e2ef4c7b1023ce495503e40ca89532cbf6a740e57d9fa57d2b6f93615e00830152614ca0820151615e208301528260016040615de085016060615de0870160075afa14169250615d60820151615e40830152615d80820151615e60830152615de0820151615e80830152615e00820151615ea08301528260016040615e4085016080615e40870160065afa141692507f15b64cf223d375ca6c983ab84102a960bfeb54a0a29a085844e0e571b09f3d71615ec08301527f23d8408484b6b10b897f9b0cc33314d9060dac48f43a62a0e5660be5882a7a8e615ee0830152614cc0820151615f008301528260016040615ec085016060615ec0870160075afa14169250615e40820151615f20830152615e60820151615f40830152615ec0820151615f60830152615ee0820151615f808301528260016040615f2085016080615f20870160065afa141692507f2b069d8e2e57e6add6f216816a31936af27540959bfd7b845d3e74d84196639d615fa08301527f0840b8c0bdbb760a926c4046da2614e14d3c8b2fafc18c7471ce21298ca57c17615fc0830152614ce0820151615fe08301528260016040615fa085016060615fa0870160075afa14169250615f20820151616000830152615f40820151616020830152615fa0820151616040830152615fc0820151616060830152826001604061600085016080616000870160065afa141692507f2a6e42bf68afa452351faa949dc279f9fe3c68b126280aca278121888fcbaf736160808301527f04ddb656fb4f29069ada65c848b2ab177b495c0869aba6fe9216dab3a043f7596160a0830152614d008201516160c0830152826001604061608085016060616080870160075afa141692506160008201516160e08301526160208201516161008301526160808201516161208301526160a082015161614083015282600160406160e0850160806160e0870160065afa141692507f0182a509c08487b8c3d5b8507251cc8a46f5b313c687c1e7262d08eb8dfa4c106161608301527f0474aa258fa2d41afc65596c3ada20b889a0f27825905a2a176560b27e2d2c8e616180830152614d208201516161a0830152826001604061616085016060616160870160075afa141692506160e08201516161c08301526161008201516161e083015261616082015161620083015261618082015161622083015282600160406161c0850160806161c0870160065afa141692507f1b5b2f748768c343be69fd761df14910a926a77da095db2912e96ac9f73ab6a26162408301527f2c0bb520bc601497c6b7f1bf683c83cab3a0440c41d8fdfbae0c775a57e727f5616260830152614d40820151616280830152826001604061624085016060616240870160075afa141692506161c08201516162a08301526161e08201516162c08301526162408201516162e083015261626082015161630083015282600160406162a0850160806162a0870160065afa141692507e13dfb44248755cf12dcbac0ec5563e577e5b804ade04abc4e9baadac00e7ff6163208301527f264d42845662a911a5c37ae71cce463c1c387c12eed1a675e957440020045cb1616340830152614d60820151616360830152826001604061632085016060616320870160075afa141692506162a08201516163808301526162c08201516163a08301526163208201516163c08301526163408201516163e0830152826001604061638085016080616380870160065afa141692507f2386d5258846b3fc1e5ffca77fde43316fd15ea08e7ce940927f7212c1b37bb76164008301527f23306e0a53ba71047743578c8fb135d2b843a8dded816b5a9e0b06b72f07be96616420830152614d80820151616440830152826001604061640085016060616400870160075afa141692506163808201516164608301526163a08201516164808301526164008201516164a08301526164208201516164c0830152826001604061646085016080616460870160065afa141692506104208201516164e0830152610440820151616500830152614da082015161652083015282600160406164e0850160606164e0870160075afa141692506164608201516165408301526164808201516165608301526164e08201516165808301526165008201516165a0830152826001604061654085016080616540870160065afa141692506104608201516165c08301526104808201516165e0830152614dc082015161660083015282600160406165c0850160606165c0870160075afa141692506165408201516166208301526165608201516166408301526165c08201516166608301526165e0820151616680830152826001604061662085016080616620870160065afa141692506104a08201516166a08301526104c08201516166c0830152614de08201516166e083015282600160406166a0850160606166a0870160075afa141692506166208201516167008301526166408201516167208301526166a08201516167408301526166c0820151616760830152826001604061670085016080616700870160065afa141692506104e08201516167808301526105008201516167a0830152614e008201516167c0830152826001604061678085016060616780870160075afa141692506167008201516167e08301526167208201516168008301526167808201516168208301526167a082015161684083015282600160406167e0850160806167e0870160065afa14169250610520820151616860830152610540820151616880830152614e208201516168a0830152826001604061686085016060616860870160075afa141692506167e08201516168c08301526168008201516168e083015261686082015161690083015261688082015161692083015282600160406168c0850160806168c0870160065afa141692506103808201516169408301526103a0820151616960830152614e40820151616980830152826001604061694085016060616940870160075afa141692506168c08201516169a08301526168e08201516169c08301526169408201516169e0830152616960820151616a0083015282600160406169a0850160806169a0870160065afa141692506102c0820151616a208301526102e0820151616a40830152614f40820151616a608301528260016040616a2085016060616a20870160075afa141692506169a0820151616a808301526169c0820151616aa0830152616a20820151616ac0830152616a40820151616ae08301528260016040616a8085016080616a80870160065afa14169250610300820151616b00830152610320820151616b208301526150e0820151616b408301528260016040616b0085016060616b00870160075afa14169250616a80820151616b60830152616aa0820151616b80830152616b00820151616ba0830152616b20820151616bc08301528260016040616b6085016080616b60870160065afa14169250610340820151616be0830152610360820151616c00830152615100820151616c208301528260016040616be085016060616be0870160075afa14169250616b60820151616c40830152616b80820151616c60830152616be0820151616c80830152616c00820151616ca08301528260016040616c4085016080616c40870160065afa14169250610180820151616cc08301526101a0820151616ce0830152615200820151616d008301528260016040616cc085016060616cc0870160075afa14169250616c40820151616d20830152616c60820151616d40830152616cc0820151616d60830152616ce0820151616d808301528260016040616d2085016080616d20870160065afa14169250610ae0820151616da0830152610b00820151616dc08301526152408201518103616de0830152508160016040616da084016060616da0860160075afa14169150616d20810151616e00820152616d40810151616e20820152616da0810151616e40820152616dc0810151616e608201528160016040616e0084016080616e00860160065afa14169150610b80810151616e80820152610ba0810151616ea0820152615260810151616ec08201528160016040616e8084016060616e80860160075afa14169150616e00810151616ee0820152616e20810151616f00820152616e80810151616f20820152616ea0810151616f408201528160016040616ee084016080616ee0860160065afa14169150616ee0810151616f60820152616f00810151616f808201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2616fa08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed616fc08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b616fe08201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa617000820152610b80810151617020820152610ba08101516170408201527f1e46f29916af7be8122d38ce700e9f73b49830b4aa672d58c5fa83daa6f490386170608201527f203ccabc1b45b69a6dfd92fe117dfbdbeb48e684dccdf8cb2f466f4b860730346170808201527f0bd22dcbe71a1faeea29bf6783cbc63f06788ff9ea2488a2af9036ac52d4ae826170a08201527f23b7b2c332fca16856cc8bd1ca0b56f6872ed95ef4291917fce124bf48c136096170c08201528160016020616f608401610180616f60860160085afa616f6093909301516001149214161691505092915050565b604051806170c00160405280610386906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156152b1576152b1615272565b604052919050565b600082601f8301126152ca57600080fd5b813567ffffffffffffffff8111156152e4576152e4615272565b6152f7601f8201601f1916602001615288565b81815284602083860101111561530c57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561533c57600080fd5b823567ffffffffffffffff8082111561535457600080fd5b818501915085601f83011261536857600080fd5b813560208282111561537c5761537c615272565b8160051b61538b828201615288565b928352848101820192828101908a8511156153a557600080fd5b958301955b848710156153c3578635825295830195908301906153aa565b97505050860135925050808211156153da57600080fd5b506153e7858286016152b9565b915050925092905056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4730644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a26469706673582212207a4968b5317023c5b47a2108863e4850a34d6d7ed69ac30b2bbb0bc95c1ed01564736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} \ No newline at end of file diff --git a/backend/src/contracts/abi/Verifier.json b/backend/src/contracts/abi/SolvencyVerifier.json similarity index 100% rename from backend/src/contracts/abi/Verifier.json rename to backend/src/contracts/abi/SolvencyVerifier.json diff --git a/backend/src/contracts/abi/Summa.json b/backend/src/contracts/abi/Summa.json index a377c505..2356f3a1 100644 --- a/backend/src/contracts/abi/Summa.json +++ b/backend/src/contracts/abi/Summa.json @@ -1 +1 @@ -{"_format":"hh-sol-artifact-1","contractName":"Summa","sourceName":"src/Summa.sol","abi":[{"inputs":[{"internalType":"contract IVerifier","name":"_verifier","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"components":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"indexed":false,"internalType":"struct Summa.AddressOwnershipProof[]","name":"addressOwnershipProofs","type":"tuple[]"}],"name":"AddressOwnershipProofSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mstRoot","type":"uint256"},{"components":[{"internalType":"string","name":"assetName","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"indexed":false,"internalType":"struct Summa.Asset[]","name":"assets","type":"tuple[]"}],"name":"SolvencyProofSubmitted","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"addressOwnershipProofs","outputs":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"ownershipProofByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"internalType":"struct Summa.AddressOwnershipProof[]","name":"_addressOwnershipProofs","type":"tuple[]"}],"name":"submitProofOfAddressOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mstRoot","type":"uint256"},{"components":[{"internalType":"string","name":"assetName","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct Summa.Asset[]","name":"assets","type":"tuple[]"},{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"submitProofOfSolvency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"uint256[]","name":"publicInputs","type":"uint256[]"}],"name":"verifyZkProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"bytecode":"0x60a060405234801561001057600080fd5b506040516114de3803806114de83398101604081905261002f91610099565b61003833610049565b6001600160a01b03166080526100c9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100ab57600080fd5b81516001600160a01b03811681146100c257600080fd5b9392505050565b6080516113fa6100e4600039600061092901526113fa6000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063a3c4bcf81161005b578063a3c4bcf8146100f8578063c7ddca0e1461011b578063e691ad331461012e578063f2fde38b1461015157600080fd5b806323eb94a01461008d578063413a9f2d146100c0578063715018a6146100d55780638da5cb5b146100dd575b600080fd5b6100ad61009b366004610acd565b60026020526000908152604090205481565b6040519081526020015b60405180910390f35b6100d36100ce366004610c0d565b610164565b005b6100d36103ea565b6000546040516001600160a01b0390911681526020016100b7565b61010b610106366004610acd565b6103fe565b6040516100b79493929190610da7565b6100d3610129366004610dff565b61065e565b61014161013c366004610f59565b610908565b60405190151581526020016100b7565b6100d361015f366004611014565b6109aa565b61016c610a23565b6001546000036101e25760405162461bcd60e51b815260206004820152603660248201527f5468652043455820686173206e6f74207375626d697474656420616e792061646044820152756472657373206f776e6572736869702070726f6f667360501b60648201526084015b60405180910390fd5b6000835160016101f2919061105a565b67ffffffffffffffff81111561020a5761020a610ae6565b604051908082528060200260200182016040528015610233578160200160208202803683370190505b509050848160008151811061024a5761024a61106d565b60200260200101818152505060005b8451811015610345578481815181106102745761027461106d565b602002602001015160200151516000141580156102b0575084818151811061029e5761029e61106d565b60200260200101516000015151600014155b6102ec5760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908185cdcd95d609a1b60448201526064016101d9565b8481815181106102fe576102fe61106d565b60200260200101516040015182826001610318919061105a565b815181106103285761032861106d565b60209081029190910101528061033d81611083565b915050610259565b506103508382610908565b61038f5760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2102d2590383937b7b360811b60448201526064016101d9565b817f0473581c3cf437afc52207d88ce1541afbc7ce9fdb83b4d4d3b7214beed56ff5826000815181106103c4576103c461106d565b6020026020010151866040516103db92919061109c565b60405180910390a25050505050565b6103f2610a23565b6103fc6000610a7d565b565b6001818154811061040e57600080fd5b906000526020600020906004020160009150905080600001805461043190611133565b80601f016020809104026020016040519081016040528092919081815260200182805461045d90611133565b80156104aa5780601f1061047f576101008083540402835291602001916104aa565b820191906000526020600020905b81548152906001019060200180831161048d57829003601f168201915b5050505050908060010180546104bf90611133565b80601f01602080910402602001604051908101604052809291908181526020018280546104eb90611133565b80156105385780601f1061050d57610100808354040283529160200191610538565b820191906000526020600020905b81548152906001019060200180831161051b57829003601f168201915b50505050509080600201805461054d90611133565b80601f016020809104026020016040519081016040528092919081815260200182805461057990611133565b80156105c65780601f1061059b576101008083540402835291602001916105c6565b820191906000526020600020905b8154815290600101906020018083116105a957829003601f168201915b5050505050908060030180546105db90611133565b80601f016020809104026020016040519081016040528092919081815260200182805461060790611133565b80156106545780601f1061062957610100808354040283529160200191610654565b820191906000526020600020905b81548152906001019060200180831161063757829003601f168201915b5050505050905084565b610666610a23565b60005b81518110156108cd5760008282815181106106865761068661106d565b6020026020010151600001516040516020016106a2919061116d565b60408051601f1981840301815291815281516020928301206000818152600290935291205490915080156107185760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c7265616479207665726966696564000000000000000060448201526064016101d9565b61072383600161105a565b60008381526002602052604090205583516001908590859081106107495761074961106d565b6020908102919091018101518254600181018455600093845291909220825160049092020190819061077b90826111cf565b506020820151600182019061079090826111cf565b50604082015160028201906107a590826111cf565b50606082015160038201906107ba90826111cf565b5050508383815181106107cf576107cf61106d565b6020026020010151600001515160001415801561080b57508383815181106107f9576107f961106d565b60200260200101516020015151600014155b801561083657508383815181106108245761082461106d565b60200260200101516040015151600014155b8015610861575083838151811061084f5761084f61106d565b60200260200101516060015151600014155b6108b85760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642070726f6f66206f662061646472657373206f776e65727368604482015261069760f41b60648201526084016101d9565b505080806108c590611083565b915050610669565b507f382315d4d56a6035e1899bffe77d9becefaf5f2650e4323b27854857a0454658816040516108fd919061128f565b60405180910390a150565b6000610912610a23565b604051630bd205a960e41b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063bd205a9090610960908590879060040161134b565b602060405180830381865afa15801561097d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a191906113a2565b90505b92915050565b6109b2610a23565b6001600160a01b038116610a175760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016101d9565b610a2081610a7d565b50565b6000546001600160a01b031633146103fc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101d9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208284031215610adf57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715610b1f57610b1f610ae6565b60405290565b6040516080810167ffffffffffffffff81118282101715610b1f57610b1f610ae6565b604051601f8201601f1916810167ffffffffffffffff81118282101715610b7157610b71610ae6565b604052919050565b600067ffffffffffffffff821115610b9357610b93610ae6565b5060051b60200190565b600082601f830112610bae57600080fd5b813567ffffffffffffffff811115610bc857610bc8610ae6565b610bdb601f8201601f1916602001610b48565b818152846020838601011115610bf057600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215610c2357600080fd5b84359350602085013567ffffffffffffffff80821115610c4257600080fd5b818701915087601f830112610c5657600080fd5b610c68610c638335610b79565b610b48565b82358082526020808301929160051b8501018a811115610c8757600080fd5b602085015b81811015610d29578481351115610ca257600080fd5b803586016060818e03601f19011215610cba57600080fd5b610cc2610afc565b602082013587811115610cd457600080fd5b610ce38f602083860101610b9d565b825250604082013587811115610cf857600080fd5b610d078f602083860101610b9d565b6020838101919091526060939093013560408301525085529384019301610c8c565b5090965050506040870135915080821115610d4357600080fd5b50610d5087828801610b9d565b949793965093946060013593505050565b6000815180845260005b81811015610d8757602081850181015186830182015201610d6b565b506000602082860101526020601f19601f83011685010191505092915050565b608081526000610dba6080830187610d61565b8281036020840152610dcc8187610d61565b90508281036040840152610de08186610d61565b90508281036060840152610df48185610d61565b979650505050505050565b60006020808385031215610e1257600080fd5b823567ffffffffffffffff80821115610e2a57600080fd5b818501915085601f830112610e3e57600080fd5b8135610e4c610c6382610b79565b81815260059190911b83018401908481019088831115610e6b57600080fd5b8585015b83811015610f4c57803585811115610e8657600080fd5b86016080818c03601f19011215610e9d5760008081fd5b610ea5610b25565b8882013587811115610eb75760008081fd5b610ec58d8b83860101610b9d565b82525060408083013588811115610edc5760008081fd5b610eea8e8c83870101610b9d565b8b8401525060608084013589811115610f035760008081fd5b610f118f8d83880101610b9d565b83850152506080840135915088821115610f2b5760008081fd5b610f398e8c84870101610b9d565b9083015250845250918601918601610e6f565b5098975050505050505050565b60008060408385031215610f6c57600080fd5b823567ffffffffffffffff80821115610f8457600080fd5b610f9086838701610b9d565b9350602091508185013581811115610fa757600080fd5b85019050601f81018613610fba57600080fd5b8035610fc8610c6382610b79565b81815260059190911b82018301908381019088831115610fe757600080fd5b928401925b8284101561100557833582529284019290840190610fec565b80955050505050509250929050565b60006020828403121561102657600080fd5b81356001600160a01b038116811461103d57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156109a4576109a4611044565b634e487b7160e01b600052603260045260246000fd5b60006001820161109557611095611044565b5060010190565b6000604080830185845260208281860152818651808452606093508387019150838160051b88010183890160005b8381101561112357898303605f19018552815180518885526110ee89860182610d61565b905087820151858203898701526111058282610d61565b928b0151958b019590955250948601949250908501906001016110ca565b50909a9950505050505050505050565b600181811c9082168061114757607f821691505b60208210810361116757634e487b7160e01b600052602260045260246000fd5b50919050565b6020815260006109a16020830184610d61565b601f8211156111ca57600081815260208120601f850160051c810160208610156111a75750805b601f850160051c820191505b818110156111c6578281556001016111b3565b5050505b505050565b815167ffffffffffffffff8111156111e9576111e9610ae6565b6111fd816111f78454611133565b84611180565b602080601f831160018114611232576000841561121a5750858301515b600019600386901b1c1916600185901b1785556111c6565b600085815260208120601f198616915b8281101561126157888601518255948401946001909101908401611242565b508582101561127f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561133d57603f198984030185528151608081518186526112dc82870182610d61565b915050888201518582038a8701526112f48282610d61565b915050878201518582038987015261130c8282610d61565b915050606080830151925085820381870152506113298183610d61565b9689019694505050908601906001016112b6565b509098975050505050505050565b604080825283519082018190526000906020906060840190828701845b8281101561138457815184529284019290840190600101611368565b505050838103828501526113988186610d61565b9695505050505050565b6000602082840312156113b457600080fd5b8151801515811461103d57600080fdfea2646970667358221220cc9dfa8f3cf3ae556baea19ab18adc851c627ec21cbf91de48a59ef0b51103d064736f6c63430008120033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063a3c4bcf81161005b578063a3c4bcf8146100f8578063c7ddca0e1461011b578063e691ad331461012e578063f2fde38b1461015157600080fd5b806323eb94a01461008d578063413a9f2d146100c0578063715018a6146100d55780638da5cb5b146100dd575b600080fd5b6100ad61009b366004610acd565b60026020526000908152604090205481565b6040519081526020015b60405180910390f35b6100d36100ce366004610c0d565b610164565b005b6100d36103ea565b6000546040516001600160a01b0390911681526020016100b7565b61010b610106366004610acd565b6103fe565b6040516100b79493929190610da7565b6100d3610129366004610dff565b61065e565b61014161013c366004610f59565b610908565b60405190151581526020016100b7565b6100d361015f366004611014565b6109aa565b61016c610a23565b6001546000036101e25760405162461bcd60e51b815260206004820152603660248201527f5468652043455820686173206e6f74207375626d697474656420616e792061646044820152756472657373206f776e6572736869702070726f6f667360501b60648201526084015b60405180910390fd5b6000835160016101f2919061105a565b67ffffffffffffffff81111561020a5761020a610ae6565b604051908082528060200260200182016040528015610233578160200160208202803683370190505b509050848160008151811061024a5761024a61106d565b60200260200101818152505060005b8451811015610345578481815181106102745761027461106d565b602002602001015160200151516000141580156102b0575084818151811061029e5761029e61106d565b60200260200101516000015151600014155b6102ec5760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908185cdcd95d609a1b60448201526064016101d9565b8481815181106102fe576102fe61106d565b60200260200101516040015182826001610318919061105a565b815181106103285761032861106d565b60209081029190910101528061033d81611083565b915050610259565b506103508382610908565b61038f5760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2102d2590383937b7b360811b60448201526064016101d9565b817f0473581c3cf437afc52207d88ce1541afbc7ce9fdb83b4d4d3b7214beed56ff5826000815181106103c4576103c461106d565b6020026020010151866040516103db92919061109c565b60405180910390a25050505050565b6103f2610a23565b6103fc6000610a7d565b565b6001818154811061040e57600080fd5b906000526020600020906004020160009150905080600001805461043190611133565b80601f016020809104026020016040519081016040528092919081815260200182805461045d90611133565b80156104aa5780601f1061047f576101008083540402835291602001916104aa565b820191906000526020600020905b81548152906001019060200180831161048d57829003601f168201915b5050505050908060010180546104bf90611133565b80601f01602080910402602001604051908101604052809291908181526020018280546104eb90611133565b80156105385780601f1061050d57610100808354040283529160200191610538565b820191906000526020600020905b81548152906001019060200180831161051b57829003601f168201915b50505050509080600201805461054d90611133565b80601f016020809104026020016040519081016040528092919081815260200182805461057990611133565b80156105c65780601f1061059b576101008083540402835291602001916105c6565b820191906000526020600020905b8154815290600101906020018083116105a957829003601f168201915b5050505050908060030180546105db90611133565b80601f016020809104026020016040519081016040528092919081815260200182805461060790611133565b80156106545780601f1061062957610100808354040283529160200191610654565b820191906000526020600020905b81548152906001019060200180831161063757829003601f168201915b5050505050905084565b610666610a23565b60005b81518110156108cd5760008282815181106106865761068661106d565b6020026020010151600001516040516020016106a2919061116d565b60408051601f1981840301815291815281516020928301206000818152600290935291205490915080156107185760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c7265616479207665726966696564000000000000000060448201526064016101d9565b61072383600161105a565b60008381526002602052604090205583516001908590859081106107495761074961106d565b6020908102919091018101518254600181018455600093845291909220825160049092020190819061077b90826111cf565b506020820151600182019061079090826111cf565b50604082015160028201906107a590826111cf565b50606082015160038201906107ba90826111cf565b5050508383815181106107cf576107cf61106d565b6020026020010151600001515160001415801561080b57508383815181106107f9576107f961106d565b60200260200101516020015151600014155b801561083657508383815181106108245761082461106d565b60200260200101516040015151600014155b8015610861575083838151811061084f5761084f61106d565b60200260200101516060015151600014155b6108b85760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642070726f6f66206f662061646472657373206f776e65727368604482015261069760f41b60648201526084016101d9565b505080806108c590611083565b915050610669565b507f382315d4d56a6035e1899bffe77d9becefaf5f2650e4323b27854857a0454658816040516108fd919061128f565b60405180910390a150565b6000610912610a23565b604051630bd205a960e41b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063bd205a9090610960908590879060040161134b565b602060405180830381865afa15801561097d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a191906113a2565b90505b92915050565b6109b2610a23565b6001600160a01b038116610a175760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016101d9565b610a2081610a7d565b50565b6000546001600160a01b031633146103fc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101d9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208284031215610adf57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715610b1f57610b1f610ae6565b60405290565b6040516080810167ffffffffffffffff81118282101715610b1f57610b1f610ae6565b604051601f8201601f1916810167ffffffffffffffff81118282101715610b7157610b71610ae6565b604052919050565b600067ffffffffffffffff821115610b9357610b93610ae6565b5060051b60200190565b600082601f830112610bae57600080fd5b813567ffffffffffffffff811115610bc857610bc8610ae6565b610bdb601f8201601f1916602001610b48565b818152846020838601011115610bf057600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215610c2357600080fd5b84359350602085013567ffffffffffffffff80821115610c4257600080fd5b818701915087601f830112610c5657600080fd5b610c68610c638335610b79565b610b48565b82358082526020808301929160051b8501018a811115610c8757600080fd5b602085015b81811015610d29578481351115610ca257600080fd5b803586016060818e03601f19011215610cba57600080fd5b610cc2610afc565b602082013587811115610cd457600080fd5b610ce38f602083860101610b9d565b825250604082013587811115610cf857600080fd5b610d078f602083860101610b9d565b6020838101919091526060939093013560408301525085529384019301610c8c565b5090965050506040870135915080821115610d4357600080fd5b50610d5087828801610b9d565b949793965093946060013593505050565b6000815180845260005b81811015610d8757602081850181015186830182015201610d6b565b506000602082860101526020601f19601f83011685010191505092915050565b608081526000610dba6080830187610d61565b8281036020840152610dcc8187610d61565b90508281036040840152610de08186610d61565b90508281036060840152610df48185610d61565b979650505050505050565b60006020808385031215610e1257600080fd5b823567ffffffffffffffff80821115610e2a57600080fd5b818501915085601f830112610e3e57600080fd5b8135610e4c610c6382610b79565b81815260059190911b83018401908481019088831115610e6b57600080fd5b8585015b83811015610f4c57803585811115610e8657600080fd5b86016080818c03601f19011215610e9d5760008081fd5b610ea5610b25565b8882013587811115610eb75760008081fd5b610ec58d8b83860101610b9d565b82525060408083013588811115610edc5760008081fd5b610eea8e8c83870101610b9d565b8b8401525060608084013589811115610f035760008081fd5b610f118f8d83880101610b9d565b83850152506080840135915088821115610f2b5760008081fd5b610f398e8c84870101610b9d565b9083015250845250918601918601610e6f565b5098975050505050505050565b60008060408385031215610f6c57600080fd5b823567ffffffffffffffff80821115610f8457600080fd5b610f9086838701610b9d565b9350602091508185013581811115610fa757600080fd5b85019050601f81018613610fba57600080fd5b8035610fc8610c6382610b79565b81815260059190911b82018301908381019088831115610fe757600080fd5b928401925b8284101561100557833582529284019290840190610fec565b80955050505050509250929050565b60006020828403121561102657600080fd5b81356001600160a01b038116811461103d57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156109a4576109a4611044565b634e487b7160e01b600052603260045260246000fd5b60006001820161109557611095611044565b5060010190565b6000604080830185845260208281860152818651808452606093508387019150838160051b88010183890160005b8381101561112357898303605f19018552815180518885526110ee89860182610d61565b905087820151858203898701526111058282610d61565b928b0151958b019590955250948601949250908501906001016110ca565b50909a9950505050505050505050565b600181811c9082168061114757607f821691505b60208210810361116757634e487b7160e01b600052602260045260246000fd5b50919050565b6020815260006109a16020830184610d61565b601f8211156111ca57600081815260208120601f850160051c810160208610156111a75750805b601f850160051c820191505b818110156111c6578281556001016111b3565b5050505b505050565b815167ffffffffffffffff8111156111e9576111e9610ae6565b6111fd816111f78454611133565b84611180565b602080601f831160018114611232576000841561121a5750858301515b600019600386901b1c1916600185901b1785556111c6565b600085815260208120601f198616915b8281101561126157888601518255948401946001909101908401611242565b508582101561127f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561133d57603f198984030185528151608081518186526112dc82870182610d61565b915050888201518582038a8701526112f48282610d61565b915050878201518582038987015261130c8282610d61565b915050606080830151925085820381870152506113298183610d61565b9689019694505050908601906001016112b6565b509098975050505050505050565b604080825283519082018190526000906020906060840190828701845b8281101561138457815184529284019290840190600101611368565b505050838103828501526113988186610d61565b9695505050505050565b6000602082840312156113b457600080fd5b8151801515811461103d57600080fdfea2646970667358221220cc9dfa8f3cf3ae556baea19ab18adc851c627ec21cbf91de48a59ef0b51103d064736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} \ No newline at end of file +{"_format":"hh-sol-artifact-1","contractName":"Summa","sourceName":"src/Summa.sol","abi":[{"inputs":[{"internalType":"contract IVerifier","name":"_solvencyVerifier","type":"address"},{"internalType":"contract IVerifier","name":"_inclusionVerifier","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"components":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"indexed":false,"internalType":"struct Summa.AddressOwnershipProof[]","name":"addressOwnershipProofs","type":"tuple[]"}],"name":"AddressOwnershipProofSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mstRoot","type":"uint256"},{"components":[{"internalType":"string","name":"assetName","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"indexed":false,"internalType":"struct Summa.Asset[]","name":"assets","type":"tuple[]"}],"name":"SolvencyProofSubmitted","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"addressOwnershipProofs","outputs":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mstRoots","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"ownershipProofByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"cexAddress","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"internalType":"struct Summa.AddressOwnershipProof[]","name":"_addressOwnershipProofs","type":"tuple[]"}],"name":"submitProofOfAddressOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mstRoot","type":"uint256"},{"components":[{"internalType":"string","name":"assetName","type":"string"},{"internalType":"string","name":"chain","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct Summa.Asset[]","name":"assets","type":"tuple[]"},{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"submitProofOfSolvency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"uint256[]","name":"publicInputs","type":"uint256[]"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"verifyInclusionProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"proof","type":"bytes"},{"internalType":"uint256[]","name":"publicInputs","type":"uint256[]"}],"name":"verifySolvencyProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"bytecode":"0x60c06040523480156200001157600080fd5b50604051620016f3380380620016f38339810160408190526200003491620000c4565b6200003f3362000057565b6001600160a01b039182166080521660a052620000fc565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620000bf57600080fd5b919050565b60008060408385031215620000d857600080fd5b620000e383620000a7565b9150620000f360208401620000a7565b90509250929050565b60805160a0516115d1620001226000396000610a850152600061045e01526115d16000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c80638da5cb5b116100665780638da5cb5b14610136578063a3c4bcf814610151578063c7ddca0e14610174578063c8e5814714610187578063f2fde38b1461019a57600080fd5b806323eb94a0146100a3578063413a9f2d146100d65780636c7684fe146100eb578063715018a61461010e5780637f3bfb2e14610116575b600080fd5b6100c36100b1366004610c28565b60026020526000908152604090205481565b6040519081526020015b60405180910390f35b6100e96100e4366004610d68565b6101ad565b005b6100fe6100f9366004610f22565b610444565b60405190151581526020016100cd565b6100e96104df565b6100c3610124366004610c28565b60036020526000908152604090205481565b6000546040516001600160a01b0390911681526020016100cd565b61016461015f366004610c28565b6104f3565b6040516100cd9493929190610fcc565b6100e9610182366004611024565b610753565b6100fe61019536600461117e565b6109fd565b6100e96101a83660046111eb565b610b05565b6101b5610b7e565b60015460000361022b5760405162461bcd60e51b815260206004820152603660248201527f5468652043455820686173206e6f74207375626d697474656420616e792061646044820152756472657373206f776e6572736869702070726f6f667360501b60648201526084015b60405180910390fd5b60008351600161023b9190611231565b67ffffffffffffffff81111561025357610253610c41565b60405190808252806020026020018201604052801561027c578160200160208202803683370190505b509050848160008151811061029357610293611244565b60200260200101818152505060005b845181101561038e578481815181106102bd576102bd611244565b602002602001015160200151516000141580156102f957508481815181106102e7576102e7611244565b60200260200101516000015151600014155b6103355760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908185cdcd95d609a1b6044820152606401610222565b84818151811061034757610347611244565b602002602001015160400151828260016103619190611231565b8151811061037157610371611244565b6020908102919091010152806103868161125a565b9150506102a2565b506103998382610444565b6103d85760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2102d2590383937b7b360811b6044820152606401610222565b6000828152600360205260408120869055815183917f0473581c3cf437afc52207d88ce1541afbc7ce9fdb83b4d4d3b7214beed56ff59184919061041e5761041e611244565b602002602001015186604051610435929190611273565b60405180910390a25050505050565b604051630bd205a960e41b81526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063bd205a9090610495908590879060040161130a565b602060405180830381865afa1580156104b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d69190611361565b90505b92915050565b6104e7610b7e565b6104f16000610bd8565b565b6001818154811061050357600080fd5b906000526020600020906004020160009150905080600001805461052690611383565b80601f016020809104026020016040519081016040528092919081815260200182805461055290611383565b801561059f5780601f106105745761010080835404028352916020019161059f565b820191906000526020600020905b81548152906001019060200180831161058257829003601f168201915b5050505050908060010180546105b490611383565b80601f01602080910402602001604051908101604052809291908181526020018280546105e090611383565b801561062d5780601f106106025761010080835404028352916020019161062d565b820191906000526020600020905b81548152906001019060200180831161061057829003601f168201915b50505050509080600201805461064290611383565b80601f016020809104026020016040519081016040528092919081815260200182805461066e90611383565b80156106bb5780601f10610690576101008083540402835291602001916106bb565b820191906000526020600020905b81548152906001019060200180831161069e57829003601f168201915b5050505050908060030180546106d090611383565b80601f01602080910402602001604051908101604052809291908181526020018280546106fc90611383565b80156107495780601f1061071e57610100808354040283529160200191610749565b820191906000526020600020905b81548152906001019060200180831161072c57829003601f168201915b5050505050905084565b61075b610b7e565b60005b81518110156109c257600082828151811061077b5761077b611244565b60200260200101516000015160405160200161079791906113bd565b60408051601f19818403018152918152815160209283012060008181526002909352912054909150801561080d5760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920766572696669656400000000000000006044820152606401610222565b610818836001611231565b600083815260026020526040902055835160019085908590811061083e5761083e611244565b60209081029190910181015182546001810184556000938452919092208251600490920201908190610870908261141f565b5060208201516001820190610885908261141f565b506040820151600282019061089a908261141f565b50606082015160038201906108af908261141f565b5050508383815181106108c4576108c4611244565b6020026020010151600001515160001415801561090057508383815181106108ee576108ee611244565b60200260200101516020015151600014155b801561092b575083838151811061091957610919611244565b60200260200101516040015151600014155b8015610956575083838151811061094457610944611244565b60200260200101516060015151600014155b6109ad5760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642070726f6f66206f662061646472657373206f776e65727368604482015261069760f41b6064820152608401610222565b505080806109ba9061125a565b91505061075e565b507f382315d4d56a6035e1899bffe77d9becefaf5f2650e4323b27854857a0454658816040516109f291906114df565b60405180910390a150565b600082600181518110610a1257610a12611244565b6020026020010151600360008481526020019081526020016000205414610a6e5760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081354d5081c9bdbdd60821b6044820152606401610222565b604051630bd205a960e41b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063bd205a9090610abc908690889060040161130a565b602060405180830381865afa158015610ad9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afd9190611361565b949350505050565b610b0d610b7e565b6001600160a01b038116610b725760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610222565b610b7b81610bd8565b50565b6000546001600160a01b031633146104f15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610222565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208284031215610c3a57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715610c7a57610c7a610c41565b60405290565b6040516080810167ffffffffffffffff81118282101715610c7a57610c7a610c41565b604051601f8201601f1916810167ffffffffffffffff81118282101715610ccc57610ccc610c41565b604052919050565b600067ffffffffffffffff821115610cee57610cee610c41565b5060051b60200190565b600082601f830112610d0957600080fd5b813567ffffffffffffffff811115610d2357610d23610c41565b610d36601f8201601f1916602001610ca3565b818152846020838601011115610d4b57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215610d7e57600080fd5b84359350602085013567ffffffffffffffff80821115610d9d57600080fd5b818701915087601f830112610db157600080fd5b610dc3610dbe8335610cd4565b610ca3565b82358082526020808301929160051b8501018a811115610de257600080fd5b602085015b81811015610e84578481351115610dfd57600080fd5b803586016060818e03601f19011215610e1557600080fd5b610e1d610c57565b602082013587811115610e2f57600080fd5b610e3e8f602083860101610cf8565b825250604082013587811115610e5357600080fd5b610e628f602083860101610cf8565b6020838101919091526060939093013560408301525085529384019301610de7565b5090965050506040870135915080821115610e9e57600080fd5b50610eab87828801610cf8565b949793965093946060013593505050565b600082601f830112610ecd57600080fd5b81356020610edd610dbe83610cd4565b82815260059290921b84018101918181019086841115610efc57600080fd5b8286015b84811015610f175780358352918301918301610f00565b509695505050505050565b60008060408385031215610f3557600080fd5b823567ffffffffffffffff80821115610f4d57600080fd5b610f5986838701610cf8565b93506020850135915080821115610f6f57600080fd5b50610f7c85828601610ebc565b9150509250929050565b6000815180845260005b81811015610fac57602081850181015186830182015201610f90565b506000602082860101526020601f19601f83011685010191505092915050565b608081526000610fdf6080830187610f86565b8281036020840152610ff18187610f86565b905082810360408401526110058186610f86565b905082810360608401526110198185610f86565b979650505050505050565b6000602080838503121561103757600080fd5b823567ffffffffffffffff8082111561104f57600080fd5b818501915085601f83011261106357600080fd5b8135611071610dbe82610cd4565b81815260059190911b8301840190848101908883111561109057600080fd5b8585015b83811015611171578035858111156110ab57600080fd5b86016080818c03601f190112156110c25760008081fd5b6110ca610c80565b88820135878111156110dc5760008081fd5b6110ea8d8b83860101610cf8565b825250604080830135888111156111015760008081fd5b61110f8e8c83870101610cf8565b8b84015250606080840135898111156111285760008081fd5b6111368f8d83880101610cf8565b838501525060808401359150888211156111505760008081fd5b61115e8e8c84870101610cf8565b9083015250845250918601918601611094565b5098975050505050505050565b60008060006060848603121561119357600080fd5b833567ffffffffffffffff808211156111ab57600080fd5b6111b787838801610cf8565b945060208601359150808211156111cd57600080fd5b506111da86828701610ebc565b925050604084013590509250925092565b6000602082840312156111fd57600080fd5b81356001600160a01b038116811461121457600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156104d9576104d961121b565b634e487b7160e01b600052603260045260246000fd5b60006001820161126c5761126c61121b565b5060010190565b6000604080830185845260208281860152818651808452606093508387019150838160051b88010183890160005b838110156112fa57898303605f19018552815180518885526112c589860182610f86565b905087820151858203898701526112dc8282610f86565b928b0151958b019590955250948601949250908501906001016112a1565b50909a9950505050505050505050565b604080825283519082018190526000906020906060840190828701845b8281101561134357815184529284019290840190600101611327565b505050838103828501526113578186610f86565b9695505050505050565b60006020828403121561137357600080fd5b8151801515811461121457600080fd5b600181811c9082168061139757607f821691505b6020821081036113b757634e487b7160e01b600052602260045260246000fd5b50919050565b6020815260006104d66020830184610f86565b601f82111561141a57600081815260208120601f850160051c810160208610156113f75750805b601f850160051c820191505b8181101561141657828155600101611403565b5050505b505050565b815167ffffffffffffffff81111561143957611439610c41565b61144d816114478454611383565b846113d0565b602080601f831160018114611482576000841561146a5750858301515b600019600386901b1c1916600185901b178555611416565b600085815260208120601f198616915b828110156114b157888601518255948401946001909101908401611492565b50858210156114cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561158d57603f1989840301855281516080815181865261152c82870182610f86565b915050888201518582038a8701526115448282610f86565b915050878201518582038987015261155c8282610f86565b915050606080830151925085820381870152506115798183610f86565b968901969450505090860190600101611506565b50909897505050505050505056fea26469706673582212205892833baedff2908a642dc60ace741d7f4d60e2a24958e9ef1d8db67a8df3b264736f6c63430008120033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061009e5760003560e01c80638da5cb5b116100665780638da5cb5b14610136578063a3c4bcf814610151578063c7ddca0e14610174578063c8e5814714610187578063f2fde38b1461019a57600080fd5b806323eb94a0146100a3578063413a9f2d146100d65780636c7684fe146100eb578063715018a61461010e5780637f3bfb2e14610116575b600080fd5b6100c36100b1366004610c28565b60026020526000908152604090205481565b6040519081526020015b60405180910390f35b6100e96100e4366004610d68565b6101ad565b005b6100fe6100f9366004610f22565b610444565b60405190151581526020016100cd565b6100e96104df565b6100c3610124366004610c28565b60036020526000908152604090205481565b6000546040516001600160a01b0390911681526020016100cd565b61016461015f366004610c28565b6104f3565b6040516100cd9493929190610fcc565b6100e9610182366004611024565b610753565b6100fe61019536600461117e565b6109fd565b6100e96101a83660046111eb565b610b05565b6101b5610b7e565b60015460000361022b5760405162461bcd60e51b815260206004820152603660248201527f5468652043455820686173206e6f74207375626d697474656420616e792061646044820152756472657373206f776e6572736869702070726f6f667360501b60648201526084015b60405180910390fd5b60008351600161023b9190611231565b67ffffffffffffffff81111561025357610253610c41565b60405190808252806020026020018201604052801561027c578160200160208202803683370190505b509050848160008151811061029357610293611244565b60200260200101818152505060005b845181101561038e578481815181106102bd576102bd611244565b602002602001015160200151516000141580156102f957508481815181106102e7576102e7611244565b60200260200101516000015151600014155b6103355760405162461bcd60e51b815260206004820152600d60248201526c125b9d985b1a5908185cdcd95d609a1b6044820152606401610222565b84818151811061034757610347611244565b602002602001015160400151828260016103619190611231565b8151811061037157610371611244565b6020908102919091010152806103868161125a565b9150506102a2565b506103998382610444565b6103d85760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2102d2590383937b7b360811b6044820152606401610222565b6000828152600360205260408120869055815183917f0473581c3cf437afc52207d88ce1541afbc7ce9fdb83b4d4d3b7214beed56ff59184919061041e5761041e611244565b602002602001015186604051610435929190611273565b60405180910390a25050505050565b604051630bd205a960e41b81526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063bd205a9090610495908590879060040161130a565b602060405180830381865afa1580156104b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d69190611361565b90505b92915050565b6104e7610b7e565b6104f16000610bd8565b565b6001818154811061050357600080fd5b906000526020600020906004020160009150905080600001805461052690611383565b80601f016020809104026020016040519081016040528092919081815260200182805461055290611383565b801561059f5780601f106105745761010080835404028352916020019161059f565b820191906000526020600020905b81548152906001019060200180831161058257829003601f168201915b5050505050908060010180546105b490611383565b80601f01602080910402602001604051908101604052809291908181526020018280546105e090611383565b801561062d5780601f106106025761010080835404028352916020019161062d565b820191906000526020600020905b81548152906001019060200180831161061057829003601f168201915b50505050509080600201805461064290611383565b80601f016020809104026020016040519081016040528092919081815260200182805461066e90611383565b80156106bb5780601f10610690576101008083540402835291602001916106bb565b820191906000526020600020905b81548152906001019060200180831161069e57829003601f168201915b5050505050908060030180546106d090611383565b80601f01602080910402602001604051908101604052809291908181526020018280546106fc90611383565b80156107495780601f1061071e57610100808354040283529160200191610749565b820191906000526020600020905b81548152906001019060200180831161072c57829003601f168201915b5050505050905084565b61075b610b7e565b60005b81518110156109c257600082828151811061077b5761077b611244565b60200260200101516000015160405160200161079791906113bd565b60408051601f19818403018152918152815160209283012060008181526002909352912054909150801561080d5760405162461bcd60e51b815260206004820152601860248201527f4164647265737320616c726561647920766572696669656400000000000000006044820152606401610222565b610818836001611231565b600083815260026020526040902055835160019085908590811061083e5761083e611244565b60209081029190910181015182546001810184556000938452919092208251600490920201908190610870908261141f565b5060208201516001820190610885908261141f565b506040820151600282019061089a908261141f565b50606082015160038201906108af908261141f565b5050508383815181106108c4576108c4611244565b6020026020010151600001515160001415801561090057508383815181106108ee576108ee611244565b60200260200101516020015151600014155b801561092b575083838151811061091957610919611244565b60200260200101516040015151600014155b8015610956575083838151811061094457610944611244565b60200260200101516060015151600014155b6109ad5760405162461bcd60e51b815260206004820152602260248201527f496e76616c69642070726f6f66206f662061646472657373206f776e65727368604482015261069760f41b6064820152608401610222565b505080806109ba9061125a565b91505061075e565b507f382315d4d56a6035e1899bffe77d9becefaf5f2650e4323b27854857a0454658816040516109f291906114df565b60405180910390a150565b600082600181518110610a1257610a12611244565b6020026020010151600360008481526020019081526020016000205414610a6e5760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081354d5081c9bdbdd60821b6044820152606401610222565b604051630bd205a960e41b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063bd205a9090610abc908690889060040161130a565b602060405180830381865afa158015610ad9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afd9190611361565b949350505050565b610b0d610b7e565b6001600160a01b038116610b725760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610222565b610b7b81610bd8565b50565b6000546001600160a01b031633146104f15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610222565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208284031215610c3a57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715610c7a57610c7a610c41565b60405290565b6040516080810167ffffffffffffffff81118282101715610c7a57610c7a610c41565b604051601f8201601f1916810167ffffffffffffffff81118282101715610ccc57610ccc610c41565b604052919050565b600067ffffffffffffffff821115610cee57610cee610c41565b5060051b60200190565b600082601f830112610d0957600080fd5b813567ffffffffffffffff811115610d2357610d23610c41565b610d36601f8201601f1916602001610ca3565b818152846020838601011115610d4b57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215610d7e57600080fd5b84359350602085013567ffffffffffffffff80821115610d9d57600080fd5b818701915087601f830112610db157600080fd5b610dc3610dbe8335610cd4565b610ca3565b82358082526020808301929160051b8501018a811115610de257600080fd5b602085015b81811015610e84578481351115610dfd57600080fd5b803586016060818e03601f19011215610e1557600080fd5b610e1d610c57565b602082013587811115610e2f57600080fd5b610e3e8f602083860101610cf8565b825250604082013587811115610e5357600080fd5b610e628f602083860101610cf8565b6020838101919091526060939093013560408301525085529384019301610de7565b5090965050506040870135915080821115610e9e57600080fd5b50610eab87828801610cf8565b949793965093946060013593505050565b600082601f830112610ecd57600080fd5b81356020610edd610dbe83610cd4565b82815260059290921b84018101918181019086841115610efc57600080fd5b8286015b84811015610f175780358352918301918301610f00565b509695505050505050565b60008060408385031215610f3557600080fd5b823567ffffffffffffffff80821115610f4d57600080fd5b610f5986838701610cf8565b93506020850135915080821115610f6f57600080fd5b50610f7c85828601610ebc565b9150509250929050565b6000815180845260005b81811015610fac57602081850181015186830182015201610f90565b506000602082860101526020601f19601f83011685010191505092915050565b608081526000610fdf6080830187610f86565b8281036020840152610ff18187610f86565b905082810360408401526110058186610f86565b905082810360608401526110198185610f86565b979650505050505050565b6000602080838503121561103757600080fd5b823567ffffffffffffffff8082111561104f57600080fd5b818501915085601f83011261106357600080fd5b8135611071610dbe82610cd4565b81815260059190911b8301840190848101908883111561109057600080fd5b8585015b83811015611171578035858111156110ab57600080fd5b86016080818c03601f190112156110c25760008081fd5b6110ca610c80565b88820135878111156110dc5760008081fd5b6110ea8d8b83860101610cf8565b825250604080830135888111156111015760008081fd5b61110f8e8c83870101610cf8565b8b84015250606080840135898111156111285760008081fd5b6111368f8d83880101610cf8565b838501525060808401359150888211156111505760008081fd5b61115e8e8c84870101610cf8565b9083015250845250918601918601611094565b5098975050505050505050565b60008060006060848603121561119357600080fd5b833567ffffffffffffffff808211156111ab57600080fd5b6111b787838801610cf8565b945060208601359150808211156111cd57600080fd5b506111da86828701610ebc565b925050604084013590509250925092565b6000602082840312156111fd57600080fd5b81356001600160a01b038116811461121457600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156104d9576104d961121b565b634e487b7160e01b600052603260045260246000fd5b60006001820161126c5761126c61121b565b5060010190565b6000604080830185845260208281860152818651808452606093508387019150838160051b88010183890160005b838110156112fa57898303605f19018552815180518885526112c589860182610f86565b905087820151858203898701526112dc8282610f86565b928b0151958b019590955250948601949250908501906001016112a1565b50909a9950505050505050505050565b604080825283519082018190526000906020906060840190828701845b8281101561134357815184529284019290840190600101611327565b505050838103828501526113578186610f86565b9695505050505050565b60006020828403121561137357600080fd5b8151801515811461121457600080fd5b600181811c9082168061139757607f821691505b6020821081036113b757634e487b7160e01b600052602260045260246000fd5b50919050565b6020815260006104d66020830184610f86565b601f82111561141a57600081815260208120601f850160051c810160208610156113f75750805b601f850160051c820191505b8181101561141657828155600101611403565b5050505b505050565b815167ffffffffffffffff81111561143957611439610c41565b61144d816114478454611383565b846113d0565b602080601f831160018114611482576000841561146a5750858301515b600019600386901b1c1916600185901b178555611416565b600085815260208120601f198616915b828110156114b157888601518255948401946001909101908401611492565b50858210156114cf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561158d57603f1989840301855281516080815181865261152c82870182610f86565b915050888201518582038a8701526115448282610f86565b915050878201518582038987015261155c8282610f86565b915050606080830151925085820381870152506115798183610f86565b968901969450505090860190600101611506565b50909897505050505050505056fea26469706673582212205892833baedff2908a642dc60ace741d7f4d60e2a24958e9ef1d8db67a8df3b264736f6c63430008120033","linkReferences":{},"deployedLinkReferences":{}} \ No newline at end of file diff --git a/backend/src/contracts/generated/inclusion_verifier.rs b/backend/src/contracts/generated/inclusion_verifier.rs new file mode 100644 index 00000000..56b5f744 --- /dev/null +++ b/backend/src/contracts/generated/inclusion_verifier.rs @@ -0,0 +1,43403 @@ +pub use inclusion_verifier::*; +/// This module was auto-generated with ethers-rs Abigen. +/// More information at: +#[allow( + clippy::enum_variant_names, + clippy::too_many_arguments, + clippy::upper_case_acronyms, + clippy::type_complexity, + dead_code, + non_camel_case_types, +)] +pub mod inclusion_verifier { + #[rustfmt::skip] + const __ABI: &str = "[{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"pubInputs\",\"type\":\"uint256[]\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"verify\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\",\"components\":[]}]}]"; + ///The parsed JSON ABI of the contract. + pub static INCLUSIONVERIFIER_ABI: ::ethers::contract::Lazy< + ::ethers::core::abi::Abi, + > = ::ethers::contract::Lazy::new(|| { + ::ethers::core::utils::__serde_json::from_str(__ABI) + .expect("ABI is always valid") + }); + #[rustfmt::skip] + const __BYTECODE: &[u8] = &[ + 96, + 128, + 96, + 64, + 82, + 52, + 128, + 21, + 97, + 0, + 16, + 87, + 96, + 0, + 128, + 253, + 91, + 80, + 97, + 84, + 103, + 128, + 97, + 0, + 32, + 96, + 0, + 57, + 96, + 0, + 243, + 254, + 96, + 128, + 96, + 64, + 82, + 52, + 128, + 21, + 97, + 0, + 16, + 87, + 96, + 0, + 128, + 253, + 91, + 80, + 96, + 4, + 54, + 16, + 97, + 0, + 43, + 87, + 96, + 0, + 53, + 96, + 224, + 28, + 128, + 99, + 189, + 32, + 90, + 144, + 20, + 97, + 0, + 48, + 87, + 91, + 96, + 0, + 128, + 253, + 91, + 97, + 0, + 67, + 97, + 0, + 62, + 54, + 96, + 4, + 97, + 83, + 41, + 86, + 91, + 97, + 0, + 87, + 86, + 91, + 96, + 64, + 81, + 144, + 21, + 21, + 129, + 82, + 96, + 32, + 1, + 96, + 64, + 81, + 128, + 145, + 3, + 144, + 243, + 91, + 96, + 0, + 96, + 1, + 97, + 0, + 99, + 97, + 82, + 82, + 86, + 91, + 96, + 0, + 128, + 81, + 96, + 32, + 97, + 84, + 18, + 131, + 57, + 129, + 81, + 145, + 82, + 97, + 0, + 217, + 86, + 91, + 96, + 0, + 128, + 81, + 96, + 32, + 97, + 83, + 242, + 131, + 57, + 129, + 81, + 145, + 82, + 128, + 131, + 16, + 129, + 131, + 16, + 22, + 144, + 131, + 128, + 9, + 96, + 0, + 128, + 81, + 96, + 32, + 97, + 83, + 242, + 131, + 57, + 129, + 81, + 145, + 82, + 131, + 132, + 9, + 96, + 0, + 128, + 81, + 96, + 32, + 97, + 83, + 242, + 131, + 57, + 129, + 81, + 145, + 82, + 132, + 130, + 9, + 144, + 80, + 96, + 0, + 128, + 81, + 96, + 32, + 97, + 83, + 242, + 131, + 57, + 129, + 81, + 145, + 82, + 96, + 3, + 130, + 8, + 145, + 144, + 145, + 20, + 145, + 144, + 145, + 22, + 147, + 146, + 80, + 80, + 80, + 86, + 91, + 128, + 96, + 32, + 135, + 1, + 81, + 6, + 96, + 32, + 131, + 1, + 82, + 128, + 96, + 64, + 135, + 1, + 81, + 6, + 96, + 64, + 131, + 1, + 82, + 127, + 38, + 193, + 43, + 159, + 215, + 235, + 27, + 179, + 58, + 37, + 52, + 26, + 180, + 175, + 45, + 179, + 52, + 191, + 10, + 194, + 219, + 95, + 24, + 162, + 24, + 72, + 32, + 168, + 65, + 244, + 142, + 166, + 96, + 0, + 131, + 1, + 82, + 96, + 32, + 133, + 1, + 81, + 128, + 96, + 96, + 132, + 1, + 82, + 96, + 64, + 134, + 1, + 81, + 128, + 96, + 128, + 133, + 1, + 82, + 132, + 97, + 1, + 56, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 96, + 96, + 133, + 1, + 81, + 128, + 96, + 160, + 132, + 1, + 82, + 96, + 128, + 134, + 1, + 81, + 128, + 96, + 192, + 133, + 1, + 82, + 132, + 97, + 1, + 94, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 96, + 160, + 133, + 1, + 81, + 128, + 96, + 224, + 132, + 1, + 82, + 96, + 192, + 134, + 1, + 81, + 128, + 97, + 1, + 0, + 133, + 1, + 82, + 132, + 97, + 1, + 133, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 97, + 1, + 32, + 96, + 0, + 131, + 1, + 32, + 97, + 1, + 32, + 131, + 1, + 82, + 97, + 1, + 32, + 130, + 1, + 81, + 129, + 129, + 6, + 97, + 1, + 64, + 132, + 1, + 82, + 128, + 97, + 1, + 96, + 132, + 1, + 82, + 80, + 96, + 224, + 133, + 1, + 81, + 128, + 97, + 1, + 128, + 132, + 1, + 82, + 97, + 1, + 0, + 134, + 1, + 81, + 128, + 97, + 1, + 160, + 133, + 1, + 82, + 132, + 97, + 1, + 211, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 97, + 1, + 32, + 133, + 1, + 81, + 128, + 97, + 1, + 192, + 132, + 1, + 82, + 97, + 1, + 64, + 134, + 1, + 81, + 128, + 97, + 1, + 224, + 133, + 1, + 82, + 132, + 97, + 1, + 253, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 96, + 160, + 97, + 1, + 96, + 135, + 1, + 32, + 97, + 2, + 0, + 135, + 1, + 129, + 144, + 82, + 133, + 129, + 6, + 97, + 2, + 32, + 136, + 1, + 82, + 97, + 2, + 64, + 135, + 1, + 82, + 22, + 148, + 80, + 96, + 1, + 145, + 80, + 80, + 97, + 2, + 96, + 131, + 1, + 83, + 96, + 33, + 97, + 2, + 64, + 131, + 1, + 32, + 97, + 2, + 96, + 131, + 1, + 129, + 144, + 82, + 129, + 129, + 6, + 97, + 2, + 128, + 132, + 1, + 82, + 97, + 2, + 160, + 131, + 1, + 82, + 97, + 1, + 96, + 133, + 1, + 81, + 97, + 2, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 1, + 128, + 134, + 1, + 81, + 97, + 2, + 224, + 132, + 1, + 129, + 144, + 82, + 132, + 97, + 2, + 112, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 97, + 1, + 160, + 133, + 1, + 81, + 128, + 97, + 3, + 0, + 132, + 1, + 82, + 97, + 1, + 192, + 134, + 1, + 81, + 128, + 97, + 3, + 32, + 133, + 1, + 82, + 132, + 97, + 2, + 154, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 97, + 1, + 224, + 133, + 1, + 81, + 128, + 97, + 3, + 64, + 132, + 1, + 82, + 97, + 2, + 0, + 134, + 1, + 81, + 128, + 97, + 3, + 96, + 133, + 1, + 82, + 132, + 97, + 2, + 196, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 97, + 2, + 32, + 133, + 1, + 81, + 128, + 97, + 3, + 128, + 132, + 1, + 82, + 97, + 2, + 64, + 134, + 1, + 81, + 128, + 97, + 3, + 160, + 133, + 1, + 82, + 132, + 97, + 2, + 238, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 97, + 1, + 32, + 97, + 2, + 160, + 131, + 1, + 32, + 97, + 3, + 192, + 131, + 1, + 82, + 97, + 3, + 192, + 130, + 1, + 81, + 129, + 129, + 6, + 97, + 3, + 224, + 132, + 1, + 82, + 128, + 97, + 4, + 0, + 132, + 1, + 82, + 80, + 97, + 2, + 96, + 133, + 1, + 81, + 128, + 97, + 4, + 32, + 132, + 1, + 82, + 97, + 2, + 128, + 134, + 1, + 81, + 128, + 97, + 4, + 64, + 133, + 1, + 82, + 132, + 97, + 3, + 62, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 97, + 2, + 160, + 133, + 1, + 81, + 128, + 97, + 4, + 96, + 132, + 1, + 82, + 97, + 2, + 192, + 134, + 1, + 81, + 128, + 97, + 4, + 128, + 133, + 1, + 82, + 132, + 97, + 3, + 104, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 97, + 2, + 224, + 133, + 1, + 81, + 128, + 97, + 4, + 160, + 132, + 1, + 82, + 97, + 3, + 0, + 134, + 1, + 81, + 128, + 97, + 4, + 192, + 133, + 1, + 82, + 132, + 97, + 3, + 146, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 97, + 3, + 32, + 133, + 1, + 81, + 128, + 97, + 4, + 224, + 132, + 1, + 82, + 97, + 3, + 64, + 134, + 1, + 81, + 128, + 97, + 5, + 0, + 133, + 1, + 82, + 132, + 97, + 3, + 188, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 97, + 3, + 96, + 133, + 1, + 81, + 128, + 97, + 5, + 32, + 132, + 1, + 82, + 97, + 3, + 128, + 134, + 1, + 81, + 128, + 97, + 5, + 64, + 133, + 1, + 82, + 132, + 97, + 3, + 230, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 97, + 1, + 96, + 97, + 4, + 0, + 131, + 1, + 32, + 97, + 5, + 96, + 131, + 1, + 82, + 97, + 5, + 96, + 130, + 1, + 81, + 129, + 129, + 6, + 97, + 5, + 128, + 132, + 1, + 82, + 128, + 97, + 5, + 160, + 132, + 1, + 82, + 80, + 128, + 97, + 3, + 160, + 134, + 1, + 81, + 6, + 97, + 5, + 192, + 131, + 1, + 82, + 128, + 97, + 3, + 192, + 134, + 1, + 81, + 6, + 97, + 5, + 224, + 131, + 1, + 82, + 128, + 97, + 3, + 224, + 134, + 1, + 81, + 6, + 97, + 6, + 0, + 131, + 1, + 82, + 128, + 97, + 4, + 0, + 134, + 1, + 81, + 6, + 97, + 6, + 32, + 131, + 1, + 82, + 128, + 97, + 4, + 32, + 134, + 1, + 81, + 6, + 97, + 6, + 64, + 131, + 1, + 82, + 128, + 97, + 4, + 64, + 134, + 1, + 81, + 6, + 97, + 6, + 96, + 131, + 1, + 82, + 128, + 97, + 4, + 96, + 134, + 1, + 81, + 6, + 97, + 6, + 128, + 131, + 1, + 82, + 128, + 97, + 4, + 128, + 134, + 1, + 81, + 6, + 97, + 6, + 160, + 131, + 1, + 82, + 128, + 97, + 4, + 160, + 134, + 1, + 81, + 6, + 97, + 6, + 192, + 131, + 1, + 82, + 128, + 97, + 4, + 192, + 134, + 1, + 81, + 6, + 97, + 6, + 224, + 131, + 1, + 82, + 128, + 97, + 4, + 224, + 134, + 1, + 81, + 6, + 97, + 7, + 0, + 131, + 1, + 82, + 128, + 97, + 5, + 0, + 134, + 1, + 81, + 6, + 97, + 7, + 32, + 131, + 1, + 82, + 128, + 97, + 5, + 32, + 134, + 1, + 81, + 6, + 97, + 7, + 64, + 131, + 1, + 82, + 128, + 97, + 5, + 64, + 134, + 1, + 81, + 6, + 97, + 7, + 96, + 131, + 1, + 82, + 128, + 97, + 5, + 96, + 134, + 1, + 81, + 6, + 97, + 7, + 128, + 131, + 1, + 82, + 128, + 97, + 5, + 128, + 134, + 1, + 81, + 6, + 97, + 7, + 160, + 131, + 1, + 82, + 128, + 97, + 5, + 160, + 134, + 1, + 81, + 6, + 97, + 7, + 192, + 131, + 1, + 82, + 128, + 97, + 5, + 192, + 134, + 1, + 81, + 6, + 97, + 7, + 224, + 131, + 1, + 82, + 128, + 97, + 5, + 224, + 134, + 1, + 81, + 6, + 97, + 8, + 0, + 131, + 1, + 82, + 128, + 97, + 6, + 0, + 134, + 1, + 81, + 6, + 97, + 8, + 32, + 131, + 1, + 82, + 128, + 97, + 6, + 32, + 134, + 1, + 81, + 6, + 97, + 8, + 64, + 131, + 1, + 82, + 128, + 97, + 6, + 64, + 134, + 1, + 81, + 6, + 97, + 8, + 96, + 131, + 1, + 82, + 128, + 97, + 6, + 96, + 134, + 1, + 81, + 6, + 97, + 8, + 128, + 131, + 1, + 82, + 128, + 97, + 6, + 128, + 134, + 1, + 81, + 6, + 97, + 8, + 160, + 131, + 1, + 82, + 128, + 97, + 6, + 160, + 134, + 1, + 81, + 6, + 97, + 8, + 192, + 131, + 1, + 82, + 128, + 97, + 6, + 192, + 134, + 1, + 81, + 6, + 97, + 8, + 224, + 131, + 1, + 82, + 128, + 97, + 6, + 224, + 134, + 1, + 81, + 6, + 97, + 9, + 0, + 131, + 1, + 82, + 128, + 97, + 7, + 0, + 134, + 1, + 81, + 6, + 97, + 9, + 32, + 131, + 1, + 82, + 128, + 97, + 7, + 32, + 134, + 1, + 81, + 6, + 97, + 9, + 64, + 131, + 1, + 82, + 128, + 97, + 7, + 64, + 134, + 1, + 81, + 6, + 97, + 9, + 96, + 131, + 1, + 82, + 128, + 97, + 7, + 96, + 134, + 1, + 81, + 6, + 97, + 9, + 128, + 131, + 1, + 82, + 128, + 97, + 7, + 128, + 134, + 1, + 81, + 6, + 97, + 9, + 160, + 131, + 1, + 82, + 128, + 97, + 7, + 160, + 134, + 1, + 81, + 6, + 97, + 9, + 192, + 131, + 1, + 82, + 128, + 97, + 7, + 192, + 134, + 1, + 81, + 6, + 97, + 9, + 224, + 131, + 1, + 82, + 128, + 97, + 7, + 224, + 134, + 1, + 81, + 6, + 97, + 10, + 0, + 131, + 1, + 82, + 97, + 4, + 128, + 97, + 5, + 160, + 131, + 1, + 32, + 97, + 10, + 32, + 131, + 1, + 82, + 97, + 10, + 32, + 130, + 1, + 81, + 129, + 129, + 6, + 97, + 10, + 64, + 132, + 1, + 82, + 128, + 97, + 10, + 96, + 132, + 1, + 82, + 80, + 96, + 1, + 97, + 10, + 128, + 131, + 1, + 83, + 96, + 33, + 97, + 10, + 96, + 131, + 1, + 32, + 97, + 10, + 128, + 131, + 1, + 129, + 144, + 82, + 129, + 129, + 6, + 97, + 10, + 160, + 132, + 1, + 82, + 97, + 10, + 192, + 131, + 1, + 82, + 97, + 8, + 0, + 133, + 1, + 81, + 97, + 10, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 8, + 32, + 134, + 1, + 81, + 97, + 11, + 0, + 132, + 1, + 129, + 144, + 82, + 132, + 97, + 6, + 111, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 96, + 96, + 97, + 10, + 192, + 131, + 1, + 32, + 97, + 11, + 32, + 131, + 1, + 82, + 97, + 11, + 32, + 130, + 1, + 81, + 129, + 129, + 6, + 97, + 11, + 64, + 132, + 1, + 82, + 128, + 97, + 11, + 96, + 132, + 1, + 82, + 80, + 97, + 8, + 64, + 133, + 1, + 81, + 128, + 97, + 11, + 128, + 132, + 1, + 82, + 97, + 8, + 96, + 134, + 1, + 81, + 128, + 97, + 11, + 160, + 133, + 1, + 82, + 132, + 97, + 6, + 190, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 128, + 97, + 5, + 128, + 131, + 1, + 81, + 97, + 5, + 128, + 132, + 1, + 81, + 9, + 97, + 11, + 192, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 11, + 224, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 12, + 0, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 12, + 32, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 12, + 64, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 12, + 96, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 12, + 128, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 12, + 160, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 12, + 192, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 12, + 224, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 13, + 0, + 131, + 1, + 82, + 128, + 127, + 48, + 100, + 78, + 114, + 225, + 49, + 160, + 41, + 184, + 80, + 69, + 182, + 129, + 129, + 88, + 93, + 40, + 51, + 232, + 72, + 121, + 185, + 112, + 145, + 67, + 225, + 245, + 147, + 240, + 0, + 0, + 0, + 97, + 13, + 0, + 132, + 1, + 81, + 8, + 97, + 13, + 32, + 131, + 1, + 82, + 128, + 127, + 48, + 94, + 65, + 233, + 18, + 213, + 121, + 245, + 179, + 25, + 59, + 173, + 202, + 177, + 40, + 50, + 28, + 142, + 225, + 203, + 112, + 170, + 57, + 99, + 49, + 185, + 121, + 85, + 61, + 130, + 0, + 1, + 97, + 13, + 32, + 132, + 1, + 81, + 9, + 97, + 13, + 64, + 131, + 1, + 82, + 128, + 127, + 34, + 181, + 86, + 3, + 88, + 109, + 95, + 196, + 44, + 108, + 20, + 194, + 252, + 39, + 160, + 40, + 194, + 7, + 218, + 139, + 44, + 113, + 203, + 51, + 213, + 73, + 250, + 74, + 43, + 229, + 211, + 2, + 97, + 13, + 64, + 132, + 1, + 81, + 9, + 97, + 13, + 96, + 131, + 1, + 82, + 128, + 127, + 13, + 174, + 248, + 111, + 136, + 196, + 64, + 101, + 139, + 228, + 48, + 243, + 133, + 89, + 184, + 52, + 102, + 44, + 13, + 189, + 77, + 71, + 165, + 93, + 110, + 151, + 251, + 73, + 196, + 26, + 44, + 255, + 97, + 5, + 128, + 132, + 1, + 81, + 8, + 97, + 13, + 128, + 131, + 1, + 82, + 128, + 127, + 36, + 152, + 194, + 211, + 175, + 250, + 27, + 170, + 246, + 65, + 157, + 188, + 203, + 106, + 5, + 75, + 184, + 115, + 89, + 192, + 46, + 173, + 229, + 174, + 172, + 216, + 108, + 132, + 117, + 123, + 144, + 81, + 97, + 13, + 64, + 132, + 1, + 81, + 9, + 97, + 13, + 160, + 131, + 1, + 82, + 128, + 127, + 11, + 203, + 139, + 159, + 49, + 55, + 132, + 126, + 194, + 14, + 167, + 249, + 182, + 23, + 83, + 17, + 111, + 192, + 142, + 136, + 75, + 11, + 138, + 226, + 151, + 9, + 137, + 15, + 122, + 132, + 111, + 176, + 97, + 5, + 128, + 132, + 1, + 81, + 8, + 97, + 13, + 192, + 131, + 1, + 82, + 128, + 127, + 9, + 107, + 159, + 139, + 133, + 152, + 183, + 195, + 135, + 251, + 105, + 171, + 242, + 54, + 176, + 213, + 224, + 78, + 36, + 210, + 117, + 238, + 152, + 36, + 68, + 67, + 237, + 165, + 211, + 188, + 64, + 53, + 97, + 13, + 64, + 132, + 1, + 81, + 9, + 97, + 13, + 224, + 131, + 1, + 82, + 128, + 127, + 38, + 248, + 174, + 231, + 91, + 152, + 232, + 102, + 48, + 84, + 220, + 10, + 143, + 74, + 167, + 135, + 71, + 229, + 195, + 118, + 3, + 202, + 216, + 108, + 255, + 158, + 7, + 238, + 28, + 67, + 191, + 204, + 97, + 5, + 128, + 132, + 1, + 81, + 8, + 97, + 14, + 0, + 131, + 1, + 82, + 128, + 127, + 40, + 119, + 16, + 113, + 171, + 22, + 51, + 1, + 78, + 174, + 39, + 207, + 193, + 109, + 94, + 190, + 8, + 168, + 254, + 47, + 201, + 232, + 80, + 68, + 228, + 164, + 95, + 130, + 193, + 76, + 216, + 37, + 97, + 13, + 64, + 132, + 1, + 81, + 9, + 97, + 14, + 32, + 131, + 1, + 82, + 128, + 127, + 7, + 237, + 62, + 1, + 54, + 27, + 109, + 40, + 105, + 162, + 29, + 230, + 192, + 19, + 249, + 159, + 31, + 138, + 234, + 24, + 175, + 209, + 32, + 76, + 95, + 61, + 150, + 17, + 46, + 179, + 39, + 220, + 97, + 5, + 128, + 132, + 1, + 81, + 8, + 97, + 14, + 64, + 131, + 1, + 82, + 128, + 127, + 10, + 227, + 201, + 95, + 192, + 60, + 10, + 95, + 45, + 232, + 168, + 244, + 108, + 3, + 204, + 223, + 223, + 237, + 43, + 185, + 140, + 158, + 74, + 224, + 177, + 11, + 21, + 237, + 164, + 227, + 177, + 227, + 97, + 13, + 64, + 132, + 1, + 81, + 9, + 97, + 14, + 96, + 131, + 1, + 82, + 128, + 127, + 37, + 128, + 133, + 19, + 32, + 245, + 149, + 202, + 138, + 103, + 156, + 194, + 21, + 125, + 139, + 125, + 72, + 70, + 188, + 142, + 237, + 27, + 37, + 176, + 146, + 214, + 223, + 166, + 75, + 28, + 78, + 30, + 97, + 5, + 128, + 132, + 1, + 81, + 8, + 97, + 14, + 128, + 131, + 1, + 82, + 128, + 127, + 42, + 253, + 78, + 119, + 39, + 63, + 28, + 179, + 67, + 74, + 74, + 102, + 121, + 41, + 5, + 140, + 21, + 107, + 33, + 87, + 60, + 63, + 30, + 252, + 136, + 46, + 112, + 133, + 151, + 215, + 22, + 26, + 97, + 13, + 64, + 132, + 1, + 81, + 9, + 97, + 14, + 160, + 131, + 1, + 82, + 128, + 127, + 5, + 102, + 255, + 251, + 185, + 242, + 131, + 118, + 117, + 5, + 251, + 80, + 8, + 88, + 82, + 209, + 18, + 200, + 198, + 241, + 61, + 122, + 81, + 148, + 187, + 179, + 133, + 14, + 88, + 40, + 233, + 231, + 97, + 5, + 128, + 132, + 1, + 81, + 8, + 97, + 14, + 192, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 13, + 64, + 132, + 1, + 81, + 9, + 97, + 14, + 224, + 131, + 1, + 82, + 128, + 127, + 48, + 100, + 78, + 114, + 225, + 49, + 160, + 41, + 184, + 80, + 69, + 182, + 129, + 129, + 88, + 93, + 40, + 51, + 232, + 72, + 121, + 185, + 112, + 145, + 67, + 225, + 245, + 147, + 240, + 0, + 0, + 0, + 97, + 5, + 128, + 132, + 1, + 81, + 8, + 97, + 15, + 0, + 131, + 1, + 82, + 128, + 127, + 20, + 198, + 1, + 133, + 231, + 88, + 133, + 214, + 116, + 219, + 75, + 63, + 125, + 74, + 86, + 148, + 250, + 108, + 1, + 170, + 15, + 83, + 85, + 123, + 6, + 11, + 192, + 74, + 65, + 114, + 112, + 95, + 97, + 13, + 64, + 132, + 1, + 81, + 9, + 97, + 15, + 32, + 131, + 1, + 82, + 128, + 127, + 27, + 158, + 76, + 236, + 249, + 217, + 26, + 83, + 67, + 116, + 250, + 119, + 4, + 55, + 1, + 200, + 45, + 199, + 230, + 158, + 106, + 102, + 27, + 22, + 61, + 214, + 53, + 73, + 174, + 141, + 143, + 162, + 97, + 5, + 128, + 132, + 1, + 81, + 8, + 97, + 15, + 64, + 131, + 1, + 82, + 97, + 13, + 128, + 130, + 1, + 81, + 129, + 129, + 97, + 13, + 192, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 15, + 96, + 132, + 1, + 82, + 129, + 129, + 97, + 14, + 0, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 15, + 128, + 132, + 1, + 82, + 129, + 129, + 97, + 14, + 64, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 15, + 160, + 132, + 1, + 82, + 129, + 129, + 97, + 14, + 128, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 15, + 192, + 132, + 1, + 82, + 129, + 129, + 97, + 14, + 192, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 15, + 224, + 132, + 1, + 82, + 129, + 129, + 97, + 15, + 0, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 16, + 0, + 132, + 1, + 82, + 129, + 129, + 97, + 15, + 64, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 16, + 32, + 132, + 1, + 82, + 129, + 129, + 97, + 13, + 32, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 16, + 64, + 132, + 1, + 82, + 80, + 96, + 32, + 97, + 16, + 128, + 131, + 1, + 82, + 96, + 32, + 97, + 16, + 160, + 131, + 1, + 82, + 96, + 32, + 97, + 16, + 192, + 131, + 1, + 82, + 97, + 16, + 64, + 130, + 1, + 81, + 97, + 16, + 224, + 131, + 1, + 82, + 127, + 48, + 100, + 78, + 114, + 225, + 49, + 160, + 41, + 184, + 80, + 69, + 182, + 129, + 129, + 88, + 93, + 40, + 51, + 232, + 72, + 121, + 185, + 112, + 145, + 67, + 225, + 245, + 147, + 239, + 255, + 255, + 255, + 97, + 17, + 0, + 131, + 1, + 82, + 96, + 0, + 128, + 81, + 96, + 32, + 97, + 84, + 18, + 131, + 57, + 129, + 81, + 145, + 82, + 97, + 17, + 32, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 32, + 97, + 16, + 96, + 133, + 1, + 96, + 192, + 97, + 16, + 128, + 135, + 1, + 96, + 5, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 16, + 96, + 130, + 1, + 81, + 96, + 0, + 97, + 13, + 32, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 16, + 32, + 134, + 1, + 81, + 9, + 97, + 13, + 32, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 15, + 64, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 16, + 0, + 134, + 1, + 81, + 9, + 97, + 15, + 64, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 15, + 0, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 15, + 224, + 134, + 1, + 81, + 9, + 97, + 15, + 0, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 14, + 192, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 15, + 192, + 134, + 1, + 81, + 9, + 97, + 14, + 192, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 14, + 128, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 15, + 160, + 134, + 1, + 81, + 9, + 97, + 14, + 128, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 14, + 64, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 15, + 128, + 134, + 1, + 81, + 9, + 97, + 14, + 64, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 14, + 0, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 15, + 96, + 134, + 1, + 81, + 9, + 97, + 14, + 0, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 13, + 192, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 13, + 128, + 134, + 1, + 81, + 9, + 97, + 13, + 192, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 97, + 13, + 128, + 133, + 1, + 129, + 144, + 82, + 97, + 13, + 96, + 133, + 1, + 81, + 132, + 147, + 80, + 144, + 145, + 80, + 9, + 97, + 17, + 64, + 131, + 1, + 82, + 128, + 97, + 13, + 192, + 131, + 1, + 81, + 97, + 13, + 160, + 132, + 1, + 81, + 9, + 97, + 17, + 96, + 131, + 1, + 82, + 128, + 97, + 14, + 0, + 131, + 1, + 81, + 97, + 13, + 224, + 132, + 1, + 81, + 9, + 97, + 17, + 128, + 131, + 1, + 82, + 128, + 97, + 14, + 64, + 131, + 1, + 81, + 97, + 14, + 32, + 132, + 1, + 81, + 9, + 97, + 17, + 160, + 131, + 1, + 82, + 128, + 97, + 14, + 128, + 131, + 1, + 81, + 97, + 14, + 96, + 132, + 1, + 81, + 9, + 97, + 17, + 192, + 131, + 1, + 82, + 128, + 97, + 14, + 192, + 131, + 1, + 81, + 97, + 14, + 160, + 132, + 1, + 81, + 9, + 97, + 17, + 224, + 131, + 1, + 82, + 128, + 97, + 15, + 0, + 131, + 1, + 81, + 97, + 14, + 224, + 132, + 1, + 81, + 9, + 97, + 18, + 0, + 131, + 1, + 82, + 128, + 97, + 15, + 64, + 131, + 1, + 81, + 97, + 15, + 32, + 132, + 1, + 81, + 9, + 97, + 18, + 32, + 131, + 1, + 82, + 128, + 96, + 32, + 131, + 1, + 81, + 97, + 18, + 0, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 96, + 64, + 134, + 1, + 81, + 97, + 18, + 32, + 135, + 1, + 81, + 9, + 8, + 97, + 18, + 64, + 132, + 1, + 82, + 80, + 97, + 6, + 224, + 130, + 1, + 81, + 97, + 5, + 192, + 131, + 1, + 81, + 130, + 145, + 144, + 8, + 97, + 18, + 96, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 18, + 128, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 18, + 160, + 131, + 1, + 82, + 128, + 97, + 18, + 160, + 131, + 1, + 81, + 97, + 18, + 96, + 132, + 1, + 81, + 9, + 97, + 18, + 192, + 131, + 1, + 82, + 128, + 127, + 6, + 111, + 111, + 133, + 214, + 246, + 138, + 133, + 236, + 16, + 52, + 83, + 81, + 162, + 58, + 58, + 175, + 7, + 243, + 138, + 248, + 201, + 82, + 167, + 188, + 236, + 167, + 11, + 210, + 175, + 122, + 213, + 97, + 18, + 192, + 132, + 1, + 81, + 9, + 97, + 18, + 224, + 131, + 1, + 82, + 128, + 97, + 7, + 0, + 131, + 1, + 81, + 97, + 5, + 224, + 132, + 1, + 81, + 8, + 97, + 19, + 0, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 19, + 32, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 19, + 64, + 131, + 1, + 82, + 128, + 97, + 19, + 64, + 131, + 1, + 81, + 97, + 19, + 0, + 132, + 1, + 81, + 9, + 97, + 19, + 96, + 131, + 1, + 82, + 128, + 127, + 43, + 157, + 75, + 65, + 16, + 201, + 174, + 153, + 119, + 130, + 225, + 80, + 155, + 29, + 15, + 219, + 32, + 167, + 192, + 43, + 189, + 139, + 234, + 115, + 5, + 70, + 43, + 159, + 129, + 37, + 177, + 232, + 97, + 19, + 96, + 132, + 1, + 81, + 9, + 97, + 19, + 128, + 131, + 1, + 82, + 128, + 97, + 19, + 128, + 131, + 1, + 81, + 97, + 18, + 224, + 132, + 1, + 81, + 8, + 97, + 19, + 160, + 131, + 1, + 82, + 128, + 97, + 6, + 0, + 131, + 1, + 81, + 130, + 3, + 97, + 19, + 160, + 132, + 1, + 81, + 8, + 97, + 19, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 7, + 128, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 19, + 224, + 131, + 1, + 82, + 128, + 97, + 19, + 224, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 20, + 0, + 131, + 1, + 82, + 128, + 127, + 12, + 197, + 124, + 219, + 176, + 133, + 7, + 214, + 43, + 246, + 122, + 68, + 147, + 204, + 38, + 47, + 182, + 192, + 157, + 85, + 112, + 19, + 255, + 241, + 245, + 115, + 244, + 49, + 34, + 31, + 143, + 249, + 97, + 18, + 192, + 132, + 1, + 81, + 9, + 97, + 20, + 32, + 131, + 1, + 82, + 128, + 127, + 18, + 116, + 230, + 73, + 163, + 46, + 211, + 85, + 163, + 26, + 110, + 214, + 151, + 36, + 225, + 173, + 173, + 232, + 87, + 232, + 110, + 181, + 195, + 161, + 33, + 188, + 209, + 71, + 148, + 50, + 3, + 200, + 97, + 19, + 96, + 132, + 1, + 81, + 9, + 97, + 20, + 64, + 131, + 1, + 82, + 128, + 97, + 20, + 64, + 131, + 1, + 81, + 97, + 20, + 32, + 132, + 1, + 81, + 8, + 97, + 20, + 96, + 131, + 1, + 82, + 128, + 97, + 6, + 32, + 131, + 1, + 81, + 130, + 3, + 97, + 20, + 96, + 132, + 1, + 81, + 8, + 97, + 20, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 7, + 128, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 20, + 160, + 131, + 1, + 82, + 128, + 97, + 20, + 160, + 131, + 1, + 81, + 97, + 20, + 0, + 132, + 1, + 81, + 8, + 97, + 20, + 192, + 131, + 1, + 82, + 128, + 97, + 20, + 192, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 20, + 224, + 131, + 1, + 82, + 128, + 97, + 6, + 64, + 131, + 1, + 81, + 130, + 3, + 97, + 18, + 192, + 132, + 1, + 81, + 8, + 97, + 21, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 7, + 160, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 21, + 32, + 131, + 1, + 82, + 128, + 97, + 21, + 32, + 131, + 1, + 81, + 97, + 20, + 224, + 132, + 1, + 81, + 8, + 97, + 21, + 64, + 131, + 1, + 82, + 128, + 97, + 21, + 64, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 21, + 96, + 131, + 1, + 82, + 128, + 127, + 6, + 111, + 111, + 133, + 214, + 246, + 138, + 133, + 236, + 16, + 52, + 83, + 81, + 162, + 58, + 58, + 175, + 7, + 243, + 138, + 248, + 201, + 82, + 167, + 188, + 236, + 167, + 11, + 210, + 175, + 122, + 213, + 97, + 6, + 64, + 132, + 1, + 81, + 9, + 97, + 21, + 128, + 131, + 1, + 82, + 128, + 127, + 43, + 157, + 75, + 65, + 16, + 201, + 174, + 153, + 119, + 130, + 225, + 80, + 155, + 29, + 15, + 219, + 32, + 167, + 192, + 43, + 189, + 139, + 234, + 115, + 5, + 70, + 43, + 159, + 129, + 37, + 177, + 232, + 97, + 19, + 0, + 132, + 1, + 81, + 9, + 97, + 21, + 160, + 131, + 1, + 82, + 128, + 97, + 21, + 160, + 131, + 1, + 81, + 97, + 21, + 128, + 132, + 1, + 81, + 8, + 97, + 21, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 6, + 160, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 21, + 224, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 22, + 0, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 22, + 32, + 131, + 1, + 82, + 128, + 97, + 22, + 32, + 131, + 1, + 81, + 97, + 21, + 224, + 132, + 1, + 81, + 9, + 97, + 22, + 64, + 131, + 1, + 82, + 128, + 127, + 19, + 171, + 236, + 57, + 10, + 218, + 127, + 67, + 112, + 129, + 154, + 177, + 199, + 132, + 111, + 33, + 5, + 84, + 86, + 157, + 155, + 41, + 209, + 234, + 141, + 190, + 189, + 15, + 168, + 197, + 62, + 102, + 97, + 6, + 0, + 132, + 1, + 81, + 9, + 97, + 22, + 96, + 131, + 1, + 82, + 128, + 127, + 30, + 185, + 225, + 220, + 25, + 163, + 58, + 98, + 76, + 152, + 98, + 161, + 217, + 125, + 21, + 16, + 189, + 82, + 30, + 173, + 93, + 254, + 3, + 69, + 170, + 246, + 24, + 91, + 26, + 30, + 96, + 254, + 97, + 6, + 32, + 132, + 1, + 81, + 9, + 97, + 22, + 128, + 131, + 1, + 82, + 128, + 97, + 22, + 128, + 131, + 1, + 81, + 97, + 22, + 96, + 132, + 1, + 81, + 8, + 97, + 22, + 160, + 131, + 1, + 82, + 128, + 97, + 22, + 160, + 131, + 1, + 81, + 130, + 3, + 97, + 22, + 64, + 132, + 1, + 81, + 8, + 97, + 22, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 7, + 160, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 22, + 224, + 131, + 1, + 82, + 128, + 97, + 22, + 224, + 131, + 1, + 81, + 97, + 21, + 96, + 132, + 1, + 81, + 8, + 97, + 23, + 0, + 131, + 1, + 82, + 128, + 97, + 23, + 0, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 23, + 32, + 131, + 1, + 82, + 128, + 127, + 12, + 197, + 124, + 219, + 176, + 133, + 7, + 214, + 43, + 246, + 122, + 68, + 147, + 204, + 38, + 47, + 182, + 192, + 157, + 85, + 112, + 19, + 255, + 241, + 245, + 115, + 244, + 49, + 34, + 31, + 143, + 249, + 97, + 6, + 64, + 132, + 1, + 81, + 9, + 97, + 23, + 64, + 131, + 1, + 82, + 128, + 127, + 18, + 116, + 230, + 73, + 163, + 46, + 211, + 85, + 163, + 26, + 110, + 214, + 151, + 36, + 225, + 173, + 173, + 232, + 87, + 232, + 110, + 181, + 195, + 161, + 33, + 188, + 209, + 71, + 148, + 50, + 3, + 200, + 97, + 19, + 0, + 132, + 1, + 81, + 9, + 97, + 23, + 96, + 131, + 1, + 82, + 128, + 97, + 23, + 96, + 131, + 1, + 81, + 97, + 23, + 64, + 132, + 1, + 81, + 8, + 97, + 23, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 6, + 192, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 23, + 160, + 131, + 1, + 82, + 128, + 127, + 15, + 193, + 201, + 57, + 77, + 184, + 155, + 178, + 96, + 26, + 188, + 73, + 253, + 173, + 79, + 3, + 140, + 229, + 22, + 144, + 48, + 162, + 173, + 105, + 118, + 63, + 120, + 117, + 3, + 107, + 203, + 2, + 97, + 6, + 0, + 132, + 1, + 81, + 9, + 97, + 23, + 192, + 131, + 1, + 82, + 128, + 127, + 22, + 169, + 233, + 140, + 73, + 58, + 144, + 43, + 149, + 2, + 5, + 78, + 220, + 3, + 231, + 178, + 43, + 126, + 172, + 52, + 52, + 89, + 97, + 188, + 138, + 188, + 237, + 107, + 209, + 71, + 200, + 190, + 97, + 6, + 32, + 132, + 1, + 81, + 9, + 97, + 23, + 224, + 131, + 1, + 82, + 128, + 97, + 23, + 224, + 131, + 1, + 81, + 97, + 23, + 192, + 132, + 1, + 81, + 8, + 97, + 24, + 0, + 131, + 1, + 82, + 128, + 97, + 24, + 0, + 131, + 1, + 81, + 130, + 3, + 97, + 23, + 160, + 132, + 1, + 81, + 8, + 97, + 24, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 7, + 160, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 24, + 64, + 131, + 1, + 82, + 128, + 97, + 24, + 64, + 131, + 1, + 81, + 97, + 23, + 32, + 132, + 1, + 81, + 8, + 97, + 24, + 96, + 131, + 1, + 82, + 128, + 97, + 24, + 96, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 24, + 128, + 131, + 1, + 82, + 128, + 97, + 7, + 96, + 131, + 1, + 81, + 130, + 3, + 96, + 1, + 8, + 97, + 24, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 7, + 96, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 24, + 192, + 131, + 1, + 82, + 128, + 97, + 7, + 96, + 131, + 1, + 81, + 130, + 3, + 96, + 2, + 8, + 97, + 24, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 24, + 192, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 25, + 0, + 131, + 1, + 82, + 128, + 97, + 7, + 96, + 131, + 1, + 81, + 130, + 3, + 96, + 4, + 8, + 97, + 25, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 25, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 25, + 64, + 131, + 1, + 82, + 128, + 97, + 5, + 192, + 131, + 1, + 81, + 97, + 6, + 128, + 132, + 1, + 81, + 8, + 97, + 25, + 96, + 131, + 1, + 82, + 128, + 97, + 6, + 0, + 131, + 1, + 81, + 130, + 3, + 97, + 25, + 96, + 132, + 1, + 81, + 8, + 97, + 25, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 25, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 25, + 160, + 131, + 1, + 82, + 128, + 97, + 25, + 160, + 131, + 1, + 81, + 97, + 24, + 128, + 132, + 1, + 81, + 8, + 97, + 25, + 192, + 131, + 1, + 82, + 128, + 97, + 25, + 192, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 25, + 224, + 131, + 1, + 82, + 128, + 97, + 6, + 32, + 131, + 1, + 81, + 130, + 3, + 97, + 6, + 96, + 132, + 1, + 81, + 8, + 97, + 26, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 25, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 26, + 32, + 131, + 1, + 82, + 128, + 97, + 26, + 32, + 131, + 1, + 81, + 97, + 25, + 224, + 132, + 1, + 81, + 8, + 97, + 26, + 64, + 131, + 1, + 82, + 128, + 97, + 26, + 64, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 26, + 96, + 131, + 1, + 82, + 128, + 97, + 7, + 192, + 131, + 1, + 81, + 97, + 19, + 192, + 132, + 1, + 81, + 9, + 97, + 26, + 128, + 131, + 1, + 82, + 128, + 97, + 26, + 128, + 131, + 1, + 81, + 97, + 26, + 96, + 132, + 1, + 81, + 8, + 97, + 26, + 160, + 131, + 1, + 82, + 128, + 97, + 26, + 160, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 26, + 192, + 131, + 1, + 82, + 128, + 97, + 7, + 192, + 131, + 1, + 81, + 97, + 20, + 128, + 132, + 1, + 81, + 9, + 97, + 26, + 224, + 131, + 1, + 82, + 128, + 97, + 26, + 224, + 131, + 1, + 81, + 97, + 26, + 192, + 132, + 1, + 81, + 8, + 97, + 27, + 0, + 131, + 1, + 82, + 128, + 97, + 27, + 0, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 27, + 32, + 131, + 1, + 82, + 128, + 97, + 7, + 224, + 131, + 1, + 81, + 97, + 21, + 0, + 132, + 1, + 81, + 9, + 97, + 27, + 64, + 131, + 1, + 82, + 128, + 97, + 27, + 64, + 131, + 1, + 81, + 97, + 27, + 32, + 132, + 1, + 81, + 8, + 97, + 27, + 96, + 131, + 1, + 82, + 128, + 97, + 27, + 96, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 27, + 128, + 131, + 1, + 82, + 128, + 97, + 7, + 224, + 131, + 1, + 81, + 97, + 22, + 192, + 132, + 1, + 81, + 9, + 97, + 27, + 160, + 131, + 1, + 82, + 128, + 97, + 27, + 160, + 131, + 1, + 81, + 97, + 27, + 128, + 132, + 1, + 81, + 8, + 97, + 27, + 192, + 131, + 1, + 82, + 128, + 97, + 27, + 192, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 27, + 224, + 131, + 1, + 82, + 128, + 97, + 7, + 224, + 131, + 1, + 81, + 97, + 24, + 32, + 132, + 1, + 81, + 9, + 97, + 28, + 0, + 131, + 1, + 82, + 128, + 97, + 28, + 0, + 131, + 1, + 81, + 97, + 27, + 224, + 132, + 1, + 81, + 8, + 97, + 28, + 32, + 131, + 1, + 82, + 128, + 97, + 28, + 32, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 28, + 64, + 131, + 1, + 82, + 128, + 97, + 7, + 96, + 131, + 1, + 81, + 130, + 3, + 96, + 3, + 8, + 97, + 28, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 25, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 28, + 128, + 131, + 1, + 82, + 128, + 97, + 28, + 128, + 131, + 1, + 81, + 97, + 25, + 128, + 132, + 1, + 81, + 9, + 97, + 28, + 160, + 131, + 1, + 82, + 128, + 97, + 28, + 160, + 131, + 1, + 81, + 97, + 28, + 64, + 132, + 1, + 81, + 8, + 97, + 28, + 192, + 131, + 1, + 82, + 128, + 97, + 28, + 192, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 28, + 224, + 131, + 1, + 82, + 128, + 97, + 28, + 128, + 131, + 1, + 81, + 97, + 26, + 0, + 132, + 1, + 81, + 9, + 97, + 29, + 0, + 131, + 1, + 82, + 128, + 97, + 29, + 0, + 131, + 1, + 81, + 97, + 28, + 224, + 132, + 1, + 81, + 8, + 97, + 29, + 32, + 131, + 1, + 82, + 128, + 97, + 29, + 32, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 29, + 64, + 131, + 1, + 82, + 128, + 97, + 7, + 96, + 131, + 1, + 81, + 97, + 24, + 224, + 132, + 1, + 81, + 9, + 97, + 29, + 96, + 131, + 1, + 82, + 128, + 97, + 29, + 96, + 131, + 1, + 81, + 97, + 28, + 96, + 132, + 1, + 81, + 9, + 97, + 29, + 128, + 131, + 1, + 82, + 128, + 97, + 29, + 128, + 131, + 1, + 81, + 97, + 25, + 32, + 132, + 1, + 81, + 9, + 97, + 29, + 160, + 131, + 1, + 82, + 128, + 97, + 29, + 160, + 131, + 1, + 81, + 97, + 6, + 64, + 132, + 1, + 81, + 9, + 97, + 29, + 192, + 131, + 1, + 82, + 128, + 97, + 6, + 64, + 131, + 1, + 81, + 130, + 3, + 96, + 1, + 8, + 97, + 29, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 29, + 192, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 30, + 0, + 131, + 1, + 82, + 128, + 97, + 30, + 0, + 131, + 1, + 81, + 97, + 29, + 64, + 132, + 1, + 81, + 8, + 97, + 30, + 32, + 131, + 1, + 82, + 128, + 97, + 30, + 32, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 30, + 64, + 131, + 1, + 82, + 128, + 97, + 6, + 64, + 131, + 1, + 81, + 96, + 2, + 9, + 97, + 30, + 96, + 131, + 1, + 82, + 128, + 97, + 5, + 192, + 131, + 1, + 81, + 130, + 3, + 97, + 5, + 224, + 132, + 1, + 81, + 8, + 97, + 30, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 30, + 96, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 30, + 160, + 131, + 1, + 82, + 128, + 97, + 5, + 192, + 131, + 1, + 81, + 130, + 3, + 97, + 6, + 0, + 132, + 1, + 81, + 8, + 97, + 30, + 192, + 131, + 1, + 82, + 128, + 97, + 30, + 192, + 131, + 1, + 81, + 130, + 3, + 97, + 30, + 160, + 132, + 1, + 81, + 8, + 97, + 30, + 224, + 131, + 1, + 82, + 128, + 97, + 6, + 32, + 131, + 1, + 81, + 130, + 3, + 97, + 5, + 224, + 132, + 1, + 81, + 8, + 97, + 31, + 0, + 131, + 1, + 82, + 128, + 97, + 31, + 0, + 131, + 1, + 81, + 130, + 3, + 97, + 30, + 224, + 132, + 1, + 81, + 8, + 97, + 31, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 29, + 160, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 31, + 64, + 131, + 1, + 82, + 128, + 97, + 31, + 64, + 131, + 1, + 81, + 97, + 30, + 64, + 132, + 1, + 81, + 8, + 97, + 31, + 96, + 131, + 1, + 82, + 128, + 97, + 31, + 96, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 31, + 128, + 131, + 1, + 82, + 128, + 97, + 24, + 192, + 131, + 1, + 81, + 97, + 28, + 96, + 132, + 1, + 81, + 9, + 97, + 31, + 160, + 131, + 1, + 82, + 128, + 97, + 31, + 160, + 131, + 1, + 81, + 97, + 25, + 32, + 132, + 1, + 81, + 9, + 97, + 31, + 192, + 131, + 1, + 82, + 128, + 97, + 5, + 224, + 131, + 1, + 81, + 97, + 5, + 192, + 132, + 1, + 81, + 8, + 97, + 31, + 224, + 131, + 1, + 82, + 128, + 97, + 6, + 64, + 131, + 1, + 81, + 130, + 3, + 97, + 31, + 224, + 132, + 1, + 81, + 8, + 97, + 32, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 31, + 192, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 32, + 32, + 131, + 1, + 82, + 128, + 97, + 32, + 32, + 131, + 1, + 81, + 97, + 31, + 128, + 132, + 1, + 81, + 8, + 97, + 32, + 64, + 131, + 1, + 82, + 128, + 97, + 32, + 64, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 32, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 32, + 32, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 32, + 128, + 131, + 1, + 82, + 128, + 97, + 32, + 128, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 32, + 160, + 131, + 1, + 82, + 128, + 97, + 8, + 224, + 131, + 1, + 81, + 130, + 3, + 96, + 1, + 8, + 97, + 32, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 18, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 32, + 224, + 131, + 1, + 82, + 128, + 97, + 32, + 224, + 131, + 1, + 81, + 97, + 32, + 160, + 132, + 1, + 81, + 8, + 97, + 33, + 0, + 131, + 1, + 82, + 128, + 97, + 33, + 0, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 33, + 32, + 131, + 1, + 82, + 97, + 9, + 64, + 130, + 1, + 81, + 129, + 144, + 128, + 9, + 97, + 33, + 64, + 131, + 1, + 82, + 128, + 97, + 9, + 64, + 131, + 1, + 81, + 130, + 3, + 97, + 33, + 64, + 132, + 1, + 81, + 8, + 97, + 33, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 17, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 33, + 128, + 131, + 1, + 82, + 128, + 97, + 33, + 128, + 131, + 1, + 81, + 97, + 33, + 32, + 132, + 1, + 81, + 8, + 97, + 33, + 160, + 131, + 1, + 82, + 128, + 97, + 33, + 160, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 33, + 192, + 131, + 1, + 82, + 128, + 97, + 9, + 32, + 131, + 1, + 81, + 130, + 3, + 97, + 9, + 64, + 132, + 1, + 81, + 8, + 97, + 33, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 18, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 34, + 0, + 131, + 1, + 82, + 128, + 97, + 34, + 0, + 131, + 1, + 81, + 97, + 33, + 192, + 132, + 1, + 81, + 8, + 97, + 34, + 32, + 131, + 1, + 82, + 128, + 97, + 34, + 32, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 34, + 64, + 131, + 1, + 82, + 128, + 97, + 17, + 64, + 131, + 1, + 81, + 130, + 3, + 96, + 1, + 8, + 97, + 34, + 96, + 131, + 1, + 82, + 128, + 97, + 17, + 128, + 131, + 1, + 81, + 97, + 17, + 96, + 132, + 1, + 81, + 8, + 97, + 34, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 17, + 160, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 34, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 17, + 192, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 34, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 17, + 224, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 34, + 224, + 131, + 1, + 82, + 128, + 97, + 34, + 224, + 131, + 1, + 81, + 130, + 3, + 97, + 34, + 96, + 132, + 1, + 81, + 8, + 97, + 35, + 0, + 131, + 1, + 82, + 128, + 97, + 2, + 32, + 131, + 1, + 81, + 97, + 8, + 32, + 132, + 1, + 81, + 9, + 97, + 35, + 32, + 131, + 1, + 82, + 128, + 97, + 35, + 32, + 131, + 1, + 81, + 97, + 6, + 160, + 132, + 1, + 81, + 8, + 97, + 35, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 2, + 128, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 35, + 96, + 131, + 1, + 82, + 128, + 97, + 2, + 32, + 131, + 1, + 81, + 97, + 8, + 64, + 132, + 1, + 81, + 9, + 97, + 35, + 128, + 131, + 1, + 82, + 128, + 97, + 35, + 128, + 131, + 1, + 81, + 97, + 5, + 192, + 132, + 1, + 81, + 8, + 97, + 35, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 2, + 128, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 35, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 35, + 96, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 35, + 224, + 131, + 1, + 82, + 128, + 97, + 2, + 32, + 131, + 1, + 81, + 97, + 8, + 96, + 132, + 1, + 81, + 9, + 97, + 36, + 0, + 131, + 1, + 82, + 128, + 97, + 36, + 0, + 131, + 1, + 81, + 97, + 5, + 224, + 132, + 1, + 81, + 8, + 97, + 36, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 2, + 128, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 36, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 35, + 224, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 36, + 96, + 131, + 1, + 82, + 128, + 97, + 2, + 32, + 131, + 1, + 81, + 97, + 8, + 128, + 132, + 1, + 81, + 9, + 97, + 36, + 128, + 131, + 1, + 82, + 128, + 97, + 36, + 128, + 131, + 1, + 81, + 97, + 6, + 192, + 132, + 1, + 81, + 8, + 97, + 36, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 2, + 128, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 36, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 36, + 96, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 36, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 9, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 37, + 0, + 131, + 1, + 82, + 128, + 97, + 2, + 32, + 131, + 1, + 81, + 96, + 1, + 9, + 97, + 37, + 32, + 131, + 1, + 82, + 128, + 97, + 37, + 32, + 131, + 1, + 81, + 97, + 5, + 128, + 132, + 1, + 81, + 9, + 97, + 37, + 64, + 131, + 1, + 82, + 128, + 97, + 37, + 64, + 131, + 1, + 81, + 97, + 6, + 160, + 132, + 1, + 81, + 8, + 97, + 37, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 2, + 128, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 37, + 128, + 131, + 1, + 82, + 128, + 97, + 2, + 32, + 131, + 1, + 81, + 127, + 9, + 34, + 107, + 110, + 34, + 198, + 240, + 202, + 100, + 236, + 38, + 170, + 212, + 200, + 110, + 113, + 91, + 95, + 137, + 142, + 94, + 150, + 63, + 37, + 135, + 14, + 86, + 187, + 229, + 51, + 233, + 162, + 9, + 97, + 37, + 160, + 131, + 1, + 82, + 128, + 97, + 37, + 160, + 131, + 1, + 81, + 97, + 5, + 128, + 132, + 1, + 81, + 9, + 97, + 37, + 192, + 131, + 1, + 82, + 128, + 97, + 37, + 192, + 131, + 1, + 81, + 97, + 5, + 192, + 132, + 1, + 81, + 8, + 97, + 37, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 2, + 128, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 38, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 37, + 128, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 38, + 32, + 131, + 1, + 82, + 128, + 97, + 2, + 32, + 131, + 1, + 81, + 127, + 19, + 179, + 96, + 212, + 232, + 47, + 233, + 21, + 254, + 209, + 96, + 129, + 3, + 143, + 152, + 194, + 17, + 66, + 123, + 135, + 162, + 129, + 189, + 115, + 60, + 39, + 125, + 186, + 223, + 16, + 55, + 43, + 9, + 97, + 38, + 64, + 131, + 1, + 82, + 128, + 97, + 38, + 64, + 131, + 1, + 81, + 97, + 5, + 128, + 132, + 1, + 81, + 9, + 97, + 38, + 96, + 131, + 1, + 82, + 128, + 97, + 38, + 96, + 131, + 1, + 81, + 97, + 5, + 224, + 132, + 1, + 81, + 8, + 97, + 38, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 2, + 128, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 38, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 38, + 32, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 38, + 192, + 131, + 1, + 82, + 128, + 97, + 2, + 32, + 131, + 1, + 81, + 127, + 24, + 175, + 223, + 35, + 233, + 189, + 147, + 2, + 103, + 63, + 193, + 224, + 118, + 164, + 146, + 212, + 214, + 91, + 209, + 142, + 188, + 77, + 133, + 78, + 209, + 137, + 19, + 155, + 171, + 49, + 62, + 82, + 9, + 97, + 38, + 224, + 131, + 1, + 82, + 128, + 97, + 38, + 224, + 131, + 1, + 81, + 97, + 5, + 128, + 132, + 1, + 81, + 9, + 97, + 39, + 0, + 131, + 1, + 82, + 128, + 97, + 39, + 0, + 131, + 1, + 81, + 97, + 6, + 192, + 132, + 1, + 81, + 8, + 97, + 39, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 2, + 128, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 39, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 38, + 192, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 39, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 8, + 224, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 39, + 128, + 131, + 1, + 82, + 128, + 97, + 39, + 128, + 131, + 1, + 81, + 130, + 3, + 97, + 37, + 0, + 132, + 1, + 81, + 8, + 97, + 39, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 35, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 39, + 192, + 131, + 1, + 82, + 128, + 97, + 39, + 192, + 131, + 1, + 81, + 97, + 34, + 64, + 132, + 1, + 81, + 8, + 97, + 39, + 224, + 131, + 1, + 82, + 128, + 97, + 39, + 224, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 40, + 0, + 131, + 1, + 82, + 128, + 97, + 2, + 32, + 131, + 1, + 81, + 97, + 8, + 160, + 132, + 1, + 81, + 9, + 97, + 40, + 32, + 131, + 1, + 82, + 128, + 97, + 40, + 32, + 131, + 1, + 81, + 97, + 6, + 64, + 132, + 1, + 81, + 8, + 97, + 40, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 2, + 128, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 40, + 96, + 131, + 1, + 82, + 128, + 97, + 2, + 32, + 131, + 1, + 81, + 97, + 8, + 192, + 132, + 1, + 81, + 9, + 97, + 40, + 128, + 131, + 1, + 82, + 128, + 97, + 40, + 128, + 131, + 1, + 81, + 97, + 18, + 64, + 132, + 1, + 81, + 8, + 97, + 40, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 2, + 128, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 40, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 40, + 96, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 40, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 9, + 96, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 41, + 0, + 131, + 1, + 82, + 128, + 97, + 2, + 32, + 131, + 1, + 81, + 126, + 161, + 54, + 186, + 19, + 175, + 166, + 200, + 62, + 183, + 184, + 47, + 179, + 112, + 226, + 40, + 231, + 65, + 85, + 228, + 143, + 184, + 241, + 193, + 207, + 195, + 63, + 176, + 218, + 138, + 251, + 66, + 9, + 97, + 41, + 32, + 131, + 1, + 82, + 128, + 97, + 41, + 32, + 131, + 1, + 81, + 97, + 5, + 128, + 132, + 1, + 81, + 9, + 97, + 41, + 64, + 131, + 1, + 82, + 128, + 97, + 41, + 64, + 131, + 1, + 81, + 97, + 6, + 64, + 132, + 1, + 81, + 8, + 97, + 41, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 2, + 128, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 41, + 128, + 131, + 1, + 82, + 128, + 97, + 2, + 32, + 131, + 1, + 81, + 127, + 46, + 185, + 117, + 13, + 206, + 84, + 95, + 23, + 212, + 146, + 5, + 141, + 210, + 1, + 161, + 37, + 31, + 243, + 217, + 7, + 120, + 100, + 88, + 61, + 68, + 234, + 249, + 190, + 144, + 8, + 105, + 157, + 9, + 97, + 41, + 160, + 131, + 1, + 82, + 128, + 97, + 41, + 160, + 131, + 1, + 81, + 97, + 5, + 128, + 132, + 1, + 81, + 9, + 97, + 41, + 192, + 131, + 1, + 82, + 128, + 97, + 41, + 192, + 131, + 1, + 81, + 97, + 18, + 64, + 132, + 1, + 81, + 8, + 97, + 41, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 2, + 128, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 42, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 41, + 128, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 42, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 9, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 42, + 64, + 131, + 1, + 82, + 128, + 97, + 42, + 64, + 131, + 1, + 81, + 130, + 3, + 97, + 41, + 0, + 132, + 1, + 81, + 8, + 97, + 42, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 35, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 42, + 128, + 131, + 1, + 82, + 128, + 97, + 42, + 128, + 131, + 1, + 81, + 97, + 40, + 0, + 132, + 1, + 81, + 8, + 97, + 42, + 160, + 131, + 1, + 82, + 128, + 97, + 42, + 160, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 42, + 192, + 131, + 1, + 82, + 128, + 97, + 9, + 128, + 131, + 1, + 81, + 130, + 3, + 96, + 1, + 8, + 97, + 42, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 18, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 43, + 0, + 131, + 1, + 82, + 128, + 97, + 43, + 0, + 131, + 1, + 81, + 97, + 42, + 192, + 132, + 1, + 81, + 8, + 97, + 43, + 32, + 131, + 1, + 82, + 128, + 97, + 43, + 32, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 43, + 64, + 131, + 1, + 82, + 97, + 9, + 128, + 130, + 1, + 81, + 129, + 144, + 128, + 9, + 97, + 43, + 96, + 131, + 1, + 82, + 128, + 97, + 9, + 128, + 131, + 1, + 81, + 130, + 3, + 97, + 43, + 96, + 132, + 1, + 81, + 8, + 97, + 43, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 17, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 43, + 160, + 131, + 1, + 82, + 128, + 97, + 43, + 160, + 131, + 1, + 81, + 97, + 43, + 64, + 132, + 1, + 81, + 8, + 97, + 43, + 192, + 131, + 1, + 82, + 128, + 97, + 43, + 192, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 43, + 224, + 131, + 1, + 82, + 128, + 97, + 2, + 32, + 131, + 1, + 81, + 97, + 9, + 192, + 132, + 1, + 81, + 8, + 97, + 44, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 9, + 160, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 44, + 32, + 131, + 1, + 82, + 128, + 97, + 2, + 128, + 131, + 1, + 81, + 97, + 10, + 0, + 132, + 1, + 81, + 8, + 97, + 44, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 44, + 32, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 44, + 96, + 131, + 1, + 82, + 128, + 97, + 6, + 0, + 131, + 1, + 81, + 97, + 1, + 0, + 9, + 97, + 44, + 128, + 131, + 1, + 82, + 128, + 97, + 44, + 128, + 131, + 1, + 81, + 130, + 3, + 97, + 5, + 192, + 132, + 1, + 81, + 8, + 97, + 44, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 7, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 44, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 2, + 32, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 44, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 9, + 128, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 45, + 0, + 131, + 1, + 82, + 128, + 97, + 2, + 128, + 131, + 1, + 81, + 97, + 7, + 32, + 132, + 1, + 81, + 8, + 97, + 45, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 45, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 45, + 64, + 131, + 1, + 82, + 128, + 97, + 45, + 64, + 131, + 1, + 81, + 130, + 3, + 97, + 44, + 96, + 132, + 1, + 81, + 8, + 97, + 45, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 35, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 45, + 128, + 131, + 1, + 82, + 128, + 97, + 45, + 128, + 131, + 1, + 81, + 97, + 43, + 224, + 132, + 1, + 81, + 8, + 97, + 45, + 160, + 131, + 1, + 82, + 128, + 97, + 45, + 160, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 45, + 192, + 131, + 1, + 82, + 128, + 97, + 10, + 0, + 131, + 1, + 81, + 130, + 3, + 97, + 9, + 192, + 132, + 1, + 81, + 8, + 97, + 45, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 18, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 46, + 0, + 131, + 1, + 82, + 128, + 97, + 46, + 0, + 131, + 1, + 81, + 97, + 45, + 192, + 132, + 1, + 81, + 8, + 97, + 46, + 32, + 131, + 1, + 82, + 128, + 97, + 46, + 32, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 46, + 64, + 131, + 1, + 82, + 128, + 97, + 35, + 0, + 131, + 1, + 81, + 97, + 45, + 224, + 132, + 1, + 81, + 9, + 97, + 46, + 96, + 131, + 1, + 82, + 128, + 97, + 9, + 224, + 131, + 1, + 81, + 130, + 3, + 97, + 9, + 192, + 132, + 1, + 81, + 8, + 97, + 46, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 46, + 96, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 46, + 160, + 131, + 1, + 82, + 128, + 97, + 46, + 160, + 131, + 1, + 81, + 97, + 46, + 64, + 132, + 1, + 81, + 8, + 97, + 46, + 192, + 131, + 1, + 82, + 97, + 13, + 0, + 130, + 1, + 81, + 129, + 144, + 128, + 9, + 97, + 46, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 13, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 47, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 13, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 47, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 13, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 47, + 64, + 131, + 1, + 82, + 128, + 97, + 13, + 0, + 131, + 1, + 81, + 96, + 1, + 9, + 97, + 47, + 96, + 131, + 1, + 82, + 128, + 97, + 46, + 224, + 131, + 1, + 81, + 96, + 1, + 9, + 97, + 47, + 128, + 131, + 1, + 82, + 128, + 97, + 47, + 0, + 131, + 1, + 81, + 96, + 1, + 9, + 97, + 47, + 160, + 131, + 1, + 82, + 128, + 97, + 47, + 32, + 131, + 1, + 81, + 96, + 1, + 9, + 97, + 47, + 192, + 131, + 1, + 82, + 128, + 97, + 13, + 32, + 131, + 1, + 81, + 97, + 46, + 192, + 132, + 1, + 81, + 9, + 97, + 47, + 224, + 131, + 1, + 82, + 128, + 97, + 5, + 128, + 131, + 1, + 81, + 97, + 11, + 192, + 132, + 1, + 81, + 9, + 97, + 48, + 0, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 5, + 128, + 132, + 1, + 81, + 9, + 97, + 48, + 32, + 131, + 1, + 82, + 128, + 97, + 48, + 32, + 131, + 1, + 81, + 130, + 3, + 97, + 11, + 64, + 132, + 1, + 81, + 8, + 97, + 48, + 64, + 131, + 1, + 82, + 128, + 127, + 20, + 198, + 1, + 133, + 231, + 88, + 133, + 214, + 116, + 219, + 75, + 63, + 125, + 74, + 86, + 148, + 250, + 108, + 1, + 170, + 15, + 83, + 85, + 123, + 6, + 11, + 192, + 74, + 65, + 114, + 112, + 95, + 97, + 5, + 128, + 132, + 1, + 81, + 9, + 97, + 48, + 96, + 131, + 1, + 82, + 128, + 97, + 48, + 96, + 131, + 1, + 81, + 130, + 3, + 97, + 11, + 64, + 132, + 1, + 81, + 8, + 97, + 48, + 128, + 131, + 1, + 82, + 128, + 127, + 34, + 181, + 86, + 3, + 88, + 109, + 95, + 196, + 44, + 108, + 20, + 194, + 252, + 39, + 160, + 40, + 194, + 7, + 218, + 139, + 44, + 113, + 203, + 51, + 213, + 73, + 250, + 74, + 43, + 229, + 211, + 2, + 97, + 5, + 128, + 132, + 1, + 81, + 9, + 97, + 48, + 160, + 131, + 1, + 82, + 128, + 97, + 48, + 160, + 131, + 1, + 81, + 130, + 3, + 97, + 11, + 64, + 132, + 1, + 81, + 8, + 97, + 48, + 192, + 131, + 1, + 82, + 128, + 127, + 42, + 253, + 78, + 119, + 39, + 63, + 28, + 179, + 67, + 74, + 74, + 102, + 121, + 41, + 5, + 140, + 21, + 107, + 33, + 87, + 60, + 63, + 30, + 252, + 136, + 46, + 112, + 133, + 151, + 215, + 22, + 26, + 97, + 5, + 128, + 132, + 1, + 81, + 9, + 97, + 48, + 224, + 131, + 1, + 82, + 128, + 97, + 48, + 224, + 131, + 1, + 81, + 130, + 3, + 97, + 11, + 64, + 132, + 1, + 81, + 8, + 97, + 49, + 0, + 131, + 1, + 82, + 128, + 129, + 127, + 33, + 5, + 76, + 232, + 179, + 203, + 157, + 201, + 184, + 122, + 245, + 199, + 12, + 143, + 84, + 153, + 64, + 144, + 173, + 143, + 167, + 224, + 108, + 170, + 249, + 137, + 186, + 88, + 6, + 182, + 121, + 139, + 97, + 11, + 192, + 133, + 1, + 81, + 9, + 97, + 11, + 64, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 132, + 127, + 15, + 95, + 1, + 138, + 45, + 102, + 2, + 95, + 255, + 213, + 79, + 239, + 116, + 242, + 3, + 195, + 231, + 163, + 58, + 184, + 209, + 217, + 3, + 230, + 74, + 88, + 59, + 59, + 233, + 73, + 134, + 118, + 97, + 11, + 192, + 136, + 1, + 81, + 9, + 97, + 5, + 128, + 135, + 1, + 81, + 9, + 8, + 144, + 80, + 128, + 97, + 49, + 32, + 132, + 1, + 82, + 80, + 128, + 129, + 127, + 16, + 172, + 0, + 157, + 47, + 49, + 57, + 94, + 48, + 22, + 53, + 205, + 109, + 41, + 41, + 120, + 164, + 1, + 33, + 151, + 194, + 77, + 110, + 99, + 251, + 73, + 148, + 58, + 112, + 41, + 97, + 54, + 97, + 11, + 192, + 133, + 1, + 81, + 9, + 97, + 11, + 64, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 132, + 127, + 38, + 150, + 170, + 39, + 136, + 17, + 12, + 99, + 235, + 191, + 215, + 249, + 43, + 53, + 44, + 233, + 59, + 40, + 187, + 218, + 229, + 123, + 124, + 185, + 75, + 197, + 136, + 94, + 228, + 57, + 231, + 116, + 97, + 11, + 192, + 136, + 1, + 81, + 9, + 97, + 5, + 128, + 135, + 1, + 81, + 9, + 8, + 144, + 80, + 128, + 97, + 49, + 64, + 132, + 1, + 82, + 80, + 128, + 129, + 127, + 37, + 16, + 202, + 225, + 97, + 135, + 19, + 172, + 23, + 201, + 239, + 131, + 241, + 166, + 118, + 69, + 237, + 33, + 244, + 84, + 217, + 107, + 241, + 240, + 114, + 202, + 91, + 70, + 62, + 127, + 12, + 40, + 97, + 11, + 192, + 133, + 1, + 81, + 9, + 97, + 11, + 64, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 132, + 127, + 13, + 106, + 7, + 101, + 60, + 100, + 244, + 17, + 34, + 132, + 203, + 139, + 35, + 191, + 115, + 173, + 236, + 175, + 78, + 224, + 254, + 245, + 25, + 152, + 84, + 149, + 38, + 240, + 123, + 109, + 239, + 215, + 97, + 11, + 192, + 136, + 1, + 81, + 9, + 97, + 5, + 128, + 135, + 1, + 81, + 9, + 8, + 97, + 49, + 96, + 132, + 1, + 82, + 80, + 97, + 48, + 64, + 130, + 1, + 81, + 129, + 144, + 96, + 1, + 9, + 97, + 49, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 48, + 128, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 49, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 49, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 49, + 192, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 11, + 64, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 127, + 48, + 100, + 78, + 114, + 225, + 49, + 160, + 41, + 184, + 80, + 69, + 182, + 129, + 129, + 88, + 93, + 40, + 51, + 232, + 72, + 121, + 185, + 112, + 145, + 67, + 225, + 245, + 147, + 240, + 0, + 0, + 0, + 97, + 5, + 128, + 135, + 1, + 81, + 9, + 8, + 144, + 80, + 128, + 97, + 49, + 224, + 132, + 1, + 82, + 80, + 128, + 129, + 127, + 29, + 129, + 185, + 189, + 81, + 101, + 214, + 58, + 13, + 74, + 131, + 112, + 211, + 121, + 102, + 235, + 36, + 51, + 101, + 211, + 108, + 162, + 53, + 145, + 21, + 100, + 167, + 131, + 248, + 35, + 76, + 242, + 97, + 11, + 192, + 133, + 1, + 81, + 9, + 97, + 11, + 64, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 132, + 127, + 18, + 226, + 148, + 181, + 143, + 203, + 201, + 239, + 171, + 5, + 194, + 69, + 174, + 7, + 241, + 114, + 4, + 0, + 130, + 117, + 13, + 23, + 59, + 0, + 46, + 125, + 78, + 15, + 247, + 220, + 179, + 15, + 97, + 11, + 192, + 136, + 1, + 81, + 9, + 97, + 5, + 128, + 135, + 1, + 81, + 9, + 8, + 144, + 80, + 128, + 97, + 50, + 0, + 132, + 1, + 82, + 80, + 128, + 129, + 127, + 20, + 47, + 147, + 200, + 145, + 151, + 0, + 237, + 219, + 70, + 168, + 35, + 166, + 63, + 23, + 38, + 192, + 94, + 105, + 83, + 253, + 139, + 165, + 125, + 223, + 110, + 167, + 14, + 126, + 188, + 141, + 207, + 97, + 11, + 192, + 133, + 1, + 81, + 9, + 97, + 11, + 64, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 132, + 127, + 39, + 7, + 211, + 204, + 87, + 136, + 194, + 207, + 192, + 238, + 158, + 95, + 86, + 56, + 218, + 59, + 144, + 203, + 109, + 139, + 151, + 34, + 74, + 69, + 33, + 7, + 62, + 201, + 241, + 8, + 38, + 251, + 97, + 11, + 192, + 136, + 1, + 81, + 9, + 97, + 5, + 128, + 135, + 1, + 81, + 9, + 8, + 144, + 80, + 128, + 97, + 50, + 32, + 132, + 1, + 82, + 80, + 128, + 129, + 127, + 19, + 211, + 212, + 219, + 131, + 180, + 44, + 77, + 72, + 175, + 166, + 181, + 201, + 203, + 227, + 244, + 151, + 3, + 208, + 202, + 241, + 253, + 195, + 1, + 176, + 212, + 211, + 116, + 58, + 182, + 8, + 51, + 97, + 11, + 192, + 133, + 1, + 81, + 9, + 97, + 11, + 64, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 132, + 127, + 34, + 62, + 217, + 157, + 56, + 7, + 88, + 25, + 4, + 63, + 168, + 94, + 211, + 197, + 79, + 59, + 251, + 93, + 98, + 49, + 33, + 57, + 86, + 44, + 168, + 45, + 153, + 3, + 177, + 181, + 46, + 39, + 97, + 11, + 192, + 136, + 1, + 81, + 9, + 97, + 5, + 128, + 135, + 1, + 81, + 9, + 8, + 97, + 50, + 64, + 132, + 1, + 82, + 80, + 97, + 48, + 192, + 130, + 1, + 81, + 97, + 49, + 160, + 131, + 1, + 81, + 130, + 145, + 144, + 9, + 97, + 50, + 96, + 131, + 1, + 82, + 128, + 129, + 127, + 27, + 158, + 76, + 236, + 249, + 217, + 26, + 83, + 67, + 116, + 250, + 119, + 4, + 55, + 1, + 200, + 45, + 199, + 230, + 158, + 106, + 102, + 27, + 22, + 61, + 214, + 53, + 73, + 174, + 141, + 143, + 163, + 97, + 5, + 128, + 133, + 1, + 81, + 9, + 97, + 11, + 64, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 132, + 127, + 20, + 198, + 1, + 133, + 231, + 88, + 133, + 214, + 116, + 219, + 75, + 63, + 125, + 74, + 86, + 148, + 250, + 108, + 1, + 170, + 15, + 83, + 85, + 123, + 6, + 11, + 192, + 74, + 65, + 114, + 112, + 94, + 97, + 5, + 128, + 136, + 1, + 81, + 9, + 97, + 5, + 128, + 135, + 1, + 81, + 9, + 8, + 144, + 80, + 128, + 97, + 50, + 128, + 132, + 1, + 82, + 80, + 128, + 129, + 127, + 20, + 198, + 1, + 133, + 231, + 88, + 133, + 214, + 116, + 219, + 75, + 63, + 125, + 74, + 86, + 148, + 250, + 108, + 1, + 170, + 15, + 83, + 85, + 123, + 6, + 11, + 192, + 74, + 65, + 114, + 112, + 94, + 97, + 5, + 128, + 133, + 1, + 81, + 9, + 97, + 11, + 64, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 132, + 127, + 26, + 81, + 77, + 217, + 248, + 13, + 227, + 85, + 19, + 52, + 20, + 153, + 11, + 255, + 220, + 19, + 113, + 105, + 255, + 191, + 121, + 241, + 176, + 152, + 140, + 228, + 220, + 75, + 39, + 173, + 180, + 227, + 97, + 5, + 128, + 136, + 1, + 81, + 9, + 97, + 5, + 128, + 135, + 1, + 81, + 9, + 8, + 144, + 80, + 128, + 97, + 50, + 160, + 132, + 1, + 82, + 80, + 128, + 129, + 127, + 5, + 102, + 255, + 251, + 185, + 242, + 131, + 118, + 117, + 5, + 251, + 80, + 8, + 88, + 82, + 209, + 18, + 200, + 198, + 241, + 61, + 122, + 81, + 148, + 187, + 179, + 133, + 14, + 88, + 40, + 233, + 232, + 97, + 5, + 128, + 133, + 1, + 81, + 9, + 97, + 11, + 64, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 132, + 127, + 42, + 253, + 78, + 119, + 39, + 63, + 28, + 179, + 67, + 74, + 74, + 102, + 121, + 41, + 5, + 140, + 21, + 107, + 33, + 87, + 60, + 63, + 30, + 252, + 136, + 46, + 112, + 133, + 151, + 215, + 22, + 25, + 97, + 5, + 128, + 136, + 1, + 81, + 9, + 97, + 5, + 128, + 135, + 1, + 81, + 9, + 8, + 144, + 80, + 128, + 97, + 50, + 192, + 132, + 1, + 82, + 80, + 128, + 129, + 127, + 42, + 253, + 78, + 119, + 39, + 63, + 28, + 179, + 67, + 74, + 74, + 102, + 121, + 41, + 5, + 140, + 21, + 107, + 33, + 87, + 60, + 63, + 30, + 252, + 136, + 46, + 112, + 133, + 151, + 215, + 22, + 25, + 97, + 5, + 128, + 133, + 1, + 81, + 9, + 97, + 11, + 64, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 132, + 127, + 32, + 25, + 133, + 23, + 103, + 3, + 18, + 84, + 21, + 97, + 161, + 114, + 13, + 37, + 56, + 172, + 53, + 125, + 245, + 157, + 175, + 160, + 212, + 27, + 215, + 35, + 90, + 151, + 242, + 243, + 100, + 55, + 97, + 5, + 128, + 136, + 1, + 81, + 9, + 97, + 5, + 128, + 135, + 1, + 81, + 9, + 8, + 97, + 50, + 224, + 132, + 1, + 82, + 80, + 97, + 49, + 0, + 130, + 1, + 81, + 97, + 49, + 128, + 131, + 1, + 81, + 130, + 145, + 144, + 9, + 97, + 51, + 0, + 131, + 1, + 82, + 97, + 49, + 32, + 130, + 1, + 81, + 129, + 129, + 97, + 49, + 64, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 51, + 32, + 132, + 1, + 82, + 129, + 129, + 97, + 49, + 96, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 51, + 64, + 132, + 1, + 82, + 129, + 129, + 97, + 49, + 224, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 51, + 96, + 132, + 1, + 82, + 129, + 129, + 97, + 49, + 128, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 51, + 128, + 132, + 1, + 82, + 129, + 129, + 97, + 50, + 0, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 51, + 160, + 132, + 1, + 82, + 129, + 129, + 97, + 50, + 32, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 51, + 192, + 132, + 1, + 82, + 129, + 129, + 97, + 50, + 64, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 51, + 224, + 132, + 1, + 82, + 129, + 129, + 97, + 50, + 96, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 52, + 0, + 132, + 1, + 82, + 129, + 129, + 97, + 50, + 128, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 52, + 32, + 132, + 1, + 82, + 129, + 129, + 97, + 50, + 160, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 52, + 64, + 132, + 1, + 82, + 129, + 129, + 97, + 49, + 160, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 52, + 96, + 132, + 1, + 82, + 129, + 129, + 97, + 50, + 192, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 52, + 128, + 132, + 1, + 82, + 129, + 129, + 97, + 50, + 224, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 52, + 160, + 132, + 1, + 82, + 129, + 129, + 97, + 51, + 0, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 52, + 192, + 132, + 1, + 82, + 80, + 96, + 32, + 97, + 53, + 0, + 131, + 1, + 82, + 96, + 32, + 97, + 53, + 32, + 131, + 1, + 82, + 96, + 32, + 97, + 53, + 64, + 131, + 1, + 82, + 97, + 52, + 192, + 130, + 1, + 81, + 97, + 53, + 96, + 131, + 1, + 82, + 127, + 48, + 100, + 78, + 114, + 225, + 49, + 160, + 41, + 184, + 80, + 69, + 182, + 129, + 129, + 88, + 93, + 40, + 51, + 232, + 72, + 121, + 185, + 112, + 145, + 67, + 225, + 245, + 147, + 239, + 255, + 255, + 255, + 97, + 53, + 128, + 131, + 1, + 82, + 96, + 0, + 128, + 81, + 96, + 32, + 97, + 84, + 18, + 131, + 57, + 129, + 81, + 145, + 82, + 97, + 53, + 160, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 32, + 97, + 52, + 224, + 133, + 1, + 96, + 192, + 97, + 53, + 0, + 135, + 1, + 96, + 5, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 52, + 224, + 130, + 1, + 81, + 96, + 0, + 97, + 51, + 0, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 52, + 160, + 134, + 1, + 81, + 9, + 97, + 51, + 0, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 50, + 224, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 52, + 128, + 134, + 1, + 81, + 9, + 97, + 50, + 224, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 50, + 192, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 52, + 96, + 134, + 1, + 81, + 9, + 97, + 50, + 192, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 49, + 160, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 52, + 64, + 134, + 1, + 81, + 9, + 97, + 49, + 160, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 50, + 160, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 52, + 32, + 134, + 1, + 81, + 9, + 97, + 50, + 160, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 50, + 128, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 52, + 0, + 134, + 1, + 81, + 9, + 97, + 50, + 128, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 50, + 96, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 51, + 224, + 134, + 1, + 81, + 9, + 97, + 50, + 96, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 50, + 64, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 51, + 192, + 134, + 1, + 81, + 9, + 97, + 50, + 64, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 50, + 32, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 51, + 160, + 134, + 1, + 81, + 9, + 97, + 50, + 32, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 50, + 0, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 51, + 128, + 134, + 1, + 81, + 9, + 97, + 50, + 0, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 49, + 128, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 51, + 96, + 134, + 1, + 81, + 9, + 97, + 49, + 128, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 49, + 224, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 51, + 64, + 134, + 1, + 81, + 9, + 97, + 49, + 224, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 49, + 96, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 51, + 32, + 134, + 1, + 81, + 9, + 97, + 49, + 96, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 49, + 64, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 49, + 32, + 134, + 1, + 81, + 9, + 97, + 49, + 64, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 97, + 49, + 32, + 133, + 1, + 129, + 144, + 82, + 97, + 49, + 64, + 133, + 1, + 81, + 144, + 146, + 80, + 131, + 145, + 80, + 130, + 144, + 8, + 144, + 80, + 129, + 129, + 97, + 49, + 96, + 133, + 1, + 81, + 8, + 97, + 53, + 192, + 132, + 1, + 82, + 80, + 97, + 49, + 128, + 130, + 1, + 81, + 97, + 49, + 192, + 131, + 1, + 81, + 130, + 145, + 144, + 9, + 97, + 53, + 224, + 131, + 1, + 82, + 97, + 49, + 224, + 130, + 1, + 81, + 128, + 97, + 54, + 0, + 132, + 1, + 82, + 80, + 128, + 97, + 50, + 96, + 131, + 1, + 81, + 97, + 49, + 192, + 132, + 1, + 81, + 9, + 97, + 54, + 32, + 131, + 1, + 82, + 97, + 50, + 0, + 130, + 1, + 81, + 129, + 129, + 97, + 50, + 32, + 133, + 1, + 81, + 8, + 144, + 80, + 129, + 129, + 97, + 50, + 64, + 133, + 1, + 81, + 8, + 97, + 54, + 64, + 132, + 1, + 82, + 80, + 97, + 49, + 160, + 130, + 1, + 81, + 97, + 49, + 192, + 131, + 1, + 81, + 130, + 145, + 144, + 9, + 97, + 54, + 96, + 131, + 1, + 82, + 97, + 50, + 128, + 130, + 1, + 81, + 129, + 129, + 97, + 50, + 160, + 133, + 1, + 81, + 8, + 97, + 54, + 128, + 132, + 1, + 82, + 80, + 97, + 51, + 0, + 130, + 1, + 81, + 97, + 49, + 192, + 131, + 1, + 81, + 130, + 145, + 144, + 9, + 97, + 54, + 160, + 131, + 1, + 82, + 97, + 50, + 192, + 130, + 1, + 81, + 129, + 129, + 97, + 50, + 224, + 133, + 1, + 81, + 8, + 97, + 54, + 192, + 132, + 1, + 82, + 80, + 97, + 53, + 192, + 130, + 1, + 81, + 97, + 54, + 0, + 131, + 1, + 81, + 130, + 144, + 130, + 144, + 9, + 144, + 80, + 128, + 97, + 54, + 224, + 132, + 1, + 82, + 129, + 129, + 97, + 54, + 64, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 55, + 0, + 132, + 1, + 82, + 129, + 129, + 97, + 54, + 128, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 55, + 32, + 132, + 1, + 82, + 129, + 129, + 97, + 54, + 192, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 55, + 64, + 132, + 1, + 82, + 80, + 96, + 32, + 97, + 55, + 128, + 131, + 1, + 82, + 96, + 32, + 97, + 55, + 160, + 131, + 1, + 82, + 96, + 32, + 97, + 55, + 192, + 131, + 1, + 82, + 97, + 55, + 64, + 130, + 1, + 81, + 97, + 55, + 224, + 131, + 1, + 82, + 127, + 48, + 100, + 78, + 114, + 225, + 49, + 160, + 41, + 184, + 80, + 69, + 182, + 129, + 129, + 88, + 93, + 40, + 51, + 232, + 72, + 121, + 185, + 112, + 145, + 67, + 225, + 245, + 147, + 239, + 255, + 255, + 255, + 97, + 56, + 0, + 131, + 1, + 82, + 96, + 0, + 128, + 81, + 96, + 32, + 97, + 84, + 18, + 131, + 57, + 129, + 81, + 145, + 82, + 97, + 56, + 32, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 32, + 97, + 55, + 96, + 133, + 1, + 96, + 192, + 97, + 55, + 128, + 135, + 1, + 96, + 5, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 55, + 96, + 130, + 1, + 81, + 96, + 0, + 97, + 54, + 192, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 55, + 32, + 134, + 1, + 81, + 9, + 97, + 54, + 192, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 54, + 128, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 55, + 0, + 134, + 1, + 81, + 9, + 97, + 54, + 128, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 54, + 64, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 54, + 224, + 134, + 1, + 81, + 9, + 97, + 54, + 64, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 54, + 0, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 53, + 192, + 134, + 1, + 81, + 9, + 97, + 54, + 0, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 97, + 53, + 192, + 133, + 1, + 82, + 80, + 80, + 97, + 54, + 0, + 130, + 1, + 81, + 97, + 53, + 224, + 131, + 1, + 81, + 130, + 145, + 144, + 9, + 97, + 56, + 64, + 131, + 1, + 82, + 128, + 97, + 54, + 64, + 131, + 1, + 81, + 97, + 54, + 32, + 132, + 1, + 81, + 9, + 97, + 56, + 96, + 131, + 1, + 82, + 128, + 97, + 54, + 128, + 131, + 1, + 81, + 97, + 54, + 96, + 132, + 1, + 81, + 9, + 97, + 56, + 128, + 131, + 1, + 82, + 128, + 97, + 54, + 192, + 131, + 1, + 81, + 97, + 54, + 160, + 132, + 1, + 81, + 9, + 97, + 56, + 160, + 131, + 1, + 82, + 97, + 10, + 64, + 130, + 1, + 81, + 129, + 144, + 128, + 9, + 97, + 56, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 56, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 57, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 57, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 57, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 57, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 57, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 57, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 57, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 57, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 58, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 58, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 58, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 58, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 58, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 58, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 58, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 58, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 59, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 59, + 32, + 131, + 1, + 82, + 97, + 10, + 160, + 130, + 1, + 81, + 129, + 144, + 128, + 9, + 97, + 59, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 160, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 59, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 160, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 59, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 160, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 59, + 160, + 131, + 1, + 82, + 128, + 97, + 49, + 32, + 131, + 1, + 81, + 97, + 5, + 192, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 97, + 49, + 64, + 134, + 1, + 81, + 97, + 6, + 0, + 135, + 1, + 81, + 9, + 8, + 144, + 80, + 129, + 129, + 131, + 97, + 49, + 96, + 134, + 1, + 81, + 97, + 6, + 128, + 135, + 1, + 81, + 9, + 8, + 97, + 59, + 192, + 132, + 1, + 129, + 144, + 82, + 97, + 53, + 192, + 132, + 1, + 81, + 131, + 146, + 80, + 144, + 9, + 97, + 59, + 224, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 59, + 224, + 132, + 1, + 81, + 131, + 3, + 9, + 97, + 60, + 0, + 131, + 1, + 82, + 128, + 97, + 49, + 32, + 131, + 1, + 81, + 97, + 5, + 224, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 97, + 49, + 64, + 134, + 1, + 81, + 97, + 6, + 32, + 135, + 1, + 81, + 9, + 8, + 144, + 80, + 129, + 129, + 131, + 97, + 49, + 96, + 134, + 1, + 81, + 97, + 6, + 96, + 135, + 1, + 81, + 9, + 8, + 97, + 60, + 32, + 132, + 1, + 129, + 144, + 82, + 97, + 53, + 192, + 132, + 1, + 81, + 131, + 146, + 80, + 144, + 9, + 97, + 60, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 60, + 96, + 131, + 1, + 82, + 128, + 97, + 10, + 64, + 131, + 1, + 81, + 96, + 1, + 9, + 97, + 60, + 128, + 131, + 1, + 82, + 128, + 97, + 60, + 96, + 131, + 1, + 81, + 97, + 60, + 0, + 132, + 1, + 81, + 8, + 97, + 60, + 160, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 60, + 160, + 132, + 1, + 81, + 9, + 97, + 60, + 192, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 60, + 128, + 132, + 1, + 81, + 9, + 97, + 60, + 224, + 131, + 1, + 82, + 128, + 97, + 53, + 224, + 131, + 1, + 81, + 96, + 1, + 9, + 97, + 61, + 0, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 6, + 64, + 132, + 1, + 81, + 9, + 97, + 61, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 61, + 64, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 61, + 64, + 132, + 1, + 81, + 131, + 3, + 9, + 97, + 61, + 96, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 61, + 128, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 10, + 0, + 132, + 1, + 81, + 9, + 97, + 61, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 61, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 61, + 224, + 131, + 1, + 82, + 128, + 97, + 10, + 64, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 62, + 0, + 131, + 1, + 82, + 128, + 97, + 61, + 224, + 131, + 1, + 81, + 97, + 61, + 96, + 132, + 1, + 81, + 8, + 97, + 62, + 32, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 6, + 160, + 132, + 1, + 81, + 9, + 97, + 62, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 62, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 192, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 62, + 128, + 131, + 1, + 82, + 128, + 97, + 56, + 192, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 62, + 160, + 131, + 1, + 82, + 128, + 97, + 62, + 128, + 131, + 1, + 81, + 97, + 62, + 32, + 132, + 1, + 81, + 8, + 97, + 62, + 192, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 6, + 192, + 132, + 1, + 81, + 9, + 97, + 62, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 63, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 224, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 63, + 32, + 131, + 1, + 82, + 128, + 97, + 56, + 224, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 63, + 64, + 131, + 1, + 82, + 128, + 97, + 63, + 32, + 131, + 1, + 81, + 97, + 62, + 192, + 132, + 1, + 81, + 8, + 97, + 63, + 96, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 6, + 224, + 132, + 1, + 81, + 9, + 97, + 63, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 63, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 57, + 0, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 63, + 192, + 131, + 1, + 82, + 128, + 97, + 57, + 0, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 63, + 224, + 131, + 1, + 82, + 128, + 97, + 63, + 192, + 131, + 1, + 81, + 97, + 63, + 96, + 132, + 1, + 81, + 8, + 97, + 64, + 0, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 7, + 0, + 132, + 1, + 81, + 9, + 97, + 64, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 64, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 57, + 32, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 64, + 96, + 131, + 1, + 82, + 128, + 97, + 57, + 32, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 64, + 128, + 131, + 1, + 82, + 128, + 97, + 64, + 96, + 131, + 1, + 81, + 97, + 64, + 0, + 132, + 1, + 81, + 8, + 97, + 64, + 160, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 7, + 32, + 132, + 1, + 81, + 9, + 97, + 64, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 64, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 57, + 64, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 65, + 0, + 131, + 1, + 82, + 128, + 97, + 57, + 64, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 65, + 32, + 131, + 1, + 82, + 128, + 97, + 65, + 0, + 131, + 1, + 81, + 97, + 64, + 160, + 132, + 1, + 81, + 8, + 97, + 65, + 64, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 7, + 64, + 132, + 1, + 81, + 9, + 97, + 65, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 65, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 57, + 96, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 65, + 160, + 131, + 1, + 82, + 128, + 97, + 57, + 96, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 65, + 192, + 131, + 1, + 82, + 128, + 97, + 65, + 160, + 131, + 1, + 81, + 97, + 65, + 64, + 132, + 1, + 81, + 8, + 97, + 65, + 224, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 7, + 96, + 132, + 1, + 81, + 9, + 97, + 66, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 66, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 57, + 128, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 66, + 64, + 131, + 1, + 82, + 128, + 97, + 57, + 128, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 66, + 96, + 131, + 1, + 82, + 128, + 97, + 66, + 64, + 131, + 1, + 81, + 97, + 65, + 224, + 132, + 1, + 81, + 8, + 97, + 66, + 128, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 7, + 128, + 132, + 1, + 81, + 9, + 97, + 66, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 66, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 57, + 160, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 66, + 224, + 131, + 1, + 82, + 128, + 97, + 57, + 160, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 67, + 0, + 131, + 1, + 82, + 128, + 97, + 66, + 224, + 131, + 1, + 81, + 97, + 66, + 128, + 132, + 1, + 81, + 8, + 97, + 67, + 32, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 7, + 160, + 132, + 1, + 81, + 9, + 97, + 67, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 67, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 57, + 192, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 67, + 128, + 131, + 1, + 82, + 128, + 97, + 57, + 192, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 67, + 160, + 131, + 1, + 82, + 128, + 97, + 67, + 128, + 131, + 1, + 81, + 97, + 67, + 32, + 132, + 1, + 81, + 8, + 97, + 67, + 192, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 7, + 192, + 132, + 1, + 81, + 9, + 97, + 67, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 68, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 57, + 224, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 68, + 32, + 131, + 1, + 82, + 128, + 97, + 57, + 224, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 68, + 64, + 131, + 1, + 82, + 128, + 97, + 68, + 32, + 131, + 1, + 81, + 97, + 67, + 192, + 132, + 1, + 81, + 8, + 97, + 68, + 96, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 7, + 224, + 132, + 1, + 81, + 9, + 97, + 68, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 68, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 58, + 0, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 68, + 192, + 131, + 1, + 82, + 128, + 97, + 58, + 0, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 68, + 224, + 131, + 1, + 82, + 128, + 97, + 68, + 192, + 131, + 1, + 81, + 97, + 68, + 96, + 132, + 1, + 81, + 8, + 97, + 69, + 0, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 8, + 32, + 132, + 1, + 81, + 9, + 97, + 69, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 69, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 58, + 32, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 69, + 96, + 131, + 1, + 82, + 128, + 97, + 58, + 32, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 69, + 128, + 131, + 1, + 82, + 128, + 97, + 69, + 96, + 131, + 1, + 81, + 97, + 69, + 0, + 132, + 1, + 81, + 8, + 97, + 69, + 160, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 8, + 64, + 132, + 1, + 81, + 9, + 97, + 69, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 69, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 58, + 64, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 70, + 0, + 131, + 1, + 82, + 128, + 97, + 58, + 64, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 70, + 32, + 131, + 1, + 82, + 128, + 97, + 70, + 0, + 131, + 1, + 81, + 97, + 69, + 160, + 132, + 1, + 81, + 8, + 97, + 70, + 64, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 8, + 96, + 132, + 1, + 81, + 9, + 97, + 70, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 70, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 58, + 96, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 70, + 160, + 131, + 1, + 82, + 128, + 97, + 58, + 96, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 70, + 192, + 131, + 1, + 82, + 128, + 97, + 70, + 160, + 131, + 1, + 81, + 97, + 70, + 64, + 132, + 1, + 81, + 8, + 97, + 70, + 224, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 8, + 128, + 132, + 1, + 81, + 9, + 97, + 71, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 71, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 58, + 128, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 71, + 64, + 131, + 1, + 82, + 128, + 97, + 58, + 128, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 71, + 96, + 131, + 1, + 82, + 128, + 97, + 71, + 64, + 131, + 1, + 81, + 97, + 70, + 224, + 132, + 1, + 81, + 8, + 97, + 71, + 128, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 8, + 160, + 132, + 1, + 81, + 9, + 97, + 71, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 71, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 58, + 160, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 71, + 224, + 131, + 1, + 82, + 128, + 97, + 58, + 160, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 72, + 0, + 131, + 1, + 82, + 128, + 97, + 71, + 224, + 131, + 1, + 81, + 97, + 71, + 128, + 132, + 1, + 81, + 8, + 97, + 72, + 32, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 8, + 192, + 132, + 1, + 81, + 9, + 97, + 72, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 72, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 58, + 192, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 72, + 128, + 131, + 1, + 82, + 128, + 97, + 58, + 192, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 72, + 160, + 131, + 1, + 82, + 128, + 97, + 72, + 128, + 131, + 1, + 81, + 97, + 72, + 32, + 132, + 1, + 81, + 8, + 97, + 72, + 192, + 131, + 1, + 82, + 128, + 97, + 53, + 224, + 131, + 1, + 81, + 97, + 47, + 96, + 132, + 1, + 81, + 9, + 97, + 72, + 224, + 131, + 1, + 82, + 128, + 97, + 53, + 224, + 131, + 1, + 81, + 97, + 47, + 128, + 132, + 1, + 81, + 9, + 97, + 73, + 0, + 131, + 1, + 82, + 128, + 97, + 53, + 224, + 131, + 1, + 81, + 97, + 47, + 160, + 132, + 1, + 81, + 9, + 97, + 73, + 32, + 131, + 1, + 82, + 128, + 97, + 53, + 224, + 131, + 1, + 81, + 97, + 47, + 192, + 132, + 1, + 81, + 9, + 97, + 73, + 64, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 47, + 224, + 132, + 1, + 81, + 9, + 97, + 73, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 73, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 58, + 224, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 73, + 160, + 131, + 1, + 82, + 128, + 97, + 58, + 224, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 73, + 192, + 131, + 1, + 82, + 128, + 97, + 58, + 224, + 131, + 1, + 81, + 97, + 72, + 224, + 132, + 1, + 81, + 9, + 97, + 73, + 224, + 131, + 1, + 82, + 128, + 97, + 58, + 224, + 131, + 1, + 81, + 97, + 73, + 0, + 132, + 1, + 81, + 9, + 97, + 74, + 0, + 131, + 1, + 82, + 128, + 97, + 58, + 224, + 131, + 1, + 81, + 97, + 73, + 32, + 132, + 1, + 81, + 9, + 97, + 74, + 32, + 131, + 1, + 82, + 128, + 97, + 58, + 224, + 131, + 1, + 81, + 97, + 73, + 64, + 132, + 1, + 81, + 9, + 97, + 74, + 64, + 131, + 1, + 82, + 128, + 97, + 73, + 160, + 131, + 1, + 81, + 97, + 72, + 192, + 132, + 1, + 81, + 8, + 97, + 74, + 96, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 8, + 0, + 132, + 1, + 81, + 9, + 97, + 74, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 74, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 59, + 0, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 74, + 192, + 131, + 1, + 82, + 128, + 97, + 59, + 0, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 74, + 224, + 131, + 1, + 82, + 128, + 97, + 74, + 192, + 131, + 1, + 81, + 97, + 74, + 96, + 132, + 1, + 81, + 8, + 97, + 75, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 160, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 75, + 32, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 61, + 128, + 132, + 1, + 81, + 9, + 97, + 75, + 64, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 62, + 0, + 132, + 1, + 81, + 9, + 97, + 75, + 96, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 62, + 160, + 132, + 1, + 81, + 9, + 97, + 75, + 128, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 63, + 64, + 132, + 1, + 81, + 9, + 97, + 75, + 160, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 63, + 224, + 132, + 1, + 81, + 9, + 97, + 75, + 192, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 64, + 128, + 132, + 1, + 81, + 9, + 97, + 75, + 224, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 65, + 32, + 132, + 1, + 81, + 9, + 97, + 76, + 0, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 65, + 192, + 132, + 1, + 81, + 9, + 97, + 76, + 32, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 66, + 96, + 132, + 1, + 81, + 9, + 97, + 76, + 64, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 67, + 0, + 132, + 1, + 81, + 9, + 97, + 76, + 96, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 67, + 160, + 132, + 1, + 81, + 9, + 97, + 76, + 128, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 68, + 64, + 132, + 1, + 81, + 9, + 97, + 76, + 160, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 68, + 224, + 132, + 1, + 81, + 9, + 97, + 76, + 192, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 69, + 128, + 132, + 1, + 81, + 9, + 97, + 76, + 224, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 70, + 32, + 132, + 1, + 81, + 9, + 97, + 77, + 0, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 70, + 192, + 132, + 1, + 81, + 9, + 97, + 77, + 32, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 71, + 96, + 132, + 1, + 81, + 9, + 97, + 77, + 64, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 72, + 0, + 132, + 1, + 81, + 9, + 97, + 77, + 96, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 72, + 160, + 132, + 1, + 81, + 9, + 97, + 77, + 128, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 73, + 192, + 132, + 1, + 81, + 9, + 97, + 77, + 160, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 73, + 224, + 132, + 1, + 81, + 9, + 97, + 77, + 192, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 74, + 0, + 132, + 1, + 81, + 9, + 97, + 77, + 224, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 74, + 32, + 132, + 1, + 81, + 9, + 97, + 78, + 0, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 74, + 64, + 132, + 1, + 81, + 9, + 97, + 78, + 32, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 74, + 224, + 132, + 1, + 81, + 9, + 97, + 78, + 64, + 131, + 1, + 82, + 128, + 97, + 75, + 32, + 131, + 1, + 81, + 97, + 60, + 192, + 132, + 1, + 81, + 8, + 97, + 78, + 96, + 131, + 1, + 82, + 128, + 97, + 54, + 32, + 131, + 1, + 81, + 96, + 1, + 9, + 97, + 78, + 128, + 131, + 1, + 82, + 128, + 97, + 50, + 0, + 131, + 1, + 81, + 97, + 8, + 224, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 97, + 50, + 32, + 134, + 1, + 81, + 97, + 9, + 0, + 135, + 1, + 81, + 9, + 8, + 144, + 80, + 129, + 129, + 131, + 97, + 50, + 64, + 134, + 1, + 81, + 97, + 9, + 32, + 135, + 1, + 81, + 9, + 8, + 97, + 78, + 160, + 132, + 1, + 129, + 144, + 82, + 97, + 56, + 96, + 132, + 1, + 81, + 131, + 146, + 80, + 144, + 9, + 97, + 78, + 192, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 78, + 192, + 132, + 1, + 81, + 131, + 3, + 9, + 97, + 78, + 224, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 78, + 128, + 132, + 1, + 81, + 9, + 97, + 79, + 0, + 131, + 1, + 82, + 128, + 97, + 59, + 64, + 131, + 1, + 81, + 97, + 78, + 224, + 132, + 1, + 81, + 9, + 97, + 79, + 32, + 131, + 1, + 82, + 128, + 97, + 59, + 64, + 131, + 1, + 81, + 97, + 79, + 0, + 132, + 1, + 81, + 9, + 97, + 79, + 64, + 131, + 1, + 82, + 128, + 97, + 79, + 32, + 131, + 1, + 81, + 97, + 78, + 96, + 132, + 1, + 81, + 8, + 97, + 79, + 96, + 131, + 1, + 82, + 128, + 97, + 54, + 96, + 131, + 1, + 81, + 96, + 1, + 9, + 97, + 79, + 128, + 131, + 1, + 82, + 128, + 97, + 50, + 128, + 131, + 1, + 81, + 97, + 9, + 64, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 97, + 50, + 160, + 134, + 1, + 81, + 97, + 9, + 96, + 135, + 1, + 81, + 9, + 8, + 97, + 79, + 160, + 132, + 1, + 129, + 144, + 82, + 97, + 56, + 128, + 132, + 1, + 81, + 131, + 146, + 80, + 144, + 9, + 97, + 79, + 192, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 79, + 192, + 132, + 1, + 81, + 131, + 3, + 9, + 97, + 79, + 224, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 79, + 128, + 132, + 1, + 81, + 9, + 97, + 80, + 0, + 131, + 1, + 82, + 128, + 97, + 50, + 128, + 131, + 1, + 81, + 97, + 9, + 128, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 97, + 50, + 160, + 134, + 1, + 81, + 97, + 9, + 160, + 135, + 1, + 81, + 9, + 8, + 97, + 80, + 32, + 132, + 1, + 129, + 144, + 82, + 97, + 56, + 128, + 132, + 1, + 81, + 131, + 146, + 80, + 144, + 9, + 97, + 80, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 80, + 96, + 131, + 1, + 82, + 128, + 97, + 10, + 64, + 131, + 1, + 81, + 97, + 79, + 128, + 132, + 1, + 81, + 9, + 97, + 80, + 128, + 131, + 1, + 82, + 128, + 97, + 80, + 96, + 131, + 1, + 81, + 97, + 79, + 224, + 132, + 1, + 81, + 8, + 97, + 80, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 59, + 96, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 80, + 192, + 131, + 1, + 82, + 128, + 97, + 59, + 96, + 131, + 1, + 81, + 97, + 80, + 0, + 132, + 1, + 81, + 9, + 97, + 80, + 224, + 131, + 1, + 82, + 128, + 97, + 59, + 96, + 131, + 1, + 81, + 97, + 80, + 128, + 132, + 1, + 81, + 9, + 97, + 81, + 0, + 131, + 1, + 82, + 128, + 97, + 80, + 192, + 131, + 1, + 81, + 97, + 79, + 96, + 132, + 1, + 81, + 8, + 97, + 81, + 32, + 131, + 1, + 82, + 128, + 97, + 54, + 160, + 131, + 1, + 81, + 96, + 1, + 9, + 97, + 81, + 64, + 131, + 1, + 82, + 128, + 97, + 50, + 192, + 131, + 1, + 81, + 97, + 9, + 192, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 97, + 50, + 224, + 134, + 1, + 81, + 97, + 9, + 224, + 135, + 1, + 81, + 9, + 8, + 97, + 81, + 96, + 132, + 1, + 129, + 144, + 82, + 97, + 56, + 160, + 132, + 1, + 81, + 131, + 146, + 80, + 144, + 9, + 97, + 81, + 128, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 81, + 128, + 132, + 1, + 81, + 131, + 3, + 9, + 97, + 81, + 160, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 81, + 64, + 132, + 1, + 81, + 9, + 97, + 81, + 192, + 131, + 1, + 82, + 128, + 97, + 59, + 128, + 131, + 1, + 81, + 97, + 81, + 160, + 132, + 1, + 81, + 9, + 97, + 81, + 224, + 131, + 1, + 82, + 128, + 97, + 59, + 128, + 131, + 1, + 81, + 97, + 81, + 192, + 132, + 1, + 81, + 9, + 97, + 82, + 0, + 131, + 1, + 82, + 128, + 97, + 81, + 224, + 131, + 1, + 81, + 97, + 81, + 32, + 132, + 1, + 81, + 8, + 97, + 82, + 32, + 131, + 1, + 82, + 128, + 97, + 49, + 192, + 131, + 1, + 81, + 96, + 1, + 9, + 97, + 82, + 64, + 131, + 1, + 82, + 128, + 97, + 11, + 64, + 131, + 1, + 81, + 96, + 1, + 9, + 97, + 82, + 96, + 131, + 1, + 82, + 96, + 1, + 97, + 82, + 128, + 131, + 1, + 129, + 129, + 82, + 96, + 2, + 97, + 82, + 160, + 133, + 1, + 82, + 97, + 82, + 32, + 132, + 1, + 81, + 97, + 82, + 192, + 133, + 1, + 82, + 132, + 145, + 144, + 96, + 64, + 144, + 96, + 96, + 129, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 82, + 128, + 130, + 1, + 81, + 97, + 82, + 224, + 131, + 1, + 82, + 97, + 82, + 160, + 130, + 1, + 81, + 97, + 83, + 0, + 131, + 1, + 82, + 96, + 96, + 130, + 1, + 81, + 97, + 83, + 32, + 131, + 1, + 82, + 96, + 128, + 130, + 1, + 81, + 97, + 83, + 64, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 82, + 224, + 133, + 1, + 96, + 128, + 97, + 82, + 224, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 96, + 160, + 130, + 1, + 81, + 97, + 83, + 96, + 131, + 1, + 82, + 96, + 192, + 130, + 1, + 81, + 97, + 83, + 128, + 131, + 1, + 82, + 97, + 60, + 224, + 130, + 1, + 81, + 97, + 83, + 160, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 83, + 96, + 133, + 1, + 96, + 96, + 97, + 83, + 96, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 82, + 224, + 130, + 1, + 81, + 97, + 83, + 192, + 131, + 1, + 82, + 97, + 83, + 0, + 130, + 1, + 81, + 97, + 83, + 224, + 131, + 1, + 82, + 97, + 83, + 96, + 130, + 1, + 81, + 97, + 84, + 0, + 131, + 1, + 82, + 97, + 83, + 128, + 130, + 1, + 81, + 97, + 84, + 32, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 83, + 192, + 133, + 1, + 96, + 128, + 97, + 83, + 192, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 96, + 224, + 130, + 1, + 81, + 97, + 84, + 64, + 131, + 1, + 82, + 97, + 1, + 0, + 130, + 1, + 81, + 97, + 84, + 96, + 131, + 1, + 82, + 97, + 75, + 64, + 130, + 1, + 81, + 97, + 84, + 128, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 84, + 64, + 133, + 1, + 96, + 96, + 97, + 84, + 64, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 83, + 192, + 130, + 1, + 81, + 97, + 84, + 160, + 131, + 1, + 82, + 97, + 83, + 224, + 130, + 1, + 81, + 97, + 84, + 192, + 131, + 1, + 82, + 97, + 84, + 64, + 130, + 1, + 81, + 97, + 84, + 224, + 131, + 1, + 82, + 97, + 84, + 96, + 130, + 1, + 81, + 97, + 85, + 0, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 84, + 160, + 133, + 1, + 96, + 128, + 97, + 84, + 160, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 1, + 192, + 130, + 1, + 81, + 97, + 85, + 32, + 131, + 1, + 82, + 97, + 1, + 224, + 130, + 1, + 81, + 97, + 85, + 64, + 131, + 1, + 82, + 97, + 75, + 96, + 130, + 1, + 81, + 97, + 85, + 96, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 85, + 32, + 133, + 1, + 96, + 96, + 97, + 85, + 32, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 84, + 160, + 130, + 1, + 81, + 97, + 85, + 128, + 131, + 1, + 82, + 97, + 84, + 192, + 130, + 1, + 81, + 97, + 85, + 160, + 131, + 1, + 82, + 97, + 85, + 32, + 130, + 1, + 81, + 97, + 85, + 192, + 131, + 1, + 82, + 97, + 85, + 64, + 130, + 1, + 81, + 97, + 85, + 224, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 85, + 128, + 133, + 1, + 96, + 128, + 97, + 85, + 128, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 20, + 17, + 61, + 45, + 168, + 3, + 126, + 199, + 127, + 85, + 223, + 251, + 145, + 21, + 26, + 142, + 123, + 179, + 238, + 234, + 47, + 228, + 79, + 104, + 4, + 112, + 61, + 15, + 130, + 243, + 68, + 160, + 97, + 86, + 0, + 131, + 1, + 82, + 127, + 28, + 91, + 95, + 76, + 40, + 52, + 108, + 253, + 223, + 8, + 237, + 222, + 141, + 180, + 146, + 241, + 154, + 36, + 181, + 247, + 63, + 194, + 189, + 72, + 220, + 25, + 19, + 122, + 17, + 206, + 83, + 191, + 97, + 86, + 32, + 131, + 1, + 82, + 97, + 75, + 128, + 130, + 1, + 81, + 97, + 86, + 64, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 86, + 0, + 133, + 1, + 96, + 96, + 97, + 86, + 0, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 85, + 128, + 130, + 1, + 81, + 97, + 86, + 96, + 131, + 1, + 82, + 97, + 85, + 160, + 130, + 1, + 81, + 97, + 86, + 128, + 131, + 1, + 82, + 97, + 86, + 0, + 130, + 1, + 81, + 97, + 86, + 160, + 131, + 1, + 82, + 97, + 86, + 32, + 130, + 1, + 81, + 97, + 86, + 192, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 86, + 96, + 133, + 1, + 96, + 128, + 97, + 86, + 96, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 4, + 145, + 113, + 78, + 160, + 41, + 83, + 70, + 145, + 149, + 202, + 7, + 104, + 181, + 170, + 251, + 3, + 22, + 107, + 39, + 40, + 77, + 231, + 204, + 159, + 250, + 123, + 56, + 121, + 169, + 89, + 165, + 97, + 86, + 224, + 131, + 1, + 82, + 127, + 45, + 186, + 169, + 165, + 157, + 199, + 253, + 150, + 87, + 121, + 141, + 217, + 192, + 15, + 252, + 133, + 210, + 3, + 62, + 149, + 85, + 182, + 153, + 244, + 217, + 112, + 107, + 194, + 183, + 125, + 206, + 119, + 97, + 87, + 0, + 131, + 1, + 82, + 97, + 75, + 160, + 130, + 1, + 81, + 97, + 87, + 32, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 86, + 224, + 133, + 1, + 96, + 96, + 97, + 86, + 224, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 86, + 96, + 130, + 1, + 81, + 97, + 87, + 64, + 131, + 1, + 82, + 97, + 86, + 128, + 130, + 1, + 81, + 97, + 87, + 96, + 131, + 1, + 82, + 97, + 86, + 224, + 130, + 1, + 81, + 97, + 87, + 128, + 131, + 1, + 82, + 97, + 87, + 0, + 130, + 1, + 81, + 97, + 87, + 160, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 87, + 64, + 133, + 1, + 96, + 128, + 97, + 87, + 64, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 22, + 218, + 143, + 205, + 231, + 133, + 198, + 223, + 31, + 225, + 58, + 236, + 74, + 8, + 142, + 6, + 121, + 7, + 80, + 223, + 169, + 162, + 233, + 198, + 224, + 84, + 100, + 160, + 107, + 153, + 103, + 157, + 97, + 87, + 192, + 131, + 1, + 82, + 127, + 25, + 255, + 250, + 93, + 145, + 84, + 156, + 222, + 199, + 55, + 38, + 46, + 108, + 197, + 250, + 1, + 194, + 241, + 195, + 156, + 123, + 95, + 86, + 125, + 101, + 214, + 142, + 44, + 243, + 7, + 123, + 219, + 97, + 87, + 224, + 131, + 1, + 82, + 97, + 75, + 192, + 130, + 1, + 81, + 97, + 88, + 0, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 87, + 192, + 133, + 1, + 96, + 96, + 97, + 87, + 192, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 87, + 64, + 130, + 1, + 81, + 97, + 88, + 32, + 131, + 1, + 82, + 97, + 87, + 96, + 130, + 1, + 81, + 97, + 88, + 64, + 131, + 1, + 82, + 97, + 87, + 192, + 130, + 1, + 81, + 97, + 88, + 96, + 131, + 1, + 82, + 97, + 87, + 224, + 130, + 1, + 81, + 97, + 88, + 128, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 88, + 32, + 133, + 1, + 96, + 128, + 97, + 88, + 32, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 21, + 66, + 215, + 212, + 113, + 4, + 156, + 52, + 110, + 155, + 151, + 171, + 194, + 163, + 81, + 148, + 141, + 35, + 67, + 128, + 25, + 167, + 109, + 242, + 177, + 152, + 156, + 143, + 118, + 178, + 135, + 96, + 97, + 88, + 160, + 131, + 1, + 82, + 127, + 14, + 38, + 225, + 61, + 177, + 241, + 120, + 248, + 93, + 188, + 184, + 59, + 10, + 97, + 125, + 118, + 108, + 11, + 54, + 252, + 74, + 73, + 186, + 250, + 177, + 59, + 32, + 232, + 61, + 5, + 87, + 243, + 97, + 88, + 192, + 131, + 1, + 82, + 97, + 75, + 224, + 130, + 1, + 81, + 97, + 88, + 224, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 88, + 160, + 133, + 1, + 96, + 96, + 97, + 88, + 160, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 88, + 32, + 130, + 1, + 81, + 97, + 89, + 0, + 131, + 1, + 82, + 97, + 88, + 64, + 130, + 1, + 81, + 97, + 89, + 32, + 131, + 1, + 82, + 97, + 88, + 160, + 130, + 1, + 81, + 97, + 89, + 64, + 131, + 1, + 82, + 97, + 88, + 192, + 130, + 1, + 81, + 97, + 89, + 96, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 89, + 0, + 133, + 1, + 96, + 128, + 97, + 89, + 0, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 43, + 105, + 43, + 145, + 153, + 137, + 31, + 134, + 227, + 252, + 86, + 19, + 153, + 30, + 114, + 180, + 112, + 152, + 34, + 12, + 157, + 136, + 52, + 21, + 36, + 66, + 113, + 204, + 116, + 177, + 33, + 141, + 97, + 89, + 128, + 131, + 1, + 82, + 127, + 4, + 47, + 146, + 154, + 254, + 75, + 197, + 98, + 6, + 180, + 172, + 228, + 26, + 61, + 40, + 56, + 72, + 117, + 61, + 80, + 20, + 89, + 123, + 205, + 14, + 193, + 79, + 138, + 146, + 97, + 197, + 132, + 97, + 89, + 160, + 131, + 1, + 82, + 97, + 76, + 0, + 130, + 1, + 81, + 97, + 89, + 192, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 89, + 128, + 133, + 1, + 96, + 96, + 97, + 89, + 128, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 89, + 0, + 130, + 1, + 81, + 97, + 89, + 224, + 131, + 1, + 82, + 97, + 89, + 32, + 130, + 1, + 81, + 97, + 90, + 0, + 131, + 1, + 82, + 97, + 89, + 128, + 130, + 1, + 81, + 97, + 90, + 32, + 131, + 1, + 82, + 97, + 89, + 160, + 130, + 1, + 81, + 97, + 90, + 64, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 89, + 224, + 133, + 1, + 96, + 128, + 97, + 89, + 224, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 41, + 192, + 159, + 32, + 106, + 47, + 176, + 75, + 21, + 163, + 160, + 194, + 32, + 2, + 76, + 107, + 15, + 250, + 68, + 138, + 25, + 254, + 61, + 78, + 196, + 95, + 250, + 32, + 116, + 143, + 201, + 70, + 97, + 90, + 96, + 131, + 1, + 82, + 127, + 29, + 39, + 198, + 159, + 191, + 169, + 156, + 174, + 207, + 6, + 55, + 109, + 121, + 203, + 222, + 84, + 54, + 114, + 104, + 54, + 173, + 99, + 88, + 41, + 84, + 226, + 97, + 141, + 56, + 153, + 166, + 246, + 97, + 90, + 128, + 131, + 1, + 82, + 97, + 76, + 32, + 130, + 1, + 81, + 97, + 90, + 160, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 90, + 96, + 133, + 1, + 96, + 96, + 97, + 90, + 96, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 89, + 224, + 130, + 1, + 81, + 97, + 90, + 192, + 131, + 1, + 82, + 97, + 90, + 0, + 130, + 1, + 81, + 97, + 90, + 224, + 131, + 1, + 82, + 97, + 90, + 96, + 130, + 1, + 81, + 97, + 91, + 0, + 131, + 1, + 82, + 97, + 90, + 128, + 130, + 1, + 81, + 97, + 91, + 32, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 90, + 192, + 133, + 1, + 96, + 128, + 97, + 90, + 192, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 32, + 163, + 17, + 58, + 72, + 188, + 153, + 209, + 64, + 22, + 102, + 105, + 144, + 217, + 130, + 175, + 63, + 200, + 239, + 98, + 105, + 194, + 243, + 126, + 5, + 59, + 187, + 128, + 30, + 27, + 218, + 55, + 97, + 91, + 64, + 131, + 1, + 82, + 127, + 17, + 135, + 74, + 51, + 72, + 166, + 1, + 19, + 237, + 149, + 178, + 92, + 75, + 219, + 25, + 131, + 105, + 228, + 73, + 150, + 125, + 254, + 127, + 227, + 37, + 60, + 179, + 154, + 253, + 238, + 38, + 114, + 97, + 91, + 96, + 131, + 1, + 82, + 97, + 76, + 64, + 130, + 1, + 81, + 97, + 91, + 128, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 91, + 64, + 133, + 1, + 96, + 96, + 97, + 91, + 64, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 90, + 192, + 130, + 1, + 81, + 97, + 91, + 160, + 131, + 1, + 82, + 97, + 90, + 224, + 130, + 1, + 81, + 97, + 91, + 192, + 131, + 1, + 82, + 97, + 91, + 64, + 130, + 1, + 81, + 97, + 91, + 224, + 131, + 1, + 82, + 97, + 91, + 96, + 130, + 1, + 81, + 97, + 92, + 0, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 91, + 160, + 133, + 1, + 96, + 128, + 97, + 91, + 160, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 34, + 238, + 103, + 125, + 43, + 225, + 86, + 138, + 94, + 216, + 155, + 115, + 200, + 73, + 157, + 65, + 92, + 124, + 72, + 177, + 33, + 132, + 164, + 135, + 129, + 228, + 240, + 141, + 55, + 117, + 87, + 87, + 97, + 92, + 32, + 131, + 1, + 82, + 127, + 22, + 242, + 116, + 75, + 184, + 218, + 230, + 91, + 92, + 90, + 110, + 8, + 54, + 205, + 91, + 89, + 1, + 76, + 37, + 242, + 72, + 27, + 2, + 77, + 236, + 33, + 204, + 191, + 38, + 169, + 128, + 140, + 97, + 92, + 64, + 131, + 1, + 82, + 97, + 76, + 96, + 130, + 1, + 81, + 97, + 92, + 96, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 92, + 32, + 133, + 1, + 96, + 96, + 97, + 92, + 32, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 91, + 160, + 130, + 1, + 81, + 97, + 92, + 128, + 131, + 1, + 82, + 97, + 91, + 192, + 130, + 1, + 81, + 97, + 92, + 160, + 131, + 1, + 82, + 97, + 92, + 32, + 130, + 1, + 81, + 97, + 92, + 192, + 131, + 1, + 82, + 97, + 92, + 64, + 130, + 1, + 81, + 97, + 92, + 224, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 92, + 128, + 133, + 1, + 96, + 128, + 97, + 92, + 128, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 15, + 204, + 243, + 125, + 198, + 134, + 140, + 180, + 80, + 193, + 204, + 151, + 26, + 144, + 5, + 194, + 10, + 207, + 25, + 221, + 177, + 200, + 43, + 156, + 234, + 231, + 87, + 154, + 170, + 246, + 229, + 220, + 97, + 93, + 0, + 131, + 1, + 82, + 127, + 16, + 83, + 165, + 173, + 187, + 132, + 28, + 235, + 12, + 128, + 76, + 142, + 65, + 136, + 178, + 235, + 3, + 13, + 10, + 98, + 58, + 225, + 153, + 85, + 49, + 115, + 216, + 24, + 223, + 70, + 168, + 248, + 97, + 93, + 32, + 131, + 1, + 82, + 97, + 76, + 128, + 130, + 1, + 81, + 97, + 93, + 64, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 93, + 0, + 133, + 1, + 96, + 96, + 97, + 93, + 0, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 92, + 128, + 130, + 1, + 81, + 97, + 93, + 96, + 131, + 1, + 82, + 97, + 92, + 160, + 130, + 1, + 81, + 97, + 93, + 128, + 131, + 1, + 82, + 97, + 93, + 0, + 130, + 1, + 81, + 97, + 93, + 160, + 131, + 1, + 82, + 97, + 93, + 32, + 130, + 1, + 81, + 97, + 93, + 192, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 93, + 96, + 133, + 1, + 96, + 128, + 97, + 93, + 96, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 3, + 195, + 197, + 121, + 35, + 148, + 172, + 214, + 35, + 1, + 116, + 52, + 44, + 15, + 180, + 206, + 186, + 155, + 53, + 195, + 141, + 74, + 176, + 221, + 180, + 160, + 251, + 23, + 125, + 181, + 67, + 8, + 97, + 93, + 224, + 131, + 1, + 82, + 127, + 31, + 215, + 211, + 174, + 87, + 226, + 239, + 76, + 123, + 16, + 35, + 206, + 73, + 85, + 3, + 228, + 12, + 168, + 149, + 50, + 203, + 246, + 167, + 64, + 229, + 125, + 159, + 165, + 125, + 43, + 111, + 147, + 97, + 94, + 0, + 131, + 1, + 82, + 97, + 76, + 160, + 130, + 1, + 81, + 97, + 94, + 32, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 93, + 224, + 133, + 1, + 96, + 96, + 97, + 93, + 224, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 93, + 96, + 130, + 1, + 81, + 97, + 94, + 64, + 131, + 1, + 82, + 97, + 93, + 128, + 130, + 1, + 81, + 97, + 94, + 96, + 131, + 1, + 82, + 97, + 93, + 224, + 130, + 1, + 81, + 97, + 94, + 128, + 131, + 1, + 82, + 97, + 94, + 0, + 130, + 1, + 81, + 97, + 94, + 160, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 94, + 64, + 133, + 1, + 96, + 128, + 97, + 94, + 64, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 21, + 182, + 76, + 242, + 35, + 211, + 117, + 202, + 108, + 152, + 58, + 184, + 65, + 2, + 169, + 96, + 191, + 235, + 84, + 160, + 162, + 154, + 8, + 88, + 68, + 224, + 229, + 113, + 176, + 159, + 61, + 113, + 97, + 94, + 192, + 131, + 1, + 82, + 127, + 35, + 216, + 64, + 132, + 132, + 182, + 177, + 11, + 137, + 127, + 155, + 12, + 195, + 51, + 20, + 217, + 6, + 13, + 172, + 72, + 244, + 58, + 98, + 160, + 229, + 102, + 11, + 229, + 136, + 42, + 122, + 142, + 97, + 94, + 224, + 131, + 1, + 82, + 97, + 76, + 192, + 130, + 1, + 81, + 97, + 95, + 0, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 94, + 192, + 133, + 1, + 96, + 96, + 97, + 94, + 192, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 94, + 64, + 130, + 1, + 81, + 97, + 95, + 32, + 131, + 1, + 82, + 97, + 94, + 96, + 130, + 1, + 81, + 97, + 95, + 64, + 131, + 1, + 82, + 97, + 94, + 192, + 130, + 1, + 81, + 97, + 95, + 96, + 131, + 1, + 82, + 97, + 94, + 224, + 130, + 1, + 81, + 97, + 95, + 128, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 95, + 32, + 133, + 1, + 96, + 128, + 97, + 95, + 32, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 43, + 6, + 157, + 142, + 46, + 87, + 230, + 173, + 214, + 242, + 22, + 129, + 106, + 49, + 147, + 106, + 242, + 117, + 64, + 149, + 155, + 253, + 123, + 132, + 93, + 62, + 116, + 216, + 65, + 150, + 99, + 157, + 97, + 95, + 160, + 131, + 1, + 82, + 127, + 8, + 64, + 184, + 192, + 189, + 187, + 118, + 10, + 146, + 108, + 64, + 70, + 218, + 38, + 20, + 225, + 77, + 60, + 139, + 47, + 175, + 193, + 140, + 116, + 113, + 206, + 33, + 41, + 140, + 165, + 124, + 23, + 97, + 95, + 192, + 131, + 1, + 82, + 97, + 76, + 224, + 130, + 1, + 81, + 97, + 95, + 224, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 95, + 160, + 133, + 1, + 96, + 96, + 97, + 95, + 160, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 95, + 32, + 130, + 1, + 81, + 97, + 96, + 0, + 131, + 1, + 82, + 97, + 95, + 64, + 130, + 1, + 81, + 97, + 96, + 32, + 131, + 1, + 82, + 97, + 95, + 160, + 130, + 1, + 81, + 97, + 96, + 64, + 131, + 1, + 82, + 97, + 95, + 192, + 130, + 1, + 81, + 97, + 96, + 96, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 96, + 0, + 133, + 1, + 96, + 128, + 97, + 96, + 0, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 42, + 110, + 66, + 191, + 104, + 175, + 164, + 82, + 53, + 31, + 170, + 148, + 157, + 194, + 121, + 249, + 254, + 60, + 104, + 177, + 38, + 40, + 10, + 202, + 39, + 129, + 33, + 136, + 143, + 203, + 175, + 115, + 97, + 96, + 128, + 131, + 1, + 82, + 127, + 4, + 221, + 182, + 86, + 251, + 79, + 41, + 6, + 154, + 218, + 101, + 200, + 72, + 178, + 171, + 23, + 123, + 73, + 92, + 8, + 105, + 171, + 166, + 254, + 146, + 22, + 218, + 179, + 160, + 67, + 247, + 89, + 97, + 96, + 160, + 131, + 1, + 82, + 97, + 77, + 0, + 130, + 1, + 81, + 97, + 96, + 192, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 96, + 128, + 133, + 1, + 96, + 96, + 97, + 96, + 128, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 96, + 0, + 130, + 1, + 81, + 97, + 96, + 224, + 131, + 1, + 82, + 97, + 96, + 32, + 130, + 1, + 81, + 97, + 97, + 0, + 131, + 1, + 82, + 97, + 96, + 128, + 130, + 1, + 81, + 97, + 97, + 32, + 131, + 1, + 82, + 97, + 96, + 160, + 130, + 1, + 81, + 97, + 97, + 64, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 96, + 224, + 133, + 1, + 96, + 128, + 97, + 96, + 224, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 1, + 130, + 165, + 9, + 192, + 132, + 135, + 184, + 195, + 213, + 184, + 80, + 114, + 81, + 204, + 138, + 70, + 245, + 179, + 19, + 198, + 135, + 193, + 231, + 38, + 45, + 8, + 235, + 141, + 250, + 76, + 16, + 97, + 97, + 96, + 131, + 1, + 82, + 127, + 4, + 116, + 170, + 37, + 143, + 162, + 212, + 26, + 252, + 101, + 89, + 108, + 58, + 218, + 32, + 184, + 137, + 160, + 242, + 120, + 37, + 144, + 90, + 42, + 23, + 101, + 96, + 178, + 126, + 45, + 44, + 142, + 97, + 97, + 128, + 131, + 1, + 82, + 97, + 77, + 32, + 130, + 1, + 81, + 97, + 97, + 160, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 97, + 96, + 133, + 1, + 96, + 96, + 97, + 97, + 96, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 96, + 224, + 130, + 1, + 81, + 97, + 97, + 192, + 131, + 1, + 82, + 97, + 97, + 0, + 130, + 1, + 81, + 97, + 97, + 224, + 131, + 1, + 82, + 97, + 97, + 96, + 130, + 1, + 81, + 97, + 98, + 0, + 131, + 1, + 82, + 97, + 97, + 128, + 130, + 1, + 81, + 97, + 98, + 32, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 97, + 192, + 133, + 1, + 96, + 128, + 97, + 97, + 192, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 27, + 91, + 47, + 116, + 135, + 104, + 195, + 67, + 190, + 105, + 253, + 118, + 29, + 241, + 73, + 16, + 169, + 38, + 167, + 125, + 160, + 149, + 219, + 41, + 18, + 233, + 106, + 201, + 247, + 58, + 182, + 162, + 97, + 98, + 64, + 131, + 1, + 82, + 127, + 44, + 11, + 181, + 32, + 188, + 96, + 20, + 151, + 198, + 183, + 241, + 191, + 104, + 60, + 131, + 202, + 179, + 160, + 68, + 12, + 65, + 216, + 253, + 251, + 174, + 12, + 119, + 90, + 87, + 231, + 39, + 245, + 97, + 98, + 96, + 131, + 1, + 82, + 97, + 77, + 64, + 130, + 1, + 81, + 97, + 98, + 128, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 98, + 64, + 133, + 1, + 96, + 96, + 97, + 98, + 64, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 97, + 192, + 130, + 1, + 81, + 97, + 98, + 160, + 131, + 1, + 82, + 97, + 97, + 224, + 130, + 1, + 81, + 97, + 98, + 192, + 131, + 1, + 82, + 97, + 98, + 64, + 130, + 1, + 81, + 97, + 98, + 224, + 131, + 1, + 82, + 97, + 98, + 96, + 130, + 1, + 81, + 97, + 99, + 0, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 98, + 160, + 133, + 1, + 96, + 128, + 97, + 98, + 160, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 126, + 19, + 223, + 180, + 66, + 72, + 117, + 92, + 241, + 45, + 203, + 172, + 14, + 197, + 86, + 62, + 87, + 126, + 91, + 128, + 74, + 222, + 4, + 171, + 196, + 233, + 186, + 173, + 172, + 0, + 231, + 255, + 97, + 99, + 32, + 131, + 1, + 82, + 127, + 38, + 77, + 66, + 132, + 86, + 98, + 169, + 17, + 165, + 195, + 122, + 231, + 28, + 206, + 70, + 60, + 28, + 56, + 124, + 18, + 238, + 209, + 166, + 117, + 233, + 87, + 68, + 0, + 32, + 4, + 92, + 177, + 97, + 99, + 64, + 131, + 1, + 82, + 97, + 77, + 96, + 130, + 1, + 81, + 97, + 99, + 96, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 99, + 32, + 133, + 1, + 96, + 96, + 97, + 99, + 32, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 98, + 160, + 130, + 1, + 81, + 97, + 99, + 128, + 131, + 1, + 82, + 97, + 98, + 192, + 130, + 1, + 81, + 97, + 99, + 160, + 131, + 1, + 82, + 97, + 99, + 32, + 130, + 1, + 81, + 97, + 99, + 192, + 131, + 1, + 82, + 97, + 99, + 64, + 130, + 1, + 81, + 97, + 99, + 224, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 99, + 128, + 133, + 1, + 96, + 128, + 97, + 99, + 128, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 35, + 134, + 213, + 37, + 136, + 70, + 179, + 252, + 30, + 95, + 252, + 167, + 127, + 222, + 67, + 49, + 111, + 209, + 94, + 160, + 142, + 124, + 233, + 64, + 146, + 127, + 114, + 18, + 193, + 179, + 123, + 183, + 97, + 100, + 0, + 131, + 1, + 82, + 127, + 35, + 48, + 110, + 10, + 83, + 186, + 113, + 4, + 119, + 67, + 87, + 140, + 143, + 177, + 53, + 210, + 184, + 67, + 168, + 221, + 237, + 129, + 107, + 90, + 158, + 11, + 6, + 183, + 47, + 7, + 190, + 150, + 97, + 100, + 32, + 131, + 1, + 82, + 97, + 77, + 128, + 130, + 1, + 81, + 97, + 100, + 64, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 100, + 0, + 133, + 1, + 96, + 96, + 97, + 100, + 0, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 99, + 128, + 130, + 1, + 81, + 97, + 100, + 96, + 131, + 1, + 82, + 97, + 99, + 160, + 130, + 1, + 81, + 97, + 100, + 128, + 131, + 1, + 82, + 97, + 100, + 0, + 130, + 1, + 81, + 97, + 100, + 160, + 131, + 1, + 82, + 97, + 100, + 32, + 130, + 1, + 81, + 97, + 100, + 192, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 100, + 96, + 133, + 1, + 96, + 128, + 97, + 100, + 96, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 4, + 32, + 130, + 1, + 81, + 97, + 100, + 224, + 131, + 1, + 82, + 97, + 4, + 64, + 130, + 1, + 81, + 97, + 101, + 0, + 131, + 1, + 82, + 97, + 77, + 160, + 130, + 1, + 81, + 97, + 101, + 32, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 100, + 224, + 133, + 1, + 96, + 96, + 97, + 100, + 224, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 100, + 96, + 130, + 1, + 81, + 97, + 101, + 64, + 131, + 1, + 82, + 97, + 100, + 128, + 130, + 1, + 81, + 97, + 101, + 96, + 131, + 1, + 82, + 97, + 100, + 224, + 130, + 1, + 81, + 97, + 101, + 128, + 131, + 1, + 82, + 97, + 101, + 0, + 130, + 1, + 81, + 97, + 101, + 160, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 101, + 64, + 133, + 1, + 96, + 128, + 97, + 101, + 64, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 4, + 96, + 130, + 1, + 81, + 97, + 101, + 192, + 131, + 1, + 82, + 97, + 4, + 128, + 130, + 1, + 81, + 97, + 101, + 224, + 131, + 1, + 82, + 97, + 77, + 192, + 130, + 1, + 81, + 97, + 102, + 0, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 101, + 192, + 133, + 1, + 96, + 96, + 97, + 101, + 192, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 101, + 64, + 130, + 1, + 81, + 97, + 102, + 32, + 131, + 1, + 82, + 97, + 101, + 96, + 130, + 1, + 81, + 97, + 102, + 64, + 131, + 1, + 82, + 97, + 101, + 192, + 130, + 1, + 81, + 97, + 102, + 96, + 131, + 1, + 82, + 97, + 101, + 224, + 130, + 1, + 81, + 97, + 102, + 128, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 102, + 32, + 133, + 1, + 96, + 128, + 97, + 102, + 32, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 4, + 160, + 130, + 1, + 81, + 97, + 102, + 160, + 131, + 1, + 82, + 97, + 4, + 192, + 130, + 1, + 81, + 97, + 102, + 192, + 131, + 1, + 82, + 97, + 77, + 224, + 130, + 1, + 81, + 97, + 102, + 224, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 102, + 160, + 133, + 1, + 96, + 96, + 97, + 102, + 160, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 102, + 32, + 130, + 1, + 81, + 97, + 103, + 0, + 131, + 1, + 82, + 97, + 102, + 64, + 130, + 1, + 81, + 97, + 103, + 32, + 131, + 1, + 82, + 97, + 102, + 160, + 130, + 1, + 81, + 97, + 103, + 64, + 131, + 1, + 82, + 97, + 102, + 192, + 130, + 1, + 81, + 97, + 103, + 96, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 103, + 0, + 133, + 1, + 96, + 128, + 97, + 103, + 0, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 4, + 224, + 130, + 1, + 81, + 97, + 103, + 128, + 131, + 1, + 82, + 97, + 5, + 0, + 130, + 1, + 81, + 97, + 103, + 160, + 131, + 1, + 82, + 97, + 78, + 0, + 130, + 1, + 81, + 97, + 103, + 192, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 103, + 128, + 133, + 1, + 96, + 96, + 97, + 103, + 128, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 103, + 0, + 130, + 1, + 81, + 97, + 103, + 224, + 131, + 1, + 82, + 97, + 103, + 32, + 130, + 1, + 81, + 97, + 104, + 0, + 131, + 1, + 82, + 97, + 103, + 128, + 130, + 1, + 81, + 97, + 104, + 32, + 131, + 1, + 82, + 97, + 103, + 160, + 130, + 1, + 81, + 97, + 104, + 64, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 103, + 224, + 133, + 1, + 96, + 128, + 97, + 103, + 224, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 5, + 32, + 130, + 1, + 81, + 97, + 104, + 96, + 131, + 1, + 82, + 97, + 5, + 64, + 130, + 1, + 81, + 97, + 104, + 128, + 131, + 1, + 82, + 97, + 78, + 32, + 130, + 1, + 81, + 97, + 104, + 160, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 104, + 96, + 133, + 1, + 96, + 96, + 97, + 104, + 96, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 103, + 224, + 130, + 1, + 81, + 97, + 104, + 192, + 131, + 1, + 82, + 97, + 104, + 0, + 130, + 1, + 81, + 97, + 104, + 224, + 131, + 1, + 82, + 97, + 104, + 96, + 130, + 1, + 81, + 97, + 105, + 0, + 131, + 1, + 82, + 97, + 104, + 128, + 130, + 1, + 81, + 97, + 105, + 32, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 104, + 192, + 133, + 1, + 96, + 128, + 97, + 104, + 192, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 3, + 128, + 130, + 1, + 81, + 97, + 105, + 64, + 131, + 1, + 82, + 97, + 3, + 160, + 130, + 1, + 81, + 97, + 105, + 96, + 131, + 1, + 82, + 97, + 78, + 64, + 130, + 1, + 81, + 97, + 105, + 128, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 105, + 64, + 133, + 1, + 96, + 96, + 97, + 105, + 64, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 104, + 192, + 130, + 1, + 81, + 97, + 105, + 160, + 131, + 1, + 82, + 97, + 104, + 224, + 130, + 1, + 81, + 97, + 105, + 192, + 131, + 1, + 82, + 97, + 105, + 64, + 130, + 1, + 81, + 97, + 105, + 224, + 131, + 1, + 82, + 97, + 105, + 96, + 130, + 1, + 81, + 97, + 106, + 0, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 105, + 160, + 133, + 1, + 96, + 128, + 97, + 105, + 160, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 2, + 192, + 130, + 1, + 81, + 97, + 106, + 32, + 131, + 1, + 82, + 97, + 2, + 224, + 130, + 1, + 81, + 97, + 106, + 64, + 131, + 1, + 82, + 97, + 79, + 64, + 130, + 1, + 81, + 97, + 106, + 96, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 106, + 32, + 133, + 1, + 96, + 96, + 97, + 106, + 32, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 105, + 160, + 130, + 1, + 81, + 97, + 106, + 128, + 131, + 1, + 82, + 97, + 105, + 192, + 130, + 1, + 81, + 97, + 106, + 160, + 131, + 1, + 82, + 97, + 106, + 32, + 130, + 1, + 81, + 97, + 106, + 192, + 131, + 1, + 82, + 97, + 106, + 64, + 130, + 1, + 81, + 97, + 106, + 224, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 106, + 128, + 133, + 1, + 96, + 128, + 97, + 106, + 128, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 3, + 0, + 130, + 1, + 81, + 97, + 107, + 0, + 131, + 1, + 82, + 97, + 3, + 32, + 130, + 1, + 81, + 97, + 107, + 32, + 131, + 1, + 82, + 97, + 80, + 224, + 130, + 1, + 81, + 97, + 107, + 64, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 107, + 0, + 133, + 1, + 96, + 96, + 97, + 107, + 0, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 106, + 128, + 130, + 1, + 81, + 97, + 107, + 96, + 131, + 1, + 82, + 97, + 106, + 160, + 130, + 1, + 81, + 97, + 107, + 128, + 131, + 1, + 82, + 97, + 107, + 0, + 130, + 1, + 81, + 97, + 107, + 160, + 131, + 1, + 82, + 97, + 107, + 32, + 130, + 1, + 81, + 97, + 107, + 192, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 107, + 96, + 133, + 1, + 96, + 128, + 97, + 107, + 96, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 3, + 64, + 130, + 1, + 81, + 97, + 107, + 224, + 131, + 1, + 82, + 97, + 3, + 96, + 130, + 1, + 81, + 97, + 108, + 0, + 131, + 1, + 82, + 97, + 81, + 0, + 130, + 1, + 81, + 97, + 108, + 32, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 107, + 224, + 133, + 1, + 96, + 96, + 97, + 107, + 224, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 107, + 96, + 130, + 1, + 81, + 97, + 108, + 64, + 131, + 1, + 82, + 97, + 107, + 128, + 130, + 1, + 81, + 97, + 108, + 96, + 131, + 1, + 82, + 97, + 107, + 224, + 130, + 1, + 81, + 97, + 108, + 128, + 131, + 1, + 82, + 97, + 108, + 0, + 130, + 1, + 81, + 97, + 108, + 160, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 108, + 64, + 133, + 1, + 96, + 128, + 97, + 108, + 64, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 1, + 128, + 130, + 1, + 81, + 97, + 108, + 192, + 131, + 1, + 82, + 97, + 1, + 160, + 130, + 1, + 81, + 97, + 108, + 224, + 131, + 1, + 82, + 97, + 82, + 0, + 130, + 1, + 81, + 97, + 109, + 0, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 108, + 192, + 133, + 1, + 96, + 96, + 97, + 108, + 192, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 108, + 64, + 130, + 1, + 81, + 97, + 109, + 32, + 131, + 1, + 82, + 97, + 108, + 96, + 130, + 1, + 81, + 97, + 109, + 64, + 131, + 1, + 82, + 97, + 108, + 192, + 130, + 1, + 81, + 97, + 109, + 96, + 131, + 1, + 82, + 97, + 108, + 224, + 130, + 1, + 81, + 97, + 109, + 128, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 109, + 32, + 133, + 1, + 96, + 128, + 97, + 109, + 32, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 10, + 224, + 130, + 1, + 81, + 97, + 109, + 160, + 131, + 1, + 82, + 97, + 11, + 0, + 130, + 1, + 81, + 97, + 109, + 192, + 131, + 1, + 82, + 97, + 82, + 64, + 130, + 1, + 81, + 129, + 3, + 97, + 109, + 224, + 131, + 1, + 82, + 80, + 129, + 96, + 1, + 96, + 64, + 97, + 109, + 160, + 132, + 1, + 96, + 96, + 97, + 109, + 160, + 134, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 145, + 80, + 97, + 109, + 32, + 129, + 1, + 81, + 97, + 110, + 0, + 130, + 1, + 82, + 97, + 109, + 64, + 129, + 1, + 81, + 97, + 110, + 32, + 130, + 1, + 82, + 97, + 109, + 160, + 129, + 1, + 81, + 97, + 110, + 64, + 130, + 1, + 82, + 97, + 109, + 192, + 129, + 1, + 81, + 97, + 110, + 96, + 130, + 1, + 82, + 129, + 96, + 1, + 96, + 64, + 97, + 110, + 0, + 132, + 1, + 96, + 128, + 97, + 110, + 0, + 134, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 145, + 80, + 97, + 11, + 128, + 129, + 1, + 81, + 97, + 110, + 128, + 130, + 1, + 82, + 97, + 11, + 160, + 129, + 1, + 81, + 97, + 110, + 160, + 130, + 1, + 82, + 97, + 82, + 96, + 129, + 1, + 81, + 97, + 110, + 192, + 130, + 1, + 82, + 129, + 96, + 1, + 96, + 64, + 97, + 110, + 128, + 132, + 1, + 96, + 96, + 97, + 110, + 128, + 134, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 145, + 80, + 97, + 110, + 0, + 129, + 1, + 81, + 97, + 110, + 224, + 130, + 1, + 82, + 97, + 110, + 32, + 129, + 1, + 81, + 97, + 111, + 0, + 130, + 1, + 82, + 97, + 110, + 128, + 129, + 1, + 81, + 97, + 111, + 32, + 130, + 1, + 82, + 97, + 110, + 160, + 129, + 1, + 81, + 97, + 111, + 64, + 130, + 1, + 82, + 129, + 96, + 1, + 96, + 64, + 97, + 110, + 224, + 132, + 1, + 96, + 128, + 97, + 110, + 224, + 134, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 145, + 80, + 97, + 110, + 224, + 129, + 1, + 81, + 97, + 111, + 96, + 130, + 1, + 82, + 97, + 111, + 0, + 129, + 1, + 81, + 97, + 111, + 128, + 130, + 1, + 82, + 127, + 25, + 142, + 147, + 147, + 146, + 13, + 72, + 58, + 114, + 96, + 191, + 183, + 49, + 251, + 93, + 37, + 241, + 170, + 73, + 51, + 53, + 169, + 231, + 18, + 151, + 228, + 133, + 183, + 174, + 243, + 18, + 194, + 97, + 111, + 160, + 130, + 1, + 82, + 127, + 24, + 0, + 222, + 239, + 18, + 31, + 30, + 118, + 66, + 106, + 0, + 102, + 94, + 92, + 68, + 121, + 103, + 67, + 34, + 212, + 247, + 94, + 218, + 221, + 70, + 222, + 189, + 92, + 217, + 146, + 246, + 237, + 97, + 111, + 192, + 130, + 1, + 82, + 127, + 9, + 6, + 137, + 208, + 88, + 95, + 240, + 117, + 236, + 158, + 153, + 173, + 105, + 12, + 51, + 149, + 188, + 75, + 49, + 51, + 112, + 179, + 142, + 243, + 85, + 172, + 218, + 220, + 209, + 34, + 151, + 91, + 97, + 111, + 224, + 130, + 1, + 82, + 127, + 18, + 200, + 94, + 165, + 219, + 140, + 109, + 235, + 74, + 171, + 113, + 128, + 141, + 203, + 64, + 143, + 227, + 209, + 231, + 105, + 12, + 67, + 211, + 123, + 76, + 230, + 204, + 1, + 102, + 250, + 125, + 170, + 97, + 112, + 0, + 130, + 1, + 82, + 97, + 11, + 128, + 129, + 1, + 81, + 97, + 112, + 32, + 130, + 1, + 82, + 97, + 11, + 160, + 129, + 1, + 81, + 97, + 112, + 64, + 130, + 1, + 82, + 127, + 30, + 70, + 242, + 153, + 22, + 175, + 123, + 232, + 18, + 45, + 56, + 206, + 112, + 14, + 159, + 115, + 180, + 152, + 48, + 180, + 170, + 103, + 45, + 88, + 197, + 250, + 131, + 218, + 166, + 244, + 144, + 56, + 97, + 112, + 96, + 130, + 1, + 82, + 127, + 32, + 60, + 202, + 188, + 27, + 69, + 182, + 154, + 109, + 253, + 146, + 254, + 17, + 125, + 251, + 219, + 235, + 72, + 230, + 132, + 220, + 205, + 248, + 203, + 47, + 70, + 111, + 75, + 134, + 7, + 48, + 52, + 97, + 112, + 128, + 130, + 1, + 82, + 127, + 11, + 210, + 45, + 203, + 231, + 26, + 31, + 174, + 234, + 41, + 191, + 103, + 131, + 203, + 198, + 63, + 6, + 120, + 143, + 249, + 234, + 36, + 136, + 162, + 175, + 144, + 54, + 172, + 82, + 212, + 174, + 130, + 97, + 112, + 160, + 130, + 1, + 82, + 127, + 35, + 183, + 178, + 195, + 50, + 252, + 161, + 104, + 86, + 204, + 139, + 209, + 202, + 11, + 86, + 246, + 135, + 46, + 217, + 94, + 244, + 41, + 25, + 23, + 252, + 225, + 36, + 191, + 72, + 193, + 54, + 9, + 97, + 112, + 192, + 130, + 1, + 82, + 129, + 96, + 1, + 96, + 32, + 97, + 111, + 96, + 132, + 1, + 97, + 1, + 128, + 97, + 111, + 96, + 134, + 1, + 96, + 8, + 90, + 250, + 97, + 111, + 96, + 147, + 144, + 147, + 1, + 81, + 96, + 1, + 20, + 146, + 20, + 22, + 22, + 145, + 80, + 80, + 146, + 145, + 80, + 80, + 86, + 91, + 96, + 64, + 81, + 128, + 97, + 112, + 192, + 1, + 96, + 64, + 82, + 128, + 97, + 3, + 134, + 144, + 96, + 32, + 130, + 2, + 128, + 54, + 131, + 55, + 80, + 145, + 146, + 145, + 80, + 80, + 86, + 91, + 99, + 78, + 72, + 123, + 113, + 96, + 224, + 27, + 96, + 0, + 82, + 96, + 65, + 96, + 4, + 82, + 96, + 36, + 96, + 0, + 253, + 91, + 96, + 64, + 81, + 96, + 31, + 130, + 1, + 96, + 31, + 25, + 22, + 129, + 1, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 129, + 17, + 130, + 130, + 16, + 23, + 21, + 97, + 82, + 177, + 87, + 97, + 82, + 177, + 97, + 82, + 114, + 86, + 91, + 96, + 64, + 82, + 145, + 144, + 80, + 86, + 91, + 96, + 0, + 130, + 96, + 31, + 131, + 1, + 18, + 97, + 82, + 202, + 87, + 96, + 0, + 128, + 253, + 91, + 129, + 53, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 129, + 17, + 21, + 97, + 82, + 228, + 87, + 97, + 82, + 228, + 97, + 82, + 114, + 86, + 91, + 97, + 82, + 247, + 96, + 31, + 130, + 1, + 96, + 31, + 25, + 22, + 96, + 32, + 1, + 97, + 82, + 136, + 86, + 91, + 129, + 129, + 82, + 132, + 96, + 32, + 131, + 134, + 1, + 1, + 17, + 21, + 97, + 83, + 12, + 87, + 96, + 0, + 128, + 253, + 91, + 129, + 96, + 32, + 133, + 1, + 96, + 32, + 131, + 1, + 55, + 96, + 0, + 145, + 129, + 1, + 96, + 32, + 1, + 145, + 144, + 145, + 82, + 147, + 146, + 80, + 80, + 80, + 86, + 91, + 96, + 0, + 128, + 96, + 64, + 131, + 133, + 3, + 18, + 21, + 97, + 83, + 60, + 87, + 96, + 0, + 128, + 253, + 91, + 130, + 53, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 128, + 130, + 17, + 21, + 97, + 83, + 84, + 87, + 96, + 0, + 128, + 253, + 91, + 129, + 133, + 1, + 145, + 80, + 133, + 96, + 31, + 131, + 1, + 18, + 97, + 83, + 104, + 87, + 96, + 0, + 128, + 253, + 91, + 129, + 53, + 96, + 32, + 130, + 130, + 17, + 21, + 97, + 83, + 124, + 87, + 97, + 83, + 124, + 97, + 82, + 114, + 86, + 91, + 129, + 96, + 5, + 27, + 97, + 83, + 139, + 130, + 130, + 1, + 97, + 82, + 136, + 86, + 91, + 146, + 131, + 82, + 132, + 129, + 1, + 130, + 1, + 146, + 130, + 129, + 1, + 144, + 138, + 133, + 17, + 21, + 97, + 83, + 165, + 87, + 96, + 0, + 128, + 253, + 91, + 149, + 131, + 1, + 149, + 91, + 132, + 135, + 16, + 21, + 97, + 83, + 195, + 87, + 134, + 53, + 130, + 82, + 149, + 131, + 1, + 149, + 144, + 131, + 1, + 144, + 97, + 83, + 170, + 86, + 91, + 151, + 80, + 80, + 80, + 134, + 1, + 53, + 146, + 80, + 80, + 128, + 130, + 17, + 21, + 97, + 83, + 218, + 87, + 96, + 0, + 128, + 253, + 91, + 80, + 97, + 83, + 231, + 133, + 130, + 134, + 1, + 97, + 82, + 185, + 86, + 91, + 145, + 80, + 80, + 146, + 80, + 146, + 144, + 80, + 86, + 254, + 48, + 100, + 78, + 114, + 225, + 49, + 160, + 41, + 184, + 80, + 69, + 182, + 129, + 129, + 88, + 93, + 151, + 129, + 106, + 145, + 104, + 113, + 202, + 141, + 60, + 32, + 140, + 22, + 216, + 124, + 253, + 71, + 48, + 100, + 78, + 114, + 225, + 49, + 160, + 41, + 184, + 80, + 69, + 182, + 129, + 129, + 88, + 93, + 40, + 51, + 232, + 72, + 121, + 185, + 112, + 145, + 67, + 225, + 245, + 147, + 240, + 0, + 0, + 1, + 162, + 100, + 105, + 112, + 102, + 115, + 88, + 34, + 18, + 32, + 122, + 73, + 104, + 181, + 49, + 112, + 35, + 197, + 180, + 122, + 33, + 8, + 134, + 62, + 72, + 80, + 163, + 77, + 109, + 126, + 214, + 154, + 195, + 11, + 43, + 187, + 11, + 201, + 92, + 30, + 208, + 21, + 100, + 115, + 111, + 108, + 99, + 67, + 0, + 8, + 18, + 0, + 51, + ]; + ///The bytecode of the contract. + pub static INCLUSIONVERIFIER_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( + __BYTECODE, + ); + #[rustfmt::skip] + const __DEPLOYED_BYTECODE: &[u8] = &[ + 96, + 128, + 96, + 64, + 82, + 52, + 128, + 21, + 97, + 0, + 16, + 87, + 96, + 0, + 128, + 253, + 91, + 80, + 96, + 4, + 54, + 16, + 97, + 0, + 43, + 87, + 96, + 0, + 53, + 96, + 224, + 28, + 128, + 99, + 189, + 32, + 90, + 144, + 20, + 97, + 0, + 48, + 87, + 91, + 96, + 0, + 128, + 253, + 91, + 97, + 0, + 67, + 97, + 0, + 62, + 54, + 96, + 4, + 97, + 83, + 41, + 86, + 91, + 97, + 0, + 87, + 86, + 91, + 96, + 64, + 81, + 144, + 21, + 21, + 129, + 82, + 96, + 32, + 1, + 96, + 64, + 81, + 128, + 145, + 3, + 144, + 243, + 91, + 96, + 0, + 96, + 1, + 97, + 0, + 99, + 97, + 82, + 82, + 86, + 91, + 96, + 0, + 128, + 81, + 96, + 32, + 97, + 84, + 18, + 131, + 57, + 129, + 81, + 145, + 82, + 97, + 0, + 217, + 86, + 91, + 96, + 0, + 128, + 81, + 96, + 32, + 97, + 83, + 242, + 131, + 57, + 129, + 81, + 145, + 82, + 128, + 131, + 16, + 129, + 131, + 16, + 22, + 144, + 131, + 128, + 9, + 96, + 0, + 128, + 81, + 96, + 32, + 97, + 83, + 242, + 131, + 57, + 129, + 81, + 145, + 82, + 131, + 132, + 9, + 96, + 0, + 128, + 81, + 96, + 32, + 97, + 83, + 242, + 131, + 57, + 129, + 81, + 145, + 82, + 132, + 130, + 9, + 144, + 80, + 96, + 0, + 128, + 81, + 96, + 32, + 97, + 83, + 242, + 131, + 57, + 129, + 81, + 145, + 82, + 96, + 3, + 130, + 8, + 145, + 144, + 145, + 20, + 145, + 144, + 145, + 22, + 147, + 146, + 80, + 80, + 80, + 86, + 91, + 128, + 96, + 32, + 135, + 1, + 81, + 6, + 96, + 32, + 131, + 1, + 82, + 128, + 96, + 64, + 135, + 1, + 81, + 6, + 96, + 64, + 131, + 1, + 82, + 127, + 38, + 193, + 43, + 159, + 215, + 235, + 27, + 179, + 58, + 37, + 52, + 26, + 180, + 175, + 45, + 179, + 52, + 191, + 10, + 194, + 219, + 95, + 24, + 162, + 24, + 72, + 32, + 168, + 65, + 244, + 142, + 166, + 96, + 0, + 131, + 1, + 82, + 96, + 32, + 133, + 1, + 81, + 128, + 96, + 96, + 132, + 1, + 82, + 96, + 64, + 134, + 1, + 81, + 128, + 96, + 128, + 133, + 1, + 82, + 132, + 97, + 1, + 56, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 96, + 96, + 133, + 1, + 81, + 128, + 96, + 160, + 132, + 1, + 82, + 96, + 128, + 134, + 1, + 81, + 128, + 96, + 192, + 133, + 1, + 82, + 132, + 97, + 1, + 94, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 96, + 160, + 133, + 1, + 81, + 128, + 96, + 224, + 132, + 1, + 82, + 96, + 192, + 134, + 1, + 81, + 128, + 97, + 1, + 0, + 133, + 1, + 82, + 132, + 97, + 1, + 133, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 97, + 1, + 32, + 96, + 0, + 131, + 1, + 32, + 97, + 1, + 32, + 131, + 1, + 82, + 97, + 1, + 32, + 130, + 1, + 81, + 129, + 129, + 6, + 97, + 1, + 64, + 132, + 1, + 82, + 128, + 97, + 1, + 96, + 132, + 1, + 82, + 80, + 96, + 224, + 133, + 1, + 81, + 128, + 97, + 1, + 128, + 132, + 1, + 82, + 97, + 1, + 0, + 134, + 1, + 81, + 128, + 97, + 1, + 160, + 133, + 1, + 82, + 132, + 97, + 1, + 211, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 97, + 1, + 32, + 133, + 1, + 81, + 128, + 97, + 1, + 192, + 132, + 1, + 82, + 97, + 1, + 64, + 134, + 1, + 81, + 128, + 97, + 1, + 224, + 133, + 1, + 82, + 132, + 97, + 1, + 253, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 96, + 160, + 97, + 1, + 96, + 135, + 1, + 32, + 97, + 2, + 0, + 135, + 1, + 129, + 144, + 82, + 133, + 129, + 6, + 97, + 2, + 32, + 136, + 1, + 82, + 97, + 2, + 64, + 135, + 1, + 82, + 22, + 148, + 80, + 96, + 1, + 145, + 80, + 80, + 97, + 2, + 96, + 131, + 1, + 83, + 96, + 33, + 97, + 2, + 64, + 131, + 1, + 32, + 97, + 2, + 96, + 131, + 1, + 129, + 144, + 82, + 129, + 129, + 6, + 97, + 2, + 128, + 132, + 1, + 82, + 97, + 2, + 160, + 131, + 1, + 82, + 97, + 1, + 96, + 133, + 1, + 81, + 97, + 2, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 1, + 128, + 134, + 1, + 81, + 97, + 2, + 224, + 132, + 1, + 129, + 144, + 82, + 132, + 97, + 2, + 112, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 97, + 1, + 160, + 133, + 1, + 81, + 128, + 97, + 3, + 0, + 132, + 1, + 82, + 97, + 1, + 192, + 134, + 1, + 81, + 128, + 97, + 3, + 32, + 133, + 1, + 82, + 132, + 97, + 2, + 154, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 97, + 1, + 224, + 133, + 1, + 81, + 128, + 97, + 3, + 64, + 132, + 1, + 82, + 97, + 2, + 0, + 134, + 1, + 81, + 128, + 97, + 3, + 96, + 133, + 1, + 82, + 132, + 97, + 2, + 196, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 97, + 2, + 32, + 133, + 1, + 81, + 128, + 97, + 3, + 128, + 132, + 1, + 82, + 97, + 2, + 64, + 134, + 1, + 81, + 128, + 97, + 3, + 160, + 133, + 1, + 82, + 132, + 97, + 2, + 238, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 97, + 1, + 32, + 97, + 2, + 160, + 131, + 1, + 32, + 97, + 3, + 192, + 131, + 1, + 82, + 97, + 3, + 192, + 130, + 1, + 81, + 129, + 129, + 6, + 97, + 3, + 224, + 132, + 1, + 82, + 128, + 97, + 4, + 0, + 132, + 1, + 82, + 80, + 97, + 2, + 96, + 133, + 1, + 81, + 128, + 97, + 4, + 32, + 132, + 1, + 82, + 97, + 2, + 128, + 134, + 1, + 81, + 128, + 97, + 4, + 64, + 133, + 1, + 82, + 132, + 97, + 3, + 62, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 97, + 2, + 160, + 133, + 1, + 81, + 128, + 97, + 4, + 96, + 132, + 1, + 82, + 97, + 2, + 192, + 134, + 1, + 81, + 128, + 97, + 4, + 128, + 133, + 1, + 82, + 132, + 97, + 3, + 104, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 97, + 2, + 224, + 133, + 1, + 81, + 128, + 97, + 4, + 160, + 132, + 1, + 82, + 97, + 3, + 0, + 134, + 1, + 81, + 128, + 97, + 4, + 192, + 133, + 1, + 82, + 132, + 97, + 3, + 146, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 97, + 3, + 32, + 133, + 1, + 81, + 128, + 97, + 4, + 224, + 132, + 1, + 82, + 97, + 3, + 64, + 134, + 1, + 81, + 128, + 97, + 5, + 0, + 133, + 1, + 82, + 132, + 97, + 3, + 188, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 97, + 3, + 96, + 133, + 1, + 81, + 128, + 97, + 5, + 32, + 132, + 1, + 82, + 97, + 3, + 128, + 134, + 1, + 81, + 128, + 97, + 5, + 64, + 133, + 1, + 82, + 132, + 97, + 3, + 230, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 97, + 1, + 96, + 97, + 4, + 0, + 131, + 1, + 32, + 97, + 5, + 96, + 131, + 1, + 82, + 97, + 5, + 96, + 130, + 1, + 81, + 129, + 129, + 6, + 97, + 5, + 128, + 132, + 1, + 82, + 128, + 97, + 5, + 160, + 132, + 1, + 82, + 80, + 128, + 97, + 3, + 160, + 134, + 1, + 81, + 6, + 97, + 5, + 192, + 131, + 1, + 82, + 128, + 97, + 3, + 192, + 134, + 1, + 81, + 6, + 97, + 5, + 224, + 131, + 1, + 82, + 128, + 97, + 3, + 224, + 134, + 1, + 81, + 6, + 97, + 6, + 0, + 131, + 1, + 82, + 128, + 97, + 4, + 0, + 134, + 1, + 81, + 6, + 97, + 6, + 32, + 131, + 1, + 82, + 128, + 97, + 4, + 32, + 134, + 1, + 81, + 6, + 97, + 6, + 64, + 131, + 1, + 82, + 128, + 97, + 4, + 64, + 134, + 1, + 81, + 6, + 97, + 6, + 96, + 131, + 1, + 82, + 128, + 97, + 4, + 96, + 134, + 1, + 81, + 6, + 97, + 6, + 128, + 131, + 1, + 82, + 128, + 97, + 4, + 128, + 134, + 1, + 81, + 6, + 97, + 6, + 160, + 131, + 1, + 82, + 128, + 97, + 4, + 160, + 134, + 1, + 81, + 6, + 97, + 6, + 192, + 131, + 1, + 82, + 128, + 97, + 4, + 192, + 134, + 1, + 81, + 6, + 97, + 6, + 224, + 131, + 1, + 82, + 128, + 97, + 4, + 224, + 134, + 1, + 81, + 6, + 97, + 7, + 0, + 131, + 1, + 82, + 128, + 97, + 5, + 0, + 134, + 1, + 81, + 6, + 97, + 7, + 32, + 131, + 1, + 82, + 128, + 97, + 5, + 32, + 134, + 1, + 81, + 6, + 97, + 7, + 64, + 131, + 1, + 82, + 128, + 97, + 5, + 64, + 134, + 1, + 81, + 6, + 97, + 7, + 96, + 131, + 1, + 82, + 128, + 97, + 5, + 96, + 134, + 1, + 81, + 6, + 97, + 7, + 128, + 131, + 1, + 82, + 128, + 97, + 5, + 128, + 134, + 1, + 81, + 6, + 97, + 7, + 160, + 131, + 1, + 82, + 128, + 97, + 5, + 160, + 134, + 1, + 81, + 6, + 97, + 7, + 192, + 131, + 1, + 82, + 128, + 97, + 5, + 192, + 134, + 1, + 81, + 6, + 97, + 7, + 224, + 131, + 1, + 82, + 128, + 97, + 5, + 224, + 134, + 1, + 81, + 6, + 97, + 8, + 0, + 131, + 1, + 82, + 128, + 97, + 6, + 0, + 134, + 1, + 81, + 6, + 97, + 8, + 32, + 131, + 1, + 82, + 128, + 97, + 6, + 32, + 134, + 1, + 81, + 6, + 97, + 8, + 64, + 131, + 1, + 82, + 128, + 97, + 6, + 64, + 134, + 1, + 81, + 6, + 97, + 8, + 96, + 131, + 1, + 82, + 128, + 97, + 6, + 96, + 134, + 1, + 81, + 6, + 97, + 8, + 128, + 131, + 1, + 82, + 128, + 97, + 6, + 128, + 134, + 1, + 81, + 6, + 97, + 8, + 160, + 131, + 1, + 82, + 128, + 97, + 6, + 160, + 134, + 1, + 81, + 6, + 97, + 8, + 192, + 131, + 1, + 82, + 128, + 97, + 6, + 192, + 134, + 1, + 81, + 6, + 97, + 8, + 224, + 131, + 1, + 82, + 128, + 97, + 6, + 224, + 134, + 1, + 81, + 6, + 97, + 9, + 0, + 131, + 1, + 82, + 128, + 97, + 7, + 0, + 134, + 1, + 81, + 6, + 97, + 9, + 32, + 131, + 1, + 82, + 128, + 97, + 7, + 32, + 134, + 1, + 81, + 6, + 97, + 9, + 64, + 131, + 1, + 82, + 128, + 97, + 7, + 64, + 134, + 1, + 81, + 6, + 97, + 9, + 96, + 131, + 1, + 82, + 128, + 97, + 7, + 96, + 134, + 1, + 81, + 6, + 97, + 9, + 128, + 131, + 1, + 82, + 128, + 97, + 7, + 128, + 134, + 1, + 81, + 6, + 97, + 9, + 160, + 131, + 1, + 82, + 128, + 97, + 7, + 160, + 134, + 1, + 81, + 6, + 97, + 9, + 192, + 131, + 1, + 82, + 128, + 97, + 7, + 192, + 134, + 1, + 81, + 6, + 97, + 9, + 224, + 131, + 1, + 82, + 128, + 97, + 7, + 224, + 134, + 1, + 81, + 6, + 97, + 10, + 0, + 131, + 1, + 82, + 97, + 4, + 128, + 97, + 5, + 160, + 131, + 1, + 32, + 97, + 10, + 32, + 131, + 1, + 82, + 97, + 10, + 32, + 130, + 1, + 81, + 129, + 129, + 6, + 97, + 10, + 64, + 132, + 1, + 82, + 128, + 97, + 10, + 96, + 132, + 1, + 82, + 80, + 96, + 1, + 97, + 10, + 128, + 131, + 1, + 83, + 96, + 33, + 97, + 10, + 96, + 131, + 1, + 32, + 97, + 10, + 128, + 131, + 1, + 129, + 144, + 82, + 129, + 129, + 6, + 97, + 10, + 160, + 132, + 1, + 82, + 97, + 10, + 192, + 131, + 1, + 82, + 97, + 8, + 0, + 133, + 1, + 81, + 97, + 10, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 8, + 32, + 134, + 1, + 81, + 97, + 11, + 0, + 132, + 1, + 129, + 144, + 82, + 132, + 97, + 6, + 111, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 96, + 96, + 97, + 10, + 192, + 131, + 1, + 32, + 97, + 11, + 32, + 131, + 1, + 82, + 97, + 11, + 32, + 130, + 1, + 81, + 129, + 129, + 6, + 97, + 11, + 64, + 132, + 1, + 82, + 128, + 97, + 11, + 96, + 132, + 1, + 82, + 80, + 97, + 8, + 64, + 133, + 1, + 81, + 128, + 97, + 11, + 128, + 132, + 1, + 82, + 97, + 8, + 96, + 134, + 1, + 81, + 128, + 97, + 11, + 160, + 133, + 1, + 82, + 132, + 97, + 6, + 190, + 130, + 132, + 97, + 0, + 119, + 86, + 91, + 22, + 148, + 80, + 80, + 80, + 128, + 97, + 5, + 128, + 131, + 1, + 81, + 97, + 5, + 128, + 132, + 1, + 81, + 9, + 97, + 11, + 192, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 11, + 224, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 12, + 0, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 12, + 32, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 12, + 64, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 12, + 96, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 12, + 128, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 12, + 160, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 12, + 192, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 12, + 224, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 13, + 0, + 131, + 1, + 82, + 128, + 127, + 48, + 100, + 78, + 114, + 225, + 49, + 160, + 41, + 184, + 80, + 69, + 182, + 129, + 129, + 88, + 93, + 40, + 51, + 232, + 72, + 121, + 185, + 112, + 145, + 67, + 225, + 245, + 147, + 240, + 0, + 0, + 0, + 97, + 13, + 0, + 132, + 1, + 81, + 8, + 97, + 13, + 32, + 131, + 1, + 82, + 128, + 127, + 48, + 94, + 65, + 233, + 18, + 213, + 121, + 245, + 179, + 25, + 59, + 173, + 202, + 177, + 40, + 50, + 28, + 142, + 225, + 203, + 112, + 170, + 57, + 99, + 49, + 185, + 121, + 85, + 61, + 130, + 0, + 1, + 97, + 13, + 32, + 132, + 1, + 81, + 9, + 97, + 13, + 64, + 131, + 1, + 82, + 128, + 127, + 34, + 181, + 86, + 3, + 88, + 109, + 95, + 196, + 44, + 108, + 20, + 194, + 252, + 39, + 160, + 40, + 194, + 7, + 218, + 139, + 44, + 113, + 203, + 51, + 213, + 73, + 250, + 74, + 43, + 229, + 211, + 2, + 97, + 13, + 64, + 132, + 1, + 81, + 9, + 97, + 13, + 96, + 131, + 1, + 82, + 128, + 127, + 13, + 174, + 248, + 111, + 136, + 196, + 64, + 101, + 139, + 228, + 48, + 243, + 133, + 89, + 184, + 52, + 102, + 44, + 13, + 189, + 77, + 71, + 165, + 93, + 110, + 151, + 251, + 73, + 196, + 26, + 44, + 255, + 97, + 5, + 128, + 132, + 1, + 81, + 8, + 97, + 13, + 128, + 131, + 1, + 82, + 128, + 127, + 36, + 152, + 194, + 211, + 175, + 250, + 27, + 170, + 246, + 65, + 157, + 188, + 203, + 106, + 5, + 75, + 184, + 115, + 89, + 192, + 46, + 173, + 229, + 174, + 172, + 216, + 108, + 132, + 117, + 123, + 144, + 81, + 97, + 13, + 64, + 132, + 1, + 81, + 9, + 97, + 13, + 160, + 131, + 1, + 82, + 128, + 127, + 11, + 203, + 139, + 159, + 49, + 55, + 132, + 126, + 194, + 14, + 167, + 249, + 182, + 23, + 83, + 17, + 111, + 192, + 142, + 136, + 75, + 11, + 138, + 226, + 151, + 9, + 137, + 15, + 122, + 132, + 111, + 176, + 97, + 5, + 128, + 132, + 1, + 81, + 8, + 97, + 13, + 192, + 131, + 1, + 82, + 128, + 127, + 9, + 107, + 159, + 139, + 133, + 152, + 183, + 195, + 135, + 251, + 105, + 171, + 242, + 54, + 176, + 213, + 224, + 78, + 36, + 210, + 117, + 238, + 152, + 36, + 68, + 67, + 237, + 165, + 211, + 188, + 64, + 53, + 97, + 13, + 64, + 132, + 1, + 81, + 9, + 97, + 13, + 224, + 131, + 1, + 82, + 128, + 127, + 38, + 248, + 174, + 231, + 91, + 152, + 232, + 102, + 48, + 84, + 220, + 10, + 143, + 74, + 167, + 135, + 71, + 229, + 195, + 118, + 3, + 202, + 216, + 108, + 255, + 158, + 7, + 238, + 28, + 67, + 191, + 204, + 97, + 5, + 128, + 132, + 1, + 81, + 8, + 97, + 14, + 0, + 131, + 1, + 82, + 128, + 127, + 40, + 119, + 16, + 113, + 171, + 22, + 51, + 1, + 78, + 174, + 39, + 207, + 193, + 109, + 94, + 190, + 8, + 168, + 254, + 47, + 201, + 232, + 80, + 68, + 228, + 164, + 95, + 130, + 193, + 76, + 216, + 37, + 97, + 13, + 64, + 132, + 1, + 81, + 9, + 97, + 14, + 32, + 131, + 1, + 82, + 128, + 127, + 7, + 237, + 62, + 1, + 54, + 27, + 109, + 40, + 105, + 162, + 29, + 230, + 192, + 19, + 249, + 159, + 31, + 138, + 234, + 24, + 175, + 209, + 32, + 76, + 95, + 61, + 150, + 17, + 46, + 179, + 39, + 220, + 97, + 5, + 128, + 132, + 1, + 81, + 8, + 97, + 14, + 64, + 131, + 1, + 82, + 128, + 127, + 10, + 227, + 201, + 95, + 192, + 60, + 10, + 95, + 45, + 232, + 168, + 244, + 108, + 3, + 204, + 223, + 223, + 237, + 43, + 185, + 140, + 158, + 74, + 224, + 177, + 11, + 21, + 237, + 164, + 227, + 177, + 227, + 97, + 13, + 64, + 132, + 1, + 81, + 9, + 97, + 14, + 96, + 131, + 1, + 82, + 128, + 127, + 37, + 128, + 133, + 19, + 32, + 245, + 149, + 202, + 138, + 103, + 156, + 194, + 21, + 125, + 139, + 125, + 72, + 70, + 188, + 142, + 237, + 27, + 37, + 176, + 146, + 214, + 223, + 166, + 75, + 28, + 78, + 30, + 97, + 5, + 128, + 132, + 1, + 81, + 8, + 97, + 14, + 128, + 131, + 1, + 82, + 128, + 127, + 42, + 253, + 78, + 119, + 39, + 63, + 28, + 179, + 67, + 74, + 74, + 102, + 121, + 41, + 5, + 140, + 21, + 107, + 33, + 87, + 60, + 63, + 30, + 252, + 136, + 46, + 112, + 133, + 151, + 215, + 22, + 26, + 97, + 13, + 64, + 132, + 1, + 81, + 9, + 97, + 14, + 160, + 131, + 1, + 82, + 128, + 127, + 5, + 102, + 255, + 251, + 185, + 242, + 131, + 118, + 117, + 5, + 251, + 80, + 8, + 88, + 82, + 209, + 18, + 200, + 198, + 241, + 61, + 122, + 81, + 148, + 187, + 179, + 133, + 14, + 88, + 40, + 233, + 231, + 97, + 5, + 128, + 132, + 1, + 81, + 8, + 97, + 14, + 192, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 13, + 64, + 132, + 1, + 81, + 9, + 97, + 14, + 224, + 131, + 1, + 82, + 128, + 127, + 48, + 100, + 78, + 114, + 225, + 49, + 160, + 41, + 184, + 80, + 69, + 182, + 129, + 129, + 88, + 93, + 40, + 51, + 232, + 72, + 121, + 185, + 112, + 145, + 67, + 225, + 245, + 147, + 240, + 0, + 0, + 0, + 97, + 5, + 128, + 132, + 1, + 81, + 8, + 97, + 15, + 0, + 131, + 1, + 82, + 128, + 127, + 20, + 198, + 1, + 133, + 231, + 88, + 133, + 214, + 116, + 219, + 75, + 63, + 125, + 74, + 86, + 148, + 250, + 108, + 1, + 170, + 15, + 83, + 85, + 123, + 6, + 11, + 192, + 74, + 65, + 114, + 112, + 95, + 97, + 13, + 64, + 132, + 1, + 81, + 9, + 97, + 15, + 32, + 131, + 1, + 82, + 128, + 127, + 27, + 158, + 76, + 236, + 249, + 217, + 26, + 83, + 67, + 116, + 250, + 119, + 4, + 55, + 1, + 200, + 45, + 199, + 230, + 158, + 106, + 102, + 27, + 22, + 61, + 214, + 53, + 73, + 174, + 141, + 143, + 162, + 97, + 5, + 128, + 132, + 1, + 81, + 8, + 97, + 15, + 64, + 131, + 1, + 82, + 97, + 13, + 128, + 130, + 1, + 81, + 129, + 129, + 97, + 13, + 192, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 15, + 96, + 132, + 1, + 82, + 129, + 129, + 97, + 14, + 0, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 15, + 128, + 132, + 1, + 82, + 129, + 129, + 97, + 14, + 64, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 15, + 160, + 132, + 1, + 82, + 129, + 129, + 97, + 14, + 128, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 15, + 192, + 132, + 1, + 82, + 129, + 129, + 97, + 14, + 192, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 15, + 224, + 132, + 1, + 82, + 129, + 129, + 97, + 15, + 0, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 16, + 0, + 132, + 1, + 82, + 129, + 129, + 97, + 15, + 64, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 16, + 32, + 132, + 1, + 82, + 129, + 129, + 97, + 13, + 32, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 16, + 64, + 132, + 1, + 82, + 80, + 96, + 32, + 97, + 16, + 128, + 131, + 1, + 82, + 96, + 32, + 97, + 16, + 160, + 131, + 1, + 82, + 96, + 32, + 97, + 16, + 192, + 131, + 1, + 82, + 97, + 16, + 64, + 130, + 1, + 81, + 97, + 16, + 224, + 131, + 1, + 82, + 127, + 48, + 100, + 78, + 114, + 225, + 49, + 160, + 41, + 184, + 80, + 69, + 182, + 129, + 129, + 88, + 93, + 40, + 51, + 232, + 72, + 121, + 185, + 112, + 145, + 67, + 225, + 245, + 147, + 239, + 255, + 255, + 255, + 97, + 17, + 0, + 131, + 1, + 82, + 96, + 0, + 128, + 81, + 96, + 32, + 97, + 84, + 18, + 131, + 57, + 129, + 81, + 145, + 82, + 97, + 17, + 32, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 32, + 97, + 16, + 96, + 133, + 1, + 96, + 192, + 97, + 16, + 128, + 135, + 1, + 96, + 5, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 16, + 96, + 130, + 1, + 81, + 96, + 0, + 97, + 13, + 32, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 16, + 32, + 134, + 1, + 81, + 9, + 97, + 13, + 32, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 15, + 64, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 16, + 0, + 134, + 1, + 81, + 9, + 97, + 15, + 64, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 15, + 0, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 15, + 224, + 134, + 1, + 81, + 9, + 97, + 15, + 0, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 14, + 192, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 15, + 192, + 134, + 1, + 81, + 9, + 97, + 14, + 192, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 14, + 128, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 15, + 160, + 134, + 1, + 81, + 9, + 97, + 14, + 128, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 14, + 64, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 15, + 128, + 134, + 1, + 81, + 9, + 97, + 14, + 64, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 14, + 0, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 15, + 96, + 134, + 1, + 81, + 9, + 97, + 14, + 0, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 13, + 192, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 13, + 128, + 134, + 1, + 81, + 9, + 97, + 13, + 192, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 97, + 13, + 128, + 133, + 1, + 129, + 144, + 82, + 97, + 13, + 96, + 133, + 1, + 81, + 132, + 147, + 80, + 144, + 145, + 80, + 9, + 97, + 17, + 64, + 131, + 1, + 82, + 128, + 97, + 13, + 192, + 131, + 1, + 81, + 97, + 13, + 160, + 132, + 1, + 81, + 9, + 97, + 17, + 96, + 131, + 1, + 82, + 128, + 97, + 14, + 0, + 131, + 1, + 81, + 97, + 13, + 224, + 132, + 1, + 81, + 9, + 97, + 17, + 128, + 131, + 1, + 82, + 128, + 97, + 14, + 64, + 131, + 1, + 81, + 97, + 14, + 32, + 132, + 1, + 81, + 9, + 97, + 17, + 160, + 131, + 1, + 82, + 128, + 97, + 14, + 128, + 131, + 1, + 81, + 97, + 14, + 96, + 132, + 1, + 81, + 9, + 97, + 17, + 192, + 131, + 1, + 82, + 128, + 97, + 14, + 192, + 131, + 1, + 81, + 97, + 14, + 160, + 132, + 1, + 81, + 9, + 97, + 17, + 224, + 131, + 1, + 82, + 128, + 97, + 15, + 0, + 131, + 1, + 81, + 97, + 14, + 224, + 132, + 1, + 81, + 9, + 97, + 18, + 0, + 131, + 1, + 82, + 128, + 97, + 15, + 64, + 131, + 1, + 81, + 97, + 15, + 32, + 132, + 1, + 81, + 9, + 97, + 18, + 32, + 131, + 1, + 82, + 128, + 96, + 32, + 131, + 1, + 81, + 97, + 18, + 0, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 96, + 64, + 134, + 1, + 81, + 97, + 18, + 32, + 135, + 1, + 81, + 9, + 8, + 97, + 18, + 64, + 132, + 1, + 82, + 80, + 97, + 6, + 224, + 130, + 1, + 81, + 97, + 5, + 192, + 131, + 1, + 81, + 130, + 145, + 144, + 8, + 97, + 18, + 96, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 18, + 128, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 18, + 160, + 131, + 1, + 82, + 128, + 97, + 18, + 160, + 131, + 1, + 81, + 97, + 18, + 96, + 132, + 1, + 81, + 9, + 97, + 18, + 192, + 131, + 1, + 82, + 128, + 127, + 6, + 111, + 111, + 133, + 214, + 246, + 138, + 133, + 236, + 16, + 52, + 83, + 81, + 162, + 58, + 58, + 175, + 7, + 243, + 138, + 248, + 201, + 82, + 167, + 188, + 236, + 167, + 11, + 210, + 175, + 122, + 213, + 97, + 18, + 192, + 132, + 1, + 81, + 9, + 97, + 18, + 224, + 131, + 1, + 82, + 128, + 97, + 7, + 0, + 131, + 1, + 81, + 97, + 5, + 224, + 132, + 1, + 81, + 8, + 97, + 19, + 0, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 19, + 32, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 19, + 64, + 131, + 1, + 82, + 128, + 97, + 19, + 64, + 131, + 1, + 81, + 97, + 19, + 0, + 132, + 1, + 81, + 9, + 97, + 19, + 96, + 131, + 1, + 82, + 128, + 127, + 43, + 157, + 75, + 65, + 16, + 201, + 174, + 153, + 119, + 130, + 225, + 80, + 155, + 29, + 15, + 219, + 32, + 167, + 192, + 43, + 189, + 139, + 234, + 115, + 5, + 70, + 43, + 159, + 129, + 37, + 177, + 232, + 97, + 19, + 96, + 132, + 1, + 81, + 9, + 97, + 19, + 128, + 131, + 1, + 82, + 128, + 97, + 19, + 128, + 131, + 1, + 81, + 97, + 18, + 224, + 132, + 1, + 81, + 8, + 97, + 19, + 160, + 131, + 1, + 82, + 128, + 97, + 6, + 0, + 131, + 1, + 81, + 130, + 3, + 97, + 19, + 160, + 132, + 1, + 81, + 8, + 97, + 19, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 7, + 128, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 19, + 224, + 131, + 1, + 82, + 128, + 97, + 19, + 224, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 20, + 0, + 131, + 1, + 82, + 128, + 127, + 12, + 197, + 124, + 219, + 176, + 133, + 7, + 214, + 43, + 246, + 122, + 68, + 147, + 204, + 38, + 47, + 182, + 192, + 157, + 85, + 112, + 19, + 255, + 241, + 245, + 115, + 244, + 49, + 34, + 31, + 143, + 249, + 97, + 18, + 192, + 132, + 1, + 81, + 9, + 97, + 20, + 32, + 131, + 1, + 82, + 128, + 127, + 18, + 116, + 230, + 73, + 163, + 46, + 211, + 85, + 163, + 26, + 110, + 214, + 151, + 36, + 225, + 173, + 173, + 232, + 87, + 232, + 110, + 181, + 195, + 161, + 33, + 188, + 209, + 71, + 148, + 50, + 3, + 200, + 97, + 19, + 96, + 132, + 1, + 81, + 9, + 97, + 20, + 64, + 131, + 1, + 82, + 128, + 97, + 20, + 64, + 131, + 1, + 81, + 97, + 20, + 32, + 132, + 1, + 81, + 8, + 97, + 20, + 96, + 131, + 1, + 82, + 128, + 97, + 6, + 32, + 131, + 1, + 81, + 130, + 3, + 97, + 20, + 96, + 132, + 1, + 81, + 8, + 97, + 20, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 7, + 128, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 20, + 160, + 131, + 1, + 82, + 128, + 97, + 20, + 160, + 131, + 1, + 81, + 97, + 20, + 0, + 132, + 1, + 81, + 8, + 97, + 20, + 192, + 131, + 1, + 82, + 128, + 97, + 20, + 192, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 20, + 224, + 131, + 1, + 82, + 128, + 97, + 6, + 64, + 131, + 1, + 81, + 130, + 3, + 97, + 18, + 192, + 132, + 1, + 81, + 8, + 97, + 21, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 7, + 160, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 21, + 32, + 131, + 1, + 82, + 128, + 97, + 21, + 32, + 131, + 1, + 81, + 97, + 20, + 224, + 132, + 1, + 81, + 8, + 97, + 21, + 64, + 131, + 1, + 82, + 128, + 97, + 21, + 64, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 21, + 96, + 131, + 1, + 82, + 128, + 127, + 6, + 111, + 111, + 133, + 214, + 246, + 138, + 133, + 236, + 16, + 52, + 83, + 81, + 162, + 58, + 58, + 175, + 7, + 243, + 138, + 248, + 201, + 82, + 167, + 188, + 236, + 167, + 11, + 210, + 175, + 122, + 213, + 97, + 6, + 64, + 132, + 1, + 81, + 9, + 97, + 21, + 128, + 131, + 1, + 82, + 128, + 127, + 43, + 157, + 75, + 65, + 16, + 201, + 174, + 153, + 119, + 130, + 225, + 80, + 155, + 29, + 15, + 219, + 32, + 167, + 192, + 43, + 189, + 139, + 234, + 115, + 5, + 70, + 43, + 159, + 129, + 37, + 177, + 232, + 97, + 19, + 0, + 132, + 1, + 81, + 9, + 97, + 21, + 160, + 131, + 1, + 82, + 128, + 97, + 21, + 160, + 131, + 1, + 81, + 97, + 21, + 128, + 132, + 1, + 81, + 8, + 97, + 21, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 6, + 160, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 21, + 224, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 22, + 0, + 131, + 1, + 129, + 144, + 82, + 129, + 144, + 128, + 9, + 97, + 22, + 32, + 131, + 1, + 82, + 128, + 97, + 22, + 32, + 131, + 1, + 81, + 97, + 21, + 224, + 132, + 1, + 81, + 9, + 97, + 22, + 64, + 131, + 1, + 82, + 128, + 127, + 19, + 171, + 236, + 57, + 10, + 218, + 127, + 67, + 112, + 129, + 154, + 177, + 199, + 132, + 111, + 33, + 5, + 84, + 86, + 157, + 155, + 41, + 209, + 234, + 141, + 190, + 189, + 15, + 168, + 197, + 62, + 102, + 97, + 6, + 0, + 132, + 1, + 81, + 9, + 97, + 22, + 96, + 131, + 1, + 82, + 128, + 127, + 30, + 185, + 225, + 220, + 25, + 163, + 58, + 98, + 76, + 152, + 98, + 161, + 217, + 125, + 21, + 16, + 189, + 82, + 30, + 173, + 93, + 254, + 3, + 69, + 170, + 246, + 24, + 91, + 26, + 30, + 96, + 254, + 97, + 6, + 32, + 132, + 1, + 81, + 9, + 97, + 22, + 128, + 131, + 1, + 82, + 128, + 97, + 22, + 128, + 131, + 1, + 81, + 97, + 22, + 96, + 132, + 1, + 81, + 8, + 97, + 22, + 160, + 131, + 1, + 82, + 128, + 97, + 22, + 160, + 131, + 1, + 81, + 130, + 3, + 97, + 22, + 64, + 132, + 1, + 81, + 8, + 97, + 22, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 7, + 160, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 22, + 224, + 131, + 1, + 82, + 128, + 97, + 22, + 224, + 131, + 1, + 81, + 97, + 21, + 96, + 132, + 1, + 81, + 8, + 97, + 23, + 0, + 131, + 1, + 82, + 128, + 97, + 23, + 0, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 23, + 32, + 131, + 1, + 82, + 128, + 127, + 12, + 197, + 124, + 219, + 176, + 133, + 7, + 214, + 43, + 246, + 122, + 68, + 147, + 204, + 38, + 47, + 182, + 192, + 157, + 85, + 112, + 19, + 255, + 241, + 245, + 115, + 244, + 49, + 34, + 31, + 143, + 249, + 97, + 6, + 64, + 132, + 1, + 81, + 9, + 97, + 23, + 64, + 131, + 1, + 82, + 128, + 127, + 18, + 116, + 230, + 73, + 163, + 46, + 211, + 85, + 163, + 26, + 110, + 214, + 151, + 36, + 225, + 173, + 173, + 232, + 87, + 232, + 110, + 181, + 195, + 161, + 33, + 188, + 209, + 71, + 148, + 50, + 3, + 200, + 97, + 19, + 0, + 132, + 1, + 81, + 9, + 97, + 23, + 96, + 131, + 1, + 82, + 128, + 97, + 23, + 96, + 131, + 1, + 81, + 97, + 23, + 64, + 132, + 1, + 81, + 8, + 97, + 23, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 6, + 192, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 23, + 160, + 131, + 1, + 82, + 128, + 127, + 15, + 193, + 201, + 57, + 77, + 184, + 155, + 178, + 96, + 26, + 188, + 73, + 253, + 173, + 79, + 3, + 140, + 229, + 22, + 144, + 48, + 162, + 173, + 105, + 118, + 63, + 120, + 117, + 3, + 107, + 203, + 2, + 97, + 6, + 0, + 132, + 1, + 81, + 9, + 97, + 23, + 192, + 131, + 1, + 82, + 128, + 127, + 22, + 169, + 233, + 140, + 73, + 58, + 144, + 43, + 149, + 2, + 5, + 78, + 220, + 3, + 231, + 178, + 43, + 126, + 172, + 52, + 52, + 89, + 97, + 188, + 138, + 188, + 237, + 107, + 209, + 71, + 200, + 190, + 97, + 6, + 32, + 132, + 1, + 81, + 9, + 97, + 23, + 224, + 131, + 1, + 82, + 128, + 97, + 23, + 224, + 131, + 1, + 81, + 97, + 23, + 192, + 132, + 1, + 81, + 8, + 97, + 24, + 0, + 131, + 1, + 82, + 128, + 97, + 24, + 0, + 131, + 1, + 81, + 130, + 3, + 97, + 23, + 160, + 132, + 1, + 81, + 8, + 97, + 24, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 7, + 160, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 24, + 64, + 131, + 1, + 82, + 128, + 97, + 24, + 64, + 131, + 1, + 81, + 97, + 23, + 32, + 132, + 1, + 81, + 8, + 97, + 24, + 96, + 131, + 1, + 82, + 128, + 97, + 24, + 96, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 24, + 128, + 131, + 1, + 82, + 128, + 97, + 7, + 96, + 131, + 1, + 81, + 130, + 3, + 96, + 1, + 8, + 97, + 24, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 7, + 96, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 24, + 192, + 131, + 1, + 82, + 128, + 97, + 7, + 96, + 131, + 1, + 81, + 130, + 3, + 96, + 2, + 8, + 97, + 24, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 24, + 192, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 25, + 0, + 131, + 1, + 82, + 128, + 97, + 7, + 96, + 131, + 1, + 81, + 130, + 3, + 96, + 4, + 8, + 97, + 25, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 25, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 25, + 64, + 131, + 1, + 82, + 128, + 97, + 5, + 192, + 131, + 1, + 81, + 97, + 6, + 128, + 132, + 1, + 81, + 8, + 97, + 25, + 96, + 131, + 1, + 82, + 128, + 97, + 6, + 0, + 131, + 1, + 81, + 130, + 3, + 97, + 25, + 96, + 132, + 1, + 81, + 8, + 97, + 25, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 25, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 25, + 160, + 131, + 1, + 82, + 128, + 97, + 25, + 160, + 131, + 1, + 81, + 97, + 24, + 128, + 132, + 1, + 81, + 8, + 97, + 25, + 192, + 131, + 1, + 82, + 128, + 97, + 25, + 192, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 25, + 224, + 131, + 1, + 82, + 128, + 97, + 6, + 32, + 131, + 1, + 81, + 130, + 3, + 97, + 6, + 96, + 132, + 1, + 81, + 8, + 97, + 26, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 25, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 26, + 32, + 131, + 1, + 82, + 128, + 97, + 26, + 32, + 131, + 1, + 81, + 97, + 25, + 224, + 132, + 1, + 81, + 8, + 97, + 26, + 64, + 131, + 1, + 82, + 128, + 97, + 26, + 64, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 26, + 96, + 131, + 1, + 82, + 128, + 97, + 7, + 192, + 131, + 1, + 81, + 97, + 19, + 192, + 132, + 1, + 81, + 9, + 97, + 26, + 128, + 131, + 1, + 82, + 128, + 97, + 26, + 128, + 131, + 1, + 81, + 97, + 26, + 96, + 132, + 1, + 81, + 8, + 97, + 26, + 160, + 131, + 1, + 82, + 128, + 97, + 26, + 160, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 26, + 192, + 131, + 1, + 82, + 128, + 97, + 7, + 192, + 131, + 1, + 81, + 97, + 20, + 128, + 132, + 1, + 81, + 9, + 97, + 26, + 224, + 131, + 1, + 82, + 128, + 97, + 26, + 224, + 131, + 1, + 81, + 97, + 26, + 192, + 132, + 1, + 81, + 8, + 97, + 27, + 0, + 131, + 1, + 82, + 128, + 97, + 27, + 0, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 27, + 32, + 131, + 1, + 82, + 128, + 97, + 7, + 224, + 131, + 1, + 81, + 97, + 21, + 0, + 132, + 1, + 81, + 9, + 97, + 27, + 64, + 131, + 1, + 82, + 128, + 97, + 27, + 64, + 131, + 1, + 81, + 97, + 27, + 32, + 132, + 1, + 81, + 8, + 97, + 27, + 96, + 131, + 1, + 82, + 128, + 97, + 27, + 96, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 27, + 128, + 131, + 1, + 82, + 128, + 97, + 7, + 224, + 131, + 1, + 81, + 97, + 22, + 192, + 132, + 1, + 81, + 9, + 97, + 27, + 160, + 131, + 1, + 82, + 128, + 97, + 27, + 160, + 131, + 1, + 81, + 97, + 27, + 128, + 132, + 1, + 81, + 8, + 97, + 27, + 192, + 131, + 1, + 82, + 128, + 97, + 27, + 192, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 27, + 224, + 131, + 1, + 82, + 128, + 97, + 7, + 224, + 131, + 1, + 81, + 97, + 24, + 32, + 132, + 1, + 81, + 9, + 97, + 28, + 0, + 131, + 1, + 82, + 128, + 97, + 28, + 0, + 131, + 1, + 81, + 97, + 27, + 224, + 132, + 1, + 81, + 8, + 97, + 28, + 32, + 131, + 1, + 82, + 128, + 97, + 28, + 32, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 28, + 64, + 131, + 1, + 82, + 128, + 97, + 7, + 96, + 131, + 1, + 81, + 130, + 3, + 96, + 3, + 8, + 97, + 28, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 25, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 28, + 128, + 131, + 1, + 82, + 128, + 97, + 28, + 128, + 131, + 1, + 81, + 97, + 25, + 128, + 132, + 1, + 81, + 9, + 97, + 28, + 160, + 131, + 1, + 82, + 128, + 97, + 28, + 160, + 131, + 1, + 81, + 97, + 28, + 64, + 132, + 1, + 81, + 8, + 97, + 28, + 192, + 131, + 1, + 82, + 128, + 97, + 28, + 192, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 28, + 224, + 131, + 1, + 82, + 128, + 97, + 28, + 128, + 131, + 1, + 81, + 97, + 26, + 0, + 132, + 1, + 81, + 9, + 97, + 29, + 0, + 131, + 1, + 82, + 128, + 97, + 29, + 0, + 131, + 1, + 81, + 97, + 28, + 224, + 132, + 1, + 81, + 8, + 97, + 29, + 32, + 131, + 1, + 82, + 128, + 97, + 29, + 32, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 29, + 64, + 131, + 1, + 82, + 128, + 97, + 7, + 96, + 131, + 1, + 81, + 97, + 24, + 224, + 132, + 1, + 81, + 9, + 97, + 29, + 96, + 131, + 1, + 82, + 128, + 97, + 29, + 96, + 131, + 1, + 81, + 97, + 28, + 96, + 132, + 1, + 81, + 9, + 97, + 29, + 128, + 131, + 1, + 82, + 128, + 97, + 29, + 128, + 131, + 1, + 81, + 97, + 25, + 32, + 132, + 1, + 81, + 9, + 97, + 29, + 160, + 131, + 1, + 82, + 128, + 97, + 29, + 160, + 131, + 1, + 81, + 97, + 6, + 64, + 132, + 1, + 81, + 9, + 97, + 29, + 192, + 131, + 1, + 82, + 128, + 97, + 6, + 64, + 131, + 1, + 81, + 130, + 3, + 96, + 1, + 8, + 97, + 29, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 29, + 192, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 30, + 0, + 131, + 1, + 82, + 128, + 97, + 30, + 0, + 131, + 1, + 81, + 97, + 29, + 64, + 132, + 1, + 81, + 8, + 97, + 30, + 32, + 131, + 1, + 82, + 128, + 97, + 30, + 32, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 30, + 64, + 131, + 1, + 82, + 128, + 97, + 6, + 64, + 131, + 1, + 81, + 96, + 2, + 9, + 97, + 30, + 96, + 131, + 1, + 82, + 128, + 97, + 5, + 192, + 131, + 1, + 81, + 130, + 3, + 97, + 5, + 224, + 132, + 1, + 81, + 8, + 97, + 30, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 30, + 96, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 30, + 160, + 131, + 1, + 82, + 128, + 97, + 5, + 192, + 131, + 1, + 81, + 130, + 3, + 97, + 6, + 0, + 132, + 1, + 81, + 8, + 97, + 30, + 192, + 131, + 1, + 82, + 128, + 97, + 30, + 192, + 131, + 1, + 81, + 130, + 3, + 97, + 30, + 160, + 132, + 1, + 81, + 8, + 97, + 30, + 224, + 131, + 1, + 82, + 128, + 97, + 6, + 32, + 131, + 1, + 81, + 130, + 3, + 97, + 5, + 224, + 132, + 1, + 81, + 8, + 97, + 31, + 0, + 131, + 1, + 82, + 128, + 97, + 31, + 0, + 131, + 1, + 81, + 130, + 3, + 97, + 30, + 224, + 132, + 1, + 81, + 8, + 97, + 31, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 29, + 160, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 31, + 64, + 131, + 1, + 82, + 128, + 97, + 31, + 64, + 131, + 1, + 81, + 97, + 30, + 64, + 132, + 1, + 81, + 8, + 97, + 31, + 96, + 131, + 1, + 82, + 128, + 97, + 31, + 96, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 31, + 128, + 131, + 1, + 82, + 128, + 97, + 24, + 192, + 131, + 1, + 81, + 97, + 28, + 96, + 132, + 1, + 81, + 9, + 97, + 31, + 160, + 131, + 1, + 82, + 128, + 97, + 31, + 160, + 131, + 1, + 81, + 97, + 25, + 32, + 132, + 1, + 81, + 9, + 97, + 31, + 192, + 131, + 1, + 82, + 128, + 97, + 5, + 224, + 131, + 1, + 81, + 97, + 5, + 192, + 132, + 1, + 81, + 8, + 97, + 31, + 224, + 131, + 1, + 82, + 128, + 97, + 6, + 64, + 131, + 1, + 81, + 130, + 3, + 97, + 31, + 224, + 132, + 1, + 81, + 8, + 97, + 32, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 31, + 192, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 32, + 32, + 131, + 1, + 82, + 128, + 97, + 32, + 32, + 131, + 1, + 81, + 97, + 31, + 128, + 132, + 1, + 81, + 8, + 97, + 32, + 64, + 131, + 1, + 82, + 128, + 97, + 32, + 64, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 32, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 32, + 32, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 32, + 128, + 131, + 1, + 82, + 128, + 97, + 32, + 128, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 32, + 160, + 131, + 1, + 82, + 128, + 97, + 8, + 224, + 131, + 1, + 81, + 130, + 3, + 96, + 1, + 8, + 97, + 32, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 18, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 32, + 224, + 131, + 1, + 82, + 128, + 97, + 32, + 224, + 131, + 1, + 81, + 97, + 32, + 160, + 132, + 1, + 81, + 8, + 97, + 33, + 0, + 131, + 1, + 82, + 128, + 97, + 33, + 0, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 33, + 32, + 131, + 1, + 82, + 97, + 9, + 64, + 130, + 1, + 81, + 129, + 144, + 128, + 9, + 97, + 33, + 64, + 131, + 1, + 82, + 128, + 97, + 9, + 64, + 131, + 1, + 81, + 130, + 3, + 97, + 33, + 64, + 132, + 1, + 81, + 8, + 97, + 33, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 17, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 33, + 128, + 131, + 1, + 82, + 128, + 97, + 33, + 128, + 131, + 1, + 81, + 97, + 33, + 32, + 132, + 1, + 81, + 8, + 97, + 33, + 160, + 131, + 1, + 82, + 128, + 97, + 33, + 160, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 33, + 192, + 131, + 1, + 82, + 128, + 97, + 9, + 32, + 131, + 1, + 81, + 130, + 3, + 97, + 9, + 64, + 132, + 1, + 81, + 8, + 97, + 33, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 18, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 34, + 0, + 131, + 1, + 82, + 128, + 97, + 34, + 0, + 131, + 1, + 81, + 97, + 33, + 192, + 132, + 1, + 81, + 8, + 97, + 34, + 32, + 131, + 1, + 82, + 128, + 97, + 34, + 32, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 34, + 64, + 131, + 1, + 82, + 128, + 97, + 17, + 64, + 131, + 1, + 81, + 130, + 3, + 96, + 1, + 8, + 97, + 34, + 96, + 131, + 1, + 82, + 128, + 97, + 17, + 128, + 131, + 1, + 81, + 97, + 17, + 96, + 132, + 1, + 81, + 8, + 97, + 34, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 17, + 160, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 34, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 17, + 192, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 34, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 17, + 224, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 34, + 224, + 131, + 1, + 82, + 128, + 97, + 34, + 224, + 131, + 1, + 81, + 130, + 3, + 97, + 34, + 96, + 132, + 1, + 81, + 8, + 97, + 35, + 0, + 131, + 1, + 82, + 128, + 97, + 2, + 32, + 131, + 1, + 81, + 97, + 8, + 32, + 132, + 1, + 81, + 9, + 97, + 35, + 32, + 131, + 1, + 82, + 128, + 97, + 35, + 32, + 131, + 1, + 81, + 97, + 6, + 160, + 132, + 1, + 81, + 8, + 97, + 35, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 2, + 128, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 35, + 96, + 131, + 1, + 82, + 128, + 97, + 2, + 32, + 131, + 1, + 81, + 97, + 8, + 64, + 132, + 1, + 81, + 9, + 97, + 35, + 128, + 131, + 1, + 82, + 128, + 97, + 35, + 128, + 131, + 1, + 81, + 97, + 5, + 192, + 132, + 1, + 81, + 8, + 97, + 35, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 2, + 128, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 35, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 35, + 96, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 35, + 224, + 131, + 1, + 82, + 128, + 97, + 2, + 32, + 131, + 1, + 81, + 97, + 8, + 96, + 132, + 1, + 81, + 9, + 97, + 36, + 0, + 131, + 1, + 82, + 128, + 97, + 36, + 0, + 131, + 1, + 81, + 97, + 5, + 224, + 132, + 1, + 81, + 8, + 97, + 36, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 2, + 128, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 36, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 35, + 224, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 36, + 96, + 131, + 1, + 82, + 128, + 97, + 2, + 32, + 131, + 1, + 81, + 97, + 8, + 128, + 132, + 1, + 81, + 9, + 97, + 36, + 128, + 131, + 1, + 82, + 128, + 97, + 36, + 128, + 131, + 1, + 81, + 97, + 6, + 192, + 132, + 1, + 81, + 8, + 97, + 36, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 2, + 128, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 36, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 36, + 96, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 36, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 9, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 37, + 0, + 131, + 1, + 82, + 128, + 97, + 2, + 32, + 131, + 1, + 81, + 96, + 1, + 9, + 97, + 37, + 32, + 131, + 1, + 82, + 128, + 97, + 37, + 32, + 131, + 1, + 81, + 97, + 5, + 128, + 132, + 1, + 81, + 9, + 97, + 37, + 64, + 131, + 1, + 82, + 128, + 97, + 37, + 64, + 131, + 1, + 81, + 97, + 6, + 160, + 132, + 1, + 81, + 8, + 97, + 37, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 2, + 128, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 37, + 128, + 131, + 1, + 82, + 128, + 97, + 2, + 32, + 131, + 1, + 81, + 127, + 9, + 34, + 107, + 110, + 34, + 198, + 240, + 202, + 100, + 236, + 38, + 170, + 212, + 200, + 110, + 113, + 91, + 95, + 137, + 142, + 94, + 150, + 63, + 37, + 135, + 14, + 86, + 187, + 229, + 51, + 233, + 162, + 9, + 97, + 37, + 160, + 131, + 1, + 82, + 128, + 97, + 37, + 160, + 131, + 1, + 81, + 97, + 5, + 128, + 132, + 1, + 81, + 9, + 97, + 37, + 192, + 131, + 1, + 82, + 128, + 97, + 37, + 192, + 131, + 1, + 81, + 97, + 5, + 192, + 132, + 1, + 81, + 8, + 97, + 37, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 2, + 128, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 38, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 37, + 128, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 38, + 32, + 131, + 1, + 82, + 128, + 97, + 2, + 32, + 131, + 1, + 81, + 127, + 19, + 179, + 96, + 212, + 232, + 47, + 233, + 21, + 254, + 209, + 96, + 129, + 3, + 143, + 152, + 194, + 17, + 66, + 123, + 135, + 162, + 129, + 189, + 115, + 60, + 39, + 125, + 186, + 223, + 16, + 55, + 43, + 9, + 97, + 38, + 64, + 131, + 1, + 82, + 128, + 97, + 38, + 64, + 131, + 1, + 81, + 97, + 5, + 128, + 132, + 1, + 81, + 9, + 97, + 38, + 96, + 131, + 1, + 82, + 128, + 97, + 38, + 96, + 131, + 1, + 81, + 97, + 5, + 224, + 132, + 1, + 81, + 8, + 97, + 38, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 2, + 128, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 38, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 38, + 32, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 38, + 192, + 131, + 1, + 82, + 128, + 97, + 2, + 32, + 131, + 1, + 81, + 127, + 24, + 175, + 223, + 35, + 233, + 189, + 147, + 2, + 103, + 63, + 193, + 224, + 118, + 164, + 146, + 212, + 214, + 91, + 209, + 142, + 188, + 77, + 133, + 78, + 209, + 137, + 19, + 155, + 171, + 49, + 62, + 82, + 9, + 97, + 38, + 224, + 131, + 1, + 82, + 128, + 97, + 38, + 224, + 131, + 1, + 81, + 97, + 5, + 128, + 132, + 1, + 81, + 9, + 97, + 39, + 0, + 131, + 1, + 82, + 128, + 97, + 39, + 0, + 131, + 1, + 81, + 97, + 6, + 192, + 132, + 1, + 81, + 8, + 97, + 39, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 2, + 128, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 39, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 38, + 192, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 39, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 8, + 224, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 39, + 128, + 131, + 1, + 82, + 128, + 97, + 39, + 128, + 131, + 1, + 81, + 130, + 3, + 97, + 37, + 0, + 132, + 1, + 81, + 8, + 97, + 39, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 35, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 39, + 192, + 131, + 1, + 82, + 128, + 97, + 39, + 192, + 131, + 1, + 81, + 97, + 34, + 64, + 132, + 1, + 81, + 8, + 97, + 39, + 224, + 131, + 1, + 82, + 128, + 97, + 39, + 224, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 40, + 0, + 131, + 1, + 82, + 128, + 97, + 2, + 32, + 131, + 1, + 81, + 97, + 8, + 160, + 132, + 1, + 81, + 9, + 97, + 40, + 32, + 131, + 1, + 82, + 128, + 97, + 40, + 32, + 131, + 1, + 81, + 97, + 6, + 64, + 132, + 1, + 81, + 8, + 97, + 40, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 2, + 128, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 40, + 96, + 131, + 1, + 82, + 128, + 97, + 2, + 32, + 131, + 1, + 81, + 97, + 8, + 192, + 132, + 1, + 81, + 9, + 97, + 40, + 128, + 131, + 1, + 82, + 128, + 97, + 40, + 128, + 131, + 1, + 81, + 97, + 18, + 64, + 132, + 1, + 81, + 8, + 97, + 40, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 2, + 128, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 40, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 40, + 96, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 40, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 9, + 96, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 41, + 0, + 131, + 1, + 82, + 128, + 97, + 2, + 32, + 131, + 1, + 81, + 126, + 161, + 54, + 186, + 19, + 175, + 166, + 200, + 62, + 183, + 184, + 47, + 179, + 112, + 226, + 40, + 231, + 65, + 85, + 228, + 143, + 184, + 241, + 193, + 207, + 195, + 63, + 176, + 218, + 138, + 251, + 66, + 9, + 97, + 41, + 32, + 131, + 1, + 82, + 128, + 97, + 41, + 32, + 131, + 1, + 81, + 97, + 5, + 128, + 132, + 1, + 81, + 9, + 97, + 41, + 64, + 131, + 1, + 82, + 128, + 97, + 41, + 64, + 131, + 1, + 81, + 97, + 6, + 64, + 132, + 1, + 81, + 8, + 97, + 41, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 2, + 128, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 41, + 128, + 131, + 1, + 82, + 128, + 97, + 2, + 32, + 131, + 1, + 81, + 127, + 46, + 185, + 117, + 13, + 206, + 84, + 95, + 23, + 212, + 146, + 5, + 141, + 210, + 1, + 161, + 37, + 31, + 243, + 217, + 7, + 120, + 100, + 88, + 61, + 68, + 234, + 249, + 190, + 144, + 8, + 105, + 157, + 9, + 97, + 41, + 160, + 131, + 1, + 82, + 128, + 97, + 41, + 160, + 131, + 1, + 81, + 97, + 5, + 128, + 132, + 1, + 81, + 9, + 97, + 41, + 192, + 131, + 1, + 82, + 128, + 97, + 41, + 192, + 131, + 1, + 81, + 97, + 18, + 64, + 132, + 1, + 81, + 8, + 97, + 41, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 2, + 128, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 42, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 41, + 128, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 42, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 9, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 42, + 64, + 131, + 1, + 82, + 128, + 97, + 42, + 64, + 131, + 1, + 81, + 130, + 3, + 97, + 41, + 0, + 132, + 1, + 81, + 8, + 97, + 42, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 35, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 42, + 128, + 131, + 1, + 82, + 128, + 97, + 42, + 128, + 131, + 1, + 81, + 97, + 40, + 0, + 132, + 1, + 81, + 8, + 97, + 42, + 160, + 131, + 1, + 82, + 128, + 97, + 42, + 160, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 42, + 192, + 131, + 1, + 82, + 128, + 97, + 9, + 128, + 131, + 1, + 81, + 130, + 3, + 96, + 1, + 8, + 97, + 42, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 18, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 43, + 0, + 131, + 1, + 82, + 128, + 97, + 43, + 0, + 131, + 1, + 81, + 97, + 42, + 192, + 132, + 1, + 81, + 8, + 97, + 43, + 32, + 131, + 1, + 82, + 128, + 97, + 43, + 32, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 43, + 64, + 131, + 1, + 82, + 97, + 9, + 128, + 130, + 1, + 81, + 129, + 144, + 128, + 9, + 97, + 43, + 96, + 131, + 1, + 82, + 128, + 97, + 9, + 128, + 131, + 1, + 81, + 130, + 3, + 97, + 43, + 96, + 132, + 1, + 81, + 8, + 97, + 43, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 17, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 43, + 160, + 131, + 1, + 82, + 128, + 97, + 43, + 160, + 131, + 1, + 81, + 97, + 43, + 64, + 132, + 1, + 81, + 8, + 97, + 43, + 192, + 131, + 1, + 82, + 128, + 97, + 43, + 192, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 43, + 224, + 131, + 1, + 82, + 128, + 97, + 2, + 32, + 131, + 1, + 81, + 97, + 9, + 192, + 132, + 1, + 81, + 8, + 97, + 44, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 9, + 160, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 44, + 32, + 131, + 1, + 82, + 128, + 97, + 2, + 128, + 131, + 1, + 81, + 97, + 10, + 0, + 132, + 1, + 81, + 8, + 97, + 44, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 44, + 32, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 44, + 96, + 131, + 1, + 82, + 128, + 97, + 6, + 0, + 131, + 1, + 81, + 97, + 1, + 0, + 9, + 97, + 44, + 128, + 131, + 1, + 82, + 128, + 97, + 44, + 128, + 131, + 1, + 81, + 130, + 3, + 97, + 5, + 192, + 132, + 1, + 81, + 8, + 97, + 44, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 7, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 44, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 2, + 32, + 131, + 1, + 81, + 130, + 145, + 8, + 97, + 44, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 9, + 128, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 45, + 0, + 131, + 1, + 82, + 128, + 97, + 2, + 128, + 131, + 1, + 81, + 97, + 7, + 32, + 132, + 1, + 81, + 8, + 97, + 45, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 45, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 45, + 64, + 131, + 1, + 82, + 128, + 97, + 45, + 64, + 131, + 1, + 81, + 130, + 3, + 97, + 44, + 96, + 132, + 1, + 81, + 8, + 97, + 45, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 35, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 45, + 128, + 131, + 1, + 82, + 128, + 97, + 45, + 128, + 131, + 1, + 81, + 97, + 43, + 224, + 132, + 1, + 81, + 8, + 97, + 45, + 160, + 131, + 1, + 82, + 128, + 97, + 45, + 160, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 45, + 192, + 131, + 1, + 82, + 128, + 97, + 10, + 0, + 131, + 1, + 81, + 130, + 3, + 97, + 9, + 192, + 132, + 1, + 81, + 8, + 97, + 45, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 18, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 46, + 0, + 131, + 1, + 82, + 128, + 97, + 46, + 0, + 131, + 1, + 81, + 97, + 45, + 192, + 132, + 1, + 81, + 8, + 97, + 46, + 32, + 131, + 1, + 82, + 128, + 97, + 46, + 32, + 131, + 1, + 81, + 97, + 3, + 224, + 132, + 1, + 81, + 9, + 97, + 46, + 64, + 131, + 1, + 82, + 128, + 97, + 35, + 0, + 131, + 1, + 81, + 97, + 45, + 224, + 132, + 1, + 81, + 9, + 97, + 46, + 96, + 131, + 1, + 82, + 128, + 97, + 9, + 224, + 131, + 1, + 81, + 130, + 3, + 97, + 9, + 192, + 132, + 1, + 81, + 8, + 97, + 46, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 46, + 96, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 46, + 160, + 131, + 1, + 82, + 128, + 97, + 46, + 160, + 131, + 1, + 81, + 97, + 46, + 64, + 132, + 1, + 81, + 8, + 97, + 46, + 192, + 131, + 1, + 82, + 97, + 13, + 0, + 130, + 1, + 81, + 129, + 144, + 128, + 9, + 97, + 46, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 13, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 47, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 13, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 47, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 13, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 47, + 64, + 131, + 1, + 82, + 128, + 97, + 13, + 0, + 131, + 1, + 81, + 96, + 1, + 9, + 97, + 47, + 96, + 131, + 1, + 82, + 128, + 97, + 46, + 224, + 131, + 1, + 81, + 96, + 1, + 9, + 97, + 47, + 128, + 131, + 1, + 82, + 128, + 97, + 47, + 0, + 131, + 1, + 81, + 96, + 1, + 9, + 97, + 47, + 160, + 131, + 1, + 82, + 128, + 97, + 47, + 32, + 131, + 1, + 81, + 96, + 1, + 9, + 97, + 47, + 192, + 131, + 1, + 82, + 128, + 97, + 13, + 32, + 131, + 1, + 81, + 97, + 46, + 192, + 132, + 1, + 81, + 9, + 97, + 47, + 224, + 131, + 1, + 82, + 128, + 97, + 5, + 128, + 131, + 1, + 81, + 97, + 11, + 192, + 132, + 1, + 81, + 9, + 97, + 48, + 0, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 5, + 128, + 132, + 1, + 81, + 9, + 97, + 48, + 32, + 131, + 1, + 82, + 128, + 97, + 48, + 32, + 131, + 1, + 81, + 130, + 3, + 97, + 11, + 64, + 132, + 1, + 81, + 8, + 97, + 48, + 64, + 131, + 1, + 82, + 128, + 127, + 20, + 198, + 1, + 133, + 231, + 88, + 133, + 214, + 116, + 219, + 75, + 63, + 125, + 74, + 86, + 148, + 250, + 108, + 1, + 170, + 15, + 83, + 85, + 123, + 6, + 11, + 192, + 74, + 65, + 114, + 112, + 95, + 97, + 5, + 128, + 132, + 1, + 81, + 9, + 97, + 48, + 96, + 131, + 1, + 82, + 128, + 97, + 48, + 96, + 131, + 1, + 81, + 130, + 3, + 97, + 11, + 64, + 132, + 1, + 81, + 8, + 97, + 48, + 128, + 131, + 1, + 82, + 128, + 127, + 34, + 181, + 86, + 3, + 88, + 109, + 95, + 196, + 44, + 108, + 20, + 194, + 252, + 39, + 160, + 40, + 194, + 7, + 218, + 139, + 44, + 113, + 203, + 51, + 213, + 73, + 250, + 74, + 43, + 229, + 211, + 2, + 97, + 5, + 128, + 132, + 1, + 81, + 9, + 97, + 48, + 160, + 131, + 1, + 82, + 128, + 97, + 48, + 160, + 131, + 1, + 81, + 130, + 3, + 97, + 11, + 64, + 132, + 1, + 81, + 8, + 97, + 48, + 192, + 131, + 1, + 82, + 128, + 127, + 42, + 253, + 78, + 119, + 39, + 63, + 28, + 179, + 67, + 74, + 74, + 102, + 121, + 41, + 5, + 140, + 21, + 107, + 33, + 87, + 60, + 63, + 30, + 252, + 136, + 46, + 112, + 133, + 151, + 215, + 22, + 26, + 97, + 5, + 128, + 132, + 1, + 81, + 9, + 97, + 48, + 224, + 131, + 1, + 82, + 128, + 97, + 48, + 224, + 131, + 1, + 81, + 130, + 3, + 97, + 11, + 64, + 132, + 1, + 81, + 8, + 97, + 49, + 0, + 131, + 1, + 82, + 128, + 129, + 127, + 33, + 5, + 76, + 232, + 179, + 203, + 157, + 201, + 184, + 122, + 245, + 199, + 12, + 143, + 84, + 153, + 64, + 144, + 173, + 143, + 167, + 224, + 108, + 170, + 249, + 137, + 186, + 88, + 6, + 182, + 121, + 139, + 97, + 11, + 192, + 133, + 1, + 81, + 9, + 97, + 11, + 64, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 132, + 127, + 15, + 95, + 1, + 138, + 45, + 102, + 2, + 95, + 255, + 213, + 79, + 239, + 116, + 242, + 3, + 195, + 231, + 163, + 58, + 184, + 209, + 217, + 3, + 230, + 74, + 88, + 59, + 59, + 233, + 73, + 134, + 118, + 97, + 11, + 192, + 136, + 1, + 81, + 9, + 97, + 5, + 128, + 135, + 1, + 81, + 9, + 8, + 144, + 80, + 128, + 97, + 49, + 32, + 132, + 1, + 82, + 80, + 128, + 129, + 127, + 16, + 172, + 0, + 157, + 47, + 49, + 57, + 94, + 48, + 22, + 53, + 205, + 109, + 41, + 41, + 120, + 164, + 1, + 33, + 151, + 194, + 77, + 110, + 99, + 251, + 73, + 148, + 58, + 112, + 41, + 97, + 54, + 97, + 11, + 192, + 133, + 1, + 81, + 9, + 97, + 11, + 64, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 132, + 127, + 38, + 150, + 170, + 39, + 136, + 17, + 12, + 99, + 235, + 191, + 215, + 249, + 43, + 53, + 44, + 233, + 59, + 40, + 187, + 218, + 229, + 123, + 124, + 185, + 75, + 197, + 136, + 94, + 228, + 57, + 231, + 116, + 97, + 11, + 192, + 136, + 1, + 81, + 9, + 97, + 5, + 128, + 135, + 1, + 81, + 9, + 8, + 144, + 80, + 128, + 97, + 49, + 64, + 132, + 1, + 82, + 80, + 128, + 129, + 127, + 37, + 16, + 202, + 225, + 97, + 135, + 19, + 172, + 23, + 201, + 239, + 131, + 241, + 166, + 118, + 69, + 237, + 33, + 244, + 84, + 217, + 107, + 241, + 240, + 114, + 202, + 91, + 70, + 62, + 127, + 12, + 40, + 97, + 11, + 192, + 133, + 1, + 81, + 9, + 97, + 11, + 64, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 132, + 127, + 13, + 106, + 7, + 101, + 60, + 100, + 244, + 17, + 34, + 132, + 203, + 139, + 35, + 191, + 115, + 173, + 236, + 175, + 78, + 224, + 254, + 245, + 25, + 152, + 84, + 149, + 38, + 240, + 123, + 109, + 239, + 215, + 97, + 11, + 192, + 136, + 1, + 81, + 9, + 97, + 5, + 128, + 135, + 1, + 81, + 9, + 8, + 97, + 49, + 96, + 132, + 1, + 82, + 80, + 97, + 48, + 64, + 130, + 1, + 81, + 129, + 144, + 96, + 1, + 9, + 97, + 49, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 48, + 128, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 49, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 49, + 0, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 49, + 192, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 11, + 64, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 127, + 48, + 100, + 78, + 114, + 225, + 49, + 160, + 41, + 184, + 80, + 69, + 182, + 129, + 129, + 88, + 93, + 40, + 51, + 232, + 72, + 121, + 185, + 112, + 145, + 67, + 225, + 245, + 147, + 240, + 0, + 0, + 0, + 97, + 5, + 128, + 135, + 1, + 81, + 9, + 8, + 144, + 80, + 128, + 97, + 49, + 224, + 132, + 1, + 82, + 80, + 128, + 129, + 127, + 29, + 129, + 185, + 189, + 81, + 101, + 214, + 58, + 13, + 74, + 131, + 112, + 211, + 121, + 102, + 235, + 36, + 51, + 101, + 211, + 108, + 162, + 53, + 145, + 21, + 100, + 167, + 131, + 248, + 35, + 76, + 242, + 97, + 11, + 192, + 133, + 1, + 81, + 9, + 97, + 11, + 64, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 132, + 127, + 18, + 226, + 148, + 181, + 143, + 203, + 201, + 239, + 171, + 5, + 194, + 69, + 174, + 7, + 241, + 114, + 4, + 0, + 130, + 117, + 13, + 23, + 59, + 0, + 46, + 125, + 78, + 15, + 247, + 220, + 179, + 15, + 97, + 11, + 192, + 136, + 1, + 81, + 9, + 97, + 5, + 128, + 135, + 1, + 81, + 9, + 8, + 144, + 80, + 128, + 97, + 50, + 0, + 132, + 1, + 82, + 80, + 128, + 129, + 127, + 20, + 47, + 147, + 200, + 145, + 151, + 0, + 237, + 219, + 70, + 168, + 35, + 166, + 63, + 23, + 38, + 192, + 94, + 105, + 83, + 253, + 139, + 165, + 125, + 223, + 110, + 167, + 14, + 126, + 188, + 141, + 207, + 97, + 11, + 192, + 133, + 1, + 81, + 9, + 97, + 11, + 64, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 132, + 127, + 39, + 7, + 211, + 204, + 87, + 136, + 194, + 207, + 192, + 238, + 158, + 95, + 86, + 56, + 218, + 59, + 144, + 203, + 109, + 139, + 151, + 34, + 74, + 69, + 33, + 7, + 62, + 201, + 241, + 8, + 38, + 251, + 97, + 11, + 192, + 136, + 1, + 81, + 9, + 97, + 5, + 128, + 135, + 1, + 81, + 9, + 8, + 144, + 80, + 128, + 97, + 50, + 32, + 132, + 1, + 82, + 80, + 128, + 129, + 127, + 19, + 211, + 212, + 219, + 131, + 180, + 44, + 77, + 72, + 175, + 166, + 181, + 201, + 203, + 227, + 244, + 151, + 3, + 208, + 202, + 241, + 253, + 195, + 1, + 176, + 212, + 211, + 116, + 58, + 182, + 8, + 51, + 97, + 11, + 192, + 133, + 1, + 81, + 9, + 97, + 11, + 64, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 132, + 127, + 34, + 62, + 217, + 157, + 56, + 7, + 88, + 25, + 4, + 63, + 168, + 94, + 211, + 197, + 79, + 59, + 251, + 93, + 98, + 49, + 33, + 57, + 86, + 44, + 168, + 45, + 153, + 3, + 177, + 181, + 46, + 39, + 97, + 11, + 192, + 136, + 1, + 81, + 9, + 97, + 5, + 128, + 135, + 1, + 81, + 9, + 8, + 97, + 50, + 64, + 132, + 1, + 82, + 80, + 97, + 48, + 192, + 130, + 1, + 81, + 97, + 49, + 160, + 131, + 1, + 81, + 130, + 145, + 144, + 9, + 97, + 50, + 96, + 131, + 1, + 82, + 128, + 129, + 127, + 27, + 158, + 76, + 236, + 249, + 217, + 26, + 83, + 67, + 116, + 250, + 119, + 4, + 55, + 1, + 200, + 45, + 199, + 230, + 158, + 106, + 102, + 27, + 22, + 61, + 214, + 53, + 73, + 174, + 141, + 143, + 163, + 97, + 5, + 128, + 133, + 1, + 81, + 9, + 97, + 11, + 64, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 132, + 127, + 20, + 198, + 1, + 133, + 231, + 88, + 133, + 214, + 116, + 219, + 75, + 63, + 125, + 74, + 86, + 148, + 250, + 108, + 1, + 170, + 15, + 83, + 85, + 123, + 6, + 11, + 192, + 74, + 65, + 114, + 112, + 94, + 97, + 5, + 128, + 136, + 1, + 81, + 9, + 97, + 5, + 128, + 135, + 1, + 81, + 9, + 8, + 144, + 80, + 128, + 97, + 50, + 128, + 132, + 1, + 82, + 80, + 128, + 129, + 127, + 20, + 198, + 1, + 133, + 231, + 88, + 133, + 214, + 116, + 219, + 75, + 63, + 125, + 74, + 86, + 148, + 250, + 108, + 1, + 170, + 15, + 83, + 85, + 123, + 6, + 11, + 192, + 74, + 65, + 114, + 112, + 94, + 97, + 5, + 128, + 133, + 1, + 81, + 9, + 97, + 11, + 64, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 132, + 127, + 26, + 81, + 77, + 217, + 248, + 13, + 227, + 85, + 19, + 52, + 20, + 153, + 11, + 255, + 220, + 19, + 113, + 105, + 255, + 191, + 121, + 241, + 176, + 152, + 140, + 228, + 220, + 75, + 39, + 173, + 180, + 227, + 97, + 5, + 128, + 136, + 1, + 81, + 9, + 97, + 5, + 128, + 135, + 1, + 81, + 9, + 8, + 144, + 80, + 128, + 97, + 50, + 160, + 132, + 1, + 82, + 80, + 128, + 129, + 127, + 5, + 102, + 255, + 251, + 185, + 242, + 131, + 118, + 117, + 5, + 251, + 80, + 8, + 88, + 82, + 209, + 18, + 200, + 198, + 241, + 61, + 122, + 81, + 148, + 187, + 179, + 133, + 14, + 88, + 40, + 233, + 232, + 97, + 5, + 128, + 133, + 1, + 81, + 9, + 97, + 11, + 64, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 132, + 127, + 42, + 253, + 78, + 119, + 39, + 63, + 28, + 179, + 67, + 74, + 74, + 102, + 121, + 41, + 5, + 140, + 21, + 107, + 33, + 87, + 60, + 63, + 30, + 252, + 136, + 46, + 112, + 133, + 151, + 215, + 22, + 25, + 97, + 5, + 128, + 136, + 1, + 81, + 9, + 97, + 5, + 128, + 135, + 1, + 81, + 9, + 8, + 144, + 80, + 128, + 97, + 50, + 192, + 132, + 1, + 82, + 80, + 128, + 129, + 127, + 42, + 253, + 78, + 119, + 39, + 63, + 28, + 179, + 67, + 74, + 74, + 102, + 121, + 41, + 5, + 140, + 21, + 107, + 33, + 87, + 60, + 63, + 30, + 252, + 136, + 46, + 112, + 133, + 151, + 215, + 22, + 25, + 97, + 5, + 128, + 133, + 1, + 81, + 9, + 97, + 11, + 64, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 132, + 127, + 32, + 25, + 133, + 23, + 103, + 3, + 18, + 84, + 21, + 97, + 161, + 114, + 13, + 37, + 56, + 172, + 53, + 125, + 245, + 157, + 175, + 160, + 212, + 27, + 215, + 35, + 90, + 151, + 242, + 243, + 100, + 55, + 97, + 5, + 128, + 136, + 1, + 81, + 9, + 97, + 5, + 128, + 135, + 1, + 81, + 9, + 8, + 97, + 50, + 224, + 132, + 1, + 82, + 80, + 97, + 49, + 0, + 130, + 1, + 81, + 97, + 49, + 128, + 131, + 1, + 81, + 130, + 145, + 144, + 9, + 97, + 51, + 0, + 131, + 1, + 82, + 97, + 49, + 32, + 130, + 1, + 81, + 129, + 129, + 97, + 49, + 64, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 51, + 32, + 132, + 1, + 82, + 129, + 129, + 97, + 49, + 96, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 51, + 64, + 132, + 1, + 82, + 129, + 129, + 97, + 49, + 224, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 51, + 96, + 132, + 1, + 82, + 129, + 129, + 97, + 49, + 128, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 51, + 128, + 132, + 1, + 82, + 129, + 129, + 97, + 50, + 0, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 51, + 160, + 132, + 1, + 82, + 129, + 129, + 97, + 50, + 32, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 51, + 192, + 132, + 1, + 82, + 129, + 129, + 97, + 50, + 64, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 51, + 224, + 132, + 1, + 82, + 129, + 129, + 97, + 50, + 96, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 52, + 0, + 132, + 1, + 82, + 129, + 129, + 97, + 50, + 128, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 52, + 32, + 132, + 1, + 82, + 129, + 129, + 97, + 50, + 160, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 52, + 64, + 132, + 1, + 82, + 129, + 129, + 97, + 49, + 160, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 52, + 96, + 132, + 1, + 82, + 129, + 129, + 97, + 50, + 192, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 52, + 128, + 132, + 1, + 82, + 129, + 129, + 97, + 50, + 224, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 52, + 160, + 132, + 1, + 82, + 129, + 129, + 97, + 51, + 0, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 52, + 192, + 132, + 1, + 82, + 80, + 96, + 32, + 97, + 53, + 0, + 131, + 1, + 82, + 96, + 32, + 97, + 53, + 32, + 131, + 1, + 82, + 96, + 32, + 97, + 53, + 64, + 131, + 1, + 82, + 97, + 52, + 192, + 130, + 1, + 81, + 97, + 53, + 96, + 131, + 1, + 82, + 127, + 48, + 100, + 78, + 114, + 225, + 49, + 160, + 41, + 184, + 80, + 69, + 182, + 129, + 129, + 88, + 93, + 40, + 51, + 232, + 72, + 121, + 185, + 112, + 145, + 67, + 225, + 245, + 147, + 239, + 255, + 255, + 255, + 97, + 53, + 128, + 131, + 1, + 82, + 96, + 0, + 128, + 81, + 96, + 32, + 97, + 84, + 18, + 131, + 57, + 129, + 81, + 145, + 82, + 97, + 53, + 160, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 32, + 97, + 52, + 224, + 133, + 1, + 96, + 192, + 97, + 53, + 0, + 135, + 1, + 96, + 5, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 52, + 224, + 130, + 1, + 81, + 96, + 0, + 97, + 51, + 0, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 52, + 160, + 134, + 1, + 81, + 9, + 97, + 51, + 0, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 50, + 224, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 52, + 128, + 134, + 1, + 81, + 9, + 97, + 50, + 224, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 50, + 192, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 52, + 96, + 134, + 1, + 81, + 9, + 97, + 50, + 192, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 49, + 160, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 52, + 64, + 134, + 1, + 81, + 9, + 97, + 49, + 160, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 50, + 160, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 52, + 32, + 134, + 1, + 81, + 9, + 97, + 50, + 160, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 50, + 128, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 52, + 0, + 134, + 1, + 81, + 9, + 97, + 50, + 128, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 50, + 96, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 51, + 224, + 134, + 1, + 81, + 9, + 97, + 50, + 96, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 50, + 64, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 51, + 192, + 134, + 1, + 81, + 9, + 97, + 50, + 64, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 50, + 32, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 51, + 160, + 134, + 1, + 81, + 9, + 97, + 50, + 32, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 50, + 0, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 51, + 128, + 134, + 1, + 81, + 9, + 97, + 50, + 0, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 49, + 128, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 51, + 96, + 134, + 1, + 81, + 9, + 97, + 49, + 128, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 49, + 224, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 51, + 64, + 134, + 1, + 81, + 9, + 97, + 49, + 224, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 49, + 96, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 51, + 32, + 134, + 1, + 81, + 9, + 97, + 49, + 96, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 49, + 64, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 49, + 32, + 134, + 1, + 81, + 9, + 97, + 49, + 64, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 97, + 49, + 32, + 133, + 1, + 129, + 144, + 82, + 97, + 49, + 64, + 133, + 1, + 81, + 144, + 146, + 80, + 131, + 145, + 80, + 130, + 144, + 8, + 144, + 80, + 129, + 129, + 97, + 49, + 96, + 133, + 1, + 81, + 8, + 97, + 53, + 192, + 132, + 1, + 82, + 80, + 97, + 49, + 128, + 130, + 1, + 81, + 97, + 49, + 192, + 131, + 1, + 81, + 130, + 145, + 144, + 9, + 97, + 53, + 224, + 131, + 1, + 82, + 97, + 49, + 224, + 130, + 1, + 81, + 128, + 97, + 54, + 0, + 132, + 1, + 82, + 80, + 128, + 97, + 50, + 96, + 131, + 1, + 81, + 97, + 49, + 192, + 132, + 1, + 81, + 9, + 97, + 54, + 32, + 131, + 1, + 82, + 97, + 50, + 0, + 130, + 1, + 81, + 129, + 129, + 97, + 50, + 32, + 133, + 1, + 81, + 8, + 144, + 80, + 129, + 129, + 97, + 50, + 64, + 133, + 1, + 81, + 8, + 97, + 54, + 64, + 132, + 1, + 82, + 80, + 97, + 49, + 160, + 130, + 1, + 81, + 97, + 49, + 192, + 131, + 1, + 81, + 130, + 145, + 144, + 9, + 97, + 54, + 96, + 131, + 1, + 82, + 97, + 50, + 128, + 130, + 1, + 81, + 129, + 129, + 97, + 50, + 160, + 133, + 1, + 81, + 8, + 97, + 54, + 128, + 132, + 1, + 82, + 80, + 97, + 51, + 0, + 130, + 1, + 81, + 97, + 49, + 192, + 131, + 1, + 81, + 130, + 145, + 144, + 9, + 97, + 54, + 160, + 131, + 1, + 82, + 97, + 50, + 192, + 130, + 1, + 81, + 129, + 129, + 97, + 50, + 224, + 133, + 1, + 81, + 8, + 97, + 54, + 192, + 132, + 1, + 82, + 80, + 97, + 53, + 192, + 130, + 1, + 81, + 97, + 54, + 0, + 131, + 1, + 81, + 130, + 144, + 130, + 144, + 9, + 144, + 80, + 128, + 97, + 54, + 224, + 132, + 1, + 82, + 129, + 129, + 97, + 54, + 64, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 55, + 0, + 132, + 1, + 82, + 129, + 129, + 97, + 54, + 128, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 55, + 32, + 132, + 1, + 82, + 129, + 129, + 97, + 54, + 192, + 133, + 1, + 81, + 9, + 144, + 80, + 128, + 97, + 55, + 64, + 132, + 1, + 82, + 80, + 96, + 32, + 97, + 55, + 128, + 131, + 1, + 82, + 96, + 32, + 97, + 55, + 160, + 131, + 1, + 82, + 96, + 32, + 97, + 55, + 192, + 131, + 1, + 82, + 97, + 55, + 64, + 130, + 1, + 81, + 97, + 55, + 224, + 131, + 1, + 82, + 127, + 48, + 100, + 78, + 114, + 225, + 49, + 160, + 41, + 184, + 80, + 69, + 182, + 129, + 129, + 88, + 93, + 40, + 51, + 232, + 72, + 121, + 185, + 112, + 145, + 67, + 225, + 245, + 147, + 239, + 255, + 255, + 255, + 97, + 56, + 0, + 131, + 1, + 82, + 96, + 0, + 128, + 81, + 96, + 32, + 97, + 84, + 18, + 131, + 57, + 129, + 81, + 145, + 82, + 97, + 56, + 32, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 32, + 97, + 55, + 96, + 133, + 1, + 96, + 192, + 97, + 55, + 128, + 135, + 1, + 96, + 5, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 55, + 96, + 130, + 1, + 81, + 96, + 0, + 97, + 54, + 192, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 55, + 32, + 134, + 1, + 81, + 9, + 97, + 54, + 192, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 54, + 128, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 55, + 0, + 134, + 1, + 81, + 9, + 97, + 54, + 128, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 54, + 64, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 54, + 224, + 134, + 1, + 81, + 9, + 97, + 54, + 64, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 145, + 80, + 97, + 54, + 0, + 132, + 1, + 81, + 144, + 80, + 130, + 130, + 97, + 53, + 192, + 134, + 1, + 81, + 9, + 97, + 54, + 0, + 133, + 1, + 82, + 130, + 130, + 130, + 9, + 97, + 53, + 192, + 133, + 1, + 82, + 80, + 80, + 97, + 54, + 0, + 130, + 1, + 81, + 97, + 53, + 224, + 131, + 1, + 81, + 130, + 145, + 144, + 9, + 97, + 56, + 64, + 131, + 1, + 82, + 128, + 97, + 54, + 64, + 131, + 1, + 81, + 97, + 54, + 32, + 132, + 1, + 81, + 9, + 97, + 56, + 96, + 131, + 1, + 82, + 128, + 97, + 54, + 128, + 131, + 1, + 81, + 97, + 54, + 96, + 132, + 1, + 81, + 9, + 97, + 56, + 128, + 131, + 1, + 82, + 128, + 97, + 54, + 192, + 131, + 1, + 81, + 97, + 54, + 160, + 132, + 1, + 81, + 9, + 97, + 56, + 160, + 131, + 1, + 82, + 97, + 10, + 64, + 130, + 1, + 81, + 129, + 144, + 128, + 9, + 97, + 56, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 56, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 57, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 57, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 57, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 57, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 57, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 57, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 57, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 57, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 58, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 58, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 58, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 58, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 58, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 58, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 58, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 58, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 59, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 59, + 32, + 131, + 1, + 82, + 97, + 10, + 160, + 130, + 1, + 81, + 129, + 144, + 128, + 9, + 97, + 59, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 160, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 59, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 160, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 59, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 160, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 59, + 160, + 131, + 1, + 82, + 128, + 97, + 49, + 32, + 131, + 1, + 81, + 97, + 5, + 192, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 97, + 49, + 64, + 134, + 1, + 81, + 97, + 6, + 0, + 135, + 1, + 81, + 9, + 8, + 144, + 80, + 129, + 129, + 131, + 97, + 49, + 96, + 134, + 1, + 81, + 97, + 6, + 128, + 135, + 1, + 81, + 9, + 8, + 97, + 59, + 192, + 132, + 1, + 129, + 144, + 82, + 97, + 53, + 192, + 132, + 1, + 81, + 131, + 146, + 80, + 144, + 9, + 97, + 59, + 224, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 59, + 224, + 132, + 1, + 81, + 131, + 3, + 9, + 97, + 60, + 0, + 131, + 1, + 82, + 128, + 97, + 49, + 32, + 131, + 1, + 81, + 97, + 5, + 224, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 97, + 49, + 64, + 134, + 1, + 81, + 97, + 6, + 32, + 135, + 1, + 81, + 9, + 8, + 144, + 80, + 129, + 129, + 131, + 97, + 49, + 96, + 134, + 1, + 81, + 97, + 6, + 96, + 135, + 1, + 81, + 9, + 8, + 97, + 60, + 32, + 132, + 1, + 129, + 144, + 82, + 97, + 53, + 192, + 132, + 1, + 81, + 131, + 146, + 80, + 144, + 9, + 97, + 60, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 60, + 96, + 131, + 1, + 82, + 128, + 97, + 10, + 64, + 131, + 1, + 81, + 96, + 1, + 9, + 97, + 60, + 128, + 131, + 1, + 82, + 128, + 97, + 60, + 96, + 131, + 1, + 81, + 97, + 60, + 0, + 132, + 1, + 81, + 8, + 97, + 60, + 160, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 60, + 160, + 132, + 1, + 81, + 9, + 97, + 60, + 192, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 60, + 128, + 132, + 1, + 81, + 9, + 97, + 60, + 224, + 131, + 1, + 82, + 128, + 97, + 53, + 224, + 131, + 1, + 81, + 96, + 1, + 9, + 97, + 61, + 0, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 6, + 64, + 132, + 1, + 81, + 9, + 97, + 61, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 61, + 64, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 61, + 64, + 132, + 1, + 81, + 131, + 3, + 9, + 97, + 61, + 96, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 61, + 128, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 10, + 0, + 132, + 1, + 81, + 9, + 97, + 61, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 61, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 61, + 224, + 131, + 1, + 82, + 128, + 97, + 10, + 64, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 62, + 0, + 131, + 1, + 82, + 128, + 97, + 61, + 224, + 131, + 1, + 81, + 97, + 61, + 96, + 132, + 1, + 81, + 8, + 97, + 62, + 32, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 6, + 160, + 132, + 1, + 81, + 9, + 97, + 62, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 62, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 192, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 62, + 128, + 131, + 1, + 82, + 128, + 97, + 56, + 192, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 62, + 160, + 131, + 1, + 82, + 128, + 97, + 62, + 128, + 131, + 1, + 81, + 97, + 62, + 32, + 132, + 1, + 81, + 8, + 97, + 62, + 192, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 6, + 192, + 132, + 1, + 81, + 9, + 97, + 62, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 63, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 224, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 63, + 32, + 131, + 1, + 82, + 128, + 97, + 56, + 224, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 63, + 64, + 131, + 1, + 82, + 128, + 97, + 63, + 32, + 131, + 1, + 81, + 97, + 62, + 192, + 132, + 1, + 81, + 8, + 97, + 63, + 96, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 6, + 224, + 132, + 1, + 81, + 9, + 97, + 63, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 63, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 57, + 0, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 63, + 192, + 131, + 1, + 82, + 128, + 97, + 57, + 0, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 63, + 224, + 131, + 1, + 82, + 128, + 97, + 63, + 192, + 131, + 1, + 81, + 97, + 63, + 96, + 132, + 1, + 81, + 8, + 97, + 64, + 0, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 7, + 0, + 132, + 1, + 81, + 9, + 97, + 64, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 64, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 57, + 32, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 64, + 96, + 131, + 1, + 82, + 128, + 97, + 57, + 32, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 64, + 128, + 131, + 1, + 82, + 128, + 97, + 64, + 96, + 131, + 1, + 81, + 97, + 64, + 0, + 132, + 1, + 81, + 8, + 97, + 64, + 160, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 7, + 32, + 132, + 1, + 81, + 9, + 97, + 64, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 64, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 57, + 64, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 65, + 0, + 131, + 1, + 82, + 128, + 97, + 57, + 64, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 65, + 32, + 131, + 1, + 82, + 128, + 97, + 65, + 0, + 131, + 1, + 81, + 97, + 64, + 160, + 132, + 1, + 81, + 8, + 97, + 65, + 64, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 7, + 64, + 132, + 1, + 81, + 9, + 97, + 65, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 65, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 57, + 96, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 65, + 160, + 131, + 1, + 82, + 128, + 97, + 57, + 96, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 65, + 192, + 131, + 1, + 82, + 128, + 97, + 65, + 160, + 131, + 1, + 81, + 97, + 65, + 64, + 132, + 1, + 81, + 8, + 97, + 65, + 224, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 7, + 96, + 132, + 1, + 81, + 9, + 97, + 66, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 66, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 57, + 128, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 66, + 64, + 131, + 1, + 82, + 128, + 97, + 57, + 128, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 66, + 96, + 131, + 1, + 82, + 128, + 97, + 66, + 64, + 131, + 1, + 81, + 97, + 65, + 224, + 132, + 1, + 81, + 8, + 97, + 66, + 128, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 7, + 128, + 132, + 1, + 81, + 9, + 97, + 66, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 66, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 57, + 160, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 66, + 224, + 131, + 1, + 82, + 128, + 97, + 57, + 160, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 67, + 0, + 131, + 1, + 82, + 128, + 97, + 66, + 224, + 131, + 1, + 81, + 97, + 66, + 128, + 132, + 1, + 81, + 8, + 97, + 67, + 32, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 7, + 160, + 132, + 1, + 81, + 9, + 97, + 67, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 67, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 57, + 192, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 67, + 128, + 131, + 1, + 82, + 128, + 97, + 57, + 192, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 67, + 160, + 131, + 1, + 82, + 128, + 97, + 67, + 128, + 131, + 1, + 81, + 97, + 67, + 32, + 132, + 1, + 81, + 8, + 97, + 67, + 192, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 7, + 192, + 132, + 1, + 81, + 9, + 97, + 67, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 68, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 57, + 224, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 68, + 32, + 131, + 1, + 82, + 128, + 97, + 57, + 224, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 68, + 64, + 131, + 1, + 82, + 128, + 97, + 68, + 32, + 131, + 1, + 81, + 97, + 67, + 192, + 132, + 1, + 81, + 8, + 97, + 68, + 96, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 7, + 224, + 132, + 1, + 81, + 9, + 97, + 68, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 68, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 58, + 0, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 68, + 192, + 131, + 1, + 82, + 128, + 97, + 58, + 0, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 68, + 224, + 131, + 1, + 82, + 128, + 97, + 68, + 192, + 131, + 1, + 81, + 97, + 68, + 96, + 132, + 1, + 81, + 8, + 97, + 69, + 0, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 8, + 32, + 132, + 1, + 81, + 9, + 97, + 69, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 69, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 58, + 32, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 69, + 96, + 131, + 1, + 82, + 128, + 97, + 58, + 32, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 69, + 128, + 131, + 1, + 82, + 128, + 97, + 69, + 96, + 131, + 1, + 81, + 97, + 69, + 0, + 132, + 1, + 81, + 8, + 97, + 69, + 160, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 8, + 64, + 132, + 1, + 81, + 9, + 97, + 69, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 69, + 224, + 131, + 1, + 129, + 144, + 82, + 97, + 58, + 64, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 70, + 0, + 131, + 1, + 82, + 128, + 97, + 58, + 64, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 70, + 32, + 131, + 1, + 82, + 128, + 97, + 70, + 0, + 131, + 1, + 81, + 97, + 69, + 160, + 132, + 1, + 81, + 8, + 97, + 70, + 64, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 8, + 96, + 132, + 1, + 81, + 9, + 97, + 70, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 70, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 58, + 96, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 70, + 160, + 131, + 1, + 82, + 128, + 97, + 58, + 96, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 70, + 192, + 131, + 1, + 82, + 128, + 97, + 70, + 160, + 131, + 1, + 81, + 97, + 70, + 64, + 132, + 1, + 81, + 8, + 97, + 70, + 224, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 8, + 128, + 132, + 1, + 81, + 9, + 97, + 71, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 71, + 32, + 131, + 1, + 129, + 144, + 82, + 97, + 58, + 128, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 71, + 64, + 131, + 1, + 82, + 128, + 97, + 58, + 128, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 71, + 96, + 131, + 1, + 82, + 128, + 97, + 71, + 64, + 131, + 1, + 81, + 97, + 70, + 224, + 132, + 1, + 81, + 8, + 97, + 71, + 128, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 8, + 160, + 132, + 1, + 81, + 9, + 97, + 71, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 71, + 192, + 131, + 1, + 129, + 144, + 82, + 97, + 58, + 160, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 71, + 224, + 131, + 1, + 82, + 128, + 97, + 58, + 160, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 72, + 0, + 131, + 1, + 82, + 128, + 97, + 71, + 224, + 131, + 1, + 81, + 97, + 71, + 128, + 132, + 1, + 81, + 8, + 97, + 72, + 32, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 8, + 192, + 132, + 1, + 81, + 9, + 97, + 72, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 72, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 58, + 192, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 72, + 128, + 131, + 1, + 82, + 128, + 97, + 58, + 192, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 72, + 160, + 131, + 1, + 82, + 128, + 97, + 72, + 128, + 131, + 1, + 81, + 97, + 72, + 32, + 132, + 1, + 81, + 8, + 97, + 72, + 192, + 131, + 1, + 82, + 128, + 97, + 53, + 224, + 131, + 1, + 81, + 97, + 47, + 96, + 132, + 1, + 81, + 9, + 97, + 72, + 224, + 131, + 1, + 82, + 128, + 97, + 53, + 224, + 131, + 1, + 81, + 97, + 47, + 128, + 132, + 1, + 81, + 9, + 97, + 73, + 0, + 131, + 1, + 82, + 128, + 97, + 53, + 224, + 131, + 1, + 81, + 97, + 47, + 160, + 132, + 1, + 81, + 9, + 97, + 73, + 32, + 131, + 1, + 82, + 128, + 97, + 53, + 224, + 131, + 1, + 81, + 97, + 47, + 192, + 132, + 1, + 81, + 9, + 97, + 73, + 64, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 47, + 224, + 132, + 1, + 81, + 9, + 97, + 73, + 96, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 73, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 58, + 224, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 73, + 160, + 131, + 1, + 82, + 128, + 97, + 58, + 224, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 73, + 192, + 131, + 1, + 82, + 128, + 97, + 58, + 224, + 131, + 1, + 81, + 97, + 72, + 224, + 132, + 1, + 81, + 9, + 97, + 73, + 224, + 131, + 1, + 82, + 128, + 97, + 58, + 224, + 131, + 1, + 81, + 97, + 73, + 0, + 132, + 1, + 81, + 9, + 97, + 74, + 0, + 131, + 1, + 82, + 128, + 97, + 58, + 224, + 131, + 1, + 81, + 97, + 73, + 32, + 132, + 1, + 81, + 9, + 97, + 74, + 32, + 131, + 1, + 82, + 128, + 97, + 58, + 224, + 131, + 1, + 81, + 97, + 73, + 64, + 132, + 1, + 81, + 9, + 97, + 74, + 64, + 131, + 1, + 82, + 128, + 97, + 73, + 160, + 131, + 1, + 81, + 97, + 72, + 192, + 132, + 1, + 81, + 8, + 97, + 74, + 96, + 131, + 1, + 82, + 128, + 97, + 49, + 224, + 131, + 1, + 81, + 97, + 8, + 0, + 132, + 1, + 81, + 9, + 97, + 74, + 128, + 131, + 1, + 129, + 144, + 82, + 97, + 56, + 64, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 74, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 59, + 0, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 74, + 192, + 131, + 1, + 82, + 128, + 97, + 59, + 0, + 131, + 1, + 81, + 97, + 61, + 0, + 132, + 1, + 81, + 9, + 97, + 74, + 224, + 131, + 1, + 82, + 128, + 97, + 74, + 192, + 131, + 1, + 81, + 97, + 74, + 96, + 132, + 1, + 81, + 8, + 97, + 75, + 0, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 160, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 75, + 32, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 61, + 128, + 132, + 1, + 81, + 9, + 97, + 75, + 64, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 62, + 0, + 132, + 1, + 81, + 9, + 97, + 75, + 96, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 62, + 160, + 132, + 1, + 81, + 9, + 97, + 75, + 128, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 63, + 64, + 132, + 1, + 81, + 9, + 97, + 75, + 160, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 63, + 224, + 132, + 1, + 81, + 9, + 97, + 75, + 192, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 64, + 128, + 132, + 1, + 81, + 9, + 97, + 75, + 224, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 65, + 32, + 132, + 1, + 81, + 9, + 97, + 76, + 0, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 65, + 192, + 132, + 1, + 81, + 9, + 97, + 76, + 32, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 66, + 96, + 132, + 1, + 81, + 9, + 97, + 76, + 64, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 67, + 0, + 132, + 1, + 81, + 9, + 97, + 76, + 96, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 67, + 160, + 132, + 1, + 81, + 9, + 97, + 76, + 128, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 68, + 64, + 132, + 1, + 81, + 9, + 97, + 76, + 160, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 68, + 224, + 132, + 1, + 81, + 9, + 97, + 76, + 192, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 69, + 128, + 132, + 1, + 81, + 9, + 97, + 76, + 224, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 70, + 32, + 132, + 1, + 81, + 9, + 97, + 77, + 0, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 70, + 192, + 132, + 1, + 81, + 9, + 97, + 77, + 32, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 71, + 96, + 132, + 1, + 81, + 9, + 97, + 77, + 64, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 72, + 0, + 132, + 1, + 81, + 9, + 97, + 77, + 96, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 72, + 160, + 132, + 1, + 81, + 9, + 97, + 77, + 128, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 73, + 192, + 132, + 1, + 81, + 9, + 97, + 77, + 160, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 73, + 224, + 132, + 1, + 81, + 9, + 97, + 77, + 192, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 74, + 0, + 132, + 1, + 81, + 9, + 97, + 77, + 224, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 74, + 32, + 132, + 1, + 81, + 9, + 97, + 78, + 0, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 74, + 64, + 132, + 1, + 81, + 9, + 97, + 78, + 32, + 131, + 1, + 82, + 128, + 97, + 10, + 160, + 131, + 1, + 81, + 97, + 74, + 224, + 132, + 1, + 81, + 9, + 97, + 78, + 64, + 131, + 1, + 82, + 128, + 97, + 75, + 32, + 131, + 1, + 81, + 97, + 60, + 192, + 132, + 1, + 81, + 8, + 97, + 78, + 96, + 131, + 1, + 82, + 128, + 97, + 54, + 32, + 131, + 1, + 81, + 96, + 1, + 9, + 97, + 78, + 128, + 131, + 1, + 82, + 128, + 97, + 50, + 0, + 131, + 1, + 81, + 97, + 8, + 224, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 97, + 50, + 32, + 134, + 1, + 81, + 97, + 9, + 0, + 135, + 1, + 81, + 9, + 8, + 144, + 80, + 129, + 129, + 131, + 97, + 50, + 64, + 134, + 1, + 81, + 97, + 9, + 32, + 135, + 1, + 81, + 9, + 8, + 97, + 78, + 160, + 132, + 1, + 129, + 144, + 82, + 97, + 56, + 96, + 132, + 1, + 81, + 131, + 146, + 80, + 144, + 9, + 97, + 78, + 192, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 78, + 192, + 132, + 1, + 81, + 131, + 3, + 9, + 97, + 78, + 224, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 78, + 128, + 132, + 1, + 81, + 9, + 97, + 79, + 0, + 131, + 1, + 82, + 128, + 97, + 59, + 64, + 131, + 1, + 81, + 97, + 78, + 224, + 132, + 1, + 81, + 9, + 97, + 79, + 32, + 131, + 1, + 82, + 128, + 97, + 59, + 64, + 131, + 1, + 81, + 97, + 79, + 0, + 132, + 1, + 81, + 9, + 97, + 79, + 64, + 131, + 1, + 82, + 128, + 97, + 79, + 32, + 131, + 1, + 81, + 97, + 78, + 96, + 132, + 1, + 81, + 8, + 97, + 79, + 96, + 131, + 1, + 82, + 128, + 97, + 54, + 96, + 131, + 1, + 81, + 96, + 1, + 9, + 97, + 79, + 128, + 131, + 1, + 82, + 128, + 97, + 50, + 128, + 131, + 1, + 81, + 97, + 9, + 64, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 97, + 50, + 160, + 134, + 1, + 81, + 97, + 9, + 96, + 135, + 1, + 81, + 9, + 8, + 97, + 79, + 160, + 132, + 1, + 129, + 144, + 82, + 97, + 56, + 128, + 132, + 1, + 81, + 131, + 146, + 80, + 144, + 9, + 97, + 79, + 192, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 79, + 192, + 132, + 1, + 81, + 131, + 3, + 9, + 97, + 79, + 224, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 79, + 128, + 132, + 1, + 81, + 9, + 97, + 80, + 0, + 131, + 1, + 82, + 128, + 97, + 50, + 128, + 131, + 1, + 81, + 97, + 9, + 128, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 97, + 50, + 160, + 134, + 1, + 81, + 97, + 9, + 160, + 135, + 1, + 81, + 9, + 8, + 97, + 80, + 32, + 132, + 1, + 129, + 144, + 82, + 97, + 56, + 128, + 132, + 1, + 81, + 131, + 146, + 80, + 144, + 9, + 97, + 80, + 64, + 131, + 1, + 129, + 144, + 82, + 97, + 10, + 64, + 131, + 1, + 81, + 130, + 145, + 130, + 3, + 9, + 97, + 80, + 96, + 131, + 1, + 82, + 128, + 97, + 10, + 64, + 131, + 1, + 81, + 97, + 79, + 128, + 132, + 1, + 81, + 9, + 97, + 80, + 128, + 131, + 1, + 82, + 128, + 97, + 80, + 96, + 131, + 1, + 81, + 97, + 79, + 224, + 132, + 1, + 81, + 8, + 97, + 80, + 160, + 131, + 1, + 129, + 144, + 82, + 97, + 59, + 96, + 131, + 1, + 81, + 130, + 145, + 9, + 97, + 80, + 192, + 131, + 1, + 82, + 128, + 97, + 59, + 96, + 131, + 1, + 81, + 97, + 80, + 0, + 132, + 1, + 81, + 9, + 97, + 80, + 224, + 131, + 1, + 82, + 128, + 97, + 59, + 96, + 131, + 1, + 81, + 97, + 80, + 128, + 132, + 1, + 81, + 9, + 97, + 81, + 0, + 131, + 1, + 82, + 128, + 97, + 80, + 192, + 131, + 1, + 81, + 97, + 79, + 96, + 132, + 1, + 81, + 8, + 97, + 81, + 32, + 131, + 1, + 82, + 128, + 97, + 54, + 160, + 131, + 1, + 81, + 96, + 1, + 9, + 97, + 81, + 64, + 131, + 1, + 82, + 128, + 97, + 50, + 192, + 131, + 1, + 81, + 97, + 9, + 192, + 132, + 1, + 81, + 9, + 129, + 129, + 131, + 97, + 50, + 224, + 134, + 1, + 81, + 97, + 9, + 224, + 135, + 1, + 81, + 9, + 8, + 97, + 81, + 96, + 132, + 1, + 129, + 144, + 82, + 97, + 56, + 160, + 132, + 1, + 81, + 131, + 146, + 80, + 144, + 9, + 97, + 81, + 128, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 81, + 128, + 132, + 1, + 81, + 131, + 3, + 9, + 97, + 81, + 160, + 131, + 1, + 82, + 128, + 96, + 1, + 97, + 81, + 64, + 132, + 1, + 81, + 9, + 97, + 81, + 192, + 131, + 1, + 82, + 128, + 97, + 59, + 128, + 131, + 1, + 81, + 97, + 81, + 160, + 132, + 1, + 81, + 9, + 97, + 81, + 224, + 131, + 1, + 82, + 128, + 97, + 59, + 128, + 131, + 1, + 81, + 97, + 81, + 192, + 132, + 1, + 81, + 9, + 97, + 82, + 0, + 131, + 1, + 82, + 128, + 97, + 81, + 224, + 131, + 1, + 81, + 97, + 81, + 32, + 132, + 1, + 81, + 8, + 97, + 82, + 32, + 131, + 1, + 82, + 128, + 97, + 49, + 192, + 131, + 1, + 81, + 96, + 1, + 9, + 97, + 82, + 64, + 131, + 1, + 82, + 128, + 97, + 11, + 64, + 131, + 1, + 81, + 96, + 1, + 9, + 97, + 82, + 96, + 131, + 1, + 82, + 96, + 1, + 97, + 82, + 128, + 131, + 1, + 129, + 129, + 82, + 96, + 2, + 97, + 82, + 160, + 133, + 1, + 82, + 97, + 82, + 32, + 132, + 1, + 81, + 97, + 82, + 192, + 133, + 1, + 82, + 132, + 145, + 144, + 96, + 64, + 144, + 96, + 96, + 129, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 82, + 128, + 130, + 1, + 81, + 97, + 82, + 224, + 131, + 1, + 82, + 97, + 82, + 160, + 130, + 1, + 81, + 97, + 83, + 0, + 131, + 1, + 82, + 96, + 96, + 130, + 1, + 81, + 97, + 83, + 32, + 131, + 1, + 82, + 96, + 128, + 130, + 1, + 81, + 97, + 83, + 64, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 82, + 224, + 133, + 1, + 96, + 128, + 97, + 82, + 224, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 96, + 160, + 130, + 1, + 81, + 97, + 83, + 96, + 131, + 1, + 82, + 96, + 192, + 130, + 1, + 81, + 97, + 83, + 128, + 131, + 1, + 82, + 97, + 60, + 224, + 130, + 1, + 81, + 97, + 83, + 160, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 83, + 96, + 133, + 1, + 96, + 96, + 97, + 83, + 96, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 82, + 224, + 130, + 1, + 81, + 97, + 83, + 192, + 131, + 1, + 82, + 97, + 83, + 0, + 130, + 1, + 81, + 97, + 83, + 224, + 131, + 1, + 82, + 97, + 83, + 96, + 130, + 1, + 81, + 97, + 84, + 0, + 131, + 1, + 82, + 97, + 83, + 128, + 130, + 1, + 81, + 97, + 84, + 32, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 83, + 192, + 133, + 1, + 96, + 128, + 97, + 83, + 192, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 96, + 224, + 130, + 1, + 81, + 97, + 84, + 64, + 131, + 1, + 82, + 97, + 1, + 0, + 130, + 1, + 81, + 97, + 84, + 96, + 131, + 1, + 82, + 97, + 75, + 64, + 130, + 1, + 81, + 97, + 84, + 128, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 84, + 64, + 133, + 1, + 96, + 96, + 97, + 84, + 64, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 83, + 192, + 130, + 1, + 81, + 97, + 84, + 160, + 131, + 1, + 82, + 97, + 83, + 224, + 130, + 1, + 81, + 97, + 84, + 192, + 131, + 1, + 82, + 97, + 84, + 64, + 130, + 1, + 81, + 97, + 84, + 224, + 131, + 1, + 82, + 97, + 84, + 96, + 130, + 1, + 81, + 97, + 85, + 0, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 84, + 160, + 133, + 1, + 96, + 128, + 97, + 84, + 160, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 1, + 192, + 130, + 1, + 81, + 97, + 85, + 32, + 131, + 1, + 82, + 97, + 1, + 224, + 130, + 1, + 81, + 97, + 85, + 64, + 131, + 1, + 82, + 97, + 75, + 96, + 130, + 1, + 81, + 97, + 85, + 96, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 85, + 32, + 133, + 1, + 96, + 96, + 97, + 85, + 32, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 84, + 160, + 130, + 1, + 81, + 97, + 85, + 128, + 131, + 1, + 82, + 97, + 84, + 192, + 130, + 1, + 81, + 97, + 85, + 160, + 131, + 1, + 82, + 97, + 85, + 32, + 130, + 1, + 81, + 97, + 85, + 192, + 131, + 1, + 82, + 97, + 85, + 64, + 130, + 1, + 81, + 97, + 85, + 224, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 85, + 128, + 133, + 1, + 96, + 128, + 97, + 85, + 128, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 20, + 17, + 61, + 45, + 168, + 3, + 126, + 199, + 127, + 85, + 223, + 251, + 145, + 21, + 26, + 142, + 123, + 179, + 238, + 234, + 47, + 228, + 79, + 104, + 4, + 112, + 61, + 15, + 130, + 243, + 68, + 160, + 97, + 86, + 0, + 131, + 1, + 82, + 127, + 28, + 91, + 95, + 76, + 40, + 52, + 108, + 253, + 223, + 8, + 237, + 222, + 141, + 180, + 146, + 241, + 154, + 36, + 181, + 247, + 63, + 194, + 189, + 72, + 220, + 25, + 19, + 122, + 17, + 206, + 83, + 191, + 97, + 86, + 32, + 131, + 1, + 82, + 97, + 75, + 128, + 130, + 1, + 81, + 97, + 86, + 64, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 86, + 0, + 133, + 1, + 96, + 96, + 97, + 86, + 0, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 85, + 128, + 130, + 1, + 81, + 97, + 86, + 96, + 131, + 1, + 82, + 97, + 85, + 160, + 130, + 1, + 81, + 97, + 86, + 128, + 131, + 1, + 82, + 97, + 86, + 0, + 130, + 1, + 81, + 97, + 86, + 160, + 131, + 1, + 82, + 97, + 86, + 32, + 130, + 1, + 81, + 97, + 86, + 192, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 86, + 96, + 133, + 1, + 96, + 128, + 97, + 86, + 96, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 4, + 145, + 113, + 78, + 160, + 41, + 83, + 70, + 145, + 149, + 202, + 7, + 104, + 181, + 170, + 251, + 3, + 22, + 107, + 39, + 40, + 77, + 231, + 204, + 159, + 250, + 123, + 56, + 121, + 169, + 89, + 165, + 97, + 86, + 224, + 131, + 1, + 82, + 127, + 45, + 186, + 169, + 165, + 157, + 199, + 253, + 150, + 87, + 121, + 141, + 217, + 192, + 15, + 252, + 133, + 210, + 3, + 62, + 149, + 85, + 182, + 153, + 244, + 217, + 112, + 107, + 194, + 183, + 125, + 206, + 119, + 97, + 87, + 0, + 131, + 1, + 82, + 97, + 75, + 160, + 130, + 1, + 81, + 97, + 87, + 32, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 86, + 224, + 133, + 1, + 96, + 96, + 97, + 86, + 224, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 86, + 96, + 130, + 1, + 81, + 97, + 87, + 64, + 131, + 1, + 82, + 97, + 86, + 128, + 130, + 1, + 81, + 97, + 87, + 96, + 131, + 1, + 82, + 97, + 86, + 224, + 130, + 1, + 81, + 97, + 87, + 128, + 131, + 1, + 82, + 97, + 87, + 0, + 130, + 1, + 81, + 97, + 87, + 160, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 87, + 64, + 133, + 1, + 96, + 128, + 97, + 87, + 64, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 22, + 218, + 143, + 205, + 231, + 133, + 198, + 223, + 31, + 225, + 58, + 236, + 74, + 8, + 142, + 6, + 121, + 7, + 80, + 223, + 169, + 162, + 233, + 198, + 224, + 84, + 100, + 160, + 107, + 153, + 103, + 157, + 97, + 87, + 192, + 131, + 1, + 82, + 127, + 25, + 255, + 250, + 93, + 145, + 84, + 156, + 222, + 199, + 55, + 38, + 46, + 108, + 197, + 250, + 1, + 194, + 241, + 195, + 156, + 123, + 95, + 86, + 125, + 101, + 214, + 142, + 44, + 243, + 7, + 123, + 219, + 97, + 87, + 224, + 131, + 1, + 82, + 97, + 75, + 192, + 130, + 1, + 81, + 97, + 88, + 0, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 87, + 192, + 133, + 1, + 96, + 96, + 97, + 87, + 192, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 87, + 64, + 130, + 1, + 81, + 97, + 88, + 32, + 131, + 1, + 82, + 97, + 87, + 96, + 130, + 1, + 81, + 97, + 88, + 64, + 131, + 1, + 82, + 97, + 87, + 192, + 130, + 1, + 81, + 97, + 88, + 96, + 131, + 1, + 82, + 97, + 87, + 224, + 130, + 1, + 81, + 97, + 88, + 128, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 88, + 32, + 133, + 1, + 96, + 128, + 97, + 88, + 32, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 21, + 66, + 215, + 212, + 113, + 4, + 156, + 52, + 110, + 155, + 151, + 171, + 194, + 163, + 81, + 148, + 141, + 35, + 67, + 128, + 25, + 167, + 109, + 242, + 177, + 152, + 156, + 143, + 118, + 178, + 135, + 96, + 97, + 88, + 160, + 131, + 1, + 82, + 127, + 14, + 38, + 225, + 61, + 177, + 241, + 120, + 248, + 93, + 188, + 184, + 59, + 10, + 97, + 125, + 118, + 108, + 11, + 54, + 252, + 74, + 73, + 186, + 250, + 177, + 59, + 32, + 232, + 61, + 5, + 87, + 243, + 97, + 88, + 192, + 131, + 1, + 82, + 97, + 75, + 224, + 130, + 1, + 81, + 97, + 88, + 224, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 88, + 160, + 133, + 1, + 96, + 96, + 97, + 88, + 160, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 88, + 32, + 130, + 1, + 81, + 97, + 89, + 0, + 131, + 1, + 82, + 97, + 88, + 64, + 130, + 1, + 81, + 97, + 89, + 32, + 131, + 1, + 82, + 97, + 88, + 160, + 130, + 1, + 81, + 97, + 89, + 64, + 131, + 1, + 82, + 97, + 88, + 192, + 130, + 1, + 81, + 97, + 89, + 96, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 89, + 0, + 133, + 1, + 96, + 128, + 97, + 89, + 0, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 43, + 105, + 43, + 145, + 153, + 137, + 31, + 134, + 227, + 252, + 86, + 19, + 153, + 30, + 114, + 180, + 112, + 152, + 34, + 12, + 157, + 136, + 52, + 21, + 36, + 66, + 113, + 204, + 116, + 177, + 33, + 141, + 97, + 89, + 128, + 131, + 1, + 82, + 127, + 4, + 47, + 146, + 154, + 254, + 75, + 197, + 98, + 6, + 180, + 172, + 228, + 26, + 61, + 40, + 56, + 72, + 117, + 61, + 80, + 20, + 89, + 123, + 205, + 14, + 193, + 79, + 138, + 146, + 97, + 197, + 132, + 97, + 89, + 160, + 131, + 1, + 82, + 97, + 76, + 0, + 130, + 1, + 81, + 97, + 89, + 192, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 89, + 128, + 133, + 1, + 96, + 96, + 97, + 89, + 128, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 89, + 0, + 130, + 1, + 81, + 97, + 89, + 224, + 131, + 1, + 82, + 97, + 89, + 32, + 130, + 1, + 81, + 97, + 90, + 0, + 131, + 1, + 82, + 97, + 89, + 128, + 130, + 1, + 81, + 97, + 90, + 32, + 131, + 1, + 82, + 97, + 89, + 160, + 130, + 1, + 81, + 97, + 90, + 64, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 89, + 224, + 133, + 1, + 96, + 128, + 97, + 89, + 224, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 41, + 192, + 159, + 32, + 106, + 47, + 176, + 75, + 21, + 163, + 160, + 194, + 32, + 2, + 76, + 107, + 15, + 250, + 68, + 138, + 25, + 254, + 61, + 78, + 196, + 95, + 250, + 32, + 116, + 143, + 201, + 70, + 97, + 90, + 96, + 131, + 1, + 82, + 127, + 29, + 39, + 198, + 159, + 191, + 169, + 156, + 174, + 207, + 6, + 55, + 109, + 121, + 203, + 222, + 84, + 54, + 114, + 104, + 54, + 173, + 99, + 88, + 41, + 84, + 226, + 97, + 141, + 56, + 153, + 166, + 246, + 97, + 90, + 128, + 131, + 1, + 82, + 97, + 76, + 32, + 130, + 1, + 81, + 97, + 90, + 160, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 90, + 96, + 133, + 1, + 96, + 96, + 97, + 90, + 96, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 89, + 224, + 130, + 1, + 81, + 97, + 90, + 192, + 131, + 1, + 82, + 97, + 90, + 0, + 130, + 1, + 81, + 97, + 90, + 224, + 131, + 1, + 82, + 97, + 90, + 96, + 130, + 1, + 81, + 97, + 91, + 0, + 131, + 1, + 82, + 97, + 90, + 128, + 130, + 1, + 81, + 97, + 91, + 32, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 90, + 192, + 133, + 1, + 96, + 128, + 97, + 90, + 192, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 32, + 163, + 17, + 58, + 72, + 188, + 153, + 209, + 64, + 22, + 102, + 105, + 144, + 217, + 130, + 175, + 63, + 200, + 239, + 98, + 105, + 194, + 243, + 126, + 5, + 59, + 187, + 128, + 30, + 27, + 218, + 55, + 97, + 91, + 64, + 131, + 1, + 82, + 127, + 17, + 135, + 74, + 51, + 72, + 166, + 1, + 19, + 237, + 149, + 178, + 92, + 75, + 219, + 25, + 131, + 105, + 228, + 73, + 150, + 125, + 254, + 127, + 227, + 37, + 60, + 179, + 154, + 253, + 238, + 38, + 114, + 97, + 91, + 96, + 131, + 1, + 82, + 97, + 76, + 64, + 130, + 1, + 81, + 97, + 91, + 128, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 91, + 64, + 133, + 1, + 96, + 96, + 97, + 91, + 64, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 90, + 192, + 130, + 1, + 81, + 97, + 91, + 160, + 131, + 1, + 82, + 97, + 90, + 224, + 130, + 1, + 81, + 97, + 91, + 192, + 131, + 1, + 82, + 97, + 91, + 64, + 130, + 1, + 81, + 97, + 91, + 224, + 131, + 1, + 82, + 97, + 91, + 96, + 130, + 1, + 81, + 97, + 92, + 0, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 91, + 160, + 133, + 1, + 96, + 128, + 97, + 91, + 160, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 34, + 238, + 103, + 125, + 43, + 225, + 86, + 138, + 94, + 216, + 155, + 115, + 200, + 73, + 157, + 65, + 92, + 124, + 72, + 177, + 33, + 132, + 164, + 135, + 129, + 228, + 240, + 141, + 55, + 117, + 87, + 87, + 97, + 92, + 32, + 131, + 1, + 82, + 127, + 22, + 242, + 116, + 75, + 184, + 218, + 230, + 91, + 92, + 90, + 110, + 8, + 54, + 205, + 91, + 89, + 1, + 76, + 37, + 242, + 72, + 27, + 2, + 77, + 236, + 33, + 204, + 191, + 38, + 169, + 128, + 140, + 97, + 92, + 64, + 131, + 1, + 82, + 97, + 76, + 96, + 130, + 1, + 81, + 97, + 92, + 96, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 92, + 32, + 133, + 1, + 96, + 96, + 97, + 92, + 32, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 91, + 160, + 130, + 1, + 81, + 97, + 92, + 128, + 131, + 1, + 82, + 97, + 91, + 192, + 130, + 1, + 81, + 97, + 92, + 160, + 131, + 1, + 82, + 97, + 92, + 32, + 130, + 1, + 81, + 97, + 92, + 192, + 131, + 1, + 82, + 97, + 92, + 64, + 130, + 1, + 81, + 97, + 92, + 224, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 92, + 128, + 133, + 1, + 96, + 128, + 97, + 92, + 128, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 15, + 204, + 243, + 125, + 198, + 134, + 140, + 180, + 80, + 193, + 204, + 151, + 26, + 144, + 5, + 194, + 10, + 207, + 25, + 221, + 177, + 200, + 43, + 156, + 234, + 231, + 87, + 154, + 170, + 246, + 229, + 220, + 97, + 93, + 0, + 131, + 1, + 82, + 127, + 16, + 83, + 165, + 173, + 187, + 132, + 28, + 235, + 12, + 128, + 76, + 142, + 65, + 136, + 178, + 235, + 3, + 13, + 10, + 98, + 58, + 225, + 153, + 85, + 49, + 115, + 216, + 24, + 223, + 70, + 168, + 248, + 97, + 93, + 32, + 131, + 1, + 82, + 97, + 76, + 128, + 130, + 1, + 81, + 97, + 93, + 64, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 93, + 0, + 133, + 1, + 96, + 96, + 97, + 93, + 0, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 92, + 128, + 130, + 1, + 81, + 97, + 93, + 96, + 131, + 1, + 82, + 97, + 92, + 160, + 130, + 1, + 81, + 97, + 93, + 128, + 131, + 1, + 82, + 97, + 93, + 0, + 130, + 1, + 81, + 97, + 93, + 160, + 131, + 1, + 82, + 97, + 93, + 32, + 130, + 1, + 81, + 97, + 93, + 192, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 93, + 96, + 133, + 1, + 96, + 128, + 97, + 93, + 96, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 3, + 195, + 197, + 121, + 35, + 148, + 172, + 214, + 35, + 1, + 116, + 52, + 44, + 15, + 180, + 206, + 186, + 155, + 53, + 195, + 141, + 74, + 176, + 221, + 180, + 160, + 251, + 23, + 125, + 181, + 67, + 8, + 97, + 93, + 224, + 131, + 1, + 82, + 127, + 31, + 215, + 211, + 174, + 87, + 226, + 239, + 76, + 123, + 16, + 35, + 206, + 73, + 85, + 3, + 228, + 12, + 168, + 149, + 50, + 203, + 246, + 167, + 64, + 229, + 125, + 159, + 165, + 125, + 43, + 111, + 147, + 97, + 94, + 0, + 131, + 1, + 82, + 97, + 76, + 160, + 130, + 1, + 81, + 97, + 94, + 32, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 93, + 224, + 133, + 1, + 96, + 96, + 97, + 93, + 224, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 93, + 96, + 130, + 1, + 81, + 97, + 94, + 64, + 131, + 1, + 82, + 97, + 93, + 128, + 130, + 1, + 81, + 97, + 94, + 96, + 131, + 1, + 82, + 97, + 93, + 224, + 130, + 1, + 81, + 97, + 94, + 128, + 131, + 1, + 82, + 97, + 94, + 0, + 130, + 1, + 81, + 97, + 94, + 160, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 94, + 64, + 133, + 1, + 96, + 128, + 97, + 94, + 64, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 21, + 182, + 76, + 242, + 35, + 211, + 117, + 202, + 108, + 152, + 58, + 184, + 65, + 2, + 169, + 96, + 191, + 235, + 84, + 160, + 162, + 154, + 8, + 88, + 68, + 224, + 229, + 113, + 176, + 159, + 61, + 113, + 97, + 94, + 192, + 131, + 1, + 82, + 127, + 35, + 216, + 64, + 132, + 132, + 182, + 177, + 11, + 137, + 127, + 155, + 12, + 195, + 51, + 20, + 217, + 6, + 13, + 172, + 72, + 244, + 58, + 98, + 160, + 229, + 102, + 11, + 229, + 136, + 42, + 122, + 142, + 97, + 94, + 224, + 131, + 1, + 82, + 97, + 76, + 192, + 130, + 1, + 81, + 97, + 95, + 0, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 94, + 192, + 133, + 1, + 96, + 96, + 97, + 94, + 192, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 94, + 64, + 130, + 1, + 81, + 97, + 95, + 32, + 131, + 1, + 82, + 97, + 94, + 96, + 130, + 1, + 81, + 97, + 95, + 64, + 131, + 1, + 82, + 97, + 94, + 192, + 130, + 1, + 81, + 97, + 95, + 96, + 131, + 1, + 82, + 97, + 94, + 224, + 130, + 1, + 81, + 97, + 95, + 128, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 95, + 32, + 133, + 1, + 96, + 128, + 97, + 95, + 32, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 43, + 6, + 157, + 142, + 46, + 87, + 230, + 173, + 214, + 242, + 22, + 129, + 106, + 49, + 147, + 106, + 242, + 117, + 64, + 149, + 155, + 253, + 123, + 132, + 93, + 62, + 116, + 216, + 65, + 150, + 99, + 157, + 97, + 95, + 160, + 131, + 1, + 82, + 127, + 8, + 64, + 184, + 192, + 189, + 187, + 118, + 10, + 146, + 108, + 64, + 70, + 218, + 38, + 20, + 225, + 77, + 60, + 139, + 47, + 175, + 193, + 140, + 116, + 113, + 206, + 33, + 41, + 140, + 165, + 124, + 23, + 97, + 95, + 192, + 131, + 1, + 82, + 97, + 76, + 224, + 130, + 1, + 81, + 97, + 95, + 224, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 95, + 160, + 133, + 1, + 96, + 96, + 97, + 95, + 160, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 95, + 32, + 130, + 1, + 81, + 97, + 96, + 0, + 131, + 1, + 82, + 97, + 95, + 64, + 130, + 1, + 81, + 97, + 96, + 32, + 131, + 1, + 82, + 97, + 95, + 160, + 130, + 1, + 81, + 97, + 96, + 64, + 131, + 1, + 82, + 97, + 95, + 192, + 130, + 1, + 81, + 97, + 96, + 96, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 96, + 0, + 133, + 1, + 96, + 128, + 97, + 96, + 0, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 42, + 110, + 66, + 191, + 104, + 175, + 164, + 82, + 53, + 31, + 170, + 148, + 157, + 194, + 121, + 249, + 254, + 60, + 104, + 177, + 38, + 40, + 10, + 202, + 39, + 129, + 33, + 136, + 143, + 203, + 175, + 115, + 97, + 96, + 128, + 131, + 1, + 82, + 127, + 4, + 221, + 182, + 86, + 251, + 79, + 41, + 6, + 154, + 218, + 101, + 200, + 72, + 178, + 171, + 23, + 123, + 73, + 92, + 8, + 105, + 171, + 166, + 254, + 146, + 22, + 218, + 179, + 160, + 67, + 247, + 89, + 97, + 96, + 160, + 131, + 1, + 82, + 97, + 77, + 0, + 130, + 1, + 81, + 97, + 96, + 192, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 96, + 128, + 133, + 1, + 96, + 96, + 97, + 96, + 128, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 96, + 0, + 130, + 1, + 81, + 97, + 96, + 224, + 131, + 1, + 82, + 97, + 96, + 32, + 130, + 1, + 81, + 97, + 97, + 0, + 131, + 1, + 82, + 97, + 96, + 128, + 130, + 1, + 81, + 97, + 97, + 32, + 131, + 1, + 82, + 97, + 96, + 160, + 130, + 1, + 81, + 97, + 97, + 64, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 96, + 224, + 133, + 1, + 96, + 128, + 97, + 96, + 224, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 1, + 130, + 165, + 9, + 192, + 132, + 135, + 184, + 195, + 213, + 184, + 80, + 114, + 81, + 204, + 138, + 70, + 245, + 179, + 19, + 198, + 135, + 193, + 231, + 38, + 45, + 8, + 235, + 141, + 250, + 76, + 16, + 97, + 97, + 96, + 131, + 1, + 82, + 127, + 4, + 116, + 170, + 37, + 143, + 162, + 212, + 26, + 252, + 101, + 89, + 108, + 58, + 218, + 32, + 184, + 137, + 160, + 242, + 120, + 37, + 144, + 90, + 42, + 23, + 101, + 96, + 178, + 126, + 45, + 44, + 142, + 97, + 97, + 128, + 131, + 1, + 82, + 97, + 77, + 32, + 130, + 1, + 81, + 97, + 97, + 160, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 97, + 96, + 133, + 1, + 96, + 96, + 97, + 97, + 96, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 96, + 224, + 130, + 1, + 81, + 97, + 97, + 192, + 131, + 1, + 82, + 97, + 97, + 0, + 130, + 1, + 81, + 97, + 97, + 224, + 131, + 1, + 82, + 97, + 97, + 96, + 130, + 1, + 81, + 97, + 98, + 0, + 131, + 1, + 82, + 97, + 97, + 128, + 130, + 1, + 81, + 97, + 98, + 32, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 97, + 192, + 133, + 1, + 96, + 128, + 97, + 97, + 192, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 27, + 91, + 47, + 116, + 135, + 104, + 195, + 67, + 190, + 105, + 253, + 118, + 29, + 241, + 73, + 16, + 169, + 38, + 167, + 125, + 160, + 149, + 219, + 41, + 18, + 233, + 106, + 201, + 247, + 58, + 182, + 162, + 97, + 98, + 64, + 131, + 1, + 82, + 127, + 44, + 11, + 181, + 32, + 188, + 96, + 20, + 151, + 198, + 183, + 241, + 191, + 104, + 60, + 131, + 202, + 179, + 160, + 68, + 12, + 65, + 216, + 253, + 251, + 174, + 12, + 119, + 90, + 87, + 231, + 39, + 245, + 97, + 98, + 96, + 131, + 1, + 82, + 97, + 77, + 64, + 130, + 1, + 81, + 97, + 98, + 128, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 98, + 64, + 133, + 1, + 96, + 96, + 97, + 98, + 64, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 97, + 192, + 130, + 1, + 81, + 97, + 98, + 160, + 131, + 1, + 82, + 97, + 97, + 224, + 130, + 1, + 81, + 97, + 98, + 192, + 131, + 1, + 82, + 97, + 98, + 64, + 130, + 1, + 81, + 97, + 98, + 224, + 131, + 1, + 82, + 97, + 98, + 96, + 130, + 1, + 81, + 97, + 99, + 0, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 98, + 160, + 133, + 1, + 96, + 128, + 97, + 98, + 160, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 126, + 19, + 223, + 180, + 66, + 72, + 117, + 92, + 241, + 45, + 203, + 172, + 14, + 197, + 86, + 62, + 87, + 126, + 91, + 128, + 74, + 222, + 4, + 171, + 196, + 233, + 186, + 173, + 172, + 0, + 231, + 255, + 97, + 99, + 32, + 131, + 1, + 82, + 127, + 38, + 77, + 66, + 132, + 86, + 98, + 169, + 17, + 165, + 195, + 122, + 231, + 28, + 206, + 70, + 60, + 28, + 56, + 124, + 18, + 238, + 209, + 166, + 117, + 233, + 87, + 68, + 0, + 32, + 4, + 92, + 177, + 97, + 99, + 64, + 131, + 1, + 82, + 97, + 77, + 96, + 130, + 1, + 81, + 97, + 99, + 96, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 99, + 32, + 133, + 1, + 96, + 96, + 97, + 99, + 32, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 98, + 160, + 130, + 1, + 81, + 97, + 99, + 128, + 131, + 1, + 82, + 97, + 98, + 192, + 130, + 1, + 81, + 97, + 99, + 160, + 131, + 1, + 82, + 97, + 99, + 32, + 130, + 1, + 81, + 97, + 99, + 192, + 131, + 1, + 82, + 97, + 99, + 64, + 130, + 1, + 81, + 97, + 99, + 224, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 99, + 128, + 133, + 1, + 96, + 128, + 97, + 99, + 128, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 127, + 35, + 134, + 213, + 37, + 136, + 70, + 179, + 252, + 30, + 95, + 252, + 167, + 127, + 222, + 67, + 49, + 111, + 209, + 94, + 160, + 142, + 124, + 233, + 64, + 146, + 127, + 114, + 18, + 193, + 179, + 123, + 183, + 97, + 100, + 0, + 131, + 1, + 82, + 127, + 35, + 48, + 110, + 10, + 83, + 186, + 113, + 4, + 119, + 67, + 87, + 140, + 143, + 177, + 53, + 210, + 184, + 67, + 168, + 221, + 237, + 129, + 107, + 90, + 158, + 11, + 6, + 183, + 47, + 7, + 190, + 150, + 97, + 100, + 32, + 131, + 1, + 82, + 97, + 77, + 128, + 130, + 1, + 81, + 97, + 100, + 64, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 100, + 0, + 133, + 1, + 96, + 96, + 97, + 100, + 0, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 99, + 128, + 130, + 1, + 81, + 97, + 100, + 96, + 131, + 1, + 82, + 97, + 99, + 160, + 130, + 1, + 81, + 97, + 100, + 128, + 131, + 1, + 82, + 97, + 100, + 0, + 130, + 1, + 81, + 97, + 100, + 160, + 131, + 1, + 82, + 97, + 100, + 32, + 130, + 1, + 81, + 97, + 100, + 192, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 100, + 96, + 133, + 1, + 96, + 128, + 97, + 100, + 96, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 4, + 32, + 130, + 1, + 81, + 97, + 100, + 224, + 131, + 1, + 82, + 97, + 4, + 64, + 130, + 1, + 81, + 97, + 101, + 0, + 131, + 1, + 82, + 97, + 77, + 160, + 130, + 1, + 81, + 97, + 101, + 32, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 100, + 224, + 133, + 1, + 96, + 96, + 97, + 100, + 224, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 100, + 96, + 130, + 1, + 81, + 97, + 101, + 64, + 131, + 1, + 82, + 97, + 100, + 128, + 130, + 1, + 81, + 97, + 101, + 96, + 131, + 1, + 82, + 97, + 100, + 224, + 130, + 1, + 81, + 97, + 101, + 128, + 131, + 1, + 82, + 97, + 101, + 0, + 130, + 1, + 81, + 97, + 101, + 160, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 101, + 64, + 133, + 1, + 96, + 128, + 97, + 101, + 64, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 4, + 96, + 130, + 1, + 81, + 97, + 101, + 192, + 131, + 1, + 82, + 97, + 4, + 128, + 130, + 1, + 81, + 97, + 101, + 224, + 131, + 1, + 82, + 97, + 77, + 192, + 130, + 1, + 81, + 97, + 102, + 0, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 101, + 192, + 133, + 1, + 96, + 96, + 97, + 101, + 192, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 101, + 64, + 130, + 1, + 81, + 97, + 102, + 32, + 131, + 1, + 82, + 97, + 101, + 96, + 130, + 1, + 81, + 97, + 102, + 64, + 131, + 1, + 82, + 97, + 101, + 192, + 130, + 1, + 81, + 97, + 102, + 96, + 131, + 1, + 82, + 97, + 101, + 224, + 130, + 1, + 81, + 97, + 102, + 128, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 102, + 32, + 133, + 1, + 96, + 128, + 97, + 102, + 32, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 4, + 160, + 130, + 1, + 81, + 97, + 102, + 160, + 131, + 1, + 82, + 97, + 4, + 192, + 130, + 1, + 81, + 97, + 102, + 192, + 131, + 1, + 82, + 97, + 77, + 224, + 130, + 1, + 81, + 97, + 102, + 224, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 102, + 160, + 133, + 1, + 96, + 96, + 97, + 102, + 160, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 102, + 32, + 130, + 1, + 81, + 97, + 103, + 0, + 131, + 1, + 82, + 97, + 102, + 64, + 130, + 1, + 81, + 97, + 103, + 32, + 131, + 1, + 82, + 97, + 102, + 160, + 130, + 1, + 81, + 97, + 103, + 64, + 131, + 1, + 82, + 97, + 102, + 192, + 130, + 1, + 81, + 97, + 103, + 96, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 103, + 0, + 133, + 1, + 96, + 128, + 97, + 103, + 0, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 4, + 224, + 130, + 1, + 81, + 97, + 103, + 128, + 131, + 1, + 82, + 97, + 5, + 0, + 130, + 1, + 81, + 97, + 103, + 160, + 131, + 1, + 82, + 97, + 78, + 0, + 130, + 1, + 81, + 97, + 103, + 192, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 103, + 128, + 133, + 1, + 96, + 96, + 97, + 103, + 128, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 103, + 0, + 130, + 1, + 81, + 97, + 103, + 224, + 131, + 1, + 82, + 97, + 103, + 32, + 130, + 1, + 81, + 97, + 104, + 0, + 131, + 1, + 82, + 97, + 103, + 128, + 130, + 1, + 81, + 97, + 104, + 32, + 131, + 1, + 82, + 97, + 103, + 160, + 130, + 1, + 81, + 97, + 104, + 64, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 103, + 224, + 133, + 1, + 96, + 128, + 97, + 103, + 224, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 5, + 32, + 130, + 1, + 81, + 97, + 104, + 96, + 131, + 1, + 82, + 97, + 5, + 64, + 130, + 1, + 81, + 97, + 104, + 128, + 131, + 1, + 82, + 97, + 78, + 32, + 130, + 1, + 81, + 97, + 104, + 160, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 104, + 96, + 133, + 1, + 96, + 96, + 97, + 104, + 96, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 103, + 224, + 130, + 1, + 81, + 97, + 104, + 192, + 131, + 1, + 82, + 97, + 104, + 0, + 130, + 1, + 81, + 97, + 104, + 224, + 131, + 1, + 82, + 97, + 104, + 96, + 130, + 1, + 81, + 97, + 105, + 0, + 131, + 1, + 82, + 97, + 104, + 128, + 130, + 1, + 81, + 97, + 105, + 32, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 104, + 192, + 133, + 1, + 96, + 128, + 97, + 104, + 192, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 3, + 128, + 130, + 1, + 81, + 97, + 105, + 64, + 131, + 1, + 82, + 97, + 3, + 160, + 130, + 1, + 81, + 97, + 105, + 96, + 131, + 1, + 82, + 97, + 78, + 64, + 130, + 1, + 81, + 97, + 105, + 128, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 105, + 64, + 133, + 1, + 96, + 96, + 97, + 105, + 64, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 104, + 192, + 130, + 1, + 81, + 97, + 105, + 160, + 131, + 1, + 82, + 97, + 104, + 224, + 130, + 1, + 81, + 97, + 105, + 192, + 131, + 1, + 82, + 97, + 105, + 64, + 130, + 1, + 81, + 97, + 105, + 224, + 131, + 1, + 82, + 97, + 105, + 96, + 130, + 1, + 81, + 97, + 106, + 0, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 105, + 160, + 133, + 1, + 96, + 128, + 97, + 105, + 160, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 2, + 192, + 130, + 1, + 81, + 97, + 106, + 32, + 131, + 1, + 82, + 97, + 2, + 224, + 130, + 1, + 81, + 97, + 106, + 64, + 131, + 1, + 82, + 97, + 79, + 64, + 130, + 1, + 81, + 97, + 106, + 96, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 106, + 32, + 133, + 1, + 96, + 96, + 97, + 106, + 32, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 105, + 160, + 130, + 1, + 81, + 97, + 106, + 128, + 131, + 1, + 82, + 97, + 105, + 192, + 130, + 1, + 81, + 97, + 106, + 160, + 131, + 1, + 82, + 97, + 106, + 32, + 130, + 1, + 81, + 97, + 106, + 192, + 131, + 1, + 82, + 97, + 106, + 64, + 130, + 1, + 81, + 97, + 106, + 224, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 106, + 128, + 133, + 1, + 96, + 128, + 97, + 106, + 128, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 3, + 0, + 130, + 1, + 81, + 97, + 107, + 0, + 131, + 1, + 82, + 97, + 3, + 32, + 130, + 1, + 81, + 97, + 107, + 32, + 131, + 1, + 82, + 97, + 80, + 224, + 130, + 1, + 81, + 97, + 107, + 64, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 107, + 0, + 133, + 1, + 96, + 96, + 97, + 107, + 0, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 106, + 128, + 130, + 1, + 81, + 97, + 107, + 96, + 131, + 1, + 82, + 97, + 106, + 160, + 130, + 1, + 81, + 97, + 107, + 128, + 131, + 1, + 82, + 97, + 107, + 0, + 130, + 1, + 81, + 97, + 107, + 160, + 131, + 1, + 82, + 97, + 107, + 32, + 130, + 1, + 81, + 97, + 107, + 192, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 107, + 96, + 133, + 1, + 96, + 128, + 97, + 107, + 96, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 3, + 64, + 130, + 1, + 81, + 97, + 107, + 224, + 131, + 1, + 82, + 97, + 3, + 96, + 130, + 1, + 81, + 97, + 108, + 0, + 131, + 1, + 82, + 97, + 81, + 0, + 130, + 1, + 81, + 97, + 108, + 32, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 107, + 224, + 133, + 1, + 96, + 96, + 97, + 107, + 224, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 107, + 96, + 130, + 1, + 81, + 97, + 108, + 64, + 131, + 1, + 82, + 97, + 107, + 128, + 130, + 1, + 81, + 97, + 108, + 96, + 131, + 1, + 82, + 97, + 107, + 224, + 130, + 1, + 81, + 97, + 108, + 128, + 131, + 1, + 82, + 97, + 108, + 0, + 130, + 1, + 81, + 97, + 108, + 160, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 108, + 64, + 133, + 1, + 96, + 128, + 97, + 108, + 64, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 1, + 128, + 130, + 1, + 81, + 97, + 108, + 192, + 131, + 1, + 82, + 97, + 1, + 160, + 130, + 1, + 81, + 97, + 108, + 224, + 131, + 1, + 82, + 97, + 82, + 0, + 130, + 1, + 81, + 97, + 109, + 0, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 108, + 192, + 133, + 1, + 96, + 96, + 97, + 108, + 192, + 135, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 108, + 64, + 130, + 1, + 81, + 97, + 109, + 32, + 131, + 1, + 82, + 97, + 108, + 96, + 130, + 1, + 81, + 97, + 109, + 64, + 131, + 1, + 82, + 97, + 108, + 192, + 130, + 1, + 81, + 97, + 109, + 96, + 131, + 1, + 82, + 97, + 108, + 224, + 130, + 1, + 81, + 97, + 109, + 128, + 131, + 1, + 82, + 130, + 96, + 1, + 96, + 64, + 97, + 109, + 32, + 133, + 1, + 96, + 128, + 97, + 109, + 32, + 135, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 146, + 80, + 97, + 10, + 224, + 130, + 1, + 81, + 97, + 109, + 160, + 131, + 1, + 82, + 97, + 11, + 0, + 130, + 1, + 81, + 97, + 109, + 192, + 131, + 1, + 82, + 97, + 82, + 64, + 130, + 1, + 81, + 129, + 3, + 97, + 109, + 224, + 131, + 1, + 82, + 80, + 129, + 96, + 1, + 96, + 64, + 97, + 109, + 160, + 132, + 1, + 96, + 96, + 97, + 109, + 160, + 134, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 145, + 80, + 97, + 109, + 32, + 129, + 1, + 81, + 97, + 110, + 0, + 130, + 1, + 82, + 97, + 109, + 64, + 129, + 1, + 81, + 97, + 110, + 32, + 130, + 1, + 82, + 97, + 109, + 160, + 129, + 1, + 81, + 97, + 110, + 64, + 130, + 1, + 82, + 97, + 109, + 192, + 129, + 1, + 81, + 97, + 110, + 96, + 130, + 1, + 82, + 129, + 96, + 1, + 96, + 64, + 97, + 110, + 0, + 132, + 1, + 96, + 128, + 97, + 110, + 0, + 134, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 145, + 80, + 97, + 11, + 128, + 129, + 1, + 81, + 97, + 110, + 128, + 130, + 1, + 82, + 97, + 11, + 160, + 129, + 1, + 81, + 97, + 110, + 160, + 130, + 1, + 82, + 97, + 82, + 96, + 129, + 1, + 81, + 97, + 110, + 192, + 130, + 1, + 82, + 129, + 96, + 1, + 96, + 64, + 97, + 110, + 128, + 132, + 1, + 96, + 96, + 97, + 110, + 128, + 134, + 1, + 96, + 7, + 90, + 250, + 20, + 22, + 145, + 80, + 97, + 110, + 0, + 129, + 1, + 81, + 97, + 110, + 224, + 130, + 1, + 82, + 97, + 110, + 32, + 129, + 1, + 81, + 97, + 111, + 0, + 130, + 1, + 82, + 97, + 110, + 128, + 129, + 1, + 81, + 97, + 111, + 32, + 130, + 1, + 82, + 97, + 110, + 160, + 129, + 1, + 81, + 97, + 111, + 64, + 130, + 1, + 82, + 129, + 96, + 1, + 96, + 64, + 97, + 110, + 224, + 132, + 1, + 96, + 128, + 97, + 110, + 224, + 134, + 1, + 96, + 6, + 90, + 250, + 20, + 22, + 145, + 80, + 97, + 110, + 224, + 129, + 1, + 81, + 97, + 111, + 96, + 130, + 1, + 82, + 97, + 111, + 0, + 129, + 1, + 81, + 97, + 111, + 128, + 130, + 1, + 82, + 127, + 25, + 142, + 147, + 147, + 146, + 13, + 72, + 58, + 114, + 96, + 191, + 183, + 49, + 251, + 93, + 37, + 241, + 170, + 73, + 51, + 53, + 169, + 231, + 18, + 151, + 228, + 133, + 183, + 174, + 243, + 18, + 194, + 97, + 111, + 160, + 130, + 1, + 82, + 127, + 24, + 0, + 222, + 239, + 18, + 31, + 30, + 118, + 66, + 106, + 0, + 102, + 94, + 92, + 68, + 121, + 103, + 67, + 34, + 212, + 247, + 94, + 218, + 221, + 70, + 222, + 189, + 92, + 217, + 146, + 246, + 237, + 97, + 111, + 192, + 130, + 1, + 82, + 127, + 9, + 6, + 137, + 208, + 88, + 95, + 240, + 117, + 236, + 158, + 153, + 173, + 105, + 12, + 51, + 149, + 188, + 75, + 49, + 51, + 112, + 179, + 142, + 243, + 85, + 172, + 218, + 220, + 209, + 34, + 151, + 91, + 97, + 111, + 224, + 130, + 1, + 82, + 127, + 18, + 200, + 94, + 165, + 219, + 140, + 109, + 235, + 74, + 171, + 113, + 128, + 141, + 203, + 64, + 143, + 227, + 209, + 231, + 105, + 12, + 67, + 211, + 123, + 76, + 230, + 204, + 1, + 102, + 250, + 125, + 170, + 97, + 112, + 0, + 130, + 1, + 82, + 97, + 11, + 128, + 129, + 1, + 81, + 97, + 112, + 32, + 130, + 1, + 82, + 97, + 11, + 160, + 129, + 1, + 81, + 97, + 112, + 64, + 130, + 1, + 82, + 127, + 30, + 70, + 242, + 153, + 22, + 175, + 123, + 232, + 18, + 45, + 56, + 206, + 112, + 14, + 159, + 115, + 180, + 152, + 48, + 180, + 170, + 103, + 45, + 88, + 197, + 250, + 131, + 218, + 166, + 244, + 144, + 56, + 97, + 112, + 96, + 130, + 1, + 82, + 127, + 32, + 60, + 202, + 188, + 27, + 69, + 182, + 154, + 109, + 253, + 146, + 254, + 17, + 125, + 251, + 219, + 235, + 72, + 230, + 132, + 220, + 205, + 248, + 203, + 47, + 70, + 111, + 75, + 134, + 7, + 48, + 52, + 97, + 112, + 128, + 130, + 1, + 82, + 127, + 11, + 210, + 45, + 203, + 231, + 26, + 31, + 174, + 234, + 41, + 191, + 103, + 131, + 203, + 198, + 63, + 6, + 120, + 143, + 249, + 234, + 36, + 136, + 162, + 175, + 144, + 54, + 172, + 82, + 212, + 174, + 130, + 97, + 112, + 160, + 130, + 1, + 82, + 127, + 35, + 183, + 178, + 195, + 50, + 252, + 161, + 104, + 86, + 204, + 139, + 209, + 202, + 11, + 86, + 246, + 135, + 46, + 217, + 94, + 244, + 41, + 25, + 23, + 252, + 225, + 36, + 191, + 72, + 193, + 54, + 9, + 97, + 112, + 192, + 130, + 1, + 82, + 129, + 96, + 1, + 96, + 32, + 97, + 111, + 96, + 132, + 1, + 97, + 1, + 128, + 97, + 111, + 96, + 134, + 1, + 96, + 8, + 90, + 250, + 97, + 111, + 96, + 147, + 144, + 147, + 1, + 81, + 96, + 1, + 20, + 146, + 20, + 22, + 22, + 145, + 80, + 80, + 146, + 145, + 80, + 80, + 86, + 91, + 96, + 64, + 81, + 128, + 97, + 112, + 192, + 1, + 96, + 64, + 82, + 128, + 97, + 3, + 134, + 144, + 96, + 32, + 130, + 2, + 128, + 54, + 131, + 55, + 80, + 145, + 146, + 145, + 80, + 80, + 86, + 91, + 99, + 78, + 72, + 123, + 113, + 96, + 224, + 27, + 96, + 0, + 82, + 96, + 65, + 96, + 4, + 82, + 96, + 36, + 96, + 0, + 253, + 91, + 96, + 64, + 81, + 96, + 31, + 130, + 1, + 96, + 31, + 25, + 22, + 129, + 1, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 129, + 17, + 130, + 130, + 16, + 23, + 21, + 97, + 82, + 177, + 87, + 97, + 82, + 177, + 97, + 82, + 114, + 86, + 91, + 96, + 64, + 82, + 145, + 144, + 80, + 86, + 91, + 96, + 0, + 130, + 96, + 31, + 131, + 1, + 18, + 97, + 82, + 202, + 87, + 96, + 0, + 128, + 253, + 91, + 129, + 53, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 129, + 17, + 21, + 97, + 82, + 228, + 87, + 97, + 82, + 228, + 97, + 82, + 114, + 86, + 91, + 97, + 82, + 247, + 96, + 31, + 130, + 1, + 96, + 31, + 25, + 22, + 96, + 32, + 1, + 97, + 82, + 136, + 86, + 91, + 129, + 129, + 82, + 132, + 96, + 32, + 131, + 134, + 1, + 1, + 17, + 21, + 97, + 83, + 12, + 87, + 96, + 0, + 128, + 253, + 91, + 129, + 96, + 32, + 133, + 1, + 96, + 32, + 131, + 1, + 55, + 96, + 0, + 145, + 129, + 1, + 96, + 32, + 1, + 145, + 144, + 145, + 82, + 147, + 146, + 80, + 80, + 80, + 86, + 91, + 96, + 0, + 128, + 96, + 64, + 131, + 133, + 3, + 18, + 21, + 97, + 83, + 60, + 87, + 96, + 0, + 128, + 253, + 91, + 130, + 53, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 128, + 130, + 17, + 21, + 97, + 83, + 84, + 87, + 96, + 0, + 128, + 253, + 91, + 129, + 133, + 1, + 145, + 80, + 133, + 96, + 31, + 131, + 1, + 18, + 97, + 83, + 104, + 87, + 96, + 0, + 128, + 253, + 91, + 129, + 53, + 96, + 32, + 130, + 130, + 17, + 21, + 97, + 83, + 124, + 87, + 97, + 83, + 124, + 97, + 82, + 114, + 86, + 91, + 129, + 96, + 5, + 27, + 97, + 83, + 139, + 130, + 130, + 1, + 97, + 82, + 136, + 86, + 91, + 146, + 131, + 82, + 132, + 129, + 1, + 130, + 1, + 146, + 130, + 129, + 1, + 144, + 138, + 133, + 17, + 21, + 97, + 83, + 165, + 87, + 96, + 0, + 128, + 253, + 91, + 149, + 131, + 1, + 149, + 91, + 132, + 135, + 16, + 21, + 97, + 83, + 195, + 87, + 134, + 53, + 130, + 82, + 149, + 131, + 1, + 149, + 144, + 131, + 1, + 144, + 97, + 83, + 170, + 86, + 91, + 151, + 80, + 80, + 80, + 134, + 1, + 53, + 146, + 80, + 80, + 128, + 130, + 17, + 21, + 97, + 83, + 218, + 87, + 96, + 0, + 128, + 253, + 91, + 80, + 97, + 83, + 231, + 133, + 130, + 134, + 1, + 97, + 82, + 185, + 86, + 91, + 145, + 80, + 80, + 146, + 80, + 146, + 144, + 80, + 86, + 254, + 48, + 100, + 78, + 114, + 225, + 49, + 160, + 41, + 184, + 80, + 69, + 182, + 129, + 129, + 88, + 93, + 151, + 129, + 106, + 145, + 104, + 113, + 202, + 141, + 60, + 32, + 140, + 22, + 216, + 124, + 253, + 71, + 48, + 100, + 78, + 114, + 225, + 49, + 160, + 41, + 184, + 80, + 69, + 182, + 129, + 129, + 88, + 93, + 40, + 51, + 232, + 72, + 121, + 185, + 112, + 145, + 67, + 225, + 245, + 147, + 240, + 0, + 0, + 1, + 162, + 100, + 105, + 112, + 102, + 115, + 88, + 34, + 18, + 32, + 122, + 73, + 104, + 181, + 49, + 112, + 35, + 197, + 180, + 122, + 33, + 8, + 134, + 62, + 72, + 80, + 163, + 77, + 109, + 126, + 214, + 154, + 195, + 11, + 43, + 187, + 11, + 201, + 92, + 30, + 208, + 21, + 100, + 115, + 111, + 108, + 99, + 67, + 0, + 8, + 18, + 0, + 51, + ]; + ///The deployed bytecode of the contract. + pub static INCLUSIONVERIFIER_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = ::ethers::core::types::Bytes::from_static( + __DEPLOYED_BYTECODE, + ); + pub struct InclusionVerifier(::ethers::contract::Contract); + impl ::core::clone::Clone for InclusionVerifier { + fn clone(&self) -> Self { + Self(::core::clone::Clone::clone(&self.0)) + } + } + impl ::core::ops::Deref for InclusionVerifier { + type Target = ::ethers::contract::Contract; + fn deref(&self) -> &Self::Target { + &self.0 + } + } + impl ::core::ops::DerefMut for InclusionVerifier { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } + } + impl ::core::fmt::Debug for InclusionVerifier { + fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { + f.debug_tuple(stringify!(InclusionVerifier)).field(&self.address()).finish() + } + } + impl InclusionVerifier { + /// Creates a new contract instance with the specified `ethers` client at + /// `address`. The contract derefs to a `ethers::Contract` object. + pub fn new>( + address: T, + client: ::std::sync::Arc, + ) -> Self { + Self( + ::ethers::contract::Contract::new( + address.into(), + INCLUSIONVERIFIER_ABI.clone(), + client, + ), + ) + } + /// Constructs the general purpose `Deployer` instance based on the provided constructor arguments and sends it. + /// Returns a new instance of a deployer that returns an instance of this contract after sending the transaction + /// + /// Notes: + /// - If there are no constructor arguments, you should pass `()` as the argument. + /// - The default poll duration is 7 seconds. + /// - The default number of confirmations is 1 block. + /// + /// + /// # Example + /// + /// Generate contract bindings with `abigen!` and deploy a new contract instance. + /// + /// *Note*: this requires a `bytecode` and `abi` object in the `greeter.json` artifact. + /// + /// ```ignore + /// # async fn deploy(client: ::std::sync::Arc) { + /// abigen!(Greeter, "../greeter.json"); + /// + /// let greeter_contract = Greeter::deploy(client, "Hello world!".to_string()).unwrap().send().await.unwrap(); + /// let msg = greeter_contract.greet().call().await.unwrap(); + /// # } + /// ``` + pub fn deploy( + client: ::std::sync::Arc, + constructor_args: T, + ) -> ::core::result::Result< + ::ethers::contract::builders::ContractDeployer, + ::ethers::contract::ContractError, + > { + let factory = ::ethers::contract::ContractFactory::new( + INCLUSIONVERIFIER_ABI.clone(), + INCLUSIONVERIFIER_BYTECODE.clone().into(), + client, + ); + let deployer = factory.deploy(constructor_args)?; + let deployer = ::ethers::contract::ContractDeployer::new(deployer); + Ok(deployer) + } + ///Calls the contract's `verify` (0xbd205a90) function + pub fn verify( + &self, + pub_inputs: ::std::vec::Vec<::ethers::core::types::U256>, + proof: ::ethers::core::types::Bytes, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([189, 32, 90, 144], (pub_inputs, proof)) + .expect("method not found (this should never happen)") + } + } + impl From<::ethers::contract::Contract> + for InclusionVerifier { + fn from(contract: ::ethers::contract::Contract) -> Self { + Self::new(contract.address(), contract.client()) + } + } + ///Container type for all input parameters for the `verify` function with signature `verify(uint256[],bytes)` and selector `0xbd205a90` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + Default, + Debug, + PartialEq, + Eq, + Hash + )] + #[ethcall(name = "verify", abi = "verify(uint256[],bytes)")] + pub struct VerifyCall { + pub pub_inputs: ::std::vec::Vec<::ethers::core::types::U256>, + pub proof: ::ethers::core::types::Bytes, + } + ///Container type for all return fields from the `verify` function with signature `verify(uint256[],bytes)` and selector `0xbd205a90` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + Default, + Debug, + PartialEq, + Eq, + Hash + )] + pub struct VerifyReturn(pub bool); +} diff --git a/backend/src/contracts/generated/mod.rs b/backend/src/contracts/generated/mod.rs index 116b51ed..a944f3aa 100644 --- a/backend/src/contracts/generated/mod.rs +++ b/backend/src/contracts/generated/mod.rs @@ -1,2 +1,3 @@ pub mod summa_contract; -pub mod verifier; \ No newline at end of file +pub mod solvency_verifier; +pub mod inclusion_verifier; \ No newline at end of file diff --git a/backend/src/contracts/generated/verifier.rs b/backend/src/contracts/generated/solvency_verifier.rs similarity index 100% rename from backend/src/contracts/generated/verifier.rs rename to backend/src/contracts/generated/solvency_verifier.rs diff --git a/backend/src/contracts/generated/summa_contract.rs b/backend/src/contracts/generated/summa_contract.rs index 80e3a932..a2611ad0 100644 --- a/backend/src/contracts/generated/summa_contract.rs +++ b/backend/src/contracts/generated/summa_contract.rs @@ -11,23 +11,24 @@ pub use summa::*; )] pub mod summa { #[rustfmt::skip] - const __ABI: &str = "[{\"inputs\":[{\"internalType\":\"contract IVerifier\",\"name\":\"_verifier\",\"type\":\"address\",\"components\":[]}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"struct Summa.AddressOwnershipProof[]\",\"name\":\"addressOwnershipProofs\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"string\",\"name\":\"cexAddress\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\",\"components\":[]}],\"indexed\":false}],\"type\":\"event\",\"name\":\"AddressOwnershipProofSubmitted\",\"outputs\":[],\"anonymous\":false},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\",\"components\":[],\"indexed\":true},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\",\"components\":[],\"indexed\":true}],\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"outputs\":[],\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\",\"components\":[],\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"mstRoot\",\"type\":\"uint256\",\"components\":[],\"indexed\":false},{\"internalType\":\"struct Summa.Asset[]\",\"name\":\"assets\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"string\",\"name\":\"assetName\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\",\"components\":[]}],\"indexed\":false}],\"type\":\"event\",\"name\":\"SolvencyProofSubmitted\",\"outputs\":[],\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"addressOwnershipProofs\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"cexAddress\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\",\"components\":[]}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\",\"components\":[]}]},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"ownershipProofByAddress\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\",\"components\":[]}]},{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"renounceOwnership\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"struct Summa.AddressOwnershipProof[]\",\"name\":\"_addressOwnershipProofs\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"string\",\"name\":\"cexAddress\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\",\"components\":[]}]}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"submitProofOfAddressOwnership\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"mstRoot\",\"type\":\"uint256\",\"components\":[]},{\"internalType\":\"struct Summa.Asset[]\",\"name\":\"assets\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"string\",\"name\":\"assetName\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\",\"components\":[]}]},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\",\"components\":[]}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"submitProofOfSolvency\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\",\"components\":[]}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"transferOwnership\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"uint256[]\",\"name\":\"publicInputs\",\"type\":\"uint256[]\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"verifyZkProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\",\"components\":[]}]}]"; + const __ABI: &str = "[{\"inputs\":[{\"internalType\":\"contract IVerifier\",\"name\":\"_solvencyVerifier\",\"type\":\"address\",\"components\":[]},{\"internalType\":\"contract IVerifier\",\"name\":\"_inclusionVerifier\",\"type\":\"address\",\"components\":[]}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"struct Summa.AddressOwnershipProof[]\",\"name\":\"addressOwnershipProofs\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"string\",\"name\":\"cexAddress\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\",\"components\":[]}],\"indexed\":false}],\"type\":\"event\",\"name\":\"AddressOwnershipProofSubmitted\",\"outputs\":[],\"anonymous\":false},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\",\"components\":[],\"indexed\":true},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\",\"components\":[],\"indexed\":true}],\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"outputs\":[],\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\",\"components\":[],\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"mstRoot\",\"type\":\"uint256\",\"components\":[],\"indexed\":false},{\"internalType\":\"struct Summa.Asset[]\",\"name\":\"assets\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"string\",\"name\":\"assetName\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\",\"components\":[]}],\"indexed\":false}],\"type\":\"event\",\"name\":\"SolvencyProofSubmitted\",\"outputs\":[],\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"addressOwnershipProofs\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"cexAddress\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\",\"components\":[]}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"mstRoots\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\",\"components\":[]}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\",\"components\":[]}]},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"ownershipProofByAddress\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\",\"components\":[]}]},{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"renounceOwnership\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"struct Summa.AddressOwnershipProof[]\",\"name\":\"_addressOwnershipProofs\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"string\",\"name\":\"cexAddress\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\",\"components\":[]}]}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"submitProofOfAddressOwnership\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"mstRoot\",\"type\":\"uint256\",\"components\":[]},{\"internalType\":\"struct Summa.Asset[]\",\"name\":\"assets\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"string\",\"name\":\"assetName\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"string\",\"name\":\"chain\",\"type\":\"string\",\"components\":[]},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\",\"components\":[]}]},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\",\"components\":[]}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"submitProofOfSolvency\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\",\"components\":[]}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"transferOwnership\",\"outputs\":[]},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"uint256[]\",\"name\":\"publicInputs\",\"type\":\"uint256[]\",\"components\":[]},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"verifyInclusionProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\",\"components\":[]}]},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\",\"components\":[]},{\"internalType\":\"uint256[]\",\"name\":\"publicInputs\",\"type\":\"uint256[]\",\"components\":[]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"verifySolvencyProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\",\"components\":[]}]}]"; ///The parsed JSON ABI of the contract. pub static SUMMA_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(|| ::ethers::core::utils::__serde_json::from_str(__ABI).expect("ABI is always valid")); #[rustfmt::skip] const __BYTECODE: &[u8] = &[ 96, - 160, + 192, 96, 64, 82, 52, 128, 21, - 97, + 98, 0, - 16, + 0, + 17, 87, 96, 0, @@ -38,15 +39,17 @@ pub mod summa { 96, 64, 81, - 97, - 20, - 222, + 98, + 0, + 22, + 243, 56, 3, 128, - 97, - 20, - 222, + 98, + 0, + 22, + 243, 131, 57, 129, @@ -56,22 +59,26 @@ pub mod summa { 129, 144, 82, - 97, + 98, 0, - 47, + 0, + 52, 145, - 97, + 98, 0, - 153, + 0, + 196, 86, 91, - 97, + 98, 0, - 56, + 0, + 63, 51, - 97, + 98, 0, - 73, + 0, + 87, 86, 91, 96, @@ -82,13 +89,20 @@ pub mod summa { 160, 27, 3, + 145, + 130, 22, 96, 128, 82, - 97, + 22, + 96, + 160, + 82, + 98, + 0, 0, - 201, + 252, 86, 91, 96, @@ -171,25 +185,7 @@ pub mod summa { 80, 86, 91, - 96, - 0, - 96, - 32, - 130, - 132, - 3, - 18, - 21, - 97, - 0, - 171, - 87, - 96, - 0, 128, - 253, - 91, - 129, 81, 96, 1, @@ -203,44 +199,110 @@ pub mod summa { 22, 129, 20, - 97, + 98, 0, - 194, + 0, + 191, 87, 96, 0, 128, 253, 91, - 147, - 146, + 145, + 144, + 80, + 86, + 91, + 96, + 0, + 128, + 96, + 64, + 131, + 133, + 3, + 18, + 21, + 98, + 0, + 0, + 216, + 87, + 96, + 0, + 128, + 253, + 91, + 98, + 0, + 0, + 227, + 131, + 98, + 0, + 0, + 167, + 86, + 91, + 145, + 80, + 98, + 0, + 0, + 243, + 96, + 32, + 132, + 1, + 98, + 0, + 0, + 167, + 86, + 91, + 144, 80, + 146, 80, + 146, + 144, 80, 86, 91, 96, 128, 81, + 96, + 160, + 81, 97, - 19, - 250, - 97, + 21, + 209, + 98, 0, - 228, + 1, + 34, 96, 0, 57, 96, 0, 97, - 9, - 41, + 10, + 133, 1, 82, + 96, + 0, 97, - 19, - 250, + 4, + 94, + 1, + 82, + 97, + 21, + 209, 96, 0, 243, @@ -269,7 +331,7 @@ pub mod summa { 16, 97, 0, - 136, + 158, 87, 96, 0, @@ -279,14 +341,25 @@ pub mod summa { 28, 128, 99, - 163, - 196, - 188, - 248, + 141, + 165, + 203, + 91, 17, 97, 0, + 102, + 87, + 128, + 99, + 141, + 165, + 203, 91, + 20, + 97, + 1, + 54, 87, 128, 99, @@ -296,8 +369,8 @@ pub mod summa { 248, 20, 97, - 0, - 248, + 1, + 81, 87, 128, 99, @@ -308,18 +381,18 @@ pub mod summa { 20, 97, 1, - 27, + 116, 87, 128, 99, - 230, - 145, - 173, - 51, + 200, + 229, + 129, + 71, 20, 97, 1, - 46, + 135, 87, 128, 99, @@ -330,7 +403,7 @@ pub mod summa { 20, 97, 1, - 81, + 154, 87, 96, 0, @@ -346,7 +419,7 @@ pub mod summa { 20, 97, 0, - 141, + 163, 87, 128, 99, @@ -357,7 +430,18 @@ pub mod summa { 20, 97, 0, - 192, + 214, + 87, + 128, + 99, + 108, + 118, + 132, + 254, + 20, + 97, + 0, + 235, 87, 128, 99, @@ -367,19 +451,19 @@ pub mod summa { 166, 20, 97, - 0, - 213, + 1, + 14, 87, 128, 99, - 141, - 165, - 203, - 91, + 127, + 59, + 251, + 46, 20, 97, - 0, - 221, + 1, + 22, 87, 91, 96, @@ -389,16 +473,16 @@ pub mod summa { 91, 97, 0, - 173, + 195, 97, 0, - 155, + 177, 54, 96, 4, 97, - 10, - 205, + 12, + 40, 86, 91, 96, @@ -440,36 +524,103 @@ pub mod summa { 91, 97, 0, - 211, + 233, 97, 0, - 206, + 228, 54, 96, 4, 97, - 12, 13, + 104, 86, 91, 97, 1, - 100, + 173, 86, 91, 0, 91, 97, 0, - 211, + 254, 97, - 3, - 234, + 0, + 249, + 54, + 96, + 4, + 97, + 15, + 34, + 86, + 91, + 97, + 4, + 68, 86, 91, 96, - 0, - 84, + 64, + 81, + 144, + 21, + 21, + 129, + 82, + 96, + 32, + 1, + 97, + 0, + 205, + 86, + 91, + 97, + 0, + 233, + 97, + 4, + 223, + 86, + 91, + 97, + 0, + 195, + 97, + 1, + 36, + 54, + 96, + 4, + 97, + 12, + 40, + 86, + 91, + 96, + 3, + 96, + 32, + 82, + 96, + 0, + 144, + 129, + 82, + 96, + 64, + 144, + 32, + 84, + 129, + 86, + 91, + 96, + 0, + 84, 96, 64, 81, @@ -491,26 +642,26 @@ pub mod summa { 1, 97, 0, - 183, + 205, 86, 91, 97, 1, - 11, + 100, 97, 1, - 6, + 95, 54, 96, 4, 97, - 10, - 205, + 12, + 40, 86, 91, 97, - 3, - 254, + 4, + 243, 86, 91, 96, @@ -518,96 +669,80 @@ pub mod summa { 81, 97, 0, - 183, + 205, 148, 147, 146, 145, 144, 97, - 13, - 167, + 15, + 204, 86, 91, 97, 0, - 211, + 233, 97, 1, - 41, + 130, 54, 96, 4, 97, - 13, - 255, + 16, + 36, 86, 91, 97, - 6, - 94, + 7, + 83, 86, 91, 97, - 1, - 65, + 0, + 254, 97, 1, - 60, + 149, 54, 96, 4, 97, - 15, - 89, + 17, + 126, 86, 91, 97, 9, - 8, - 86, - 91, - 96, - 64, - 81, - 144, - 21, - 21, - 129, - 82, - 96, - 32, - 1, - 97, - 0, - 183, + 253, 86, 91, 97, 0, - 211, + 233, 97, 1, - 95, + 168, 54, 96, 4, 97, - 16, - 20, + 17, + 235, 86, 91, 97, - 9, - 170, + 11, + 5, 86, 91, 97, 1, - 108, + 181, 97, - 10, - 35, + 11, + 126, 86, 91, 96, @@ -617,8 +752,8 @@ pub mod summa { 0, 3, 97, - 1, - 226, + 2, + 43, 87, 96, 64, @@ -735,13 +870,13 @@ pub mod summa { 96, 1, 97, - 1, - 242, + 2, + 59, 145, 144, 97, - 16, - 90, + 18, + 49, 86, 91, 103, @@ -758,14 +893,14 @@ pub mod summa { 21, 97, 2, - 10, + 83, 87, 97, 2, - 10, + 83, 97, - 10, - 230, + 12, + 65, 86, 91, 96, @@ -791,7 +926,7 @@ pub mod summa { 21, 97, 2, - 51, + 124, 87, 129, 96, @@ -822,14 +957,14 @@ pub mod summa { 16, 97, 2, - 74, + 147, 87, 97, 2, - 74, + 147, 97, - 16, - 109, + 18, + 68, 86, 91, 96, @@ -854,7 +989,7 @@ pub mod summa { 21, 97, 3, - 69, + 142, 87, 132, 129, @@ -864,14 +999,14 @@ pub mod summa { 16, 97, 2, - 116, + 189, 87, 97, 2, - 116, + 189, 97, - 16, - 109, + 18, + 68, 86, 91, 96, @@ -895,7 +1030,7 @@ pub mod summa { 21, 97, 2, - 176, + 249, 87, 80, 132, @@ -906,14 +1041,14 @@ pub mod summa { 16, 97, 2, - 158, + 231, 87, 97, 2, - 158, + 231, 97, - 16, - 109, + 18, + 68, 86, 91, 96, @@ -935,8 +1070,8 @@ pub mod summa { 21, 91, 97, - 2, - 236, + 3, + 53, 87, 96, 64, @@ -990,8 +1125,8 @@ pub mod summa { 100, 1, 97, - 1, - 217, + 2, + 34, 86, 91, 132, @@ -1001,15 +1136,15 @@ pub mod summa { 129, 16, 97, - 2, - 254, + 3, + 71, 87, 97, - 2, - 254, + 3, + 71, 97, - 16, - 109, + 18, + 68, 86, 91, 96, @@ -1030,12 +1165,12 @@ pub mod summa { 1, 97, 3, - 24, + 97, 145, 144, 97, - 16, - 90, + 18, + 49, 86, 91, 129, @@ -1044,14 +1179,14 @@ pub mod summa { 16, 97, 3, - 40, + 113, 87, 97, 3, - 40, + 113, 97, - 16, - 109, + 18, + 68, 86, 91, 96, @@ -1068,11 +1203,11 @@ pub mod summa { 128, 97, 3, - 61, + 134, 129, 97, - 16, - 131, + 18, + 90, 86, 91, 145, @@ -1080,23 +1215,23 @@ pub mod summa { 80, 97, 2, - 89, + 162, 86, 91, 80, 97, 3, - 80, + 153, 131, 130, 97, - 9, - 8, + 4, + 68, 86, 91, 97, 3, - 143, + 216, 87, 96, 64, @@ -1153,11 +1288,31 @@ pub mod summa { 100, 1, 97, - 1, - 217, + 2, + 34, 86, 91, + 96, + 0, + 130, + 129, + 82, + 96, + 3, + 96, + 32, + 82, + 96, + 64, + 129, + 32, + 134, + 144, + 85, 129, + 81, + 131, + 145, 127, 4, 115, @@ -1191,23 +1346,20 @@ pub mod summa { 213, 111, 245, - 130, - 96, - 0, - 129, - 81, - 129, - 16, + 145, + 132, + 145, + 144, 97, - 3, - 196, + 4, + 30, 87, 97, - 3, - 196, + 4, + 30, 97, - 16, - 109, + 18, + 68, 86, 91, 96, @@ -1223,14 +1375,14 @@ pub mod summa { 64, 81, 97, - 3, - 219, + 4, + 53, 146, 145, 144, 97, - 16, - 156, + 18, + 115, 86, 91, 96, @@ -1248,22 +1400,177 @@ pub mod summa { 80, 86, 91, - 97, + 96, + 64, + 81, + 99, + 11, + 210, + 5, + 169, + 96, + 228, + 27, + 129, + 82, + 96, + 0, + 144, + 96, + 1, + 96, + 1, + 96, + 160, + 27, 3, - 242, + 127, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 22, + 144, + 99, + 189, + 32, + 90, + 144, + 144, + 97, + 4, + 149, + 144, + 133, + 144, + 135, + 144, + 96, + 4, + 1, 97, + 19, 10, - 35, 86, 91, - 97, + 96, + 32, + 96, + 64, + 81, + 128, + 131, 3, - 252, + 129, + 134, + 90, + 250, + 21, + 128, + 21, + 97, + 4, + 178, + 87, + 61, + 96, + 0, + 128, + 62, + 61, 96, 0, + 253, + 91, + 80, + 80, + 80, + 80, + 96, + 64, + 81, + 61, + 96, + 31, + 25, + 96, + 31, + 130, + 1, + 22, + 130, + 1, + 128, + 96, + 64, + 82, + 80, + 129, + 1, + 144, 97, - 10, - 125, + 4, + 214, + 145, + 144, + 97, + 19, + 97, + 86, + 91, + 144, + 80, + 91, + 146, + 145, + 80, + 80, + 86, + 91, + 97, + 4, + 231, + 97, + 11, + 126, + 86, + 91, + 97, + 4, + 241, + 96, + 0, + 97, + 11, + 216, 86, 91, 86, @@ -1276,8 +1583,8 @@ pub mod summa { 129, 16, 97, - 4, - 14, + 5, + 3, 87, 96, 0, @@ -1311,12 +1618,12 @@ pub mod summa { 128, 84, 97, - 4, - 49, + 5, + 38, 144, 97, - 17, - 51, + 19, + 131, 86, 91, 128, @@ -1355,27 +1662,27 @@ pub mod summa { 128, 84, 97, - 4, - 93, + 5, + 82, 144, 97, - 17, - 51, + 19, + 131, 86, 91, 128, 21, 97, - 4, - 170, + 5, + 159, 87, 128, 96, 31, 16, 97, - 4, - 127, + 5, + 116, 87, 97, 1, @@ -1393,8 +1700,8 @@ pub mod summa { 1, 145, 97, - 4, - 170, + 5, + 159, 86, 91, 130, @@ -1427,8 +1734,8 @@ pub mod summa { 131, 17, 97, - 4, - 141, + 5, + 130, 87, 130, 144, @@ -1453,12 +1760,12 @@ pub mod summa { 128, 84, 97, - 4, - 191, + 5, + 180, 144, 97, - 17, - 51, + 19, + 131, 86, 91, 128, @@ -1497,27 +1804,27 @@ pub mod summa { 128, 84, 97, - 4, - 235, + 5, + 224, 144, 97, - 17, - 51, + 19, + 131, 86, 91, 128, 21, 97, - 5, - 56, + 6, + 45, 87, 128, 96, 31, 16, 97, - 5, - 13, + 6, + 2, 87, 97, 1, @@ -1535,8 +1842,8 @@ pub mod summa { 1, 145, 97, - 5, - 56, + 6, + 45, 86, 91, 130, @@ -1569,9 +1876,9 @@ pub mod summa { 131, 17, 97, - 5, - 27, - 87, + 6, + 16, + 87, 130, 144, 3, @@ -1595,12 +1902,12 @@ pub mod summa { 128, 84, 97, - 5, - 77, + 6, + 66, 144, 97, - 17, - 51, + 19, + 131, 86, 91, 128, @@ -1639,27 +1946,27 @@ pub mod summa { 128, 84, 97, - 5, - 121, + 6, + 110, 144, 97, - 17, - 51, + 19, + 131, 86, 91, 128, 21, 97, - 5, - 198, + 6, + 187, 87, 128, 96, 31, 16, 97, - 5, - 155, + 6, + 144, 87, 97, 1, @@ -1677,8 +1984,8 @@ pub mod summa { 1, 145, 97, - 5, - 198, + 6, + 187, 86, 91, 130, @@ -1711,8 +2018,8 @@ pub mod summa { 131, 17, 97, - 5, - 169, + 6, + 158, 87, 130, 144, @@ -1737,12 +2044,12 @@ pub mod summa { 128, 84, 97, - 5, - 219, + 6, + 208, 144, 97, - 17, - 51, + 19, + 131, 86, 91, 128, @@ -1782,26 +2089,26 @@ pub mod summa { 84, 97, 6, - 7, + 252, 144, 97, - 17, - 51, + 19, + 131, 86, 91, 128, 21, 97, - 6, - 84, + 7, + 73, 87, 128, 96, 31, 16, 97, - 6, - 41, + 7, + 30, 87, 97, 1, @@ -1819,8 +2126,8 @@ pub mod summa { 1, 145, 97, - 6, - 84, + 7, + 73, 86, 91, 130, @@ -1853,8 +2160,8 @@ pub mod summa { 131, 17, 97, - 6, - 55, + 7, + 44, 87, 130, 144, @@ -1877,11 +2184,11 @@ pub mod summa { 86, 91, 97, - 6, - 102, + 7, + 91, 97, - 10, - 35, + 11, + 126, 86, 91, 96, @@ -1893,8 +2200,8 @@ pub mod summa { 16, 21, 97, - 8, - 205, + 9, + 194, 87, 96, 0, @@ -1905,15 +2212,15 @@ pub mod summa { 129, 16, 97, - 6, - 134, + 7, + 123, 87, 97, - 6, - 134, + 7, + 123, 97, - 16, - 109, + 18, + 68, 86, 91, 96, @@ -1935,13 +2242,13 @@ pub mod summa { 32, 1, 97, - 6, - 162, + 7, + 151, 145, 144, 97, - 17, - 109, + 19, + 189, 86, 91, 96, @@ -1987,8 +2294,8 @@ pub mod summa { 128, 21, 97, - 7, - 24, + 8, + 13, 87, 96, 64, @@ -2058,19 +2365,19 @@ pub mod summa { 100, 1, 97, - 1, - 217, + 2, + 34, 86, 91, 97, - 7, - 35, + 8, + 24, 131, 96, 1, 97, - 16, - 90, + 18, + 49, 86, 91, 96, @@ -2100,15 +2407,15 @@ pub mod summa { 129, 16, 97, - 7, - 73, + 8, + 62, 87, 97, - 7, - 73, + 8, + 62, 97, - 16, - 109, + 18, + 68, 86, 91, 96, @@ -2152,13 +2459,13 @@ pub mod summa { 129, 144, 97, - 7, - 123, + 8, + 112, 144, 130, 97, - 17, - 207, + 20, + 31, 86, 91, 80, @@ -2173,13 +2480,13 @@ pub mod summa { 1, 144, 97, - 7, - 144, + 8, + 133, 144, 130, 97, - 17, - 207, + 20, + 31, 86, 91, 80, @@ -2194,13 +2501,13 @@ pub mod summa { 1, 144, 97, - 7, - 165, + 8, + 154, 144, 130, 97, - 17, - 207, + 20, + 31, 86, 91, 80, @@ -2215,13 +2522,13 @@ pub mod summa { 1, 144, 97, - 7, - 186, + 8, + 175, 144, 130, 97, - 17, - 207, + 20, + 31, 86, 91, 80, @@ -2234,15 +2541,15 @@ pub mod summa { 129, 16, 97, - 7, - 207, + 8, + 196, 87, 97, - 7, - 207, + 8, + 196, 97, - 16, - 109, + 18, + 68, 86, 91, 96, @@ -2265,8 +2572,8 @@ pub mod summa { 128, 21, 97, - 8, - 11, + 9, + 0, 87, 80, 131, @@ -2276,15 +2583,15 @@ pub mod summa { 129, 16, 97, - 7, - 249, + 8, + 238, 87, 97, - 7, - 249, + 8, + 238, 97, - 16, - 109, + 18, + 68, 86, 91, 96, @@ -2308,8 +2615,8 @@ pub mod summa { 128, 21, 97, - 8, - 54, + 9, + 43, 87, 80, 131, @@ -2319,15 +2626,15 @@ pub mod summa { 129, 16, 97, - 8, - 36, + 9, + 25, 87, 97, - 8, - 36, + 9, + 25, 97, - 16, - 109, + 18, + 68, 86, 91, 96, @@ -2351,8 +2658,8 @@ pub mod summa { 128, 21, 97, - 8, - 97, + 9, + 86, 87, 80, 131, @@ -2362,15 +2669,15 @@ pub mod summa { 129, 16, 97, - 8, - 79, + 9, + 68, 87, 97, - 8, - 79, + 9, + 68, 97, - 16, - 109, + 18, + 68, 86, 91, 96, @@ -2392,8 +2699,8 @@ pub mod summa { 21, 91, 97, - 8, - 184, + 9, + 173, 87, 96, 64, @@ -2474,8 +2781,8 @@ pub mod summa { 132, 1, 97, - 1, - 217, + 2, + 34, 86, 91, 80, @@ -2483,20 +2790,20 @@ pub mod summa { 128, 128, 97, - 8, - 197, + 9, + 186, 144, 97, - 16, - 131, + 18, + 90, 86, 91, 145, 80, 80, 97, - 6, - 105, + 7, + 94, 86, 91, 80, @@ -2538,13 +2845,13 @@ pub mod summa { 64, 81, 97, - 8, - 253, + 9, + 242, 145, 144, 97, - 18, - 143, + 20, + 223, 86, 91, 96, @@ -2560,17 +2867,120 @@ pub mod summa { 91, 96, 0, + 130, + 96, + 1, + 129, + 81, + 129, + 16, 97, - 9, + 10, 18, + 87, 97, 10, - 35, + 18, + 97, + 18, + 68, 86, 91, 96, - 64, - 81, + 32, + 2, + 96, + 32, + 1, + 1, + 81, + 96, + 3, + 96, + 0, + 132, + 129, + 82, + 96, + 32, + 1, + 144, + 129, + 82, + 96, + 32, + 1, + 96, + 0, + 32, + 84, + 20, + 97, + 10, + 110, + 87, + 96, + 64, + 81, + 98, + 70, + 27, + 205, + 96, + 229, + 27, + 129, + 82, + 96, + 32, + 96, + 4, + 130, + 1, + 82, + 96, + 16, + 96, + 36, + 130, + 1, + 82, + 111, + 18, + 91, + 157, + 152, + 91, + 26, + 89, + 8, + 19, + 84, + 213, + 8, + 28, + 155, + 219, + 221, + 96, + 130, + 27, + 96, + 68, + 130, + 1, + 82, + 96, + 100, + 1, + 97, + 2, + 34, + 86, + 91, + 96, + 64, + 81, 99, 11, 210, @@ -2631,19 +3041,19 @@ pub mod summa { 144, 144, 97, - 9, - 96, + 10, + 188, 144, - 133, + 134, 144, - 135, + 136, 144, 96, 4, 1, 97, 19, - 75, + 10, 86, 91, 96, @@ -2662,8 +3072,8 @@ pub mod summa { 128, 21, 97, - 9, - 125, + 10, + 217, 87, 61, 96, @@ -2702,30 +3112,29 @@ pub mod summa { 1, 144, 97, - 9, - 161, + 10, + 253, 145, 144, 97, 19, - 162, + 97, 86, 91, - 144, + 148, + 147, + 80, 80, - 91, - 146, - 145, 80, 80, 86, 91, 97, - 9, - 178, + 11, + 13, 97, - 10, - 35, + 11, + 126, 86, 91, 96, @@ -2739,8 +3148,8 @@ pub mod summa { 129, 22, 97, - 10, - 23, + 11, + 114, 87, 96, 64, @@ -2825,17 +3234,17 @@ pub mod summa { 132, 1, 97, - 1, - 217, + 2, + 34, 86, 91, 97, - 10, - 32, + 11, + 123, 129, 97, - 10, - 125, + 11, + 216, 86, 91, 80, @@ -2856,8 +3265,8 @@ pub mod summa { 51, 20, 97, - 3, - 252, + 4, + 241, 87, 96, 64, @@ -2927,8 +3336,8 @@ pub mod summa { 100, 1, 97, - 1, - 217, + 2, + 34, 86, 91, 96, @@ -3021,8 +3430,8 @@ pub mod summa { 18, 21, 97, - 10, - 223, + 12, + 58, 87, 96, 0, @@ -3082,15 +3491,15 @@ pub mod summa { 23, 21, 97, - 11, - 31, + 12, + 122, 87, 97, - 11, - 31, + 12, + 122, 97, - 10, - 230, + 12, + 65, 86, 91, 96, @@ -3123,15 +3532,15 @@ pub mod summa { 23, 21, 97, - 11, - 31, + 12, + 122, 87, 97, - 11, - 31, + 12, + 122, 97, - 10, - 230, + 12, + 65, 86, 91, 96, @@ -3164,15 +3573,15 @@ pub mod summa { 23, 21, 97, - 11, - 113, + 12, + 204, 87, 97, - 11, - 113, + 12, + 204, 97, - 10, - 230, + 12, + 65, 86, 91, 96, @@ -3198,15 +3607,15 @@ pub mod summa { 17, 21, 97, - 11, - 147, + 12, + 238, 87, 97, - 11, - 147, + 12, + 238, 97, - 10, - 230, + 12, + 65, 86, 91, 80, @@ -3228,8 +3637,8 @@ pub mod summa { 1, 18, 97, - 11, - 174, + 13, + 9, 87, 96, 0, @@ -3251,20 +3660,20 @@ pub mod summa { 17, 21, 97, - 11, - 200, + 13, + 35, 87, 97, - 11, - 200, + 13, + 35, 97, - 10, - 230, + 12, + 65, 86, 91, 97, - 11, - 219, + 13, + 54, 96, 31, 130, @@ -3277,8 +3686,8 @@ pub mod summa { 32, 1, 97, - 11, - 72, + 12, + 163, 86, 91, 129, @@ -3294,8 +3703,8 @@ pub mod summa { 17, 21, 97, - 11, - 240, + 13, + 75, 87, 96, 0, @@ -3345,8 +3754,8 @@ pub mod summa { 18, 21, 97, - 12, - 35, + 13, + 126, 87, 96, 0, @@ -3376,8 +3785,8 @@ pub mod summa { 17, 21, 97, - 12, - 66, + 13, + 157, 87, 96, 0, @@ -3396,8 +3805,8 @@ pub mod summa { 1, 18, 97, - 12, - 86, + 13, + 177, 87, 96, 0, @@ -3405,21 +3814,21 @@ pub mod summa { 253, 91, 97, - 12, - 104, + 13, + 195, 97, - 12, - 99, + 13, + 190, 131, 53, 97, - 11, - 121, + 12, + 212, 86, 91, 97, - 11, - 72, + 12, + 163, 86, 91, 130, @@ -3445,8 +3854,8 @@ pub mod summa { 17, 21, 97, - 12, - 135, + 13, + 226, 87, 96, 0, @@ -3463,8 +3872,8 @@ pub mod summa { 16, 21, 97, - 13, - 41, + 14, + 132, 87, 132, 129, @@ -3472,8 +3881,8 @@ pub mod summa { 17, 21, 97, - 12, - 162, + 13, + 253, 87, 96, 0, @@ -3496,8 +3905,8 @@ pub mod summa { 18, 21, 97, - 12, - 186, + 14, + 21, 87, 96, 0, @@ -3505,11 +3914,11 @@ pub mod summa { 253, 91, 97, - 12, - 194, + 14, + 29, 97, - 10, - 252, + 12, + 87, 86, 91, 96, @@ -3522,8 +3931,8 @@ pub mod summa { 17, 21, 97, - 12, - 212, + 14, + 47, 87, 96, 0, @@ -3531,8 +3940,8 @@ pub mod summa { 253, 91, 97, - 12, - 227, + 14, + 62, 143, 96, 32, @@ -3541,8 +3950,8 @@ pub mod summa { 1, 1, 97, - 11, - 157, + 12, + 248, 86, 91, 130, @@ -3558,8 +3967,8 @@ pub mod summa { 17, 21, 97, - 12, - 248, + 14, + 83, 87, 96, 0, @@ -3567,8 +3976,8 @@ pub mod summa { 253, 91, 97, - 13, - 7, + 14, + 98, 143, 96, 32, @@ -3577,8 +3986,8 @@ pub mod summa { 1, 1, 97, - 11, - 157, + 12, + 248, 86, 91, 96, @@ -3611,8 +4020,8 @@ pub mod summa { 147, 1, 97, - 12, - 140, + 13, + 231, 86, 91, 80, @@ -3633,8 +4042,8 @@ pub mod summa { 17, 21, 97, - 13, - 67, + 14, + 158, 87, 96, 0, @@ -3643,15 +4052,15 @@ pub mod summa { 91, 80, 97, - 13, - 80, + 14, + 171, 135, 130, 136, 1, 97, - 11, - 157, + 12, + 248, 86, 91, 148, @@ -3673,154 +4082,98 @@ pub mod summa { 91, 96, 0, - 129, - 81, - 128, - 132, - 82, - 96, - 0, - 91, - 129, - 129, - 16, - 21, - 97, - 13, - 135, - 87, - 96, - 32, - 129, - 133, - 1, - 129, - 1, - 81, - 134, - 131, - 1, - 130, - 1, - 82, - 1, - 97, - 13, - 107, - 86, - 91, - 80, - 96, - 0, - 96, - 32, 130, - 134, - 1, - 1, - 82, - 96, - 32, - 96, - 31, - 25, 96, 31, 131, 1, - 22, - 133, - 1, - 1, - 145, - 80, - 80, - 146, - 145, - 80, - 80, - 86, - 91, - 96, - 128, - 129, - 82, - 96, - 0, + 18, 97, - 13, - 186, + 14, + 205, + 87, 96, + 0, 128, - 131, - 1, - 135, - 97, - 13, - 97, - 86, + 253, 91, - 130, 129, - 3, + 53, 96, 32, - 132, - 1, - 82, 97, - 13, - 204, - 129, - 135, + 14, + 221, 97, 13, + 190, + 131, 97, + 12, + 212, 86, 91, - 144, - 80, 130, 129, - 3, + 82, 96, - 64, + 5, + 146, + 144, + 146, + 27, 132, 1, - 82, - 97, - 13, - 224, 129, + 1, + 145, + 129, + 129, + 1, + 144, 134, + 132, + 17, + 21, 97, - 13, - 97, - 86, + 14, + 252, + 87, + 96, + 0, + 128, + 253, 91, - 144, - 80, 130, - 129, - 3, - 96, - 96, - 132, + 134, 1, - 82, - 97, - 13, - 244, + 91, + 132, 129, - 133, + 16, + 21, 97, - 13, + 15, + 23, + 87, + 128, + 53, + 131, + 82, + 145, + 131, + 1, + 145, + 131, + 1, 97, + 15, + 0, 86, 91, - 151, - 150, 80, + 150, + 149, 80, 80, 80, @@ -3831,17 +4184,17 @@ pub mod summa { 91, 96, 0, - 96, - 32, 128, + 96, + 64, 131, 133, 3, 18, 21, 97, - 14, - 18, + 15, + 53, 87, 96, 0, @@ -3864,46 +4217,304 @@ pub mod summa { 17, 21, 97, - 14, - 42, + 15, + 77, 87, 96, 0, 128, 253, 91, - 129, + 97, + 15, + 89, + 134, + 131, + 135, + 1, + 97, + 12, + 248, + 86, + 91, + 147, + 80, + 96, + 32, 133, 1, + 53, 145, 80, + 128, + 130, + 17, + 21, + 97, + 15, + 111, + 87, + 96, + 0, + 128, + 253, + 91, + 80, + 97, + 15, + 124, 133, + 130, + 134, + 1, + 97, + 14, + 188, + 86, + 91, + 145, + 80, + 80, + 146, + 80, + 146, + 144, + 80, + 86, + 91, + 96, + 0, + 129, + 81, + 128, + 132, + 82, + 96, + 0, + 91, + 129, + 129, + 16, + 21, + 97, + 15, + 172, + 87, + 96, + 32, + 129, + 133, + 1, + 129, + 1, + 81, + 134, + 131, + 1, + 130, + 1, + 82, + 1, + 97, + 15, + 144, + 86, + 91, + 80, + 96, + 0, + 96, + 32, + 130, + 134, + 1, + 1, + 82, + 96, + 32, + 96, + 31, + 25, 96, 31, 131, 1, + 22, + 133, + 1, + 1, + 145, + 80, + 80, + 146, + 145, + 80, + 80, + 86, + 91, + 96, + 128, + 129, + 82, + 96, + 0, + 97, + 15, + 223, + 96, + 128, + 131, + 1, + 135, + 97, + 15, + 134, + 86, + 91, + 130, + 129, + 3, + 96, + 32, + 132, + 1, + 82, + 97, + 15, + 241, + 129, + 135, + 97, + 15, + 134, + 86, + 91, + 144, + 80, + 130, + 129, + 3, + 96, + 64, + 132, + 1, + 82, + 97, + 16, + 5, + 129, + 134, + 97, + 15, + 134, + 86, + 91, + 144, + 80, + 130, + 129, + 3, + 96, + 96, + 132, + 1, + 82, + 97, + 16, + 25, + 129, + 133, + 97, + 15, + 134, + 86, + 91, + 151, + 150, + 80, + 80, + 80, + 80, + 80, + 80, + 80, + 86, + 91, + 96, + 0, + 96, + 32, + 128, + 131, + 133, + 3, 18, + 21, 97, - 14, - 62, + 16, + 55, 87, 96, 0, 128, 253, 91, - 129, + 130, 53, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 128, + 130, + 17, + 21, 97, - 14, - 76, + 16, + 79, + 87, + 96, + 0, + 128, + 253, + 91, + 129, + 133, + 1, + 145, + 80, + 133, + 96, + 31, + 131, + 1, + 18, 97, - 12, + 16, 99, + 87, + 96, + 0, + 128, + 253, + 91, + 129, + 53, + 97, + 16, + 113, + 97, + 13, + 190, 130, 97, - 11, - 121, + 12, + 212, 86, 91, 129, @@ -3929,8 +4540,8 @@ pub mod summa { 17, 21, 97, - 14, - 107, + 16, + 144, 87, 96, 0, @@ -3946,8 +4557,8 @@ pub mod summa { 16, 21, 97, - 15, - 76, + 17, + 113, 87, 128, 53, @@ -3956,8 +4567,8 @@ pub mod summa { 17, 21, 97, - 14, - 134, + 16, + 171, 87, 96, 0, @@ -3978,8 +4589,8 @@ pub mod summa { 18, 21, 97, - 14, - 157, + 16, + 194, 87, 96, 0, @@ -3988,11 +4599,11 @@ pub mod summa { 253, 91, 97, - 14, - 165, + 16, + 202, 97, - 11, - 37, + 12, + 128, 86, 91, 136, @@ -4004,8 +4615,8 @@ pub mod summa { 17, 21, 97, - 14, - 183, + 16, + 220, 87, 96, 0, @@ -4014,8 +4625,8 @@ pub mod summa { 253, 91, 97, - 14, - 197, + 16, + 234, 141, 139, 131, @@ -4023,8 +4634,8 @@ pub mod summa { 1, 1, 97, - 11, - 157, + 12, + 248, 86, 91, 130, @@ -4041,8 +4652,8 @@ pub mod summa { 17, 21, 97, - 14, - 220, + 17, + 1, 87, 96, 0, @@ -4051,8 +4662,8 @@ pub mod summa { 253, 91, 97, - 14, - 234, + 17, + 15, 142, 140, 131, @@ -4060,8 +4671,8 @@ pub mod summa { 1, 1, 97, - 11, - 157, + 12, + 248, 86, 91, 139, @@ -4080,8 +4691,8 @@ pub mod summa { 17, 21, 97, - 15, - 3, + 17, + 40, 87, 96, 0, @@ -4090,8 +4701,8 @@ pub mod summa { 253, 91, 97, - 15, 17, + 54, 143, 141, 131, @@ -4099,8 +4710,8 @@ pub mod summa { 1, 1, 97, - 11, - 157, + 12, + 248, 86, 91, 131, @@ -4120,8 +4731,8 @@ pub mod summa { 17, 21, 97, - 15, - 43, + 17, + 80, 87, 96, 0, @@ -4130,8 +4741,8 @@ pub mod summa { 253, 91, 97, - 15, - 57, + 17, + 94, 142, 140, 132, @@ -4139,8 +4750,8 @@ pub mod summa { 1, 1, 97, - 11, - 157, + 12, + 248, 86, 91, 144, @@ -4158,8 +4769,8 @@ pub mod summa { 134, 1, 97, - 14, - 111, + 16, + 148, 86, 91, 80, @@ -4179,22 +4790,24 @@ pub mod summa { 0, 128, 96, - 64, - 131, - 133, + 0, + 96, + 96, + 132, + 134, 3, 18, 21, 97, - 15, - 108, + 17, + 147, 87, 96, 0, 128, 253, 91, - 130, + 131, 53, 103, 255, @@ -4210,156 +4823,76 @@ pub mod summa { 17, 21, 97, - 15, - 132, - 87, - 96, - 0, - 128, - 253, - 91, - 97, - 15, - 144, - 134, - 131, - 135, - 1, - 97, - 11, - 157, - 86, - 91, - 147, - 80, - 96, - 32, - 145, - 80, - 129, - 133, - 1, - 53, - 129, - 129, 17, - 21, - 97, - 15, - 167, - 87, - 96, - 0, - 128, - 253, - 91, - 133, - 1, - 144, - 80, - 96, - 31, - 129, - 1, - 134, - 19, - 97, - 15, - 186, + 171, 87, 96, 0, 128, 253, 91, - 128, - 53, 97, - 15, - 200, + 17, + 183, + 135, + 131, + 136, + 1, 97, 12, - 99, - 130, - 97, - 11, - 121, + 248, 86, 91, - 129, - 129, - 82, + 148, + 80, 96, - 5, - 145, - 144, + 32, + 134, + 1, + 53, 145, - 27, + 80, + 128, 130, - 1, - 131, - 1, - 144, - 131, - 129, - 1, - 144, - 136, - 131, 17, 21, 97, - 15, - 231, + 17, + 205, 87, 96, 0, 128, 253, 91, - 146, - 132, - 1, - 146, - 91, - 130, - 132, - 16, - 21, + 80, 97, - 16, - 5, - 87, - 131, - 53, + 17, + 218, + 134, 130, - 82, - 146, - 132, - 1, - 146, - 144, - 132, + 135, 1, - 144, 97, - 15, - 236, + 14, + 188, 86, 91, - 128, - 149, - 80, - 80, - 80, + 146, 80, 80, + 96, + 64, + 132, + 1, + 53, + 144, 80, 146, 80, 146, - 144, 80, + 146, 86, 91, 96, @@ -4372,8 +4905,8 @@ pub mod summa { 18, 21, 97, - 16, - 38, + 17, + 253, 87, 96, 0, @@ -4395,8 +4928,8 @@ pub mod summa { 129, 20, 97, - 16, - 61, + 18, + 20, 87, 96, 0, @@ -4440,15 +4973,15 @@ pub mod summa { 17, 21, 97, - 9, - 164, + 4, + 217, 87, 97, - 9, - 164, + 4, + 217, 97, - 16, - 68, + 18, + 27, 86, 91, 99, @@ -4480,15 +5013,15 @@ pub mod summa { 130, 1, 97, - 16, - 149, + 18, + 108, 87, 97, - 16, - 149, + 18, + 108, 97, - 16, - 68, + 18, + 27, 86, 91, 80, @@ -4549,8 +5082,8 @@ pub mod summa { 16, 21, 97, - 17, - 35, + 18, + 250, 87, 137, 131, @@ -4569,15 +5102,15 @@ pub mod summa { 133, 82, 97, - 16, - 238, + 18, + 197, 137, 134, 1, 130, 97, - 13, - 97, + 15, + 134, 86, 91, 144, @@ -4594,13 +5127,13 @@ pub mod summa { 1, 82, 97, - 17, - 5, + 18, + 220, 130, 130, 97, - 13, - 97, + 15, + 134, 86, 91, 146, @@ -4629,8 +5162,8 @@ pub mod summa { 1, 1, 97, - 16, - 202, + 18, + 161, 86, 91, 80, @@ -4650,6 +5183,127 @@ pub mod summa { 86, 91, 96, + 64, + 128, + 130, + 82, + 131, + 81, + 144, + 130, + 1, + 129, + 144, + 82, + 96, + 0, + 144, + 96, + 32, + 144, + 96, + 96, + 132, + 1, + 144, + 130, + 135, + 1, + 132, + 91, + 130, + 129, + 16, + 21, + 97, + 19, + 67, + 87, + 129, + 81, + 132, + 82, + 146, + 132, + 1, + 146, + 144, + 132, + 1, + 144, + 96, + 1, + 1, + 97, + 19, + 39, + 86, + 91, + 80, + 80, + 80, + 131, + 129, + 3, + 130, + 133, + 1, + 82, + 97, + 19, + 87, + 129, + 134, + 97, + 15, + 134, + 86, + 91, + 150, + 149, + 80, + 80, + 80, + 80, + 80, + 80, + 86, + 91, + 96, + 0, + 96, + 32, + 130, + 132, + 3, + 18, + 21, + 97, + 19, + 115, + 87, + 96, + 0, + 128, + 253, + 91, + 129, + 81, + 128, + 21, + 21, + 129, + 20, + 97, + 18, + 20, + 87, + 96, + 0, + 128, + 253, + 91, + 96, 1, 129, 129, @@ -4659,8 +5313,8 @@ pub mod summa { 22, 128, 97, - 17, - 71, + 19, + 151, 87, 96, 127, @@ -4676,8 +5330,8 @@ pub mod summa { 129, 3, 97, - 17, - 103, + 19, + 183, 87, 99, 78, @@ -4714,16 +5368,16 @@ pub mod summa { 96, 0, 97, - 9, - 161, + 4, + 214, 96, 32, 131, 1, 132, 97, - 13, - 97, + 15, + 134, 86, 91, 96, @@ -4732,8 +5386,8 @@ pub mod summa { 17, 21, 97, - 17, - 202, + 20, + 26, 87, 96, 0, @@ -4759,8 +5413,8 @@ pub mod summa { 16, 21, 97, - 17, - 167, + 19, + 247, 87, 80, 128, @@ -4782,8 +5436,8 @@ pub mod summa { 16, 21, 97, - 17, - 198, + 20, + 22, 87, 130, 129, @@ -4792,8 +5446,8 @@ pub mod summa { 1, 1, 97, - 17, - 179, + 20, + 3, 86, 91, 80, @@ -4820,35 +5474,35 @@ pub mod summa { 17, 21, 97, - 17, - 233, + 20, + 57, 87, 97, - 17, - 233, + 20, + 57, 97, - 10, - 230, + 12, + 65, 86, 91, 97, - 17, - 253, + 20, + 77, 129, 97, - 17, - 247, + 20, + 71, 132, 84, 97, - 17, - 51, + 19, + 131, 86, 91, 132, 97, - 17, - 128, + 19, + 208, 86, 91, 96, @@ -4863,16 +5517,16 @@ pub mod summa { 129, 20, 97, - 18, - 50, + 20, + 130, 87, 96, 0, 132, 21, 97, - 18, - 26, + 20, + 106, 87, 80, 133, @@ -4900,8 +5554,8 @@ pub mod summa { 133, 85, 97, - 17, - 198, + 20, + 22, 86, 91, 96, @@ -4925,8 +5579,8 @@ pub mod summa { 16, 21, 97, - 18, - 97, + 20, + 177, 87, 136, 134, @@ -4947,8 +5601,8 @@ pub mod summa { 132, 1, 97, - 18, - 66, + 20, + 146, 86, 91, 80, @@ -4957,8 +5611,8 @@ pub mod summa { 16, 21, 97, - 18, - 127, + 20, + 207, 87, 135, 133, @@ -5041,8 +5695,8 @@ pub mod summa { 16, 21, 97, - 19, - 61, + 21, + 141, 87, 96, 63, @@ -5063,15 +5717,15 @@ pub mod summa { 134, 82, 97, - 18, - 220, + 21, + 44, 130, 135, 1, 130, 97, - 13, - 97, + 15, + 134, 86, 91, 145, @@ -5089,13 +5743,13 @@ pub mod summa { 1, 82, 97, - 18, - 244, + 21, + 68, 130, 130, 97, - 13, - 97, + 15, + 134, 86, 91, 145, @@ -5113,13 +5767,13 @@ pub mod summa { 1, 82, 97, - 19, - 12, + 21, + 92, 130, 130, 97, - 13, - 97, + 15, + 134, 86, 91, 145, @@ -5142,13 +5796,13 @@ pub mod summa { 82, 80, 97, - 19, - 41, + 21, + 121, 129, 131, 97, - 13, - 97, + 15, + 134, 86, 91, 150, @@ -5167,144 +5821,23 @@ pub mod summa { 1, 1, 97, - 18, - 182, - 86, - 91, - 80, - 144, - 152, - 151, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 96, - 64, - 128, - 130, - 82, - 131, - 81, - 144, - 130, - 1, - 129, - 144, - 82, - 96, - 0, - 144, - 96, - 32, - 144, - 96, - 96, - 132, - 1, - 144, - 130, - 135, - 1, - 132, - 91, - 130, - 129, - 16, 21, - 97, - 19, - 132, - 87, - 129, - 81, - 132, - 82, - 146, - 132, - 1, - 146, - 144, - 132, - 1, - 144, - 96, - 1, - 1, - 97, - 19, - 104, + 6, 86, 91, 80, - 80, - 80, - 131, - 129, - 3, - 130, - 133, - 1, - 82, - 97, - 19, + 144, 152, - 129, - 134, - 97, - 13, - 97, - 86, - 91, - 150, - 149, - 80, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 96, - 0, - 96, - 32, - 130, - 132, - 3, - 18, - 21, - 97, - 19, - 180, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 81, - 128, - 21, - 21, - 129, - 20, - 97, - 16, - 61, - 87, - 96, - 0, - 128, - 253, + 151, + 80, + 80, + 80, + 80, + 80, + 80, + 80, + 80, + 86, 254, 162, 100, @@ -5316,38 +5849,38 @@ pub mod summa { 34, 18, 32, - 204, - 157, - 250, - 143, - 60, - 243, - 174, - 85, - 107, + 88, + 146, + 131, + 59, 174, - 161, - 154, - 177, + 223, + 242, + 144, 138, - 220, - 133, - 28, - 98, - 126, - 194, - 28, - 191, - 145, - 222, - 72, - 165, - 158, - 240, - 181, - 17, - 3, - 208, + 100, + 45, + 198, + 10, + 206, + 116, + 29, + 127, + 77, + 96, + 226, + 162, + 73, + 88, + 233, + 239, + 29, + 141, + 182, + 122, + 141, + 243, + 178, 100, 115, 111, @@ -5390,7 +5923,7 @@ pub mod summa { 16, 97, 0, - 136, + 158, 87, 96, 0, @@ -5400,14 +5933,25 @@ pub mod summa { 28, 128, 99, - 163, - 196, - 188, - 248, + 141, + 165, + 203, + 91, 17, 97, 0, + 102, + 87, + 128, + 99, + 141, + 165, + 203, 91, + 20, + 97, + 1, + 54, 87, 128, 99, @@ -5417,8 +5961,8 @@ pub mod summa { 248, 20, 97, - 0, - 248, + 1, + 81, 87, 128, 99, @@ -5429,18 +5973,18 @@ pub mod summa { 20, 97, 1, - 27, + 116, 87, 128, 99, - 230, - 145, - 173, - 51, + 200, + 229, + 129, + 71, 20, 97, 1, - 46, + 135, 87, 128, 99, @@ -5451,7 +5995,7 @@ pub mod summa { 20, 97, 1, - 81, + 154, 87, 96, 0, @@ -5467,7 +6011,7 @@ pub mod summa { 20, 97, 0, - 141, + 163, 87, 128, 99, @@ -5478,7 +6022,18 @@ pub mod summa { 20, 97, 0, - 192, + 214, + 87, + 128, + 99, + 108, + 118, + 132, + 254, + 20, + 97, + 0, + 235, 87, 128, 99, @@ -5488,19 +6043,19 @@ pub mod summa { 166, 20, 97, - 0, - 213, + 1, + 14, 87, 128, 99, - 141, - 165, - 203, - 91, + 127, + 59, + 251, + 46, 20, 97, - 0, - 221, + 1, + 22, 87, 91, 96, @@ -5510,16 +6065,16 @@ pub mod summa { 91, 97, 0, - 173, + 195, 97, 0, - 155, + 177, 54, 96, 4, 97, - 10, - 205, + 12, + 40, 86, 91, 96, @@ -5561,31 +6116,98 @@ pub mod summa { 91, 97, 0, - 211, + 233, 97, 0, - 206, + 228, 54, 96, 4, 97, - 12, 13, + 104, 86, 91, 97, 1, - 100, + 173, 86, 91, 0, 91, 97, 0, - 211, + 254, + 97, + 0, + 249, + 54, + 96, + 4, + 97, + 15, + 34, + 86, + 91, + 97, + 4, + 68, + 86, + 91, + 96, + 64, + 81, + 144, + 21, + 21, + 129, + 82, + 96, + 32, + 1, + 97, + 0, + 205, + 86, + 91, + 97, + 0, + 233, + 97, + 4, + 223, + 86, + 91, + 97, + 0, + 195, + 97, + 1, + 36, + 54, + 96, + 4, 97, + 12, + 40, + 86, + 91, + 96, 3, - 234, + 96, + 32, + 82, + 96, + 0, + 144, + 129, + 82, + 96, + 64, + 144, + 32, + 84, + 129, 86, 91, 96, @@ -5612,26 +6234,26 @@ pub mod summa { 1, 97, 0, - 183, + 205, 86, 91, 97, 1, - 11, + 100, 97, 1, - 6, + 95, 54, 96, 4, 97, - 10, - 205, + 12, + 40, 86, 91, 97, - 3, - 254, + 4, + 243, 86, 91, 96, @@ -5639,96 +6261,80 @@ pub mod summa { 81, 97, 0, - 183, + 205, 148, 147, 146, 145, 144, 97, - 13, - 167, + 15, + 204, 86, 91, 97, 0, - 211, + 233, 97, 1, - 41, + 130, 54, 96, 4, 97, - 13, - 255, + 16, + 36, 86, 91, 97, - 6, - 94, + 7, + 83, 86, 91, 97, - 1, - 65, + 0, + 254, 97, 1, - 60, + 149, 54, 96, 4, 97, - 15, - 89, + 17, + 126, 86, 91, 97, 9, - 8, - 86, - 91, - 96, - 64, - 81, - 144, - 21, - 21, - 129, - 82, - 96, - 32, - 1, - 97, - 0, - 183, + 253, 86, 91, 97, 0, - 211, + 233, 97, 1, - 95, + 168, 54, 96, 4, 97, - 16, - 20, + 17, + 235, 86, 91, 97, - 9, - 170, + 11, + 5, 86, 91, 97, 1, - 108, + 181, 97, - 10, - 35, + 11, + 126, 86, 91, 96, @@ -5738,8 +6344,8 @@ pub mod summa { 0, 3, 97, - 1, - 226, + 2, + 43, 87, 96, 64, @@ -5856,13 +6462,13 @@ pub mod summa { 96, 1, 97, - 1, - 242, + 2, + 59, 145, 144, 97, - 16, - 90, + 18, + 49, 86, 91, 103, @@ -5879,14 +6485,14 @@ pub mod summa { 21, 97, 2, - 10, + 83, 87, 97, 2, - 10, + 83, 97, - 10, - 230, + 12, + 65, 86, 91, 96, @@ -5912,7 +6518,7 @@ pub mod summa { 21, 97, 2, - 51, + 124, 87, 129, 96, @@ -5943,14 +6549,14 @@ pub mod summa { 16, 97, 2, - 74, + 147, 87, 97, 2, - 74, + 147, 97, - 16, - 109, + 18, + 68, 86, 91, 96, @@ -5975,7 +6581,7 @@ pub mod summa { 21, 97, 3, - 69, + 142, 87, 132, 129, @@ -5985,14 +6591,14 @@ pub mod summa { 16, 97, 2, - 116, + 189, 87, 97, 2, - 116, + 189, 97, - 16, - 109, + 18, + 68, 86, 91, 96, @@ -6016,7 +6622,7 @@ pub mod summa { 21, 97, 2, - 176, + 249, 87, 80, 132, @@ -6027,14 +6633,14 @@ pub mod summa { 16, 97, 2, - 158, + 231, 87, 97, 2, - 158, + 231, 97, - 16, - 109, + 18, + 68, 86, 91, 96, @@ -6056,8 +6662,8 @@ pub mod summa { 21, 91, 97, - 2, - 236, + 3, + 53, 87, 96, 64, @@ -6111,8 +6717,8 @@ pub mod summa { 100, 1, 97, - 1, - 217, + 2, + 34, 86, 91, 132, @@ -6122,15 +6728,15 @@ pub mod summa { 129, 16, 97, - 2, - 254, + 3, + 71, 87, 97, - 2, - 254, + 3, + 71, 97, - 16, - 109, + 18, + 68, 86, 91, 96, @@ -6151,12 +6757,12 @@ pub mod summa { 1, 97, 3, - 24, + 97, 145, 144, 97, - 16, - 90, + 18, + 49, 86, 91, 129, @@ -6165,14 +6771,14 @@ pub mod summa { 16, 97, 3, - 40, + 113, 87, 97, 3, - 40, + 113, 97, - 16, - 109, + 18, + 68, 86, 91, 96, @@ -6189,11 +6795,11 @@ pub mod summa { 128, 97, 3, - 61, + 134, 129, 97, - 16, - 131, + 18, + 90, 86, 91, 145, @@ -6201,23 +6807,23 @@ pub mod summa { 80, 97, 2, - 89, + 162, 86, 91, 80, 97, 3, - 80, + 153, 131, 130, 97, - 9, - 8, + 4, + 68, 86, 91, 97, 3, - 143, + 216, 87, 96, 64, @@ -6274,11 +6880,31 @@ pub mod summa { 100, 1, 97, - 1, - 217, + 2, + 34, 86, 91, + 96, + 0, + 130, + 129, + 82, + 96, + 3, + 96, + 32, + 82, + 96, + 64, + 129, + 32, + 134, + 144, + 85, 129, + 81, + 131, + 145, 127, 4, 115, @@ -6312,79 +6938,231 @@ pub mod summa { 213, 111, 245, - 130, + 145, + 132, + 145, + 144, + 97, + 4, + 30, + 87, + 97, + 4, + 30, + 97, + 18, + 68, + 86, + 91, + 96, + 32, + 2, + 96, + 32, + 1, + 1, + 81, + 134, + 96, + 64, + 81, + 97, + 4, + 53, + 146, + 145, + 144, + 97, + 18, + 115, + 86, + 91, + 96, + 64, + 81, + 128, + 145, + 3, + 144, + 162, + 80, + 80, + 80, + 80, + 80, + 86, + 91, + 96, + 64, + 81, + 99, + 11, + 210, + 5, + 169, + 96, + 228, + 27, + 129, + 82, + 96, + 0, + 144, + 96, + 1, 96, + 1, + 96, + 160, + 27, + 3, + 127, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, 0, - 129, - 81, - 129, - 16, - 97, - 3, - 196, - 87, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 22, + 144, + 99, + 189, + 32, + 90, + 144, + 144, 97, - 3, - 196, + 4, + 149, + 144, + 133, + 144, + 135, + 144, + 96, + 4, + 1, 97, - 16, - 109, + 19, + 10, 86, 91, 96, 32, - 2, 96, - 32, - 1, - 1, + 64, 81, + 128, + 131, + 3, + 129, 134, + 90, + 250, + 21, + 128, + 21, + 97, + 4, + 178, + 87, + 61, + 96, + 0, + 128, + 62, + 61, + 96, + 0, + 253, + 91, + 80, + 80, + 80, + 80, 96, 64, 81, + 61, + 96, + 31, + 25, + 96, + 31, + 130, + 1, + 22, + 130, + 1, + 128, + 96, + 64, + 82, + 80, + 129, + 1, + 144, 97, - 3, - 219, - 146, + 4, + 214, 145, 144, 97, - 16, - 156, + 19, + 97, 86, 91, - 96, - 64, - 81, - 128, - 145, - 3, 144, - 162, - 80, - 80, 80, + 91, + 146, + 145, 80, 80, 86, 91, 97, - 3, - 242, + 4, + 231, 97, - 10, - 35, + 11, + 126, 86, 91, 97, - 3, - 252, + 4, + 241, 96, 0, 97, - 10, - 125, + 11, + 216, 86, 91, 86, @@ -6397,8 +7175,8 @@ pub mod summa { 129, 16, 97, - 4, - 14, + 5, + 3, 87, 96, 0, @@ -6432,12 +7210,12 @@ pub mod summa { 128, 84, 97, - 4, - 49, + 5, + 38, 144, 97, - 17, - 51, + 19, + 131, 86, 91, 128, @@ -6476,27 +7254,27 @@ pub mod summa { 128, 84, 97, - 4, - 93, + 5, + 82, 144, 97, - 17, - 51, + 19, + 131, 86, 91, 128, 21, 97, - 4, - 170, + 5, + 159, 87, 128, 96, 31, 16, 97, - 4, - 127, + 5, + 116, 87, 97, 1, @@ -6514,8 +7292,8 @@ pub mod summa { 1, 145, 97, - 4, - 170, + 5, + 159, 86, 91, 130, @@ -6548,8 +7326,8 @@ pub mod summa { 131, 17, 97, - 4, - 141, + 5, + 130, 87, 130, 144, @@ -6574,12 +7352,12 @@ pub mod summa { 128, 84, 97, - 4, - 191, + 5, + 180, 144, 97, - 17, - 51, + 19, + 131, 86, 91, 128, @@ -6618,27 +7396,27 @@ pub mod summa { 128, 84, 97, - 4, - 235, + 5, + 224, 144, 97, - 17, - 51, + 19, + 131, 86, 91, 128, 21, 97, - 5, - 56, + 6, + 45, 87, 128, 96, 31, 16, 97, - 5, - 13, + 6, + 2, 87, 97, 1, @@ -6656,8 +7434,8 @@ pub mod summa { 1, 145, 97, - 5, - 56, + 6, + 45, 86, 91, 130, @@ -6690,8 +7468,8 @@ pub mod summa { 131, 17, 97, - 5, - 27, + 6, + 16, 87, 130, 144, @@ -6716,12 +7494,12 @@ pub mod summa { 128, 84, 97, - 5, - 77, + 6, + 66, 144, 97, - 17, - 51, + 19, + 131, 86, 91, 128, @@ -6760,27 +7538,27 @@ pub mod summa { 128, 84, 97, - 5, - 121, + 6, + 110, 144, 97, - 17, - 51, + 19, + 131, 86, 91, 128, 21, 97, - 5, - 198, + 6, + 187, 87, 128, 96, 31, 16, 97, - 5, - 155, + 6, + 144, 87, 97, 1, @@ -6798,8 +7576,8 @@ pub mod summa { 1, 145, 97, - 5, - 198, + 6, + 187, 86, 91, 130, @@ -6832,8 +7610,8 @@ pub mod summa { 131, 17, 97, - 5, - 169, + 6, + 158, 87, 130, 144, @@ -6858,12 +7636,12 @@ pub mod summa { 128, 84, 97, - 5, - 219, + 6, + 208, 144, 97, - 17, - 51, + 19, + 131, 86, 91, 128, @@ -6903,26 +7681,26 @@ pub mod summa { 84, 97, 6, - 7, + 252, 144, 97, - 17, - 51, + 19, + 131, 86, 91, 128, 21, 97, - 6, - 84, + 7, + 73, 87, 128, 96, 31, 16, 97, - 6, - 41, + 7, + 30, 87, 97, 1, @@ -6940,8 +7718,8 @@ pub mod summa { 1, 145, 97, - 6, - 84, + 7, + 73, 86, 91, 130, @@ -6974,8 +7752,8 @@ pub mod summa { 131, 17, 97, - 6, - 55, + 7, + 44, 87, 130, 144, @@ -6998,11 +7776,11 @@ pub mod summa { 86, 91, 97, - 6, - 102, + 7, + 91, 97, - 10, - 35, + 11, + 126, 86, 91, 96, @@ -7014,8 +7792,8 @@ pub mod summa { 16, 21, 97, - 8, - 205, + 9, + 194, 87, 96, 0, @@ -7026,15 +7804,15 @@ pub mod summa { 129, 16, 97, - 6, - 134, + 7, + 123, 87, 97, - 6, - 134, + 7, + 123, 97, - 16, - 109, + 18, + 68, 86, 91, 96, @@ -7056,13 +7834,13 @@ pub mod summa { 32, 1, 97, - 6, - 162, + 7, + 151, 145, 144, 97, - 17, - 109, + 19, + 189, 86, 91, 96, @@ -7108,8 +7886,8 @@ pub mod summa { 128, 21, 97, - 7, - 24, + 8, + 13, 87, 96, 64, @@ -7179,19 +7957,19 @@ pub mod summa { 100, 1, 97, - 1, - 217, + 2, + 34, 86, 91, 97, - 7, - 35, + 8, + 24, 131, 96, 1, 97, - 16, - 90, + 18, + 49, 86, 91, 96, @@ -7221,15 +7999,15 @@ pub mod summa { 129, 16, 97, - 7, - 73, + 8, + 62, 87, 97, - 7, - 73, + 8, + 62, 97, - 16, - 109, + 18, + 68, 86, 91, 96, @@ -7273,13 +8051,13 @@ pub mod summa { 129, 144, 97, - 7, - 123, + 8, + 112, 144, 130, 97, - 17, - 207, + 20, + 31, 86, 91, 80, @@ -7294,13 +8072,13 @@ pub mod summa { 1, 144, 97, - 7, - 144, + 8, + 133, 144, 130, 97, - 17, - 207, + 20, + 31, 86, 91, 80, @@ -7315,13 +8093,13 @@ pub mod summa { 1, 144, 97, - 7, - 165, + 8, + 154, 144, 130, 97, - 17, - 207, + 20, + 31, 86, 91, 80, @@ -7336,13 +8114,13 @@ pub mod summa { 1, 144, 97, - 7, - 186, + 8, + 175, 144, 130, 97, - 17, - 207, + 20, + 31, 86, 91, 80, @@ -7355,15 +8133,15 @@ pub mod summa { 129, 16, 97, - 7, - 207, + 8, + 196, 87, 97, - 7, - 207, + 8, + 196, 97, - 16, - 109, + 18, + 68, 86, 91, 96, @@ -7386,8 +8164,8 @@ pub mod summa { 128, 21, 97, - 8, - 11, + 9, + 0, 87, 80, 131, @@ -7397,15 +8175,15 @@ pub mod summa { 129, 16, 97, - 7, - 249, + 8, + 238, 87, 97, - 7, - 249, + 8, + 238, 97, - 16, - 109, + 18, + 68, 86, 91, 96, @@ -7429,8 +8207,8 @@ pub mod summa { 128, 21, 97, - 8, - 54, + 9, + 43, 87, 80, 131, @@ -7440,15 +8218,15 @@ pub mod summa { 129, 16, 97, - 8, - 36, + 9, + 25, 87, 97, - 8, - 36, + 9, + 25, 97, - 16, - 109, + 18, + 68, 86, 91, 96, @@ -7472,8 +8250,8 @@ pub mod summa { 128, 21, 97, - 8, - 97, + 9, + 86, 87, 80, 131, @@ -7483,15 +8261,15 @@ pub mod summa { 129, 16, 97, - 8, - 79, + 9, + 68, 87, 97, - 8, - 79, + 9, + 68, 97, - 16, - 109, + 18, + 68, 86, 91, 96, @@ -7513,8 +8291,8 @@ pub mod summa { 21, 91, 97, - 8, - 184, + 9, + 173, 87, 96, 64, @@ -7595,8 +8373,8 @@ pub mod summa { 132, 1, 97, - 1, - 217, + 2, + 34, 86, 91, 80, @@ -7604,20 +8382,20 @@ pub mod summa { 128, 128, 97, - 8, - 197, + 9, + 186, 144, 97, - 16, - 131, + 18, + 90, 86, 91, 145, 80, 80, 97, - 6, - 105, + 7, + 94, 86, 91, 80, @@ -7659,13 +8437,13 @@ pub mod summa { 64, 81, 97, - 8, - 253, + 9, + 242, 145, 144, 97, - 18, - 143, + 20, + 223, 86, 91, 96, @@ -7680,13 +8458,116 @@ pub mod summa { 86, 91, 96, - 0, - 97, - 9, - 18, + 0, + 130, + 96, + 1, + 129, + 81, + 129, + 16, + 97, + 10, + 18, + 87, + 97, + 10, + 18, + 97, + 18, + 68, + 86, + 91, + 96, + 32, + 2, + 96, + 32, + 1, + 1, + 81, + 96, + 3, + 96, + 0, + 132, + 129, + 82, + 96, + 32, + 1, + 144, + 129, + 82, + 96, + 32, + 1, + 96, + 0, + 32, + 84, + 20, + 97, + 10, + 110, + 87, + 96, + 64, + 81, + 98, + 70, + 27, + 205, + 96, + 229, + 27, + 129, + 82, + 96, + 32, + 96, + 4, + 130, + 1, + 82, + 96, + 16, + 96, + 36, + 130, + 1, + 82, + 111, + 18, + 91, + 157, + 152, + 91, + 26, + 89, + 8, + 19, + 84, + 213, + 8, + 28, + 155, + 219, + 221, + 96, + 130, + 27, + 96, + 68, + 130, + 1, + 82, + 96, + 100, + 1, 97, - 10, - 35, + 2, + 34, 86, 91, 96, @@ -7752,19 +8633,19 @@ pub mod summa { 144, 144, 97, - 9, - 96, + 10, + 188, 144, - 133, + 134, 144, - 135, + 136, 144, 96, 4, 1, 97, 19, - 75, + 10, 86, 91, 96, @@ -7783,8 +8664,8 @@ pub mod summa { 128, 21, 97, - 9, - 125, + 10, + 217, 87, 61, 96, @@ -7823,30 +8704,29 @@ pub mod summa { 1, 144, 97, - 9, - 161, + 10, + 253, 145, 144, 97, 19, - 162, + 97, 86, 91, - 144, + 148, + 147, + 80, 80, - 91, - 146, - 145, 80, 80, 86, 91, 97, - 9, - 178, + 11, + 13, 97, - 10, - 35, + 11, + 126, 86, 91, 96, @@ -7860,8 +8740,8 @@ pub mod summa { 129, 22, 97, - 10, - 23, + 11, + 114, 87, 96, 64, @@ -7946,17 +8826,17 @@ pub mod summa { 132, 1, 97, - 1, - 217, + 2, + 34, 86, 91, 97, - 10, - 32, + 11, + 123, 129, 97, - 10, - 125, + 11, + 216, 86, 91, 80, @@ -7977,8 +8857,8 @@ pub mod summa { 51, 20, 97, - 3, - 252, + 4, + 241, 87, 96, 64, @@ -8048,8 +8928,8 @@ pub mod summa { 100, 1, 97, - 1, - 217, + 2, + 34, 86, 91, 96, @@ -8142,8 +9022,8 @@ pub mod summa { 18, 21, 97, - 10, - 223, + 12, + 58, 87, 96, 0, @@ -8203,15 +9083,15 @@ pub mod summa { 23, 21, 97, - 11, - 31, + 12, + 122, 87, 97, - 11, - 31, + 12, + 122, 97, - 10, - 230, + 12, + 65, 86, 91, 96, @@ -8244,15 +9124,15 @@ pub mod summa { 23, 21, 97, - 11, - 31, + 12, + 122, 87, 97, - 11, - 31, + 12, + 122, 97, - 10, - 230, + 12, + 65, 86, 91, 96, @@ -8285,27 +9165,204 @@ pub mod summa { 23, 21, 97, - 11, - 113, + 12, + 204, 87, 97, - 11, - 113, + 12, + 204, 97, - 10, - 230, + 12, + 65, + 86, + 91, + 96, + 64, + 82, + 145, + 144, + 80, + 86, + 91, + 96, + 0, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 130, + 17, + 21, + 97, + 12, + 238, + 87, + 97, + 12, + 238, + 97, + 12, + 65, + 86, + 91, + 80, + 96, + 5, + 27, + 96, + 32, + 1, + 144, + 86, + 91, + 96, + 0, + 130, + 96, + 31, + 131, + 1, + 18, + 97, + 13, + 9, + 87, + 96, + 0, + 128, + 253, + 91, + 129, + 53, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 129, + 17, + 21, + 97, + 13, + 35, + 87, + 97, + 13, + 35, + 97, + 12, + 65, + 86, + 91, + 97, + 13, + 54, + 96, + 31, + 130, + 1, + 96, + 31, + 25, + 22, + 96, + 32, + 1, + 97, + 12, + 163, 86, 91, + 129, + 129, + 82, + 132, + 96, + 32, + 131, + 134, + 1, + 1, + 17, + 21, + 97, + 13, + 75, + 87, + 96, + 0, + 128, + 253, + 91, + 129, + 96, + 32, + 133, + 1, 96, - 64, - 82, + 32, + 131, + 1, + 55, + 96, + 0, + 145, + 129, + 1, + 96, + 32, + 1, 145, 144, + 145, + 82, + 147, + 146, + 80, + 80, 80, 86, 91, 96, 0, + 128, + 96, + 0, + 128, + 96, + 128, + 133, + 135, + 3, + 18, + 21, + 97, + 13, + 126, + 87, + 96, + 0, + 128, + 253, + 91, + 132, + 53, + 147, + 80, + 96, + 32, + 133, + 1, + 53, 103, 255, 255, @@ -8315,372 +9372,445 @@ pub mod summa { 255, 255, 255, + 128, 130, 17, 21, 97, - 11, - 147, + 13, + 157, + 87, + 96, + 0, + 128, + 253, + 91, + 129, + 135, + 1, + 145, + 80, + 135, + 96, + 31, + 131, + 1, + 18, + 97, + 13, + 177, 87, + 96, + 0, + 128, + 253, + 91, 97, - 11, - 147, + 13, + 195, 97, - 10, - 230, + 13, + 190, + 131, + 53, + 97, + 12, + 212, 86, 91, - 80, + 97, + 12, + 163, + 86, + 91, + 130, + 53, + 128, + 130, + 82, + 96, + 32, + 128, + 131, + 1, + 146, + 145, 96, 5, 27, - 96, - 32, + 133, 1, - 144, - 86, - 91, + 1, + 138, + 129, + 17, + 21, + 97, + 13, + 226, + 87, 96, 0, - 130, + 128, + 253, + 91, 96, - 31, - 131, + 32, + 133, 1, - 18, + 91, + 129, + 129, + 16, + 21, 97, - 11, - 174, + 14, + 132, + 87, + 132, + 129, + 53, + 17, + 21, + 97, + 13, + 253, 87, 96, 0, 128, 253, 91, - 129, + 128, 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, + 134, + 1, + 96, + 96, 129, - 17, + 142, + 3, + 96, + 31, + 25, + 1, + 18, 21, 97, - 11, - 200, + 14, + 21, 87, + 96, + 0, + 128, + 253, + 91, 97, - 11, - 200, + 14, + 29, 97, - 10, - 230, + 12, + 87, 86, 91, - 97, - 11, - 219, 96, - 31, + 32, 130, 1, + 53, + 135, + 129, + 17, + 21, + 97, + 14, + 47, + 87, 96, - 31, - 25, - 22, + 0, + 128, + 253, + 91, + 97, + 14, + 62, + 143, 96, 32, + 131, + 134, + 1, 1, 97, - 11, - 72, + 12, + 248, 86, 91, - 129, - 129, + 130, 82, - 132, + 80, 96, - 32, - 131, - 134, - 1, + 64, + 130, 1, + 53, + 135, + 129, 17, 21, 97, - 11, - 240, + 14, + 83, 87, 96, 0, 128, 253, 91, - 129, - 96, - 32, - 133, - 1, + 97, + 14, + 98, + 143, 96, 32, 131, + 134, 1, - 55, - 96, - 0, - 145, - 129, 1, + 97, + 12, + 248, + 86, + 91, 96, 32, + 131, + 129, 1, 145, 144, 145, 82, - 147, - 146, - 80, - 80, - 80, - 86, - 91, 96, - 0, - 128, 96, - 0, - 128, + 147, + 144, + 147, + 1, + 53, 96, - 128, + 64, + 131, + 1, + 82, + 80, 133, - 135, - 3, - 18, - 21, - 97, - 12, - 35, - 87, - 96, - 0, - 128, - 253, - 91, + 82, + 147, 132, - 53, + 1, 147, + 1, + 97, + 13, + 231, + 86, + 91, + 80, + 144, + 150, + 80, + 80, 80, 96, - 32, - 133, + 64, + 135, 1, 53, - 103, - 255, - 255, - 255, - 255, - 255, - 255, - 255, - 255, + 145, + 80, 128, 130, 17, 21, 97, - 12, - 66, + 14, + 158, 87, 96, 0, 128, 253, 91, - 129, + 80, + 97, + 14, + 171, 135, + 130, + 136, 1, - 145, + 97, + 12, + 248, + 86, + 91, + 148, + 151, + 147, + 150, 80, - 135, + 147, + 148, + 96, + 96, + 1, + 53, + 147, + 80, + 80, + 80, + 86, + 91, + 96, + 0, + 130, 96, 31, 131, 1, 18, 97, - 12, - 86, + 14, + 205, 87, 96, 0, 128, 253, 91, + 129, + 53, + 96, + 32, 97, - 12, - 104, + 14, + 221, 97, - 12, - 99, + 13, + 190, 131, - 53, - 97, - 11, - 121, - 86, - 91, 97, - 11, - 72, + 12, + 212, 86, 91, 130, - 53, - 128, - 130, + 129, 82, 96, - 32, - 128, - 131, - 1, - 146, - 145, - 96, 5, + 146, + 144, + 146, 27, - 133, + 132, 1, + 129, 1, - 138, + 145, + 129, 129, + 1, + 144, + 134, + 132, 17, 21, 97, - 12, - 135, + 14, + 252, 87, 96, 0, 128, 253, 91, - 96, - 32, - 133, + 130, + 134, 1, 91, - 129, - 129, - 16, - 21, - 97, - 13, - 41, - 87, 132, 129, - 53, - 17, + 16, 21, 97, - 12, - 162, + 15, + 23, 87, - 96, - 0, - 128, - 253, - 91, 128, 53, - 134, + 131, + 82, + 145, + 131, 1, - 96, - 96, - 129, - 142, - 3, - 96, - 31, - 25, + 145, + 131, 1, - 18, - 21, 97, - 12, - 186, - 87, - 96, + 15, 0, - 128, - 253, + 86, 91, - 97, - 12, - 194, - 97, - 10, - 252, + 80, + 150, + 149, + 80, + 80, + 80, + 80, + 80, + 80, 86, 91, 96, - 32, - 130, - 1, - 53, - 135, - 129, - 17, - 21, - 97, - 12, - 212, - 87, - 96, 0, 128, - 253, - 91, - 97, - 12, - 227, - 143, 96, - 32, + 64, 131, - 134, - 1, - 1, - 97, - 11, - 157, - 86, - 91, - 130, - 82, - 80, + 133, + 3, + 18, + 21, + 97, + 15, + 53, + 87, 96, - 64, + 0, + 128, + 253, + 91, 130, - 1, 53, - 135, - 129, + 103, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 255, + 128, + 130, 17, 21, 97, - 12, - 248, + 15, + 77, 87, 96, 0, @@ -8688,63 +9818,22 @@ pub mod summa { 253, 91, 97, - 13, - 7, - 143, - 96, - 32, - 131, + 15, + 89, 134, - 1, - 1, - 97, - 11, - 157, - 86, - 91, - 96, - 32, - 131, - 129, - 1, - 145, - 144, - 145, - 82, - 96, - 96, - 147, - 144, - 147, - 1, - 53, - 96, - 64, 131, - 1, - 82, - 80, - 133, - 82, - 147, - 132, - 1, - 147, + 135, 1, 97, 12, - 140, + 248, 86, 91, - 80, - 144, - 150, - 80, - 80, + 147, 80, 96, - 64, - 135, + 32, + 133, 1, 53, 145, @@ -8754,8 +9843,8 @@ pub mod summa { 17, 21, 97, - 13, - 67, + 15, + 111, 87, 96, 0, @@ -8764,31 +9853,24 @@ pub mod summa { 91, 80, 97, - 13, - 80, - 135, + 15, + 124, + 133, 130, - 136, + 134, 1, 97, - 11, - 157, + 14, + 188, 86, 91, - 148, - 151, - 147, - 150, + 145, 80, - 147, - 148, - 96, - 96, - 1, - 53, - 147, 80, + 146, 80, + 146, + 144, 80, 86, 91, @@ -8807,8 +9889,8 @@ pub mod summa { 16, 21, 97, - 13, - 135, + 15, + 172, 87, 96, 32, @@ -8826,8 +9908,8 @@ pub mod summa { 82, 1, 97, - 13, - 107, + 15, + 144, 86, 91, 80, @@ -8869,16 +9951,16 @@ pub mod summa { 96, 0, 97, - 13, - 186, + 15, + 223, 96, 128, 131, 1, 135, 97, - 13, - 97, + 15, + 134, 86, 91, 130, @@ -8890,13 +9972,13 @@ pub mod summa { 1, 82, 97, - 13, - 204, + 15, + 241, 129, 135, 97, - 13, - 97, + 15, + 134, 86, 91, 144, @@ -8910,13 +9992,13 @@ pub mod summa { 1, 82, 97, - 13, - 224, + 16, + 5, 129, 134, 97, - 13, - 97, + 15, + 134, 86, 91, 144, @@ -8930,13 +10012,13 @@ pub mod summa { 1, 82, 97, - 13, - 244, + 16, + 25, 129, 133, 97, - 13, - 97, + 15, + 134, 86, 91, 151, @@ -8961,8 +10043,8 @@ pub mod summa { 18, 21, 97, - 14, - 18, + 16, + 55, 87, 96, 0, @@ -8985,8 +10067,8 @@ pub mod summa { 17, 21, 97, - 14, - 42, + 16, + 79, 87, 96, 0, @@ -9005,8 +10087,8 @@ pub mod summa { 1, 18, 97, - 14, - 62, + 16, + 99, 87, 96, 0, @@ -9016,15 +10098,15 @@ pub mod summa { 129, 53, 97, - 14, - 76, + 16, + 113, 97, - 12, - 99, + 13, + 190, 130, 97, - 11, - 121, + 12, + 212, 86, 91, 129, @@ -9050,8 +10132,8 @@ pub mod summa { 17, 21, 97, - 14, - 107, + 16, + 144, 87, 96, 0, @@ -9067,8 +10149,8 @@ pub mod summa { 16, 21, 97, - 15, - 76, + 17, + 113, 87, 128, 53, @@ -9077,8 +10159,8 @@ pub mod summa { 17, 21, 97, - 14, - 134, + 16, + 171, 87, 96, 0, @@ -9099,8 +10181,8 @@ pub mod summa { 18, 21, 97, - 14, - 157, + 16, + 194, 87, 96, 0, @@ -9109,11 +10191,11 @@ pub mod summa { 253, 91, 97, - 14, - 165, + 16, + 202, 97, - 11, - 37, + 12, + 128, 86, 91, 136, @@ -9125,8 +10207,8 @@ pub mod summa { 17, 21, 97, - 14, - 183, + 16, + 220, 87, 96, 0, @@ -9135,8 +10217,8 @@ pub mod summa { 253, 91, 97, - 14, - 197, + 16, + 234, 141, 139, 131, @@ -9144,8 +10226,8 @@ pub mod summa { 1, 1, 97, - 11, - 157, + 12, + 248, 86, 91, 130, @@ -9162,8 +10244,8 @@ pub mod summa { 17, 21, 97, - 14, - 220, + 17, + 1, 87, 96, 0, @@ -9172,8 +10254,8 @@ pub mod summa { 253, 91, 97, - 14, - 234, + 17, + 15, 142, 140, 131, @@ -9181,8 +10263,8 @@ pub mod summa { 1, 1, 97, - 11, - 157, + 12, + 248, 86, 91, 139, @@ -9201,8 +10283,8 @@ pub mod summa { 17, 21, 97, - 15, - 3, + 17, + 40, 87, 96, 0, @@ -9211,8 +10293,8 @@ pub mod summa { 253, 91, 97, - 15, 17, + 54, 143, 141, 131, @@ -9220,8 +10302,8 @@ pub mod summa { 1, 1, 97, - 11, - 157, + 12, + 248, 86, 91, 131, @@ -9241,8 +10323,8 @@ pub mod summa { 17, 21, 97, - 15, - 43, + 17, + 80, 87, 96, 0, @@ -9251,8 +10333,8 @@ pub mod summa { 253, 91, 97, - 15, - 57, + 17, + 94, 142, 140, 132, @@ -9260,8 +10342,8 @@ pub mod summa { 1, 1, 97, - 11, - 157, + 12, + 248, 86, 91, 144, @@ -9279,8 +10361,8 @@ pub mod summa { 134, 1, 97, - 14, - 111, + 16, + 148, 86, 91, 80, @@ -9300,22 +10382,24 @@ pub mod summa { 0, 128, 96, - 64, - 131, - 133, + 0, + 96, + 96, + 132, + 134, 3, 18, 21, 97, - 15, - 108, + 17, + 147, 87, 96, 0, 128, 253, 91, - 130, + 131, 53, 103, 255, @@ -9331,8 +10415,8 @@ pub mod summa { 17, 21, 97, - 15, - 132, + 17, + 171, 87, 96, 0, @@ -9340,147 +10424,67 @@ pub mod summa { 253, 91, 97, - 15, - 144, - 134, - 131, + 17, + 183, 135, + 131, + 136, 1, 97, - 11, - 157, + 12, + 248, 86, 91, - 147, + 148, 80, 96, 32, - 145, - 80, - 129, - 133, + 134, 1, 53, - 129, - 129, - 17, - 21, - 97, - 15, - 167, - 87, - 96, - 0, - 128, - 253, - 91, - 133, - 1, - 144, + 145, 80, - 96, - 31, - 129, - 1, - 134, - 19, - 97, - 15, - 186, - 87, - 96, - 0, - 128, - 253, - 91, 128, - 53, - 97, - 15, - 200, - 97, - 12, - 99, - 130, - 97, - 11, - 121, - 86, - 91, - 129, - 129, - 82, - 96, - 5, - 145, - 144, - 145, - 27, 130, - 1, - 131, - 1, - 144, - 131, - 129, - 1, - 144, - 136, - 131, 17, 21, 97, - 15, - 231, + 17, + 205, 87, 96, 0, 128, 253, 91, - 146, - 132, - 1, - 146, - 91, - 130, - 132, - 16, - 21, + 80, 97, - 16, - 5, - 87, - 131, - 53, + 17, + 218, + 134, 130, - 82, - 146, - 132, - 1, - 146, - 144, - 132, + 135, 1, - 144, 97, - 15, - 236, + 14, + 188, 86, 91, - 128, - 149, - 80, - 80, - 80, + 146, 80, 80, + 96, + 64, + 132, + 1, + 53, + 144, 80, 146, 80, 146, - 144, 80, + 146, 86, 91, 96, @@ -9493,8 +10497,8 @@ pub mod summa { 18, 21, 97, - 16, - 38, + 17, + 253, 87, 96, 0, @@ -9516,8 +10520,8 @@ pub mod summa { 129, 20, 97, - 16, - 61, + 18, + 20, 87, 96, 0, @@ -9561,15 +10565,15 @@ pub mod summa { 17, 21, 97, - 9, - 164, + 4, + 217, 87, 97, - 9, - 164, + 4, + 217, 97, - 16, - 68, + 18, + 27, 86, 91, 99, @@ -9601,15 +10605,15 @@ pub mod summa { 130, 1, 97, - 16, - 149, + 18, + 108, 87, 97, - 16, - 149, + 18, + 108, 97, - 16, - 68, + 18, + 27, 86, 91, 80, @@ -9670,8 +10674,8 @@ pub mod summa { 16, 21, 97, - 17, - 35, + 18, + 250, 87, 137, 131, @@ -9690,15 +10694,15 @@ pub mod summa { 133, 82, 97, - 16, - 238, + 18, + 197, 137, 134, 1, 130, 97, - 13, - 97, + 15, + 134, 86, 91, 144, @@ -9715,13 +10719,13 @@ pub mod summa { 1, 82, 97, - 17, - 5, + 18, + 220, 130, 130, 97, - 13, - 97, + 15, + 134, 86, 91, 146, @@ -9731,37 +10735,124 @@ pub mod summa { 149, 139, 1, - 149, + 149, + 144, + 149, + 82, + 80, + 148, + 134, + 1, + 148, + 146, + 80, + 144, + 133, + 1, + 144, + 96, + 1, + 1, + 97, + 18, + 161, + 86, + 91, + 80, + 144, + 154, + 153, + 80, + 80, + 80, + 80, + 80, + 80, + 80, + 80, + 80, + 80, + 86, + 91, + 96, + 64, + 128, + 130, + 82, + 131, + 81, + 144, + 130, + 1, + 129, + 144, + 82, + 96, + 0, + 144, + 96, + 32, + 144, + 96, + 96, + 132, + 1, 144, - 149, + 130, + 135, + 1, + 132, + 91, + 130, + 129, + 16, + 21, + 97, + 19, + 67, + 87, + 129, + 81, + 132, 82, - 80, - 148, - 134, + 146, + 132, 1, - 148, 146, - 80, 144, - 133, + 132, 1, 144, 96, 1, 1, 97, - 16, - 202, + 19, + 39, 86, 91, 80, - 144, - 154, - 153, - 80, - 80, 80, 80, + 131, + 129, + 3, + 130, + 133, + 1, + 82, + 97, + 19, + 87, + 129, + 134, + 97, + 15, + 134, + 86, + 91, + 150, + 149, 80, 80, 80, @@ -9771,6 +10862,40 @@ pub mod summa { 86, 91, 96, + 0, + 96, + 32, + 130, + 132, + 3, + 18, + 21, + 97, + 19, + 115, + 87, + 96, + 0, + 128, + 253, + 91, + 129, + 81, + 128, + 21, + 21, + 129, + 20, + 97, + 18, + 20, + 87, + 96, + 0, + 128, + 253, + 91, + 96, 1, 129, 129, @@ -9780,8 +10905,8 @@ pub mod summa { 22, 128, 97, - 17, - 71, + 19, + 151, 87, 96, 127, @@ -9797,8 +10922,8 @@ pub mod summa { 129, 3, 97, - 17, - 103, + 19, + 183, 87, 99, 78, @@ -9835,16 +10960,16 @@ pub mod summa { 96, 0, 97, - 9, - 161, + 4, + 214, 96, 32, 131, 1, 132, 97, - 13, - 97, + 15, + 134, 86, 91, 96, @@ -9853,8 +10978,8 @@ pub mod summa { 17, 21, 97, - 17, - 202, + 20, + 26, 87, 96, 0, @@ -9880,8 +11005,8 @@ pub mod summa { 16, 21, 97, - 17, - 167, + 19, + 247, 87, 80, 128, @@ -9903,8 +11028,8 @@ pub mod summa { 16, 21, 97, - 17, - 198, + 20, + 22, 87, 130, 129, @@ -9913,8 +11038,8 @@ pub mod summa { 1, 1, 97, - 17, - 179, + 20, + 3, 86, 91, 80, @@ -9941,35 +11066,35 @@ pub mod summa { 17, 21, 97, - 17, - 233, + 20, + 57, 87, 97, - 17, - 233, + 20, + 57, 97, - 10, - 230, + 12, + 65, 86, 91, 97, - 17, - 253, + 20, + 77, 129, 97, - 17, - 247, + 20, + 71, 132, 84, 97, - 17, - 51, + 19, + 131, 86, 91, 132, 97, - 17, - 128, + 19, + 208, 86, 91, 96, @@ -9984,16 +11109,16 @@ pub mod summa { 129, 20, 97, - 18, - 50, + 20, + 130, 87, 96, 0, 132, 21, 97, - 18, - 26, + 20, + 106, 87, 80, 133, @@ -10021,8 +11146,8 @@ pub mod summa { 133, 85, 97, - 17, - 198, + 20, + 22, 86, 91, 96, @@ -10046,8 +11171,8 @@ pub mod summa { 16, 21, 97, - 18, - 97, + 20, + 177, 87, 136, 134, @@ -10068,8 +11193,8 @@ pub mod summa { 132, 1, 97, - 18, - 66, + 20, + 146, 86, 91, 80, @@ -10078,8 +11203,8 @@ pub mod summa { 16, 21, 97, - 18, - 127, + 20, + 207, 87, 135, 133, @@ -10162,8 +11287,8 @@ pub mod summa { 16, 21, 97, - 19, - 61, + 21, + 141, 87, 96, 63, @@ -10184,15 +11309,15 @@ pub mod summa { 134, 82, 97, - 18, - 220, + 21, + 44, 130, 135, 1, 130, 97, - 13, - 97, + 15, + 134, 86, 91, 145, @@ -10210,13 +11335,13 @@ pub mod summa { 1, 82, 97, - 18, - 244, + 21, + 68, 130, 130, 97, - 13, - 97, + 15, + 134, 86, 91, 145, @@ -10234,13 +11359,13 @@ pub mod summa { 1, 82, 97, - 19, - 12, + 21, + 92, 130, 130, 97, - 13, - 97, + 15, + 134, 86, 91, 145, @@ -10250,141 +11375,54 @@ pub mod summa { 96, 128, 131, - 1, - 81, - 146, - 80, - 133, - 130, - 3, - 129, - 135, - 1, - 82, - 80, - 97, - 19, - 41, - 129, - 131, - 97, - 13, - 97, - 86, - 91, - 150, - 137, - 1, - 150, - 148, - 80, - 80, - 80, - 144, - 134, - 1, - 144, - 96, - 1, - 1, - 97, - 18, - 182, - 86, - 91, - 80, - 144, - 152, - 151, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 80, - 86, - 91, - 96, - 64, - 128, - 130, - 82, - 131, + 1, 81, - 144, + 146, + 80, + 133, 130, - 1, + 3, 129, - 144, - 82, - 96, - 0, - 144, - 96, - 32, - 144, - 96, - 96, - 132, - 1, - 144, - 130, 135, 1, - 132, - 91, - 130, - 129, - 16, - 21, + 82, + 80, 97, - 19, - 132, - 87, + 21, + 121, 129, - 81, - 132, - 82, - 146, - 132, + 131, + 97, + 15, + 134, + 86, + 91, + 150, + 137, 1, - 146, + 150, + 148, + 80, + 80, + 80, 144, - 132, + 134, 1, 144, 96, 1, 1, 97, - 19, - 104, + 21, + 6, 86, 91, 80, + 144, + 152, + 151, 80, 80, - 131, - 129, - 3, - 130, - 133, - 1, - 82, - 97, - 19, - 152, - 129, - 134, - 97, - 13, - 97, - 86, - 91, - 150, - 149, 80, 80, 80, @@ -10392,40 +11430,6 @@ pub mod summa { 80, 80, 86, - 91, - 96, - 0, - 96, - 32, - 130, - 132, - 3, - 18, - 21, - 97, - 19, - 180, - 87, - 96, - 0, - 128, - 253, - 91, - 129, - 81, - 128, - 21, - 21, - 129, - 20, - 97, - 16, - 61, - 87, - 96, - 0, - 128, - 253, 254, 162, 100, @@ -10437,38 +11441,38 @@ pub mod summa { 34, 18, 32, - 204, - 157, - 250, - 143, - 60, - 243, - 174, - 85, - 107, + 88, + 146, + 131, + 59, 174, - 161, - 154, - 177, + 223, + 242, + 144, 138, - 220, - 133, - 28, - 98, - 126, - 194, - 28, - 191, - 145, - 222, - 72, - 165, - 158, - 240, - 181, - 17, - 3, - 208, + 100, + 45, + 198, + 10, + 206, + 116, + 29, + 127, + 77, + 96, + 226, + 162, + 73, + 88, + 233, + 239, + 29, + 141, + 182, + 122, + 141, + 243, + 178, 100, 115, 111, @@ -10578,6 +11582,15 @@ pub mod summa { .method_hash([163, 196, 188, 248], p0) .expect("method not found (this should never happen)") } + ///Calls the contract's `mstRoots` (0x7f3bfb2e) function + pub fn mst_roots( + &self, + p0: ::ethers::core::types::U256, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([127, 59, 251, 46], p0) + .expect("method not found (this should never happen)") + } ///Calls the contract's `owner` (0x8da5cb5b) function pub fn owner( &self, @@ -10636,14 +11649,25 @@ pub mod summa { .method_hash([242, 253, 227, 139], new_owner) .expect("method not found (this should never happen)") } - ///Calls the contract's `verifyZkProof` (0xe691ad33) function - pub fn verify_zk_proof( + ///Calls the contract's `verifyInclusionProof` (0xc8e58147) function + pub fn verify_inclusion_proof( + &self, + proof: ::ethers::core::types::Bytes, + public_inputs: ::std::vec::Vec<::ethers::core::types::U256>, + timestamp: ::ethers::core::types::U256, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([200, 229, 129, 71], (proof, public_inputs, timestamp)) + .expect("method not found (this should never happen)") + } + ///Calls the contract's `verifySolvencyProof` (0x6c7684fe) function + pub fn verify_solvency_proof( &self, proof: ::ethers::core::types::Bytes, public_inputs: ::std::vec::Vec<::ethers::core::types::U256>, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([230, 145, 173, 51], (proof, public_inputs)) + .method_hash([108, 118, 132, 254], (proof, public_inputs)) .expect("method not found (this should never happen)") } ///Gets the contract's `AddressOwnershipProofSubmitted` event @@ -10812,6 +11836,19 @@ pub mod summa { )] #[ethcall(name = "addressOwnershipProofs", abi = "addressOwnershipProofs(uint256)")] pub struct AddressOwnershipProofsCall(pub ::ethers::core::types::U256); + ///Container type for all input parameters for the `mstRoots` function with signature `mstRoots(uint256)` and selector `0x7f3bfb2e` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + Default, + Debug, + PartialEq, + Eq, + Hash + )] + #[ethcall(name = "mstRoots", abi = "mstRoots(uint256)")] + pub struct MstRootsCall(pub ::ethers::core::types::U256); ///Container type for all input parameters for the `owner` function with signature `owner()` and selector `0x8da5cb5b` #[derive( Clone, @@ -10908,7 +11945,27 @@ pub mod summa { pub struct TransferOwnershipCall { pub new_owner: ::ethers::core::types::Address, } - ///Container type for all input parameters for the `verifyZkProof` function with signature `verifyZkProof(bytes,uint256[])` and selector `0xe691ad33` + ///Container type for all input parameters for the `verifyInclusionProof` function with signature `verifyInclusionProof(bytes,uint256[],uint256)` and selector `0xc8e58147` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + Default, + Debug, + PartialEq, + Eq, + Hash + )] + #[ethcall( + name = "verifyInclusionProof", + abi = "verifyInclusionProof(bytes,uint256[],uint256)" + )] + pub struct VerifyInclusionProofCall { + pub proof: ::ethers::core::types::Bytes, + pub public_inputs: ::std::vec::Vec<::ethers::core::types::U256>, + pub timestamp: ::ethers::core::types::U256, + } + ///Container type for all input parameters for the `verifySolvencyProof` function with signature `verifySolvencyProof(bytes,uint256[])` and selector `0x6c7684fe` #[derive( Clone, ::ethers::contract::EthCall, @@ -10919,8 +11976,11 @@ pub mod summa { Eq, Hash )] - #[ethcall(name = "verifyZkProof", abi = "verifyZkProof(bytes,uint256[])")] - pub struct VerifyZkProofCall { + #[ethcall( + name = "verifySolvencyProof", + abi = "verifySolvencyProof(bytes,uint256[])" + )] + pub struct VerifySolvencyProofCall { pub proof: ::ethers::core::types::Bytes, pub public_inputs: ::std::vec::Vec<::ethers::core::types::U256>, } @@ -10928,13 +11988,15 @@ pub mod summa { #[derive(Clone, ::ethers::contract::EthAbiType, Debug, PartialEq, Eq, Hash)] pub enum SummaCalls { AddressOwnershipProofs(AddressOwnershipProofsCall), + MstRoots(MstRootsCall), Owner(OwnerCall), OwnershipProofByAddress(OwnershipProofByAddressCall), RenounceOwnership(RenounceOwnershipCall), SubmitProofOfAddressOwnership(SubmitProofOfAddressOwnershipCall), SubmitProofOfSolvency(SubmitProofOfSolvencyCall), TransferOwnership(TransferOwnershipCall), - VerifyZkProof(VerifyZkProofCall), + VerifyInclusionProof(VerifyInclusionProofCall), + VerifySolvencyProof(VerifySolvencyProofCall), } impl ::ethers::core::abi::AbiDecode for SummaCalls { fn decode( @@ -10947,6 +12009,10 @@ pub mod summa { ) { return Ok(Self::AddressOwnershipProofs(decoded)); } + if let Ok(decoded) + = ::decode(data) { + return Ok(Self::MstRoots(decoded)); + } if let Ok(decoded) = ::decode(data) { return Ok(Self::Owner(decoded)); @@ -10982,8 +12048,16 @@ pub mod summa { return Ok(Self::TransferOwnership(decoded)); } if let Ok(decoded) - = ::decode(data) { - return Ok(Self::VerifyZkProof(decoded)); + = ::decode( + data, + ) { + return Ok(Self::VerifyInclusionProof(decoded)); + } + if let Ok(decoded) + = ::decode( + data, + ) { + return Ok(Self::VerifySolvencyProof(decoded)); } Err(::ethers::core::abi::Error::InvalidData.into()) } @@ -10994,6 +12068,9 @@ pub mod summa { Self::AddressOwnershipProofs(element) => { ::ethers::core::abi::AbiEncode::encode(element) } + Self::MstRoots(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::Owner(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::OwnershipProofByAddress(element) => { ::ethers::core::abi::AbiEncode::encode(element) @@ -11010,7 +12087,10 @@ pub mod summa { Self::TransferOwnership(element) => { ::ethers::core::abi::AbiEncode::encode(element) } - Self::VerifyZkProof(element) => { + Self::VerifyInclusionProof(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } + Self::VerifySolvencyProof(element) => { ::ethers::core::abi::AbiEncode::encode(element) } } @@ -11022,6 +12102,7 @@ pub mod summa { Self::AddressOwnershipProofs(element) => { ::core::fmt::Display::fmt(element, f) } + Self::MstRoots(element) => ::core::fmt::Display::fmt(element, f), Self::Owner(element) => ::core::fmt::Display::fmt(element, f), Self::OwnershipProofByAddress(element) => { ::core::fmt::Display::fmt(element, f) @@ -11034,7 +12115,12 @@ pub mod summa { ::core::fmt::Display::fmt(element, f) } Self::TransferOwnership(element) => ::core::fmt::Display::fmt(element, f), - Self::VerifyZkProof(element) => ::core::fmt::Display::fmt(element, f), + Self::VerifyInclusionProof(element) => { + ::core::fmt::Display::fmt(element, f) + } + Self::VerifySolvencyProof(element) => { + ::core::fmt::Display::fmt(element, f) + } } } } @@ -11043,6 +12129,11 @@ pub mod summa { Self::AddressOwnershipProofs(value) } } + impl ::core::convert::From for SummaCalls { + fn from(value: MstRootsCall) -> Self { + Self::MstRoots(value) + } + } impl ::core::convert::From for SummaCalls { fn from(value: OwnerCall) -> Self { Self::Owner(value) @@ -11073,9 +12164,14 @@ pub mod summa { Self::TransferOwnership(value) } } - impl ::core::convert::From for SummaCalls { - fn from(value: VerifyZkProofCall) -> Self { - Self::VerifyZkProof(value) + impl ::core::convert::From for SummaCalls { + fn from(value: VerifyInclusionProofCall) -> Self { + Self::VerifyInclusionProof(value) + } + } + impl ::core::convert::From for SummaCalls { + fn from(value: VerifySolvencyProofCall) -> Self { + Self::VerifySolvencyProof(value) } } ///Container type for all return fields from the `addressOwnershipProofs` function with signature `addressOwnershipProofs(uint256)` and selector `0xa3c4bcf8` @@ -11095,6 +12191,18 @@ pub mod summa { pub signature: ::ethers::core::types::Bytes, pub message: ::ethers::core::types::Bytes, } + ///Container type for all return fields from the `mstRoots` function with signature `mstRoots(uint256)` and selector `0x7f3bfb2e` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + Default, + Debug, + PartialEq, + Eq, + Hash + )] + pub struct MstRootsReturn(pub ::ethers::core::types::U256); ///Container type for all return fields from the `owner` function with signature `owner()` and selector `0x8da5cb5b` #[derive( Clone, @@ -11119,7 +12227,19 @@ pub mod summa { Hash )] pub struct OwnershipProofByAddressReturn(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `verifyZkProof` function with signature `verifyZkProof(bytes,uint256[])` and selector `0xe691ad33` + ///Container type for all return fields from the `verifyInclusionProof` function with signature `verifyInclusionProof(bytes,uint256[],uint256)` and selector `0xc8e58147` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + Default, + Debug, + PartialEq, + Eq, + Hash + )] + pub struct VerifyInclusionProofReturn(pub bool); + ///Container type for all return fields from the `verifySolvencyProof` function with signature `verifySolvencyProof(bytes,uint256[])` and selector `0x6c7684fe` #[derive( Clone, ::ethers::contract::EthAbiType, @@ -11130,7 +12250,7 @@ pub mod summa { Eq, Hash )] - pub struct VerifyZkProofReturn(pub bool); + pub struct VerifySolvencyProofReturn(pub bool); ///`AddressOwnershipProof(string,string,bytes,bytes)` #[derive( Clone, diff --git a/backend/src/contracts/tests.rs b/backend/src/contracts/tests.rs index fe9e8845..7632fc9e 100644 --- a/backend/src/contracts/tests.rs +++ b/backend/src/contracts/tests.rs @@ -85,11 +85,12 @@ mod test { use crate::contracts::{ generated::{ + inclusion_verifier::InclusionVerifier, + solvency_verifier::SolvencyVerifier, summa_contract::{ AddressOwnershipProof, AddressOwnershipProofSubmittedFilter, Asset, SolvencyProofSubmittedFilter, Summa, }, - verifier::SolvencyVerifier, }, mock::mock_erc20, signer::SummaSigner, @@ -121,18 +122,30 @@ mod test { async fn test_submit_proof_of_solvency() { let (anvil, cex_addr_1, cex_addr_2, client, _mock_erc20) = initialize_anvil().await; - let verifer_contract = SolvencyVerifier::deploy(Arc::clone(&client), ()) + let solvency_verifer_contract = SolvencyVerifier::deploy(Arc::clone(&client), ()) .unwrap() .send() .await .unwrap(); - let summa_contract = Summa::deploy(Arc::clone(&client), verifer_contract.address()) + let inclusion_verifer_contract = InclusionVerifier::deploy(Arc::clone(&client), ()) .unwrap() .send() .await .unwrap(); + let summa_contract = Summa::deploy( + Arc::clone(&client), + ( + solvency_verifer_contract.address(), + inclusion_verifer_contract.address(), + ), + ) + .unwrap() + .send() + .await + .unwrap(); + let summa_signer = SummaSigner::new( &vec![ "0xdf57089febbacf7ba0bc227dafbffa9fc08a93fdc68e1e42411a14efcf23656e", @@ -190,7 +203,7 @@ mod test { } ); - let path = "../zk_prover/examples/proof_solidity_calldata.json"; + let path = "../zk_prover/examples/solvency_proof_solidity_calldata.json"; let json_data = read_to_string(path).expect("Unable to read the file"); let calldata: ProofSolidityCallData = from_str(&json_data).unwrap(); diff --git a/contracts/scripts/deploy.ts b/contracts/scripts/deploy.ts index 9c86b159..4425c4dc 100644 --- a/contracts/scripts/deploy.ts +++ b/contracts/scripts/deploy.ts @@ -10,12 +10,20 @@ type Deployments = { }; async function main() { - const verifier = await ethers.deployContract( + const solvencyVerifier = await ethers.deployContract( "src/SolvencyVerifier.sol:Verifier" ); - await verifier.deployed(); + await solvencyVerifier.deployed(); - const summa = await ethers.deployContract("Summa", [verifier.address]); + const inclusionVerifier = await ethers.deployContract( + "src/InclusionVerifier.sol:Verifier" + ); + await inclusionVerifier.deployed(); + + const summa = await ethers.deployContract("Summa", [ + solvencyVerifier.address, + inclusionVerifier.address, + ]); await summa.deployed(); @@ -54,6 +62,7 @@ async function main() { //Copy the ABIs from `artifacts/src/*` to `backend/src/contracts/*` copyAbi(fs, "Summa", "Summa"); copyAbi(fs, "SolvencyVerifier", "Verifier"); + copyAbi(fs, "InclusionVerifier", "Verifier"); } // We recommend this pattern to be able to use async/await everywhere @@ -63,11 +72,11 @@ main().catch((error) => { process.exitCode = 1; }); -function copyAbi(fs: any, path: string, contractName: string) { - const abi = require(`../artifacts/src/${path}.sol/${contractName}.json`); +function copyAbi(fs: any, filename: string, contractName: string) { + const abi = require(`../artifacts/src/${filename}.sol/${contractName}.json`); const abiStringified = JSON.stringify(abi); fs.writeFileSync( - `../backend/src/contracts/abi/${contractName}.json`, + `../backend/src/contracts/abi/${filename}.json`, abiStringified ); } diff --git a/contracts/src/InclusionVerifier.sol b/contracts/src/InclusionVerifier.sol new file mode 100644 index 00000000..aca9729e --- /dev/null +++ b/contracts/src/InclusionVerifier.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT + pragma solidity ^0.8.17; + + contract Verifier { + function verify( + uint256[] memory pubInputs, + bytes memory proof + ) public view returns (bool) { + bool success = true; + bytes32[902] memory transcript; + assembly { let f_p := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47 let f_q := 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001 function validate_ec_point(x, y) -> valid { { let x_lt_p := lt(x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let y_lt_p := lt(y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) valid := and(x_lt_p, y_lt_p) } { let y_square := mulmod(y, y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_square := mulmod(x, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_cube := mulmod(x_square, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let x_cube_plus_3 := addmod(x_cube, 3, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) let is_affine := eq(x_cube_plus_3, y_square) valid := and(valid, is_affine) } } mstore(add(transcript, 0x20), mod(mload(add(pubInputs, 0x20)), f_q))mstore(add(transcript, 0x40), mod(mload(add(pubInputs, 0x40)), f_q))mstore(add(transcript, 0x0), 17529190814129643618827022425812408993103566606845457031195635551857697656486) { let x := mload(add(proof, 0x20)) mstore(add(transcript, 0x60), x) let y := mload(add(proof, 0x40)) mstore(add(transcript, 0x80), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x60)) mstore(add(transcript, 0xa0), x) let y := mload(add(proof, 0x80)) mstore(add(transcript, 0xc0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0xa0)) mstore(add(transcript, 0xe0), x) let y := mload(add(proof, 0xc0)) mstore(add(transcript, 0x100), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x120), keccak256(add(transcript, 0x0), 288)){ let hash := mload(add(transcript, 0x120)) mstore(add(transcript, 0x140), mod(hash, f_q)) mstore(add(transcript, 0x160), hash) } { let x := mload(add(proof, 0xe0)) mstore(add(transcript, 0x180), x) let y := mload(add(proof, 0x100)) mstore(add(transcript, 0x1a0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x120)) mstore(add(transcript, 0x1c0), x) let y := mload(add(proof, 0x140)) mstore(add(transcript, 0x1e0), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x200), keccak256(add(transcript, 0x160), 160)){ let hash := mload(add(transcript, 0x200)) mstore(add(transcript, 0x220), mod(hash, f_q)) mstore(add(transcript, 0x240), hash) }mstore8(add(transcript, 0x260), 1)mstore(add(transcript, 0x260), keccak256(add(transcript, 0x240), 33)){ let hash := mload(add(transcript, 0x260)) mstore(add(transcript, 0x280), mod(hash, f_q)) mstore(add(transcript, 0x2a0), hash) } { let x := mload(add(proof, 0x160)) mstore(add(transcript, 0x2c0), x) let y := mload(add(proof, 0x180)) mstore(add(transcript, 0x2e0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x1a0)) mstore(add(transcript, 0x300), x) let y := mload(add(proof, 0x1c0)) mstore(add(transcript, 0x320), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x1e0)) mstore(add(transcript, 0x340), x) let y := mload(add(proof, 0x200)) mstore(add(transcript, 0x360), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x220)) mstore(add(transcript, 0x380), x) let y := mload(add(proof, 0x240)) mstore(add(transcript, 0x3a0), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x3c0), keccak256(add(transcript, 0x2a0), 288)){ let hash := mload(add(transcript, 0x3c0)) mstore(add(transcript, 0x3e0), mod(hash, f_q)) mstore(add(transcript, 0x400), hash) } { let x := mload(add(proof, 0x260)) mstore(add(transcript, 0x420), x) let y := mload(add(proof, 0x280)) mstore(add(transcript, 0x440), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x2a0)) mstore(add(transcript, 0x460), x) let y := mload(add(proof, 0x2c0)) mstore(add(transcript, 0x480), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x2e0)) mstore(add(transcript, 0x4a0), x) let y := mload(add(proof, 0x300)) mstore(add(transcript, 0x4c0), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x320)) mstore(add(transcript, 0x4e0), x) let y := mload(add(proof, 0x340)) mstore(add(transcript, 0x500), y) success := and(validate_ec_point(x, y), success) } { let x := mload(add(proof, 0x360)) mstore(add(transcript, 0x520), x) let y := mload(add(proof, 0x380)) mstore(add(transcript, 0x540), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0x560), keccak256(add(transcript, 0x400), 352)){ let hash := mload(add(transcript, 0x560)) mstore(add(transcript, 0x580), mod(hash, f_q)) mstore(add(transcript, 0x5a0), hash) }mstore(add(transcript, 0x5c0), mod(mload(add(proof, 0x3a0)), f_q))mstore(add(transcript, 0x5e0), mod(mload(add(proof, 0x3c0)), f_q))mstore(add(transcript, 0x600), mod(mload(add(proof, 0x3e0)), f_q))mstore(add(transcript, 0x620), mod(mload(add(proof, 0x400)), f_q))mstore(add(transcript, 0x640), mod(mload(add(proof, 0x420)), f_q))mstore(add(transcript, 0x660), mod(mload(add(proof, 0x440)), f_q))mstore(add(transcript, 0x680), mod(mload(add(proof, 0x460)), f_q))mstore(add(transcript, 0x6a0), mod(mload(add(proof, 0x480)), f_q))mstore(add(transcript, 0x6c0), mod(mload(add(proof, 0x4a0)), f_q))mstore(add(transcript, 0x6e0), mod(mload(add(proof, 0x4c0)), f_q))mstore(add(transcript, 0x700), mod(mload(add(proof, 0x4e0)), f_q))mstore(add(transcript, 0x720), mod(mload(add(proof, 0x500)), f_q))mstore(add(transcript, 0x740), mod(mload(add(proof, 0x520)), f_q))mstore(add(transcript, 0x760), mod(mload(add(proof, 0x540)), f_q))mstore(add(transcript, 0x780), mod(mload(add(proof, 0x560)), f_q))mstore(add(transcript, 0x7a0), mod(mload(add(proof, 0x580)), f_q))mstore(add(transcript, 0x7c0), mod(mload(add(proof, 0x5a0)), f_q))mstore(add(transcript, 0x7e0), mod(mload(add(proof, 0x5c0)), f_q))mstore(add(transcript, 0x800), mod(mload(add(proof, 0x5e0)), f_q))mstore(add(transcript, 0x820), mod(mload(add(proof, 0x600)), f_q))mstore(add(transcript, 0x840), mod(mload(add(proof, 0x620)), f_q))mstore(add(transcript, 0x860), mod(mload(add(proof, 0x640)), f_q))mstore(add(transcript, 0x880), mod(mload(add(proof, 0x660)), f_q))mstore(add(transcript, 0x8a0), mod(mload(add(proof, 0x680)), f_q))mstore(add(transcript, 0x8c0), mod(mload(add(proof, 0x6a0)), f_q))mstore(add(transcript, 0x8e0), mod(mload(add(proof, 0x6c0)), f_q))mstore(add(transcript, 0x900), mod(mload(add(proof, 0x6e0)), f_q))mstore(add(transcript, 0x920), mod(mload(add(proof, 0x700)), f_q))mstore(add(transcript, 0x940), mod(mload(add(proof, 0x720)), f_q))mstore(add(transcript, 0x960), mod(mload(add(proof, 0x740)), f_q))mstore(add(transcript, 0x980), mod(mload(add(proof, 0x760)), f_q))mstore(add(transcript, 0x9a0), mod(mload(add(proof, 0x780)), f_q))mstore(add(transcript, 0x9c0), mod(mload(add(proof, 0x7a0)), f_q))mstore(add(transcript, 0x9e0), mod(mload(add(proof, 0x7c0)), f_q))mstore(add(transcript, 0xa00), mod(mload(add(proof, 0x7e0)), f_q))mstore(add(transcript, 0xa20), keccak256(add(transcript, 0x5a0), 1152)){ let hash := mload(add(transcript, 0xa20)) mstore(add(transcript, 0xa40), mod(hash, f_q)) mstore(add(transcript, 0xa60), hash) }mstore8(add(transcript, 0xa80), 1)mstore(add(transcript, 0xa80), keccak256(add(transcript, 0xa60), 33)){ let hash := mload(add(transcript, 0xa80)) mstore(add(transcript, 0xaa0), mod(hash, f_q)) mstore(add(transcript, 0xac0), hash) } { let x := mload(add(proof, 0x800)) mstore(add(transcript, 0xae0), x) let y := mload(add(proof, 0x820)) mstore(add(transcript, 0xb00), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0xb20), keccak256(add(transcript, 0xac0), 96)){ let hash := mload(add(transcript, 0xb20)) mstore(add(transcript, 0xb40), mod(hash, f_q)) mstore(add(transcript, 0xb60), hash) } { let x := mload(add(proof, 0x840)) mstore(add(transcript, 0xb80), x) let y := mload(add(proof, 0x860)) mstore(add(transcript, 0xba0), y) success := and(validate_ec_point(x, y), success) }mstore(add(transcript, 0xbc0), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x580)), f_q))mstore(add(transcript, 0xbe0), mulmod(mload(add(transcript, 0xbc0)), mload(add(transcript, 0xbc0)), f_q))mstore(add(transcript, 0xc00), mulmod(mload(add(transcript, 0xbe0)), mload(add(transcript, 0xbe0)), f_q))mstore(add(transcript, 0xc20), mulmod(mload(add(transcript, 0xc00)), mload(add(transcript, 0xc00)), f_q))mstore(add(transcript, 0xc40), mulmod(mload(add(transcript, 0xc20)), mload(add(transcript, 0xc20)), f_q))mstore(add(transcript, 0xc60), mulmod(mload(add(transcript, 0xc40)), mload(add(transcript, 0xc40)), f_q))mstore(add(transcript, 0xc80), mulmod(mload(add(transcript, 0xc60)), mload(add(transcript, 0xc60)), f_q))mstore(add(transcript, 0xca0), mulmod(mload(add(transcript, 0xc80)), mload(add(transcript, 0xc80)), f_q))mstore(add(transcript, 0xcc0), mulmod(mload(add(transcript, 0xca0)), mload(add(transcript, 0xca0)), f_q))mstore(add(transcript, 0xce0), mulmod(mload(add(transcript, 0xcc0)), mload(add(transcript, 0xcc0)), f_q))mstore(add(transcript, 0xd00), mulmod(mload(add(transcript, 0xce0)), mload(add(transcript, 0xce0)), f_q))mstore(add(transcript, 0xd20), addmod(mload(add(transcript, 0xd00)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(add(transcript, 0xd40), mulmod(mload(add(transcript, 0xd20)), 21877555253249509951141793242451973684696534144361143701928820297812832026625, f_q))mstore(add(transcript, 0xd60), mulmod(mload(add(transcript, 0xd40)), 15699029810934084314820646074566828280617789951162923449200398535581206172418, f_q))mstore(add(transcript, 0xd80), addmod(mload(add(transcript, 0x580)), 6189213060905190907425759670690446807930574449253110894497805650994602323199, f_q))mstore(add(transcript, 0xda0), mulmod(mload(add(transcript, 0xd40)), 16553167948716468074998850291160946772606011499093267774599468837293218566225, f_q))mstore(add(transcript, 0xdc0), addmod(mload(add(transcript, 0x580)), 5335074923122807147247555454096328315942352901322766569098735349282589929392, f_q))mstore(add(transcript, 0xde0), mulmod(mload(add(transcript, 0xd40)), 4260969412351770314333984243767775737437927068151180798236715529158398853173, f_q))mstore(add(transcript, 0xe00), addmod(mload(add(transcript, 0x580)), 17627273459487504907912421501489499351110437332264853545461488657417409642444, f_q))mstore(add(transcript, 0xe20), mulmod(mload(add(transcript, 0xd40)), 18302882236472339419631414285403968768409802182737928837767912484847322191909, f_q))mstore(add(transcript, 0xe40), addmod(mload(add(transcript, 0x580)), 3585360635366935802614991459853306320138562217678105505930291701728486303708, f_q))mstore(add(transcript, 0xe60), mulmod(mload(add(transcript, 0xd40)), 4925592601992654644734291590386747644864797672605745962807370354577123815907, f_q))mstore(add(transcript, 0xe80), addmod(mload(add(transcript, 0x580)), 16962650269846620577512114154870527443683566727810288380890833831998684679710, f_q))mstore(add(transcript, 0xea0), mulmod(mload(add(transcript, 0xd40)), 19444693496467964793333684482470811869395409953158764080291550423779334624794, f_q))mstore(add(transcript, 0xec0), addmod(mload(add(transcript, 0x580)), 2443549375371310428912721262786463219152954447257270263406653762796473870823, f_q))mstore(add(transcript, 0xee0), mulmod(mload(add(transcript, 0xd40)), 1, f_q))mstore(add(transcript, 0xf00), addmod(mload(add(transcript, 0x580)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q))mstore(add(transcript, 0xf20), mulmod(mload(add(transcript, 0xd40)), 9396103202274256930945606623206526900461945684265495839012435492634193195103, f_q))mstore(add(transcript, 0xf40), addmod(mload(add(transcript, 0x580)), 12492139669565018291300799122050748188086418716150538504685768693941615300514, f_q)){ let prod := mload(add(transcript, 0xd80)) prod := mulmod(mload(add(transcript, 0xdc0)), prod, f_q) mstore(add(transcript, 0xf60), prod) prod := mulmod(mload(add(transcript, 0xe00)), prod, f_q) mstore(add(transcript, 0xf80), prod) prod := mulmod(mload(add(transcript, 0xe40)), prod, f_q) mstore(add(transcript, 0xfa0), prod) prod := mulmod(mload(add(transcript, 0xe80)), prod, f_q) mstore(add(transcript, 0xfc0), prod) prod := mulmod(mload(add(transcript, 0xec0)), prod, f_q) mstore(add(transcript, 0xfe0), prod) prod := mulmod(mload(add(transcript, 0xf00)), prod, f_q) mstore(add(transcript, 0x1000), prod) prod := mulmod(mload(add(transcript, 0xf40)), prod, f_q) mstore(add(transcript, 0x1020), prod) prod := mulmod(mload(add(transcript, 0xd20)), prod, f_q) mstore(add(transcript, 0x1040), prod) }mstore(add(transcript, 0x1080), 32)mstore(add(transcript, 0x10a0), 32)mstore(add(transcript, 0x10c0), 32)mstore(add(transcript, 0x10e0), mload(add(transcript, 0x1040)))mstore(add(transcript, 0x1100), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x1120), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x1080), 0xc0, add(transcript, 0x1060), 0x20), 1), success){ let inv := mload(add(transcript, 0x1060)) let v v := mload(add(transcript, 0xd20)) mstore(add(transcript, 0xd20), mulmod(mload(add(transcript, 0x1020)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xf40)) mstore(add(transcript, 0xf40), mulmod(mload(add(transcript, 0x1000)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xf00)) mstore(add(transcript, 0xf00), mulmod(mload(add(transcript, 0xfe0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xec0)) mstore(add(transcript, 0xec0), mulmod(mload(add(transcript, 0xfc0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe80)) mstore(add(transcript, 0xe80), mulmod(mload(add(transcript, 0xfa0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe40)) mstore(add(transcript, 0xe40), mulmod(mload(add(transcript, 0xf80)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xe00)) mstore(add(transcript, 0xe00), mulmod(mload(add(transcript, 0xf60)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0xdc0)) mstore(add(transcript, 0xdc0), mulmod(mload(add(transcript, 0xd80)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0xd80), inv) }mstore(add(transcript, 0x1140), mulmod(mload(add(transcript, 0xd60)), mload(add(transcript, 0xd80)), f_q))mstore(add(transcript, 0x1160), mulmod(mload(add(transcript, 0xda0)), mload(add(transcript, 0xdc0)), f_q))mstore(add(transcript, 0x1180), mulmod(mload(add(transcript, 0xde0)), mload(add(transcript, 0xe00)), f_q))mstore(add(transcript, 0x11a0), mulmod(mload(add(transcript, 0xe20)), mload(add(transcript, 0xe40)), f_q))mstore(add(transcript, 0x11c0), mulmod(mload(add(transcript, 0xe60)), mload(add(transcript, 0xe80)), f_q))mstore(add(transcript, 0x11e0), mulmod(mload(add(transcript, 0xea0)), mload(add(transcript, 0xec0)), f_q))mstore(add(transcript, 0x1200), mulmod(mload(add(transcript, 0xee0)), mload(add(transcript, 0xf00)), f_q))mstore(add(transcript, 0x1220), mulmod(mload(add(transcript, 0xf20)), mload(add(transcript, 0xf40)), f_q)){ let result := mulmod(mload(add(transcript, 0x1200)), mload(add(transcript, 0x20)), f_q)result := addmod(mulmod(mload(add(transcript, 0x1220)), mload(add(transcript, 0x40)), f_q), result, f_q)mstore(add(transcript, 0x1240), result) }mstore(add(transcript, 0x1260), addmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x6e0)), f_q))mstore(add(transcript, 0x1280), mulmod(mload(add(transcript, 0x1260)), mload(add(transcript, 0x1260)), f_q))mstore(add(transcript, 0x12a0), mulmod(mload(add(transcript, 0x1280)), mload(add(transcript, 0x1280)), f_q))mstore(add(transcript, 0x12c0), mulmod(mload(add(transcript, 0x1260)), mload(add(transcript, 0x12a0)), f_q))mstore(add(transcript, 0x12e0), mulmod(mload(add(transcript, 0x12c0)), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q))mstore(add(transcript, 0x1300), addmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x700)), f_q))mstore(add(transcript, 0x1320), mulmod(mload(add(transcript, 0x1300)), mload(add(transcript, 0x1300)), f_q))mstore(add(transcript, 0x1340), mulmod(mload(add(transcript, 0x1320)), mload(add(transcript, 0x1320)), f_q))mstore(add(transcript, 0x1360), mulmod(mload(add(transcript, 0x1300)), mload(add(transcript, 0x1340)), f_q))mstore(add(transcript, 0x1380), mulmod(mload(add(transcript, 0x1360)), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q))mstore(add(transcript, 0x13a0), addmod(mload(add(transcript, 0x12e0)), mload(add(transcript, 0x1380)), f_q))mstore(add(transcript, 0x13c0), addmod(mload(add(transcript, 0x13a0)), sub(f_q, mload(add(transcript, 0x600))), f_q))mstore(add(transcript, 0x13e0), mulmod(mload(add(transcript, 0x13c0)), mload(add(transcript, 0x780)), f_q))mstore(add(transcript, 0x1400), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x13e0)), f_q))mstore(add(transcript, 0x1420), mulmod(mload(add(transcript, 0x12c0)), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q))mstore(add(transcript, 0x1440), mulmod(mload(add(transcript, 0x1360)), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q))mstore(add(transcript, 0x1460), addmod(mload(add(transcript, 0x1420)), mload(add(transcript, 0x1440)), f_q))mstore(add(transcript, 0x1480), addmod(mload(add(transcript, 0x1460)), sub(f_q, mload(add(transcript, 0x620))), f_q))mstore(add(transcript, 0x14a0), mulmod(mload(add(transcript, 0x1480)), mload(add(transcript, 0x780)), f_q))mstore(add(transcript, 0x14c0), addmod(mload(add(transcript, 0x1400)), mload(add(transcript, 0x14a0)), f_q))mstore(add(transcript, 0x14e0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x14c0)), f_q))mstore(add(transcript, 0x1500), addmod(mload(add(transcript, 0x12c0)), sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x1520), mulmod(mload(add(transcript, 0x1500)), mload(add(transcript, 0x7a0)), f_q))mstore(add(transcript, 0x1540), addmod(mload(add(transcript, 0x14e0)), mload(add(transcript, 0x1520)), f_q))mstore(add(transcript, 0x1560), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1540)), f_q))mstore(add(transcript, 0x1580), mulmod(mload(add(transcript, 0x640)), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q))mstore(add(transcript, 0x15a0), mulmod(mload(add(transcript, 0x1300)), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q))mstore(add(transcript, 0x15c0), addmod(mload(add(transcript, 0x1580)), mload(add(transcript, 0x15a0)), f_q))mstore(add(transcript, 0x15e0), addmod(mload(add(transcript, 0x15c0)), mload(add(transcript, 0x6a0)), f_q))mstore(add(transcript, 0x1600), mulmod(mload(add(transcript, 0x15e0)), mload(add(transcript, 0x15e0)), f_q))mstore(add(transcript, 0x1620), mulmod(mload(add(transcript, 0x1600)), mload(add(transcript, 0x1600)), f_q))mstore(add(transcript, 0x1640), mulmod(mload(add(transcript, 0x15e0)), mload(add(transcript, 0x1620)), f_q))mstore(add(transcript, 0x1660), mulmod(mload(add(transcript, 0x600)), 8897705321156975119607866206188469715432233408805434913352778521345836531302, f_q))mstore(add(transcript, 0x1680), mulmod(mload(add(transcript, 0x620)), 13897810991298242824030978581179475767377101082166056046492926701399149797630, f_q))mstore(add(transcript, 0x16a0), addmod(mload(add(transcript, 0x1660)), mload(add(transcript, 0x1680)), f_q))mstore(add(transcript, 0x16c0), addmod(mload(add(transcript, 0x1640)), sub(f_q, mload(add(transcript, 0x16a0))), f_q))mstore(add(transcript, 0x16e0), mulmod(mload(add(transcript, 0x16c0)), mload(add(transcript, 0x7a0)), f_q))mstore(add(transcript, 0x1700), addmod(mload(add(transcript, 0x1560)), mload(add(transcript, 0x16e0)), f_q))mstore(add(transcript, 0x1720), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1700)), f_q))mstore(add(transcript, 0x1740), mulmod(mload(add(transcript, 0x640)), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q))mstore(add(transcript, 0x1760), mulmod(mload(add(transcript, 0x1300)), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q))mstore(add(transcript, 0x1780), addmod(mload(add(transcript, 0x1740)), mload(add(transcript, 0x1760)), f_q))mstore(add(transcript, 0x17a0), addmod(mload(add(transcript, 0x1780)), mload(add(transcript, 0x6c0)), f_q))mstore(add(transcript, 0x17c0), mulmod(mload(add(transcript, 0x600)), 7127083008168878795310303301757642617203533252990949589494537404444738046722, f_q))mstore(add(transcript, 0x17e0), mulmod(mload(add(transcript, 0x620)), 10251091711782631878897995303436082826711938358699127319815611151510940403902, f_q))mstore(add(transcript, 0x1800), addmod(mload(add(transcript, 0x17c0)), mload(add(transcript, 0x17e0)), f_q))mstore(add(transcript, 0x1820), addmod(mload(add(transcript, 0x17a0)), sub(f_q, mload(add(transcript, 0x1800))), f_q))mstore(add(transcript, 0x1840), mulmod(mload(add(transcript, 0x1820)), mload(add(transcript, 0x7a0)), f_q))mstore(add(transcript, 0x1860), addmod(mload(add(transcript, 0x1720)), mload(add(transcript, 0x1840)), f_q))mstore(add(transcript, 0x1880), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1860)), f_q))mstore(add(transcript, 0x18a0), addmod(1, sub(f_q, mload(add(transcript, 0x760))), f_q))mstore(add(transcript, 0x18c0), mulmod(mload(add(transcript, 0x18a0)), mload(add(transcript, 0x760)), f_q))mstore(add(transcript, 0x18e0), addmod(2, sub(f_q, mload(add(transcript, 0x760))), f_q))mstore(add(transcript, 0x1900), mulmod(mload(add(transcript, 0x18e0)), mload(add(transcript, 0x18c0)), f_q))mstore(add(transcript, 0x1920), addmod(4, sub(f_q, mload(add(transcript, 0x760))), f_q))mstore(add(transcript, 0x1940), mulmod(mload(add(transcript, 0x1920)), mload(add(transcript, 0x1900)), f_q))mstore(add(transcript, 0x1960), addmod(mload(add(transcript, 0x680)), mload(add(transcript, 0x5c0)), f_q))mstore(add(transcript, 0x1980), addmod(mload(add(transcript, 0x1960)), sub(f_q, mload(add(transcript, 0x600))), f_q))mstore(add(transcript, 0x19a0), mulmod(mload(add(transcript, 0x1980)), mload(add(transcript, 0x1940)), f_q))mstore(add(transcript, 0x19c0), addmod(mload(add(transcript, 0x1880)), mload(add(transcript, 0x19a0)), f_q))mstore(add(transcript, 0x19e0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x19c0)), f_q))mstore(add(transcript, 0x1a00), addmod(mload(add(transcript, 0x660)), sub(f_q, mload(add(transcript, 0x620))), f_q))mstore(add(transcript, 0x1a20), mulmod(mload(add(transcript, 0x1a00)), mload(add(transcript, 0x1940)), f_q))mstore(add(transcript, 0x1a40), addmod(mload(add(transcript, 0x19e0)), mload(add(transcript, 0x1a20)), f_q))mstore(add(transcript, 0x1a60), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1a40)), f_q))mstore(add(transcript, 0x1a80), mulmod(mload(add(transcript, 0x13c0)), mload(add(transcript, 0x7c0)), f_q))mstore(add(transcript, 0x1aa0), addmod(mload(add(transcript, 0x1a60)), mload(add(transcript, 0x1a80)), f_q))mstore(add(transcript, 0x1ac0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1aa0)), f_q))mstore(add(transcript, 0x1ae0), mulmod(mload(add(transcript, 0x1480)), mload(add(transcript, 0x7c0)), f_q))mstore(add(transcript, 0x1b00), addmod(mload(add(transcript, 0x1ac0)), mload(add(transcript, 0x1ae0)), f_q))mstore(add(transcript, 0x1b20), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1b00)), f_q))mstore(add(transcript, 0x1b40), mulmod(mload(add(transcript, 0x1500)), mload(add(transcript, 0x7e0)), f_q))mstore(add(transcript, 0x1b60), addmod(mload(add(transcript, 0x1b20)), mload(add(transcript, 0x1b40)), f_q))mstore(add(transcript, 0x1b80), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1b60)), f_q))mstore(add(transcript, 0x1ba0), mulmod(mload(add(transcript, 0x16c0)), mload(add(transcript, 0x7e0)), f_q))mstore(add(transcript, 0x1bc0), addmod(mload(add(transcript, 0x1b80)), mload(add(transcript, 0x1ba0)), f_q))mstore(add(transcript, 0x1be0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1bc0)), f_q))mstore(add(transcript, 0x1c00), mulmod(mload(add(transcript, 0x1820)), mload(add(transcript, 0x7e0)), f_q))mstore(add(transcript, 0x1c20), addmod(mload(add(transcript, 0x1be0)), mload(add(transcript, 0x1c00)), f_q))mstore(add(transcript, 0x1c40), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1c20)), f_q))mstore(add(transcript, 0x1c60), addmod(3, sub(f_q, mload(add(transcript, 0x760))), f_q))mstore(add(transcript, 0x1c80), mulmod(mload(add(transcript, 0x1c60)), mload(add(transcript, 0x1900)), f_q))mstore(add(transcript, 0x1ca0), mulmod(mload(add(transcript, 0x1980)), mload(add(transcript, 0x1c80)), f_q))mstore(add(transcript, 0x1cc0), addmod(mload(add(transcript, 0x1c40)), mload(add(transcript, 0x1ca0)), f_q))mstore(add(transcript, 0x1ce0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1cc0)), f_q))mstore(add(transcript, 0x1d00), mulmod(mload(add(transcript, 0x1a00)), mload(add(transcript, 0x1c80)), f_q))mstore(add(transcript, 0x1d20), addmod(mload(add(transcript, 0x1ce0)), mload(add(transcript, 0x1d00)), f_q))mstore(add(transcript, 0x1d40), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1d20)), f_q))mstore(add(transcript, 0x1d60), mulmod(mload(add(transcript, 0x18e0)), mload(add(transcript, 0x760)), f_q))mstore(add(transcript, 0x1d80), mulmod(mload(add(transcript, 0x1c60)), mload(add(transcript, 0x1d60)), f_q))mstore(add(transcript, 0x1da0), mulmod(mload(add(transcript, 0x1920)), mload(add(transcript, 0x1d80)), f_q))mstore(add(transcript, 0x1dc0), mulmod(mload(add(transcript, 0x640)), mload(add(transcript, 0x1da0)), f_q))mstore(add(transcript, 0x1de0), addmod(1, sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x1e00), mulmod(mload(add(transcript, 0x1de0)), mload(add(transcript, 0x1dc0)), f_q))mstore(add(transcript, 0x1e20), addmod(mload(add(transcript, 0x1d40)), mload(add(transcript, 0x1e00)), f_q))mstore(add(transcript, 0x1e40), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1e20)), f_q))mstore(add(transcript, 0x1e60), mulmod(2, mload(add(transcript, 0x640)), f_q))mstore(add(transcript, 0x1e80), addmod(mload(add(transcript, 0x5e0)), sub(f_q, mload(add(transcript, 0x5c0))), f_q))mstore(add(transcript, 0x1ea0), mulmod(mload(add(transcript, 0x1e80)), mload(add(transcript, 0x1e60)), f_q))mstore(add(transcript, 0x1ec0), addmod(mload(add(transcript, 0x600)), sub(f_q, mload(add(transcript, 0x5c0))), f_q))mstore(add(transcript, 0x1ee0), addmod(mload(add(transcript, 0x1ea0)), sub(f_q, mload(add(transcript, 0x1ec0))), f_q))mstore(add(transcript, 0x1f00), addmod(mload(add(transcript, 0x5e0)), sub(f_q, mload(add(transcript, 0x620))), f_q))mstore(add(transcript, 0x1f20), addmod(mload(add(transcript, 0x1ee0)), sub(f_q, mload(add(transcript, 0x1f00))), f_q))mstore(add(transcript, 0x1f40), mulmod(mload(add(transcript, 0x1f20)), mload(add(transcript, 0x1da0)), f_q))mstore(add(transcript, 0x1f60), addmod(mload(add(transcript, 0x1e40)), mload(add(transcript, 0x1f40)), f_q))mstore(add(transcript, 0x1f80), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x1f60)), f_q))mstore(add(transcript, 0x1fa0), mulmod(mload(add(transcript, 0x1c60)), mload(add(transcript, 0x18c0)), f_q))mstore(add(transcript, 0x1fc0), mulmod(mload(add(transcript, 0x1920)), mload(add(transcript, 0x1fa0)), f_q))mstore(add(transcript, 0x1fe0), addmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x5e0)), f_q))mstore(add(transcript, 0x2000), addmod(mload(add(transcript, 0x1fe0)), sub(f_q, mload(add(transcript, 0x640))), f_q))mstore(add(transcript, 0x2020), mulmod(mload(add(transcript, 0x2000)), mload(add(transcript, 0x1fc0)), f_q))mstore(add(transcript, 0x2040), addmod(mload(add(transcript, 0x1f80)), mload(add(transcript, 0x2020)), f_q))mstore(add(transcript, 0x2060), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2040)), f_q))mstore(add(transcript, 0x2080), addmod(mload(add(transcript, 0x2060)), mload(add(transcript, 0x2020)), f_q))mstore(add(transcript, 0x20a0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2080)), f_q))mstore(add(transcript, 0x20c0), addmod(1, sub(f_q, mload(add(transcript, 0x8e0))), f_q))mstore(add(transcript, 0x20e0), mulmod(mload(add(transcript, 0x20c0)), mload(add(transcript, 0x1200)), f_q))mstore(add(transcript, 0x2100), addmod(mload(add(transcript, 0x20a0)), mload(add(transcript, 0x20e0)), f_q))mstore(add(transcript, 0x2120), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2100)), f_q))mstore(add(transcript, 0x2140), mulmod(mload(add(transcript, 0x940)), mload(add(transcript, 0x940)), f_q))mstore(add(transcript, 0x2160), addmod(mload(add(transcript, 0x2140)), sub(f_q, mload(add(transcript, 0x940))), f_q))mstore(add(transcript, 0x2180), mulmod(mload(add(transcript, 0x2160)), mload(add(transcript, 0x1140)), f_q))mstore(add(transcript, 0x21a0), addmod(mload(add(transcript, 0x2120)), mload(add(transcript, 0x2180)), f_q))mstore(add(transcript, 0x21c0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x21a0)), f_q))mstore(add(transcript, 0x21e0), addmod(mload(add(transcript, 0x940)), sub(f_q, mload(add(transcript, 0x920))), f_q))mstore(add(transcript, 0x2200), mulmod(mload(add(transcript, 0x21e0)), mload(add(transcript, 0x1200)), f_q))mstore(add(transcript, 0x2220), addmod(mload(add(transcript, 0x21c0)), mload(add(transcript, 0x2200)), f_q))mstore(add(transcript, 0x2240), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2220)), f_q))mstore(add(transcript, 0x2260), addmod(1, sub(f_q, mload(add(transcript, 0x1140))), f_q))mstore(add(transcript, 0x2280), addmod(mload(add(transcript, 0x1160)), mload(add(transcript, 0x1180)), f_q))mstore(add(transcript, 0x22a0), addmod(mload(add(transcript, 0x2280)), mload(add(transcript, 0x11a0)), f_q))mstore(add(transcript, 0x22c0), addmod(mload(add(transcript, 0x22a0)), mload(add(transcript, 0x11c0)), f_q))mstore(add(transcript, 0x22e0), addmod(mload(add(transcript, 0x22c0)), mload(add(transcript, 0x11e0)), f_q))mstore(add(transcript, 0x2300), addmod(mload(add(transcript, 0x2260)), sub(f_q, mload(add(transcript, 0x22e0))), f_q))mstore(add(transcript, 0x2320), mulmod(mload(add(transcript, 0x820)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2340), addmod(mload(add(transcript, 0x6a0)), mload(add(transcript, 0x2320)), f_q))mstore(add(transcript, 0x2360), addmod(mload(add(transcript, 0x2340)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2380), mulmod(mload(add(transcript, 0x840)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x23a0), addmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x2380)), f_q))mstore(add(transcript, 0x23c0), addmod(mload(add(transcript, 0x23a0)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x23e0), mulmod(mload(add(transcript, 0x23c0)), mload(add(transcript, 0x2360)), f_q))mstore(add(transcript, 0x2400), mulmod(mload(add(transcript, 0x860)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2420), addmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x2400)), f_q))mstore(add(transcript, 0x2440), addmod(mload(add(transcript, 0x2420)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2460), mulmod(mload(add(transcript, 0x2440)), mload(add(transcript, 0x23e0)), f_q))mstore(add(transcript, 0x2480), mulmod(mload(add(transcript, 0x880)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x24a0), addmod(mload(add(transcript, 0x6c0)), mload(add(transcript, 0x2480)), f_q))mstore(add(transcript, 0x24c0), addmod(mload(add(transcript, 0x24a0)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x24e0), mulmod(mload(add(transcript, 0x24c0)), mload(add(transcript, 0x2460)), f_q))mstore(add(transcript, 0x2500), mulmod(mload(add(transcript, 0x24e0)), mload(add(transcript, 0x900)), f_q))mstore(add(transcript, 0x2520), mulmod(1, mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2540), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x2520)), f_q))mstore(add(transcript, 0x2560), addmod(mload(add(transcript, 0x6a0)), mload(add(transcript, 0x2540)), f_q))mstore(add(transcript, 0x2580), addmod(mload(add(transcript, 0x2560)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x25a0), mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x25c0), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x25a0)), f_q))mstore(add(transcript, 0x25e0), addmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x25c0)), f_q))mstore(add(transcript, 0x2600), addmod(mload(add(transcript, 0x25e0)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2620), mulmod(mload(add(transcript, 0x2600)), mload(add(transcript, 0x2580)), f_q))mstore(add(transcript, 0x2640), mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2660), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x2640)), f_q))mstore(add(transcript, 0x2680), addmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x2660)), f_q))mstore(add(transcript, 0x26a0), addmod(mload(add(transcript, 0x2680)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x26c0), mulmod(mload(add(transcript, 0x26a0)), mload(add(transcript, 0x2620)), f_q))mstore(add(transcript, 0x26e0), mulmod(11166246659983828508719468090013646171463329086121580628794302409516816350802, mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2700), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x26e0)), f_q))mstore(add(transcript, 0x2720), addmod(mload(add(transcript, 0x6c0)), mload(add(transcript, 0x2700)), f_q))mstore(add(transcript, 0x2740), addmod(mload(add(transcript, 0x2720)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2760), mulmod(mload(add(transcript, 0x2740)), mload(add(transcript, 0x26c0)), f_q))mstore(add(transcript, 0x2780), mulmod(mload(add(transcript, 0x2760)), mload(add(transcript, 0x8e0)), f_q))mstore(add(transcript, 0x27a0), addmod(mload(add(transcript, 0x2500)), sub(f_q, mload(add(transcript, 0x2780))), f_q))mstore(add(transcript, 0x27c0), mulmod(mload(add(transcript, 0x27a0)), mload(add(transcript, 0x2300)), f_q))mstore(add(transcript, 0x27e0), addmod(mload(add(transcript, 0x2240)), mload(add(transcript, 0x27c0)), f_q))mstore(add(transcript, 0x2800), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x27e0)), f_q))mstore(add(transcript, 0x2820), mulmod(mload(add(transcript, 0x8a0)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2840), addmod(mload(add(transcript, 0x640)), mload(add(transcript, 0x2820)), f_q))mstore(add(transcript, 0x2860), addmod(mload(add(transcript, 0x2840)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2880), mulmod(mload(add(transcript, 0x8c0)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x28a0), addmod(mload(add(transcript, 0x1240)), mload(add(transcript, 0x2880)), f_q))mstore(add(transcript, 0x28c0), addmod(mload(add(transcript, 0x28a0)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x28e0), mulmod(mload(add(transcript, 0x28c0)), mload(add(transcript, 0x2860)), f_q))mstore(add(transcript, 0x2900), mulmod(mload(add(transcript, 0x28e0)), mload(add(transcript, 0x960)), f_q))mstore(add(transcript, 0x2920), mulmod(284840088355319032285349970403338060113257071685626700086398481893096618818, mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2940), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x2920)), f_q))mstore(add(transcript, 0x2960), addmod(mload(add(transcript, 0x640)), mload(add(transcript, 0x2940)), f_q))mstore(add(transcript, 0x2980), addmod(mload(add(transcript, 0x2960)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x29a0), mulmod(21134065618345176623193549882539580312263652408302468683943992798037078993309, mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x29c0), mulmod(mload(add(transcript, 0x580)), mload(add(transcript, 0x29a0)), f_q))mstore(add(transcript, 0x29e0), addmod(mload(add(transcript, 0x1240)), mload(add(transcript, 0x29c0)), f_q))mstore(add(transcript, 0x2a00), addmod(mload(add(transcript, 0x29e0)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2a20), mulmod(mload(add(transcript, 0x2a00)), mload(add(transcript, 0x2980)), f_q))mstore(add(transcript, 0x2a40), mulmod(mload(add(transcript, 0x2a20)), mload(add(transcript, 0x940)), f_q))mstore(add(transcript, 0x2a60), addmod(mload(add(transcript, 0x2900)), sub(f_q, mload(add(transcript, 0x2a40))), f_q))mstore(add(transcript, 0x2a80), mulmod(mload(add(transcript, 0x2a60)), mload(add(transcript, 0x2300)), f_q))mstore(add(transcript, 0x2aa0), addmod(mload(add(transcript, 0x2800)), mload(add(transcript, 0x2a80)), f_q))mstore(add(transcript, 0x2ac0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2aa0)), f_q))mstore(add(transcript, 0x2ae0), addmod(1, sub(f_q, mload(add(transcript, 0x980))), f_q))mstore(add(transcript, 0x2b00), mulmod(mload(add(transcript, 0x2ae0)), mload(add(transcript, 0x1200)), f_q))mstore(add(transcript, 0x2b20), addmod(mload(add(transcript, 0x2ac0)), mload(add(transcript, 0x2b00)), f_q))mstore(add(transcript, 0x2b40), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2b20)), f_q))mstore(add(transcript, 0x2b60), mulmod(mload(add(transcript, 0x980)), mload(add(transcript, 0x980)), f_q))mstore(add(transcript, 0x2b80), addmod(mload(add(transcript, 0x2b60)), sub(f_q, mload(add(transcript, 0x980))), f_q))mstore(add(transcript, 0x2ba0), mulmod(mload(add(transcript, 0x2b80)), mload(add(transcript, 0x1140)), f_q))mstore(add(transcript, 0x2bc0), addmod(mload(add(transcript, 0x2b40)), mload(add(transcript, 0x2ba0)), f_q))mstore(add(transcript, 0x2be0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2bc0)), f_q))mstore(add(transcript, 0x2c00), addmod(mload(add(transcript, 0x9c0)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2c20), mulmod(mload(add(transcript, 0x2c00)), mload(add(transcript, 0x9a0)), f_q))mstore(add(transcript, 0x2c40), addmod(mload(add(transcript, 0xa00)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2c60), mulmod(mload(add(transcript, 0x2c40)), mload(add(transcript, 0x2c20)), f_q))mstore(add(transcript, 0x2c80), mulmod(256, mload(add(transcript, 0x600)), f_q))mstore(add(transcript, 0x2ca0), addmod(mload(add(transcript, 0x5c0)), sub(f_q, mload(add(transcript, 0x2c80))), f_q))mstore(add(transcript, 0x2cc0), mulmod(mload(add(transcript, 0x2ca0)), mload(add(transcript, 0x740)), f_q))mstore(add(transcript, 0x2ce0), addmod(mload(add(transcript, 0x2cc0)), mload(add(transcript, 0x220)), f_q))mstore(add(transcript, 0x2d00), mulmod(mload(add(transcript, 0x2ce0)), mload(add(transcript, 0x980)), f_q))mstore(add(transcript, 0x2d20), addmod(mload(add(transcript, 0x720)), mload(add(transcript, 0x280)), f_q))mstore(add(transcript, 0x2d40), mulmod(mload(add(transcript, 0x2d20)), mload(add(transcript, 0x2d00)), f_q))mstore(add(transcript, 0x2d60), addmod(mload(add(transcript, 0x2c60)), sub(f_q, mload(add(transcript, 0x2d40))), f_q))mstore(add(transcript, 0x2d80), mulmod(mload(add(transcript, 0x2d60)), mload(add(transcript, 0x2300)), f_q))mstore(add(transcript, 0x2da0), addmod(mload(add(transcript, 0x2be0)), mload(add(transcript, 0x2d80)), f_q))mstore(add(transcript, 0x2dc0), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2da0)), f_q))mstore(add(transcript, 0x2de0), addmod(mload(add(transcript, 0x9c0)), sub(f_q, mload(add(transcript, 0xa00))), f_q))mstore(add(transcript, 0x2e00), mulmod(mload(add(transcript, 0x2de0)), mload(add(transcript, 0x1200)), f_q))mstore(add(transcript, 0x2e20), addmod(mload(add(transcript, 0x2dc0)), mload(add(transcript, 0x2e00)), f_q))mstore(add(transcript, 0x2e40), mulmod(mload(add(transcript, 0x3e0)), mload(add(transcript, 0x2e20)), f_q))mstore(add(transcript, 0x2e60), mulmod(mload(add(transcript, 0x2de0)), mload(add(transcript, 0x2300)), f_q))mstore(add(transcript, 0x2e80), addmod(mload(add(transcript, 0x9c0)), sub(f_q, mload(add(transcript, 0x9e0))), f_q))mstore(add(transcript, 0x2ea0), mulmod(mload(add(transcript, 0x2e80)), mload(add(transcript, 0x2e60)), f_q))mstore(add(transcript, 0x2ec0), addmod(mload(add(transcript, 0x2e40)), mload(add(transcript, 0x2ea0)), f_q))mstore(add(transcript, 0x2ee0), mulmod(mload(add(transcript, 0xd00)), mload(add(transcript, 0xd00)), f_q))mstore(add(transcript, 0x2f00), mulmod(mload(add(transcript, 0x2ee0)), mload(add(transcript, 0xd00)), f_q))mstore(add(transcript, 0x2f20), mulmod(mload(add(transcript, 0x2f00)), mload(add(transcript, 0xd00)), f_q))mstore(add(transcript, 0x2f40), mulmod(mload(add(transcript, 0x2f20)), mload(add(transcript, 0xd00)), f_q))mstore(add(transcript, 0x2f60), mulmod(1, mload(add(transcript, 0xd00)), f_q))mstore(add(transcript, 0x2f80), mulmod(1, mload(add(transcript, 0x2ee0)), f_q))mstore(add(transcript, 0x2fa0), mulmod(1, mload(add(transcript, 0x2f00)), f_q))mstore(add(transcript, 0x2fc0), mulmod(1, mload(add(transcript, 0x2f20)), f_q))mstore(add(transcript, 0x2fe0), mulmod(mload(add(transcript, 0x2ec0)), mload(add(transcript, 0xd20)), f_q))mstore(add(transcript, 0x3000), mulmod(mload(add(transcript, 0xbc0)), mload(add(transcript, 0x580)), f_q))mstore(add(transcript, 0x3020), mulmod(mload(add(transcript, 0x580)), 1, f_q))mstore(add(transcript, 0x3040), addmod(mload(add(transcript, 0xb40)), sub(f_q, mload(add(transcript, 0x3020))), f_q))mstore(add(transcript, 0x3060), mulmod(mload(add(transcript, 0x580)), 9396103202274256930945606623206526900461945684265495839012435492634193195103, f_q))mstore(add(transcript, 0x3080), addmod(mload(add(transcript, 0xb40)), sub(f_q, mload(add(transcript, 0x3060))), f_q))mstore(add(transcript, 0x30a0), mulmod(mload(add(transcript, 0x580)), 15699029810934084314820646074566828280617789951162923449200398535581206172418, f_q))mstore(add(transcript, 0x30c0), addmod(mload(add(transcript, 0xb40)), sub(f_q, mload(add(transcript, 0x30a0))), f_q))mstore(add(transcript, 0x30e0), mulmod(mload(add(transcript, 0x580)), 19444693496467964793333684482470811869395409953158764080291550423779334624794, f_q))mstore(add(transcript, 0x3100), addmod(mload(add(transcript, 0xb40)), sub(f_q, mload(add(transcript, 0x30e0))), f_q)){ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0xbc0)), 14935689044936328720213520384837211407239373163407808768092422456738089171339, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0xbc0)), 6952553826902946502032885360420063681308991237008225575605781729837719324278, f_q), f_q), result, f_q)mstore(add(transcript, 0x3120), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0xbc0)), 7540907510155698387256503820143330389809914548046512731972450943457626251574, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0xbc0)), 17454089668527239794105182244994964593641145239866915085378986192780276655988, f_q), f_q), result, f_q)mstore(add(transcript, 0x3140), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0xbc0)), 16765245179638222004592619476379737764479697804128512065226459610007790881832, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0xbc0)), 6067403861988280018436561787453590745850405443026581205331008293509136248791, f_q), f_q), result, f_q)mstore(add(transcript, 0x3160), result) }mstore(add(transcript, 0x3180), mulmod(1, mload(add(transcript, 0x3040)), f_q))mstore(add(transcript, 0x31a0), mulmod(mload(add(transcript, 0x3180)), mload(add(transcript, 0x3080)), f_q))mstore(add(transcript, 0x31c0), mulmod(mload(add(transcript, 0x31a0)), mload(add(transcript, 0x3100)), f_q)){ let result := mulmod(mload(add(transcript, 0xb40)), 1, f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q), result, f_q)mstore(add(transcript, 0x31e0), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0xbc0)), 13346277807347402051479003338644866680074640264080882830084838995653627694322, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0xbc0)), 8541965064491873170767402406612408408473724136335151513613365190922180801295, f_q), f_q), result, f_q)mstore(add(transcript, 0x3200), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0xbc0)), 9130318747744625055991020866335675116974647447373438669980034404542087728591, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0xbc0)), 17654030801727560324741115319652541746559479525075366613702001578587072243451, f_q), f_q), result, f_q)mstore(add(transcript, 0x3220), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0xbc0)), 8968217942074169282201771672973351205073655055696863512223304343263448008755, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0xbc0)), 15489683287416706862113636648384499783884413315698913841173435408703605255719, f_q), f_q), result, f_q)mstore(add(transcript, 0x3240), result) }mstore(add(transcript, 0x3260), mulmod(mload(add(transcript, 0x31a0)), mload(add(transcript, 0x30c0)), f_q)){ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0x580)), 12492139669565018291300799122050748188086418716150538504685768693941615300515, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0x580)), 9396103202274256930945606623206526900461945684265495839012435492634193195102, f_q), f_q), result, f_q)mstore(add(transcript, 0x3280), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0x580)), 9396103202274256930945606623206526900461945684265495839012435492634193195102, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0x580)), 11903785986312266406077180662327481479585495405112251348319099480321708373219, f_q), f_q), result, f_q)mstore(add(transcript, 0x32a0), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0x580)), 2443549375371310428912721262786463219152954447257270263406653762796473870824, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0x580)), 19444693496467964793333684482470811869395409953158764080291550423779334624793, f_q), f_q), result, f_q)mstore(add(transcript, 0x32c0), result) }{ let result := mulmod(mload(add(transcript, 0xb40)), mulmod(mload(add(transcript, 0x580)), 19444693496467964793333684482470811869395409953158764080291550423779334624793, f_q), f_q)result := addmod(mulmod(mload(add(transcript, 0x580)), mulmod(mload(add(transcript, 0x580)), 14519100894475310148599392892084064224530612280553018117484180069202210808887, f_q), f_q), result, f_q)mstore(add(transcript, 0x32e0), result) }mstore(add(transcript, 0x3300), mulmod(mload(add(transcript, 0x3180)), mload(add(transcript, 0x3100)), f_q)){ let prod := mload(add(transcript, 0x3120)) prod := mulmod(mload(add(transcript, 0x3140)), prod, f_q) mstore(add(transcript, 0x3320), prod) prod := mulmod(mload(add(transcript, 0x3160)), prod, f_q) mstore(add(transcript, 0x3340), prod) prod := mulmod(mload(add(transcript, 0x31e0)), prod, f_q) mstore(add(transcript, 0x3360), prod) prod := mulmod(mload(add(transcript, 0x3180)), prod, f_q) mstore(add(transcript, 0x3380), prod) prod := mulmod(mload(add(transcript, 0x3200)), prod, f_q) mstore(add(transcript, 0x33a0), prod) prod := mulmod(mload(add(transcript, 0x3220)), prod, f_q) mstore(add(transcript, 0x33c0), prod) prod := mulmod(mload(add(transcript, 0x3240)), prod, f_q) mstore(add(transcript, 0x33e0), prod) prod := mulmod(mload(add(transcript, 0x3260)), prod, f_q) mstore(add(transcript, 0x3400), prod) prod := mulmod(mload(add(transcript, 0x3280)), prod, f_q) mstore(add(transcript, 0x3420), prod) prod := mulmod(mload(add(transcript, 0x32a0)), prod, f_q) mstore(add(transcript, 0x3440), prod) prod := mulmod(mload(add(transcript, 0x31a0)), prod, f_q) mstore(add(transcript, 0x3460), prod) prod := mulmod(mload(add(transcript, 0x32c0)), prod, f_q) mstore(add(transcript, 0x3480), prod) prod := mulmod(mload(add(transcript, 0x32e0)), prod, f_q) mstore(add(transcript, 0x34a0), prod) prod := mulmod(mload(add(transcript, 0x3300)), prod, f_q) mstore(add(transcript, 0x34c0), prod) }mstore(add(transcript, 0x3500), 32)mstore(add(transcript, 0x3520), 32)mstore(add(transcript, 0x3540), 32)mstore(add(transcript, 0x3560), mload(add(transcript, 0x34c0)))mstore(add(transcript, 0x3580), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x35a0), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x3500), 0xc0, add(transcript, 0x34e0), 0x20), 1), success){ let inv := mload(add(transcript, 0x34e0)) let v v := mload(add(transcript, 0x3300)) mstore(add(transcript, 0x3300), mulmod(mload(add(transcript, 0x34a0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x32e0)) mstore(add(transcript, 0x32e0), mulmod(mload(add(transcript, 0x3480)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x32c0)) mstore(add(transcript, 0x32c0), mulmod(mload(add(transcript, 0x3460)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x31a0)) mstore(add(transcript, 0x31a0), mulmod(mload(add(transcript, 0x3440)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x32a0)) mstore(add(transcript, 0x32a0), mulmod(mload(add(transcript, 0x3420)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3280)) mstore(add(transcript, 0x3280), mulmod(mload(add(transcript, 0x3400)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3260)) mstore(add(transcript, 0x3260), mulmod(mload(add(transcript, 0x33e0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3240)) mstore(add(transcript, 0x3240), mulmod(mload(add(transcript, 0x33c0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3220)) mstore(add(transcript, 0x3220), mulmod(mload(add(transcript, 0x33a0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3200)) mstore(add(transcript, 0x3200), mulmod(mload(add(transcript, 0x3380)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3180)) mstore(add(transcript, 0x3180), mulmod(mload(add(transcript, 0x3360)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x31e0)) mstore(add(transcript, 0x31e0), mulmod(mload(add(transcript, 0x3340)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3160)) mstore(add(transcript, 0x3160), mulmod(mload(add(transcript, 0x3320)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3140)) mstore(add(transcript, 0x3140), mulmod(mload(add(transcript, 0x3120)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0x3120), inv) }{ let result := mload(add(transcript, 0x3120))result := addmod(mload(add(transcript, 0x3140)), result, f_q)result := addmod(mload(add(transcript, 0x3160)), result, f_q)mstore(add(transcript, 0x35c0), result) }mstore(add(transcript, 0x35e0), mulmod(mload(add(transcript, 0x31c0)), mload(add(transcript, 0x3180)), f_q)){ let result := mload(add(transcript, 0x31e0))mstore(add(transcript, 0x3600), result) }mstore(add(transcript, 0x3620), mulmod(mload(add(transcript, 0x31c0)), mload(add(transcript, 0x3260)), f_q)){ let result := mload(add(transcript, 0x3200))result := addmod(mload(add(transcript, 0x3220)), result, f_q)result := addmod(mload(add(transcript, 0x3240)), result, f_q)mstore(add(transcript, 0x3640), result) }mstore(add(transcript, 0x3660), mulmod(mload(add(transcript, 0x31c0)), mload(add(transcript, 0x31a0)), f_q)){ let result := mload(add(transcript, 0x3280))result := addmod(mload(add(transcript, 0x32a0)), result, f_q)mstore(add(transcript, 0x3680), result) }mstore(add(transcript, 0x36a0), mulmod(mload(add(transcript, 0x31c0)), mload(add(transcript, 0x3300)), f_q)){ let result := mload(add(transcript, 0x32c0))result := addmod(mload(add(transcript, 0x32e0)), result, f_q)mstore(add(transcript, 0x36c0), result) }{ let prod := mload(add(transcript, 0x35c0)) prod := mulmod(mload(add(transcript, 0x3600)), prod, f_q) mstore(add(transcript, 0x36e0), prod) prod := mulmod(mload(add(transcript, 0x3640)), prod, f_q) mstore(add(transcript, 0x3700), prod) prod := mulmod(mload(add(transcript, 0x3680)), prod, f_q) mstore(add(transcript, 0x3720), prod) prod := mulmod(mload(add(transcript, 0x36c0)), prod, f_q) mstore(add(transcript, 0x3740), prod) }mstore(add(transcript, 0x3780), 32)mstore(add(transcript, 0x37a0), 32)mstore(add(transcript, 0x37c0), 32)mstore(add(transcript, 0x37e0), mload(add(transcript, 0x3740)))mstore(add(transcript, 0x3800), 21888242871839275222246405745257275088548364400416034343698204186575808495615)mstore(add(transcript, 0x3820), 21888242871839275222246405745257275088548364400416034343698204186575808495617)success := and(eq(staticcall(gas(), 0x5, add(transcript, 0x3780), 0xc0, add(transcript, 0x3760), 0x20), 1), success){ let inv := mload(add(transcript, 0x3760)) let v v := mload(add(transcript, 0x36c0)) mstore(add(transcript, 0x36c0), mulmod(mload(add(transcript, 0x3720)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3680)) mstore(add(transcript, 0x3680), mulmod(mload(add(transcript, 0x3700)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3640)) mstore(add(transcript, 0x3640), mulmod(mload(add(transcript, 0x36e0)), inv, f_q)) inv := mulmod(v, inv, f_q) v := mload(add(transcript, 0x3600)) mstore(add(transcript, 0x3600), mulmod(mload(add(transcript, 0x35c0)), inv, f_q)) inv := mulmod(v, inv, f_q) mstore(add(transcript, 0x35c0), inv) }mstore(add(transcript, 0x3840), mulmod(mload(add(transcript, 0x35e0)), mload(add(transcript, 0x3600)), f_q))mstore(add(transcript, 0x3860), mulmod(mload(add(transcript, 0x3620)), mload(add(transcript, 0x3640)), f_q))mstore(add(transcript, 0x3880), mulmod(mload(add(transcript, 0x3660)), mload(add(transcript, 0x3680)), f_q))mstore(add(transcript, 0x38a0), mulmod(mload(add(transcript, 0x36a0)), mload(add(transcript, 0x36c0)), f_q))mstore(add(transcript, 0x38c0), mulmod(mload(add(transcript, 0xa40)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x38e0), mulmod(mload(add(transcript, 0x38c0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3900), mulmod(mload(add(transcript, 0x38e0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3920), mulmod(mload(add(transcript, 0x3900)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3940), mulmod(mload(add(transcript, 0x3920)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3960), mulmod(mload(add(transcript, 0x3940)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3980), mulmod(mload(add(transcript, 0x3960)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x39a0), mulmod(mload(add(transcript, 0x3980)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x39c0), mulmod(mload(add(transcript, 0x39a0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x39e0), mulmod(mload(add(transcript, 0x39c0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3a00), mulmod(mload(add(transcript, 0x39e0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3a20), mulmod(mload(add(transcript, 0x3a00)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3a40), mulmod(mload(add(transcript, 0x3a20)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3a60), mulmod(mload(add(transcript, 0x3a40)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3a80), mulmod(mload(add(transcript, 0x3a60)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3aa0), mulmod(mload(add(transcript, 0x3a80)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3ac0), mulmod(mload(add(transcript, 0x3aa0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3ae0), mulmod(mload(add(transcript, 0x3ac0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3b00), mulmod(mload(add(transcript, 0x3ae0)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3b20), mulmod(mload(add(transcript, 0x3b00)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3b40), mulmod(mload(add(transcript, 0xaa0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x3b60), mulmod(mload(add(transcript, 0x3b40)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x3b80), mulmod(mload(add(transcript, 0x3b60)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x3ba0), mulmod(mload(add(transcript, 0x3b80)), mload(add(transcript, 0xaa0)), f_q)){ let result := mulmod(mload(add(transcript, 0x5c0)), mload(add(transcript, 0x3120)), f_q)result := addmod(mulmod(mload(add(transcript, 0x600)), mload(add(transcript, 0x3140)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x680)), mload(add(transcript, 0x3160)), f_q), result, f_q)mstore(add(transcript, 0x3bc0), result) }mstore(add(transcript, 0x3be0), mulmod(mload(add(transcript, 0x3bc0)), mload(add(transcript, 0x35c0)), f_q))mstore(add(transcript, 0x3c00), mulmod(sub(f_q, mload(add(transcript, 0x3be0))), 1, f_q)){ let result := mulmod(mload(add(transcript, 0x5e0)), mload(add(transcript, 0x3120)), f_q)result := addmod(mulmod(mload(add(transcript, 0x620)), mload(add(transcript, 0x3140)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x660)), mload(add(transcript, 0x3160)), f_q), result, f_q)mstore(add(transcript, 0x3c20), result) }mstore(add(transcript, 0x3c40), mulmod(mload(add(transcript, 0x3c20)), mload(add(transcript, 0x35c0)), f_q))mstore(add(transcript, 0x3c60), mulmod(sub(f_q, mload(add(transcript, 0x3c40))), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3c80), mulmod(1, mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3ca0), addmod(mload(add(transcript, 0x3c00)), mload(add(transcript, 0x3c60)), f_q))mstore(add(transcript, 0x3cc0), mulmod(mload(add(transcript, 0x3ca0)), 1, f_q))mstore(add(transcript, 0x3ce0), mulmod(mload(add(transcript, 0x3c80)), 1, f_q))mstore(add(transcript, 0x3d00), mulmod(1, mload(add(transcript, 0x35e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x640)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x3d20), result) }mstore(add(transcript, 0x3d40), mulmod(mload(add(transcript, 0x3d20)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x3d60), mulmod(sub(f_q, mload(add(transcript, 0x3d40))), 1, f_q))mstore(add(transcript, 0x3d80), mulmod(mload(add(transcript, 0x3d00)), 1, f_q)){ let result := mulmod(mload(add(transcript, 0xa00)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x3da0), result) }mstore(add(transcript, 0x3dc0), mulmod(mload(add(transcript, 0x3da0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x3de0), mulmod(sub(f_q, mload(add(transcript, 0x3dc0))), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3e00), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x3e20), addmod(mload(add(transcript, 0x3d60)), mload(add(transcript, 0x3de0)), f_q)){ let result := mulmod(mload(add(transcript, 0x6a0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x3e40), result) }mstore(add(transcript, 0x3e60), mulmod(mload(add(transcript, 0x3e40)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x3e80), mulmod(sub(f_q, mload(add(transcript, 0x3e60))), mload(add(transcript, 0x38c0)), f_q))mstore(add(transcript, 0x3ea0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x38c0)), f_q))mstore(add(transcript, 0x3ec0), addmod(mload(add(transcript, 0x3e20)), mload(add(transcript, 0x3e80)), f_q)){ let result := mulmod(mload(add(transcript, 0x6c0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x3ee0), result) }mstore(add(transcript, 0x3f00), mulmod(mload(add(transcript, 0x3ee0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x3f20), mulmod(sub(f_q, mload(add(transcript, 0x3f00))), mload(add(transcript, 0x38e0)), f_q))mstore(add(transcript, 0x3f40), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x38e0)), f_q))mstore(add(transcript, 0x3f60), addmod(mload(add(transcript, 0x3ec0)), mload(add(transcript, 0x3f20)), f_q)){ let result := mulmod(mload(add(transcript, 0x6e0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x3f80), result) }mstore(add(transcript, 0x3fa0), mulmod(mload(add(transcript, 0x3f80)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x3fc0), mulmod(sub(f_q, mload(add(transcript, 0x3fa0))), mload(add(transcript, 0x3900)), f_q))mstore(add(transcript, 0x3fe0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3900)), f_q))mstore(add(transcript, 0x4000), addmod(mload(add(transcript, 0x3f60)), mload(add(transcript, 0x3fc0)), f_q)){ let result := mulmod(mload(add(transcript, 0x700)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4020), result) }mstore(add(transcript, 0x4040), mulmod(mload(add(transcript, 0x4020)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4060), mulmod(sub(f_q, mload(add(transcript, 0x4040))), mload(add(transcript, 0x3920)), f_q))mstore(add(transcript, 0x4080), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3920)), f_q))mstore(add(transcript, 0x40a0), addmod(mload(add(transcript, 0x4000)), mload(add(transcript, 0x4060)), f_q)){ let result := mulmod(mload(add(transcript, 0x720)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x40c0), result) }mstore(add(transcript, 0x40e0), mulmod(mload(add(transcript, 0x40c0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4100), mulmod(sub(f_q, mload(add(transcript, 0x40e0))), mload(add(transcript, 0x3940)), f_q))mstore(add(transcript, 0x4120), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3940)), f_q))mstore(add(transcript, 0x4140), addmod(mload(add(transcript, 0x40a0)), mload(add(transcript, 0x4100)), f_q)){ let result := mulmod(mload(add(transcript, 0x740)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4160), result) }mstore(add(transcript, 0x4180), mulmod(mload(add(transcript, 0x4160)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x41a0), mulmod(sub(f_q, mload(add(transcript, 0x4180))), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x41c0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3960)), f_q))mstore(add(transcript, 0x41e0), addmod(mload(add(transcript, 0x4140)), mload(add(transcript, 0x41a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x760)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4200), result) }mstore(add(transcript, 0x4220), mulmod(mload(add(transcript, 0x4200)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4240), mulmod(sub(f_q, mload(add(transcript, 0x4220))), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4260), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3980)), f_q))mstore(add(transcript, 0x4280), addmod(mload(add(transcript, 0x41e0)), mload(add(transcript, 0x4240)), f_q)){ let result := mulmod(mload(add(transcript, 0x780)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x42a0), result) }mstore(add(transcript, 0x42c0), mulmod(mload(add(transcript, 0x42a0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x42e0), mulmod(sub(f_q, mload(add(transcript, 0x42c0))), mload(add(transcript, 0x39a0)), f_q))mstore(add(transcript, 0x4300), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x39a0)), f_q))mstore(add(transcript, 0x4320), addmod(mload(add(transcript, 0x4280)), mload(add(transcript, 0x42e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x7a0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4340), result) }mstore(add(transcript, 0x4360), mulmod(mload(add(transcript, 0x4340)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4380), mulmod(sub(f_q, mload(add(transcript, 0x4360))), mload(add(transcript, 0x39c0)), f_q))mstore(add(transcript, 0x43a0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x39c0)), f_q))mstore(add(transcript, 0x43c0), addmod(mload(add(transcript, 0x4320)), mload(add(transcript, 0x4380)), f_q)){ let result := mulmod(mload(add(transcript, 0x7c0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x43e0), result) }mstore(add(transcript, 0x4400), mulmod(mload(add(transcript, 0x43e0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4420), mulmod(sub(f_q, mload(add(transcript, 0x4400))), mload(add(transcript, 0x39e0)), f_q))mstore(add(transcript, 0x4440), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x39e0)), f_q))mstore(add(transcript, 0x4460), addmod(mload(add(transcript, 0x43c0)), mload(add(transcript, 0x4420)), f_q)){ let result := mulmod(mload(add(transcript, 0x7e0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4480), result) }mstore(add(transcript, 0x44a0), mulmod(mload(add(transcript, 0x4480)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x44c0), mulmod(sub(f_q, mload(add(transcript, 0x44a0))), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x44e0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3a00)), f_q))mstore(add(transcript, 0x4500), addmod(mload(add(transcript, 0x4460)), mload(add(transcript, 0x44c0)), f_q)){ let result := mulmod(mload(add(transcript, 0x820)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4520), result) }mstore(add(transcript, 0x4540), mulmod(mload(add(transcript, 0x4520)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4560), mulmod(sub(f_q, mload(add(transcript, 0x4540))), mload(add(transcript, 0x3a20)), f_q))mstore(add(transcript, 0x4580), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3a20)), f_q))mstore(add(transcript, 0x45a0), addmod(mload(add(transcript, 0x4500)), mload(add(transcript, 0x4560)), f_q)){ let result := mulmod(mload(add(transcript, 0x840)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x45c0), result) }mstore(add(transcript, 0x45e0), mulmod(mload(add(transcript, 0x45c0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4600), mulmod(sub(f_q, mload(add(transcript, 0x45e0))), mload(add(transcript, 0x3a40)), f_q))mstore(add(transcript, 0x4620), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3a40)), f_q))mstore(add(transcript, 0x4640), addmod(mload(add(transcript, 0x45a0)), mload(add(transcript, 0x4600)), f_q)){ let result := mulmod(mload(add(transcript, 0x860)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4660), result) }mstore(add(transcript, 0x4680), mulmod(mload(add(transcript, 0x4660)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x46a0), mulmod(sub(f_q, mload(add(transcript, 0x4680))), mload(add(transcript, 0x3a60)), f_q))mstore(add(transcript, 0x46c0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3a60)), f_q))mstore(add(transcript, 0x46e0), addmod(mload(add(transcript, 0x4640)), mload(add(transcript, 0x46a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x880)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4700), result) }mstore(add(transcript, 0x4720), mulmod(mload(add(transcript, 0x4700)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4740), mulmod(sub(f_q, mload(add(transcript, 0x4720))), mload(add(transcript, 0x3a80)), f_q))mstore(add(transcript, 0x4760), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3a80)), f_q))mstore(add(transcript, 0x4780), addmod(mload(add(transcript, 0x46e0)), mload(add(transcript, 0x4740)), f_q)){ let result := mulmod(mload(add(transcript, 0x8a0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x47a0), result) }mstore(add(transcript, 0x47c0), mulmod(mload(add(transcript, 0x47a0)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x47e0), mulmod(sub(f_q, mload(add(transcript, 0x47c0))), mload(add(transcript, 0x3aa0)), f_q))mstore(add(transcript, 0x4800), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3aa0)), f_q))mstore(add(transcript, 0x4820), addmod(mload(add(transcript, 0x4780)), mload(add(transcript, 0x47e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x8c0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4840), result) }mstore(add(transcript, 0x4860), mulmod(mload(add(transcript, 0x4840)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4880), mulmod(sub(f_q, mload(add(transcript, 0x4860))), mload(add(transcript, 0x3ac0)), f_q))mstore(add(transcript, 0x48a0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3ac0)), f_q))mstore(add(transcript, 0x48c0), addmod(mload(add(transcript, 0x4820)), mload(add(transcript, 0x4880)), f_q))mstore(add(transcript, 0x48e0), mulmod(mload(add(transcript, 0x2f60)), mload(add(transcript, 0x35e0)), f_q))mstore(add(transcript, 0x4900), mulmod(mload(add(transcript, 0x2f80)), mload(add(transcript, 0x35e0)), f_q))mstore(add(transcript, 0x4920), mulmod(mload(add(transcript, 0x2fa0)), mload(add(transcript, 0x35e0)), f_q))mstore(add(transcript, 0x4940), mulmod(mload(add(transcript, 0x2fc0)), mload(add(transcript, 0x35e0)), f_q)){ let result := mulmod(mload(add(transcript, 0x2fe0)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4960), result) }mstore(add(transcript, 0x4980), mulmod(mload(add(transcript, 0x4960)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x49a0), mulmod(sub(f_q, mload(add(transcript, 0x4980))), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x49c0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x49e0), mulmod(mload(add(transcript, 0x48e0)), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x4a00), mulmod(mload(add(transcript, 0x4900)), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x4a20), mulmod(mload(add(transcript, 0x4920)), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x4a40), mulmod(mload(add(transcript, 0x4940)), mload(add(transcript, 0x3ae0)), f_q))mstore(add(transcript, 0x4a60), addmod(mload(add(transcript, 0x48c0)), mload(add(transcript, 0x49a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x800)), mload(add(transcript, 0x31e0)), f_q)mstore(add(transcript, 0x4a80), result) }mstore(add(transcript, 0x4aa0), mulmod(mload(add(transcript, 0x4a80)), mload(add(transcript, 0x3840)), f_q))mstore(add(transcript, 0x4ac0), mulmod(sub(f_q, mload(add(transcript, 0x4aa0))), mload(add(transcript, 0x3b00)), f_q))mstore(add(transcript, 0x4ae0), mulmod(mload(add(transcript, 0x3d00)), mload(add(transcript, 0x3b00)), f_q))mstore(add(transcript, 0x4b00), addmod(mload(add(transcript, 0x4a60)), mload(add(transcript, 0x4ac0)), f_q))mstore(add(transcript, 0x4b20), mulmod(mload(add(transcript, 0x4b00)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4b40), mulmod(mload(add(transcript, 0x3d80)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4b60), mulmod(mload(add(transcript, 0x3e00)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4b80), mulmod(mload(add(transcript, 0x3ea0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4ba0), mulmod(mload(add(transcript, 0x3f40)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4bc0), mulmod(mload(add(transcript, 0x3fe0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4be0), mulmod(mload(add(transcript, 0x4080)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4c00), mulmod(mload(add(transcript, 0x4120)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4c20), mulmod(mload(add(transcript, 0x41c0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4c40), mulmod(mload(add(transcript, 0x4260)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4c60), mulmod(mload(add(transcript, 0x4300)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4c80), mulmod(mload(add(transcript, 0x43a0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4ca0), mulmod(mload(add(transcript, 0x4440)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4cc0), mulmod(mload(add(transcript, 0x44e0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4ce0), mulmod(mload(add(transcript, 0x4580)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4d00), mulmod(mload(add(transcript, 0x4620)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4d20), mulmod(mload(add(transcript, 0x46c0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4d40), mulmod(mload(add(transcript, 0x4760)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4d60), mulmod(mload(add(transcript, 0x4800)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4d80), mulmod(mload(add(transcript, 0x48a0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4da0), mulmod(mload(add(transcript, 0x49c0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4dc0), mulmod(mload(add(transcript, 0x49e0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4de0), mulmod(mload(add(transcript, 0x4a00)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4e00), mulmod(mload(add(transcript, 0x4a20)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4e20), mulmod(mload(add(transcript, 0x4a40)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4e40), mulmod(mload(add(transcript, 0x4ae0)), mload(add(transcript, 0xaa0)), f_q))mstore(add(transcript, 0x4e60), addmod(mload(add(transcript, 0x3cc0)), mload(add(transcript, 0x4b20)), f_q))mstore(add(transcript, 0x4e80), mulmod(1, mload(add(transcript, 0x3620)), f_q)){ let result := mulmod(mload(add(transcript, 0x8e0)), mload(add(transcript, 0x3200)), f_q)result := addmod(mulmod(mload(add(transcript, 0x900)), mload(add(transcript, 0x3220)), f_q), result, f_q)result := addmod(mulmod(mload(add(transcript, 0x920)), mload(add(transcript, 0x3240)), f_q), result, f_q)mstore(add(transcript, 0x4ea0), result) }mstore(add(transcript, 0x4ec0), mulmod(mload(add(transcript, 0x4ea0)), mload(add(transcript, 0x3860)), f_q))mstore(add(transcript, 0x4ee0), mulmod(sub(f_q, mload(add(transcript, 0x4ec0))), 1, f_q))mstore(add(transcript, 0x4f00), mulmod(mload(add(transcript, 0x4e80)), 1, f_q))mstore(add(transcript, 0x4f20), mulmod(mload(add(transcript, 0x4ee0)), mload(add(transcript, 0x3b40)), f_q))mstore(add(transcript, 0x4f40), mulmod(mload(add(transcript, 0x4f00)), mload(add(transcript, 0x3b40)), f_q))mstore(add(transcript, 0x4f60), addmod(mload(add(transcript, 0x4e60)), mload(add(transcript, 0x4f20)), f_q))mstore(add(transcript, 0x4f80), mulmod(1, mload(add(transcript, 0x3660)), f_q)){ let result := mulmod(mload(add(transcript, 0x940)), mload(add(transcript, 0x3280)), f_q)result := addmod(mulmod(mload(add(transcript, 0x960)), mload(add(transcript, 0x32a0)), f_q), result, f_q)mstore(add(transcript, 0x4fa0), result) }mstore(add(transcript, 0x4fc0), mulmod(mload(add(transcript, 0x4fa0)), mload(add(transcript, 0x3880)), f_q))mstore(add(transcript, 0x4fe0), mulmod(sub(f_q, mload(add(transcript, 0x4fc0))), 1, f_q))mstore(add(transcript, 0x5000), mulmod(mload(add(transcript, 0x4f80)), 1, f_q)){ let result := mulmod(mload(add(transcript, 0x980)), mload(add(transcript, 0x3280)), f_q)result := addmod(mulmod(mload(add(transcript, 0x9a0)), mload(add(transcript, 0x32a0)), f_q), result, f_q)mstore(add(transcript, 0x5020), result) }mstore(add(transcript, 0x5040), mulmod(mload(add(transcript, 0x5020)), mload(add(transcript, 0x3880)), f_q))mstore(add(transcript, 0x5060), mulmod(sub(f_q, mload(add(transcript, 0x5040))), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x5080), mulmod(mload(add(transcript, 0x4f80)), mload(add(transcript, 0xa40)), f_q))mstore(add(transcript, 0x50a0), addmod(mload(add(transcript, 0x4fe0)), mload(add(transcript, 0x5060)), f_q))mstore(add(transcript, 0x50c0), mulmod(mload(add(transcript, 0x50a0)), mload(add(transcript, 0x3b60)), f_q))mstore(add(transcript, 0x50e0), mulmod(mload(add(transcript, 0x5000)), mload(add(transcript, 0x3b60)), f_q))mstore(add(transcript, 0x5100), mulmod(mload(add(transcript, 0x5080)), mload(add(transcript, 0x3b60)), f_q))mstore(add(transcript, 0x5120), addmod(mload(add(transcript, 0x4f60)), mload(add(transcript, 0x50c0)), f_q))mstore(add(transcript, 0x5140), mulmod(1, mload(add(transcript, 0x36a0)), f_q)){ let result := mulmod(mload(add(transcript, 0x9c0)), mload(add(transcript, 0x32c0)), f_q)result := addmod(mulmod(mload(add(transcript, 0x9e0)), mload(add(transcript, 0x32e0)), f_q), result, f_q)mstore(add(transcript, 0x5160), result) }mstore(add(transcript, 0x5180), mulmod(mload(add(transcript, 0x5160)), mload(add(transcript, 0x38a0)), f_q))mstore(add(transcript, 0x51a0), mulmod(sub(f_q, mload(add(transcript, 0x5180))), 1, f_q))mstore(add(transcript, 0x51c0), mulmod(mload(add(transcript, 0x5140)), 1, f_q))mstore(add(transcript, 0x51e0), mulmod(mload(add(transcript, 0x51a0)), mload(add(transcript, 0x3b80)), f_q))mstore(add(transcript, 0x5200), mulmod(mload(add(transcript, 0x51c0)), mload(add(transcript, 0x3b80)), f_q))mstore(add(transcript, 0x5220), addmod(mload(add(transcript, 0x5120)), mload(add(transcript, 0x51e0)), f_q))mstore(add(transcript, 0x5240), mulmod(1, mload(add(transcript, 0x31c0)), f_q))mstore(add(transcript, 0x5260), mulmod(1, mload(add(transcript, 0xb40)), f_q))mstore(add(transcript, 0x5280), 0x0000000000000000000000000000000000000000000000000000000000000001) mstore(add(transcript, 0x52a0), 0x0000000000000000000000000000000000000000000000000000000000000002)mstore(add(transcript, 0x52c0), mload(add(transcript, 0x5220)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5280), 0x60, add(transcript, 0x5280), 0x40), 1), success)mstore(add(transcript, 0x52e0), mload(add(transcript, 0x5280))) mstore(add(transcript, 0x5300), mload(add(transcript, 0x52a0)))mstore(add(transcript, 0x5320), mload(add(transcript, 0x60))) mstore(add(transcript, 0x5340), mload(add(transcript, 0x80)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x52e0), 0x80, add(transcript, 0x52e0), 0x40), 1), success)mstore(add(transcript, 0x5360), mload(add(transcript, 0xa0))) mstore(add(transcript, 0x5380), mload(add(transcript, 0xc0)))mstore(add(transcript, 0x53a0), mload(add(transcript, 0x3ce0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5360), 0x60, add(transcript, 0x5360), 0x40), 1), success)mstore(add(transcript, 0x53c0), mload(add(transcript, 0x52e0))) mstore(add(transcript, 0x53e0), mload(add(transcript, 0x5300)))mstore(add(transcript, 0x5400), mload(add(transcript, 0x5360))) mstore(add(transcript, 0x5420), mload(add(transcript, 0x5380)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x53c0), 0x80, add(transcript, 0x53c0), 0x40), 1), success)mstore(add(transcript, 0x5440), mload(add(transcript, 0xe0))) mstore(add(transcript, 0x5460), mload(add(transcript, 0x100)))mstore(add(transcript, 0x5480), mload(add(transcript, 0x4b40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5440), 0x60, add(transcript, 0x5440), 0x40), 1), success)mstore(add(transcript, 0x54a0), mload(add(transcript, 0x53c0))) mstore(add(transcript, 0x54c0), mload(add(transcript, 0x53e0)))mstore(add(transcript, 0x54e0), mload(add(transcript, 0x5440))) mstore(add(transcript, 0x5500), mload(add(transcript, 0x5460)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x54a0), 0x80, add(transcript, 0x54a0), 0x40), 1), success)mstore(add(transcript, 0x5520), mload(add(transcript, 0x1c0))) mstore(add(transcript, 0x5540), mload(add(transcript, 0x1e0)))mstore(add(transcript, 0x5560), mload(add(transcript, 0x4b60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5520), 0x60, add(transcript, 0x5520), 0x40), 1), success)mstore(add(transcript, 0x5580), mload(add(transcript, 0x54a0))) mstore(add(transcript, 0x55a0), mload(add(transcript, 0x54c0)))mstore(add(transcript, 0x55c0), mload(add(transcript, 0x5520))) mstore(add(transcript, 0x55e0), mload(add(transcript, 0x5540)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5580), 0x80, add(transcript, 0x5580), 0x40), 1), success)mstore(add(transcript, 0x5600), 0x14113d2da8037ec77f55dffb91151a8e7bb3eeea2fe44f6804703d0f82f344a0) mstore(add(transcript, 0x5620), 0x1c5b5f4c28346cfddf08edde8db492f19a24b5f73fc2bd48dc19137a11ce53bf)mstore(add(transcript, 0x5640), mload(add(transcript, 0x4b80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5600), 0x60, add(transcript, 0x5600), 0x40), 1), success)mstore(add(transcript, 0x5660), mload(add(transcript, 0x5580))) mstore(add(transcript, 0x5680), mload(add(transcript, 0x55a0)))mstore(add(transcript, 0x56a0), mload(add(transcript, 0x5600))) mstore(add(transcript, 0x56c0), mload(add(transcript, 0x5620)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5660), 0x80, add(transcript, 0x5660), 0x40), 1), success)mstore(add(transcript, 0x56e0), 0x0491714ea02953469195ca0768b5aafb03166b27284de7cc9ffa7b3879a959a5) mstore(add(transcript, 0x5700), 0x2dbaa9a59dc7fd9657798dd9c00ffc85d2033e9555b699f4d9706bc2b77dce77)mstore(add(transcript, 0x5720), mload(add(transcript, 0x4ba0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x56e0), 0x60, add(transcript, 0x56e0), 0x40), 1), success)mstore(add(transcript, 0x5740), mload(add(transcript, 0x5660))) mstore(add(transcript, 0x5760), mload(add(transcript, 0x5680)))mstore(add(transcript, 0x5780), mload(add(transcript, 0x56e0))) mstore(add(transcript, 0x57a0), mload(add(transcript, 0x5700)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5740), 0x80, add(transcript, 0x5740), 0x40), 1), success)mstore(add(transcript, 0x57c0), 0x16da8fcde785c6df1fe13aec4a088e06790750dfa9a2e9c6e05464a06b99679d) mstore(add(transcript, 0x57e0), 0x19fffa5d91549cdec737262e6cc5fa01c2f1c39c7b5f567d65d68e2cf3077bdb)mstore(add(transcript, 0x5800), mload(add(transcript, 0x4bc0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x57c0), 0x60, add(transcript, 0x57c0), 0x40), 1), success)mstore(add(transcript, 0x5820), mload(add(transcript, 0x5740))) mstore(add(transcript, 0x5840), mload(add(transcript, 0x5760)))mstore(add(transcript, 0x5860), mload(add(transcript, 0x57c0))) mstore(add(transcript, 0x5880), mload(add(transcript, 0x57e0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5820), 0x80, add(transcript, 0x5820), 0x40), 1), success)mstore(add(transcript, 0x58a0), 0x1542d7d471049c346e9b97abc2a351948d23438019a76df2b1989c8f76b28760) mstore(add(transcript, 0x58c0), 0x0e26e13db1f178f85dbcb83b0a617d766c0b36fc4a49bafab13b20e83d0557f3)mstore(add(transcript, 0x58e0), mload(add(transcript, 0x4be0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x58a0), 0x60, add(transcript, 0x58a0), 0x40), 1), success)mstore(add(transcript, 0x5900), mload(add(transcript, 0x5820))) mstore(add(transcript, 0x5920), mload(add(transcript, 0x5840)))mstore(add(transcript, 0x5940), mload(add(transcript, 0x58a0))) mstore(add(transcript, 0x5960), mload(add(transcript, 0x58c0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5900), 0x80, add(transcript, 0x5900), 0x40), 1), success)mstore(add(transcript, 0x5980), 0x2b692b9199891f86e3fc5613991e72b47098220c9d883415244271cc74b1218d) mstore(add(transcript, 0x59a0), 0x042f929afe4bc56206b4ace41a3d283848753d5014597bcd0ec14f8a9261c584)mstore(add(transcript, 0x59c0), mload(add(transcript, 0x4c00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5980), 0x60, add(transcript, 0x5980), 0x40), 1), success)mstore(add(transcript, 0x59e0), mload(add(transcript, 0x5900))) mstore(add(transcript, 0x5a00), mload(add(transcript, 0x5920)))mstore(add(transcript, 0x5a20), mload(add(transcript, 0x5980))) mstore(add(transcript, 0x5a40), mload(add(transcript, 0x59a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x59e0), 0x80, add(transcript, 0x59e0), 0x40), 1), success)mstore(add(transcript, 0x5a60), 0x29c09f206a2fb04b15a3a0c220024c6b0ffa448a19fe3d4ec45ffa20748fc946) mstore(add(transcript, 0x5a80), 0x1d27c69fbfa99caecf06376d79cbde5436726836ad63582954e2618d3899a6f6)mstore(add(transcript, 0x5aa0), mload(add(transcript, 0x4c20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5a60), 0x60, add(transcript, 0x5a60), 0x40), 1), success)mstore(add(transcript, 0x5ac0), mload(add(transcript, 0x59e0))) mstore(add(transcript, 0x5ae0), mload(add(transcript, 0x5a00)))mstore(add(transcript, 0x5b00), mload(add(transcript, 0x5a60))) mstore(add(transcript, 0x5b20), mload(add(transcript, 0x5a80)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5ac0), 0x80, add(transcript, 0x5ac0), 0x40), 1), success)mstore(add(transcript, 0x5b40), 0x20a3113a48bc99d14016666990d982af3fc8ef6269c2f37e053bbb801e1bda37) mstore(add(transcript, 0x5b60), 0x11874a3348a60113ed95b25c4bdb198369e449967dfe7fe3253cb39afdee2672)mstore(add(transcript, 0x5b80), mload(add(transcript, 0x4c40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5b40), 0x60, add(transcript, 0x5b40), 0x40), 1), success)mstore(add(transcript, 0x5ba0), mload(add(transcript, 0x5ac0))) mstore(add(transcript, 0x5bc0), mload(add(transcript, 0x5ae0)))mstore(add(transcript, 0x5be0), mload(add(transcript, 0x5b40))) mstore(add(transcript, 0x5c00), mload(add(transcript, 0x5b60)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5ba0), 0x80, add(transcript, 0x5ba0), 0x40), 1), success)mstore(add(transcript, 0x5c20), 0x22ee677d2be1568a5ed89b73c8499d415c7c48b12184a48781e4f08d37755757) mstore(add(transcript, 0x5c40), 0x16f2744bb8dae65b5c5a6e0836cd5b59014c25f2481b024dec21ccbf26a9808c)mstore(add(transcript, 0x5c60), mload(add(transcript, 0x4c60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5c20), 0x60, add(transcript, 0x5c20), 0x40), 1), success)mstore(add(transcript, 0x5c80), mload(add(transcript, 0x5ba0))) mstore(add(transcript, 0x5ca0), mload(add(transcript, 0x5bc0)))mstore(add(transcript, 0x5cc0), mload(add(transcript, 0x5c20))) mstore(add(transcript, 0x5ce0), mload(add(transcript, 0x5c40)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5c80), 0x80, add(transcript, 0x5c80), 0x40), 1), success)mstore(add(transcript, 0x5d00), 0x0fccf37dc6868cb450c1cc971a9005c20acf19ddb1c82b9ceae7579aaaf6e5dc) mstore(add(transcript, 0x5d20), 0x1053a5adbb841ceb0c804c8e4188b2eb030d0a623ae199553173d818df46a8f8)mstore(add(transcript, 0x5d40), mload(add(transcript, 0x4c80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5d00), 0x60, add(transcript, 0x5d00), 0x40), 1), success)mstore(add(transcript, 0x5d60), mload(add(transcript, 0x5c80))) mstore(add(transcript, 0x5d80), mload(add(transcript, 0x5ca0)))mstore(add(transcript, 0x5da0), mload(add(transcript, 0x5d00))) mstore(add(transcript, 0x5dc0), mload(add(transcript, 0x5d20)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5d60), 0x80, add(transcript, 0x5d60), 0x40), 1), success)mstore(add(transcript, 0x5de0), 0x03c3c5792394acd6230174342c0fb4ceba9b35c38d4ab0ddb4a0fb177db54308) mstore(add(transcript, 0x5e00), 0x1fd7d3ae57e2ef4c7b1023ce495503e40ca89532cbf6a740e57d9fa57d2b6f93)mstore(add(transcript, 0x5e20), mload(add(transcript, 0x4ca0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5de0), 0x60, add(transcript, 0x5de0), 0x40), 1), success)mstore(add(transcript, 0x5e40), mload(add(transcript, 0x5d60))) mstore(add(transcript, 0x5e60), mload(add(transcript, 0x5d80)))mstore(add(transcript, 0x5e80), mload(add(transcript, 0x5de0))) mstore(add(transcript, 0x5ea0), mload(add(transcript, 0x5e00)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5e40), 0x80, add(transcript, 0x5e40), 0x40), 1), success)mstore(add(transcript, 0x5ec0), 0x15b64cf223d375ca6c983ab84102a960bfeb54a0a29a085844e0e571b09f3d71) mstore(add(transcript, 0x5ee0), 0x23d8408484b6b10b897f9b0cc33314d9060dac48f43a62a0e5660be5882a7a8e)mstore(add(transcript, 0x5f00), mload(add(transcript, 0x4cc0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5ec0), 0x60, add(transcript, 0x5ec0), 0x40), 1), success)mstore(add(transcript, 0x5f20), mload(add(transcript, 0x5e40))) mstore(add(transcript, 0x5f40), mload(add(transcript, 0x5e60)))mstore(add(transcript, 0x5f60), mload(add(transcript, 0x5ec0))) mstore(add(transcript, 0x5f80), mload(add(transcript, 0x5ee0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x5f20), 0x80, add(transcript, 0x5f20), 0x40), 1), success)mstore(add(transcript, 0x5fa0), 0x2b069d8e2e57e6add6f216816a31936af27540959bfd7b845d3e74d84196639d) mstore(add(transcript, 0x5fc0), 0x0840b8c0bdbb760a926c4046da2614e14d3c8b2fafc18c7471ce21298ca57c17)mstore(add(transcript, 0x5fe0), mload(add(transcript, 0x4ce0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x5fa0), 0x60, add(transcript, 0x5fa0), 0x40), 1), success)mstore(add(transcript, 0x6000), mload(add(transcript, 0x5f20))) mstore(add(transcript, 0x6020), mload(add(transcript, 0x5f40)))mstore(add(transcript, 0x6040), mload(add(transcript, 0x5fa0))) mstore(add(transcript, 0x6060), mload(add(transcript, 0x5fc0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6000), 0x80, add(transcript, 0x6000), 0x40), 1), success)mstore(add(transcript, 0x6080), 0x2a6e42bf68afa452351faa949dc279f9fe3c68b126280aca278121888fcbaf73) mstore(add(transcript, 0x60a0), 0x04ddb656fb4f29069ada65c848b2ab177b495c0869aba6fe9216dab3a043f759)mstore(add(transcript, 0x60c0), mload(add(transcript, 0x4d00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6080), 0x60, add(transcript, 0x6080), 0x40), 1), success)mstore(add(transcript, 0x60e0), mload(add(transcript, 0x6000))) mstore(add(transcript, 0x6100), mload(add(transcript, 0x6020)))mstore(add(transcript, 0x6120), mload(add(transcript, 0x6080))) mstore(add(transcript, 0x6140), mload(add(transcript, 0x60a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x60e0), 0x80, add(transcript, 0x60e0), 0x40), 1), success)mstore(add(transcript, 0x6160), 0x0182a509c08487b8c3d5b8507251cc8a46f5b313c687c1e7262d08eb8dfa4c10) mstore(add(transcript, 0x6180), 0x0474aa258fa2d41afc65596c3ada20b889a0f27825905a2a176560b27e2d2c8e)mstore(add(transcript, 0x61a0), mload(add(transcript, 0x4d20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6160), 0x60, add(transcript, 0x6160), 0x40), 1), success)mstore(add(transcript, 0x61c0), mload(add(transcript, 0x60e0))) mstore(add(transcript, 0x61e0), mload(add(transcript, 0x6100)))mstore(add(transcript, 0x6200), mload(add(transcript, 0x6160))) mstore(add(transcript, 0x6220), mload(add(transcript, 0x6180)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x61c0), 0x80, add(transcript, 0x61c0), 0x40), 1), success)mstore(add(transcript, 0x6240), 0x1b5b2f748768c343be69fd761df14910a926a77da095db2912e96ac9f73ab6a2) mstore(add(transcript, 0x6260), 0x2c0bb520bc601497c6b7f1bf683c83cab3a0440c41d8fdfbae0c775a57e727f5)mstore(add(transcript, 0x6280), mload(add(transcript, 0x4d40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6240), 0x60, add(transcript, 0x6240), 0x40), 1), success)mstore(add(transcript, 0x62a0), mload(add(transcript, 0x61c0))) mstore(add(transcript, 0x62c0), mload(add(transcript, 0x61e0)))mstore(add(transcript, 0x62e0), mload(add(transcript, 0x6240))) mstore(add(transcript, 0x6300), mload(add(transcript, 0x6260)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x62a0), 0x80, add(transcript, 0x62a0), 0x40), 1), success)mstore(add(transcript, 0x6320), 0x0013dfb44248755cf12dcbac0ec5563e577e5b804ade04abc4e9baadac00e7ff) mstore(add(transcript, 0x6340), 0x264d42845662a911a5c37ae71cce463c1c387c12eed1a675e957440020045cb1)mstore(add(transcript, 0x6360), mload(add(transcript, 0x4d60)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6320), 0x60, add(transcript, 0x6320), 0x40), 1), success)mstore(add(transcript, 0x6380), mload(add(transcript, 0x62a0))) mstore(add(transcript, 0x63a0), mload(add(transcript, 0x62c0)))mstore(add(transcript, 0x63c0), mload(add(transcript, 0x6320))) mstore(add(transcript, 0x63e0), mload(add(transcript, 0x6340)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6380), 0x80, add(transcript, 0x6380), 0x40), 1), success)mstore(add(transcript, 0x6400), 0x2386d5258846b3fc1e5ffca77fde43316fd15ea08e7ce940927f7212c1b37bb7) mstore(add(transcript, 0x6420), 0x23306e0a53ba71047743578c8fb135d2b843a8dded816b5a9e0b06b72f07be96)mstore(add(transcript, 0x6440), mload(add(transcript, 0x4d80)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6400), 0x60, add(transcript, 0x6400), 0x40), 1), success)mstore(add(transcript, 0x6460), mload(add(transcript, 0x6380))) mstore(add(transcript, 0x6480), mload(add(transcript, 0x63a0)))mstore(add(transcript, 0x64a0), mload(add(transcript, 0x6400))) mstore(add(transcript, 0x64c0), mload(add(transcript, 0x6420)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6460), 0x80, add(transcript, 0x6460), 0x40), 1), success)mstore(add(transcript, 0x64e0), mload(add(transcript, 0x420))) mstore(add(transcript, 0x6500), mload(add(transcript, 0x440)))mstore(add(transcript, 0x6520), mload(add(transcript, 0x4da0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x64e0), 0x60, add(transcript, 0x64e0), 0x40), 1), success)mstore(add(transcript, 0x6540), mload(add(transcript, 0x6460))) mstore(add(transcript, 0x6560), mload(add(transcript, 0x6480)))mstore(add(transcript, 0x6580), mload(add(transcript, 0x64e0))) mstore(add(transcript, 0x65a0), mload(add(transcript, 0x6500)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6540), 0x80, add(transcript, 0x6540), 0x40), 1), success)mstore(add(transcript, 0x65c0), mload(add(transcript, 0x460))) mstore(add(transcript, 0x65e0), mload(add(transcript, 0x480)))mstore(add(transcript, 0x6600), mload(add(transcript, 0x4dc0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x65c0), 0x60, add(transcript, 0x65c0), 0x40), 1), success)mstore(add(transcript, 0x6620), mload(add(transcript, 0x6540))) mstore(add(transcript, 0x6640), mload(add(transcript, 0x6560)))mstore(add(transcript, 0x6660), mload(add(transcript, 0x65c0))) mstore(add(transcript, 0x6680), mload(add(transcript, 0x65e0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6620), 0x80, add(transcript, 0x6620), 0x40), 1), success)mstore(add(transcript, 0x66a0), mload(add(transcript, 0x4a0))) mstore(add(transcript, 0x66c0), mload(add(transcript, 0x4c0)))mstore(add(transcript, 0x66e0), mload(add(transcript, 0x4de0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x66a0), 0x60, add(transcript, 0x66a0), 0x40), 1), success)mstore(add(transcript, 0x6700), mload(add(transcript, 0x6620))) mstore(add(transcript, 0x6720), mload(add(transcript, 0x6640)))mstore(add(transcript, 0x6740), mload(add(transcript, 0x66a0))) mstore(add(transcript, 0x6760), mload(add(transcript, 0x66c0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6700), 0x80, add(transcript, 0x6700), 0x40), 1), success)mstore(add(transcript, 0x6780), mload(add(transcript, 0x4e0))) mstore(add(transcript, 0x67a0), mload(add(transcript, 0x500)))mstore(add(transcript, 0x67c0), mload(add(transcript, 0x4e00)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6780), 0x60, add(transcript, 0x6780), 0x40), 1), success)mstore(add(transcript, 0x67e0), mload(add(transcript, 0x6700))) mstore(add(transcript, 0x6800), mload(add(transcript, 0x6720)))mstore(add(transcript, 0x6820), mload(add(transcript, 0x6780))) mstore(add(transcript, 0x6840), mload(add(transcript, 0x67a0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x67e0), 0x80, add(transcript, 0x67e0), 0x40), 1), success)mstore(add(transcript, 0x6860), mload(add(transcript, 0x520))) mstore(add(transcript, 0x6880), mload(add(transcript, 0x540)))mstore(add(transcript, 0x68a0), mload(add(transcript, 0x4e20)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6860), 0x60, add(transcript, 0x6860), 0x40), 1), success)mstore(add(transcript, 0x68c0), mload(add(transcript, 0x67e0))) mstore(add(transcript, 0x68e0), mload(add(transcript, 0x6800)))mstore(add(transcript, 0x6900), mload(add(transcript, 0x6860))) mstore(add(transcript, 0x6920), mload(add(transcript, 0x6880)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x68c0), 0x80, add(transcript, 0x68c0), 0x40), 1), success)mstore(add(transcript, 0x6940), mload(add(transcript, 0x380))) mstore(add(transcript, 0x6960), mload(add(transcript, 0x3a0)))mstore(add(transcript, 0x6980), mload(add(transcript, 0x4e40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6940), 0x60, add(transcript, 0x6940), 0x40), 1), success)mstore(add(transcript, 0x69a0), mload(add(transcript, 0x68c0))) mstore(add(transcript, 0x69c0), mload(add(transcript, 0x68e0)))mstore(add(transcript, 0x69e0), mload(add(transcript, 0x6940))) mstore(add(transcript, 0x6a00), mload(add(transcript, 0x6960)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x69a0), 0x80, add(transcript, 0x69a0), 0x40), 1), success)mstore(add(transcript, 0x6a20), mload(add(transcript, 0x2c0))) mstore(add(transcript, 0x6a40), mload(add(transcript, 0x2e0)))mstore(add(transcript, 0x6a60), mload(add(transcript, 0x4f40)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6a20), 0x60, add(transcript, 0x6a20), 0x40), 1), success)mstore(add(transcript, 0x6a80), mload(add(transcript, 0x69a0))) mstore(add(transcript, 0x6aa0), mload(add(transcript, 0x69c0)))mstore(add(transcript, 0x6ac0), mload(add(transcript, 0x6a20))) mstore(add(transcript, 0x6ae0), mload(add(transcript, 0x6a40)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6a80), 0x80, add(transcript, 0x6a80), 0x40), 1), success)mstore(add(transcript, 0x6b00), mload(add(transcript, 0x300))) mstore(add(transcript, 0x6b20), mload(add(transcript, 0x320)))mstore(add(transcript, 0x6b40), mload(add(transcript, 0x50e0)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6b00), 0x60, add(transcript, 0x6b00), 0x40), 1), success)mstore(add(transcript, 0x6b60), mload(add(transcript, 0x6a80))) mstore(add(transcript, 0x6b80), mload(add(transcript, 0x6aa0)))mstore(add(transcript, 0x6ba0), mload(add(transcript, 0x6b00))) mstore(add(transcript, 0x6bc0), mload(add(transcript, 0x6b20)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6b60), 0x80, add(transcript, 0x6b60), 0x40), 1), success)mstore(add(transcript, 0x6be0), mload(add(transcript, 0x340))) mstore(add(transcript, 0x6c00), mload(add(transcript, 0x360)))mstore(add(transcript, 0x6c20), mload(add(transcript, 0x5100)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6be0), 0x60, add(transcript, 0x6be0), 0x40), 1), success)mstore(add(transcript, 0x6c40), mload(add(transcript, 0x6b60))) mstore(add(transcript, 0x6c60), mload(add(transcript, 0x6b80)))mstore(add(transcript, 0x6c80), mload(add(transcript, 0x6be0))) mstore(add(transcript, 0x6ca0), mload(add(transcript, 0x6c00)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6c40), 0x80, add(transcript, 0x6c40), 0x40), 1), success)mstore(add(transcript, 0x6cc0), mload(add(transcript, 0x180))) mstore(add(transcript, 0x6ce0), mload(add(transcript, 0x1a0)))mstore(add(transcript, 0x6d00), mload(add(transcript, 0x5200)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6cc0), 0x60, add(transcript, 0x6cc0), 0x40), 1), success)mstore(add(transcript, 0x6d20), mload(add(transcript, 0x6c40))) mstore(add(transcript, 0x6d40), mload(add(transcript, 0x6c60)))mstore(add(transcript, 0x6d60), mload(add(transcript, 0x6cc0))) mstore(add(transcript, 0x6d80), mload(add(transcript, 0x6ce0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6d20), 0x80, add(transcript, 0x6d20), 0x40), 1), success)mstore(add(transcript, 0x6da0), mload(add(transcript, 0xae0))) mstore(add(transcript, 0x6dc0), mload(add(transcript, 0xb00)))mstore(add(transcript, 0x6de0), sub(f_q, mload(add(transcript, 0x5240))))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6da0), 0x60, add(transcript, 0x6da0), 0x40), 1), success)mstore(add(transcript, 0x6e00), mload(add(transcript, 0x6d20))) mstore(add(transcript, 0x6e20), mload(add(transcript, 0x6d40)))mstore(add(transcript, 0x6e40), mload(add(transcript, 0x6da0))) mstore(add(transcript, 0x6e60), mload(add(transcript, 0x6dc0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6e00), 0x80, add(transcript, 0x6e00), 0x40), 1), success)mstore(add(transcript, 0x6e80), mload(add(transcript, 0xb80))) mstore(add(transcript, 0x6ea0), mload(add(transcript, 0xba0)))mstore(add(transcript, 0x6ec0), mload(add(transcript, 0x5260)))success := and(eq(staticcall(gas(), 0x7, add(transcript, 0x6e80), 0x60, add(transcript, 0x6e80), 0x40), 1), success)mstore(add(transcript, 0x6ee0), mload(add(transcript, 0x6e00))) mstore(add(transcript, 0x6f00), mload(add(transcript, 0x6e20)))mstore(add(transcript, 0x6f20), mload(add(transcript, 0x6e80))) mstore(add(transcript, 0x6f40), mload(add(transcript, 0x6ea0)))success := and(eq(staticcall(gas(), 0x6, add(transcript, 0x6ee0), 0x80, add(transcript, 0x6ee0), 0x40), 1), success)mstore(add(transcript, 0x6f60), mload(add(transcript, 0x6ee0))) mstore(add(transcript, 0x6f80), mload(add(transcript, 0x6f00)))mstore(add(transcript, 0x6fa0), 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) mstore(add(transcript, 0x6fc0), 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) mstore(add(transcript, 0x6fe0), 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) mstore(add(transcript, 0x7000), 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa)mstore(add(transcript, 0x7020), mload(add(transcript, 0xb80))) mstore(add(transcript, 0x7040), mload(add(transcript, 0xba0)))mstore(add(transcript, 0x7060), 0x1e46f29916af7be8122d38ce700e9f73b49830b4aa672d58c5fa83daa6f49038) mstore(add(transcript, 0x7080), 0x203ccabc1b45b69a6dfd92fe117dfbdbeb48e684dccdf8cb2f466f4b86073034) mstore(add(transcript, 0x70a0), 0x0bd22dcbe71a1faeea29bf6783cbc63f06788ff9ea2488a2af9036ac52d4ae82) mstore(add(transcript, 0x70c0), 0x23b7b2c332fca16856cc8bd1ca0b56f6872ed95ef4291917fce124bf48c13609)success := and(eq(staticcall(gas(), 0x8, add(transcript, 0x6f60), 0x180, add(transcript, 0x6f60), 0x20), 1), success)success := and(eq(mload(add(transcript, 0x6f60)), 1), success)} return success; } } diff --git a/contracts/src/InclusionVerifier.yul b/contracts/src/InclusionVerifier.yul new file mode 100644 index 00000000..f0ab35e1 --- /dev/null +++ b/contracts/src/InclusionVerifier.yul @@ -0,0 +1,1481 @@ + + object "plonk_verifier" { + code { + function allocate(size) -> ptr { + ptr := mload(0x40) + if eq(ptr, 0) { ptr := 0x60 } + mstore(0x40, add(ptr, size)) + } + let size := datasize("Runtime") + let offset := allocate(size) + datacopy(offset, dataoffset("Runtime"), size) + return(offset, size) + } + object "Runtime" { + code { + let success:bool := true + let f_p := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47 + let f_q := 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001 + function validate_ec_point(x, y) -> valid:bool { + { + let x_lt_p:bool := lt(x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) + let y_lt_p:bool := lt(y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) + valid := and(x_lt_p, y_lt_p) + } + { + let y_square := mulmod(y, y, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) + let x_square := mulmod(x, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) + let x_cube := mulmod(x_square, x, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) + let x_cube_plus_3 := addmod(x_cube, 3, 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47) + let is_affine:bool := eq(x_cube_plus_3, y_square) + valid := and(valid, is_affine) + } + } + mstore(0x20, mod(calldataload(0x0), f_q)) +mstore(0x40, mod(calldataload(0x20), f_q)) +mstore(0x0, 17529190814129643618827022425812408993103566606845457031195635551857697656486) + + { + let x := calldataload(0x40) + mstore(0x60, x) + let y := calldataload(0x60) + mstore(0x80, y) + success := and(validate_ec_point(x, y), success) + } + + { + let x := calldataload(0x80) + mstore(0xa0, x) + let y := calldataload(0xa0) + mstore(0xc0, y) + success := and(validate_ec_point(x, y), success) + } + + { + let x := calldataload(0xc0) + mstore(0xe0, x) + let y := calldataload(0xe0) + mstore(0x100, y) + success := and(validate_ec_point(x, y), success) + } +mstore(0x120, keccak256(0x0, 288)) +{ + let hash := mload(0x120) + mstore(0x140, mod(hash, f_q)) + mstore(0x160, hash) + } + + { + let x := calldataload(0x100) + mstore(0x180, x) + let y := calldataload(0x120) + mstore(0x1a0, y) + success := and(validate_ec_point(x, y), success) + } + + { + let x := calldataload(0x140) + mstore(0x1c0, x) + let y := calldataload(0x160) + mstore(0x1e0, y) + success := and(validate_ec_point(x, y), success) + } +mstore(0x200, keccak256(0x160, 160)) +{ + let hash := mload(0x200) + mstore(0x220, mod(hash, f_q)) + mstore(0x240, hash) + } +mstore8(608, 1) +mstore(0x260, keccak256(0x240, 33)) +{ + let hash := mload(0x260) + mstore(0x280, mod(hash, f_q)) + mstore(0x2a0, hash) + } + + { + let x := calldataload(0x180) + mstore(0x2c0, x) + let y := calldataload(0x1a0) + mstore(0x2e0, y) + success := and(validate_ec_point(x, y), success) + } + + { + let x := calldataload(0x1c0) + mstore(0x300, x) + let y := calldataload(0x1e0) + mstore(0x320, y) + success := and(validate_ec_point(x, y), success) + } + + { + let x := calldataload(0x200) + mstore(0x340, x) + let y := calldataload(0x220) + mstore(0x360, y) + success := and(validate_ec_point(x, y), success) + } + + { + let x := calldataload(0x240) + mstore(0x380, x) + let y := calldataload(0x260) + mstore(0x3a0, y) + success := and(validate_ec_point(x, y), success) + } +mstore(0x3c0, keccak256(0x2a0, 288)) +{ + let hash := mload(0x3c0) + mstore(0x3e0, mod(hash, f_q)) + mstore(0x400, hash) + } + + { + let x := calldataload(0x280) + mstore(0x420, x) + let y := calldataload(0x2a0) + mstore(0x440, y) + success := and(validate_ec_point(x, y), success) + } + + { + let x := calldataload(0x2c0) + mstore(0x460, x) + let y := calldataload(0x2e0) + mstore(0x480, y) + success := and(validate_ec_point(x, y), success) + } + + { + let x := calldataload(0x300) + mstore(0x4a0, x) + let y := calldataload(0x320) + mstore(0x4c0, y) + success := and(validate_ec_point(x, y), success) + } + + { + let x := calldataload(0x340) + mstore(0x4e0, x) + let y := calldataload(0x360) + mstore(0x500, y) + success := and(validate_ec_point(x, y), success) + } + + { + let x := calldataload(0x380) + mstore(0x520, x) + let y := calldataload(0x3a0) + mstore(0x540, y) + success := and(validate_ec_point(x, y), success) + } +mstore(0x560, keccak256(0x400, 352)) +{ + let hash := mload(0x560) + mstore(0x580, mod(hash, f_q)) + mstore(0x5a0, hash) + } +mstore(0x5c0, mod(calldataload(0x3c0), f_q)) +mstore(0x5e0, mod(calldataload(0x3e0), f_q)) +mstore(0x600, mod(calldataload(0x400), f_q)) +mstore(0x620, mod(calldataload(0x420), f_q)) +mstore(0x640, mod(calldataload(0x440), f_q)) +mstore(0x660, mod(calldataload(0x460), f_q)) +mstore(0x680, mod(calldataload(0x480), f_q)) +mstore(0x6a0, mod(calldataload(0x4a0), f_q)) +mstore(0x6c0, mod(calldataload(0x4c0), f_q)) +mstore(0x6e0, mod(calldataload(0x4e0), f_q)) +mstore(0x700, mod(calldataload(0x500), f_q)) +mstore(0x720, mod(calldataload(0x520), f_q)) +mstore(0x740, mod(calldataload(0x540), f_q)) +mstore(0x760, mod(calldataload(0x560), f_q)) +mstore(0x780, mod(calldataload(0x580), f_q)) +mstore(0x7a0, mod(calldataload(0x5a0), f_q)) +mstore(0x7c0, mod(calldataload(0x5c0), f_q)) +mstore(0x7e0, mod(calldataload(0x5e0), f_q)) +mstore(0x800, mod(calldataload(0x600), f_q)) +mstore(0x820, mod(calldataload(0x620), f_q)) +mstore(0x840, mod(calldataload(0x640), f_q)) +mstore(0x860, mod(calldataload(0x660), f_q)) +mstore(0x880, mod(calldataload(0x680), f_q)) +mstore(0x8a0, mod(calldataload(0x6a0), f_q)) +mstore(0x8c0, mod(calldataload(0x6c0), f_q)) +mstore(0x8e0, mod(calldataload(0x6e0), f_q)) +mstore(0x900, mod(calldataload(0x700), f_q)) +mstore(0x920, mod(calldataload(0x720), f_q)) +mstore(0x940, mod(calldataload(0x740), f_q)) +mstore(0x960, mod(calldataload(0x760), f_q)) +mstore(0x980, mod(calldataload(0x780), f_q)) +mstore(0x9a0, mod(calldataload(0x7a0), f_q)) +mstore(0x9c0, mod(calldataload(0x7c0), f_q)) +mstore(0x9e0, mod(calldataload(0x7e0), f_q)) +mstore(0xa00, mod(calldataload(0x800), f_q)) +mstore(0xa20, keccak256(0x5a0, 1152)) +{ + let hash := mload(0xa20) + mstore(0xa40, mod(hash, f_q)) + mstore(0xa60, hash) + } +mstore8(2688, 1) +mstore(0xa80, keccak256(0xa60, 33)) +{ + let hash := mload(0xa80) + mstore(0xaa0, mod(hash, f_q)) + mstore(0xac0, hash) + } + + { + let x := calldataload(0x820) + mstore(0xae0, x) + let y := calldataload(0x840) + mstore(0xb00, y) + success := and(validate_ec_point(x, y), success) + } +mstore(0xb20, keccak256(0xac0, 96)) +{ + let hash := mload(0xb20) + mstore(0xb40, mod(hash, f_q)) + mstore(0xb60, hash) + } + + { + let x := calldataload(0x860) + mstore(0xb80, x) + let y := calldataload(0x880) + mstore(0xba0, y) + success := and(validate_ec_point(x, y), success) + } +mstore(0xbc0, mulmod(mload(0x580), mload(0x580), f_q)) +mstore(0xbe0, mulmod(mload(0xbc0), mload(0xbc0), f_q)) +mstore(0xc00, mulmod(mload(0xbe0), mload(0xbe0), f_q)) +mstore(0xc20, mulmod(mload(0xc00), mload(0xc00), f_q)) +mstore(0xc40, mulmod(mload(0xc20), mload(0xc20), f_q)) +mstore(0xc60, mulmod(mload(0xc40), mload(0xc40), f_q)) +mstore(0xc80, mulmod(mload(0xc60), mload(0xc60), f_q)) +mstore(0xca0, mulmod(mload(0xc80), mload(0xc80), f_q)) +mstore(0xcc0, mulmod(mload(0xca0), mload(0xca0), f_q)) +mstore(0xce0, mulmod(mload(0xcc0), mload(0xcc0), f_q)) +mstore(0xd00, mulmod(mload(0xce0), mload(0xce0), f_q)) +mstore(0xd20, addmod(mload(0xd00), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)) +mstore(0xd40, mulmod(mload(0xd20), 21877555253249509951141793242451973684696534144361143701928820297812832026625, f_q)) +mstore(0xd60, mulmod(mload(0xd40), 15699029810934084314820646074566828280617789951162923449200398535581206172418, f_q)) +mstore(0xd80, addmod(mload(0x580), 6189213060905190907425759670690446807930574449253110894497805650994602323199, f_q)) +mstore(0xda0, mulmod(mload(0xd40), 16553167948716468074998850291160946772606011499093267774599468837293218566225, f_q)) +mstore(0xdc0, addmod(mload(0x580), 5335074923122807147247555454096328315942352901322766569098735349282589929392, f_q)) +mstore(0xde0, mulmod(mload(0xd40), 4260969412351770314333984243767775737437927068151180798236715529158398853173, f_q)) +mstore(0xe00, addmod(mload(0x580), 17627273459487504907912421501489499351110437332264853545461488657417409642444, f_q)) +mstore(0xe20, mulmod(mload(0xd40), 18302882236472339419631414285403968768409802182737928837767912484847322191909, f_q)) +mstore(0xe40, addmod(mload(0x580), 3585360635366935802614991459853306320138562217678105505930291701728486303708, f_q)) +mstore(0xe60, mulmod(mload(0xd40), 4925592601992654644734291590386747644864797672605745962807370354577123815907, f_q)) +mstore(0xe80, addmod(mload(0x580), 16962650269846620577512114154870527443683566727810288380890833831998684679710, f_q)) +mstore(0xea0, mulmod(mload(0xd40), 19444693496467964793333684482470811869395409953158764080291550423779334624794, f_q)) +mstore(0xec0, addmod(mload(0x580), 2443549375371310428912721262786463219152954447257270263406653762796473870823, f_q)) +mstore(0xee0, mulmod(mload(0xd40), 1, f_q)) +mstore(0xf00, addmod(mload(0x580), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q)) +mstore(0xf20, mulmod(mload(0xd40), 9396103202274256930945606623206526900461945684265495839012435492634193195103, f_q)) +mstore(0xf40, addmod(mload(0x580), 12492139669565018291300799122050748188086418716150538504685768693941615300514, f_q)) +{ + let prod := mload(0xd80) + + prod := mulmod(mload(0xdc0), prod, f_q) + mstore(0xf60, prod) + + prod := mulmod(mload(0xe00), prod, f_q) + mstore(0xf80, prod) + + prod := mulmod(mload(0xe40), prod, f_q) + mstore(0xfa0, prod) + + prod := mulmod(mload(0xe80), prod, f_q) + mstore(0xfc0, prod) + + prod := mulmod(mload(0xec0), prod, f_q) + mstore(0xfe0, prod) + + prod := mulmod(mload(0xf00), prod, f_q) + mstore(0x1000, prod) + + prod := mulmod(mload(0xf40), prod, f_q) + mstore(0x1020, prod) + + prod := mulmod(mload(0xd20), prod, f_q) + mstore(0x1040, prod) + + } +mstore(0x1080, 32) +mstore(0x10a0, 32) +mstore(0x10c0, 32) +mstore(0x10e0, mload(0x1040)) +mstore(0x1100, 21888242871839275222246405745257275088548364400416034343698204186575808495615) +mstore(0x1120, 21888242871839275222246405745257275088548364400416034343698204186575808495617) +success := and(eq(staticcall(gas(), 0x5, 0x1080, 0xc0, 0x1060, 0x20), 1), success) +{ + + let inv := mload(0x1060) + let v + + v := mload(0xd20) + mstore(3360, mulmod(mload(0x1020), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0xf40) + mstore(3904, mulmod(mload(0x1000), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0xf00) + mstore(3840, mulmod(mload(0xfe0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0xec0) + mstore(3776, mulmod(mload(0xfc0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0xe80) + mstore(3712, mulmod(mload(0xfa0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0xe40) + mstore(3648, mulmod(mload(0xf80), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0xe00) + mstore(3584, mulmod(mload(0xf60), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0xdc0) + mstore(3520, mulmod(mload(0xd80), inv, f_q)) + inv := mulmod(v, inv, f_q) + mstore(0xd80, inv) + + } +mstore(0x1140, mulmod(mload(0xd60), mload(0xd80), f_q)) +mstore(0x1160, mulmod(mload(0xda0), mload(0xdc0), f_q)) +mstore(0x1180, mulmod(mload(0xde0), mload(0xe00), f_q)) +mstore(0x11a0, mulmod(mload(0xe20), mload(0xe40), f_q)) +mstore(0x11c0, mulmod(mload(0xe60), mload(0xe80), f_q)) +mstore(0x11e0, mulmod(mload(0xea0), mload(0xec0), f_q)) +mstore(0x1200, mulmod(mload(0xee0), mload(0xf00), f_q)) +mstore(0x1220, mulmod(mload(0xf20), mload(0xf40), f_q)) +{ + let result := mulmod(mload(0x1200), mload(0x20), f_q) +result := addmod(mulmod(mload(0x1220), mload(0x40), f_q), result, f_q) +mstore(4672, result) + } +mstore(0x1260, addmod(mload(0x5c0), mload(0x6e0), f_q)) +mstore(0x1280, mulmod(mload(0x1260), mload(0x1260), f_q)) +mstore(0x12a0, mulmod(mload(0x1280), mload(0x1280), f_q)) +mstore(0x12c0, mulmod(mload(0x1260), mload(0x12a0), f_q)) +mstore(0x12e0, mulmod(mload(0x12c0), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q)) +mstore(0x1300, addmod(mload(0x5e0), mload(0x700), f_q)) +mstore(0x1320, mulmod(mload(0x1300), mload(0x1300), f_q)) +mstore(0x1340, mulmod(mload(0x1320), mload(0x1320), f_q)) +mstore(0x1360, mulmod(mload(0x1300), mload(0x1340), f_q)) +mstore(0x1380, mulmod(mload(0x1360), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q)) +mstore(0x13a0, addmod(mload(0x12e0), mload(0x1380), f_q)) +mstore(0x13c0, addmod(mload(0x13a0), sub(f_q, mload(0x600)), f_q)) +mstore(0x13e0, mulmod(mload(0x13c0), mload(0x780), f_q)) +mstore(0x1400, mulmod(mload(0x3e0), mload(0x13e0), f_q)) +mstore(0x1420, mulmod(mload(0x12c0), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q)) +mstore(0x1440, mulmod(mload(0x1360), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q)) +mstore(0x1460, addmod(mload(0x1420), mload(0x1440), f_q)) +mstore(0x1480, addmod(mload(0x1460), sub(f_q, mload(0x620)), f_q)) +mstore(0x14a0, mulmod(mload(0x1480), mload(0x780), f_q)) +mstore(0x14c0, addmod(mload(0x1400), mload(0x14a0), f_q)) +mstore(0x14e0, mulmod(mload(0x3e0), mload(0x14c0), f_q)) +mstore(0x1500, addmod(mload(0x12c0), sub(f_q, mload(0x640)), f_q)) +mstore(0x1520, mulmod(mload(0x1500), mload(0x7a0), f_q)) +mstore(0x1540, addmod(mload(0x14e0), mload(0x1520), f_q)) +mstore(0x1560, mulmod(mload(0x3e0), mload(0x1540), f_q)) +mstore(0x1580, mulmod(mload(0x640), 2910766817845651019878574839501801340070030115151021261302834310722729507541, f_q)) +mstore(0x15a0, mulmod(mload(0x1300), 19727366863391167538122140361473584127147630672623100827934084310230022599144, f_q)) +mstore(0x15c0, addmod(mload(0x1580), mload(0x15a0), f_q)) +mstore(0x15e0, addmod(mload(0x15c0), mload(0x6a0), f_q)) +mstore(0x1600, mulmod(mload(0x15e0), mload(0x15e0), f_q)) +mstore(0x1620, mulmod(mload(0x1600), mload(0x1600), f_q)) +mstore(0x1640, mulmod(mload(0x15e0), mload(0x1620), f_q)) +mstore(0x1660, mulmod(mload(0x600), 8897705321156975119607866206188469715432233408805434913352778521345836531302, f_q)) +mstore(0x1680, mulmod(mload(0x620), 13897810991298242824030978581179475767377101082166056046492926701399149797630, f_q)) +mstore(0x16a0, addmod(mload(0x1660), mload(0x1680), f_q)) +mstore(0x16c0, addmod(mload(0x1640), sub(f_q, mload(0x16a0)), f_q)) +mstore(0x16e0, mulmod(mload(0x16c0), mload(0x7a0), f_q)) +mstore(0x1700, addmod(mload(0x1560), mload(0x16e0), f_q)) +mstore(0x1720, mulmod(mload(0x3e0), mload(0x1700), f_q)) +mstore(0x1740, mulmod(mload(0x640), 5776684794125549462448597414050232243778680302179439492664047328281728356345, f_q)) +mstore(0x1760, mulmod(mload(0x1300), 8348174920934122550483593999453880006756108121341067172388445916328941978568, f_q)) +mstore(0x1780, addmod(mload(0x1740), mload(0x1760), f_q)) +mstore(0x17a0, addmod(mload(0x1780), mload(0x6c0), f_q)) +mstore(0x17c0, mulmod(mload(0x600), 7127083008168878795310303301757642617203533252990949589494537404444738046722, f_q)) +mstore(0x17e0, mulmod(mload(0x620), 10251091711782631878897995303436082826711938358699127319815611151510940403902, f_q)) +mstore(0x1800, addmod(mload(0x17c0), mload(0x17e0), f_q)) +mstore(0x1820, addmod(mload(0x17a0), sub(f_q, mload(0x1800)), f_q)) +mstore(0x1840, mulmod(mload(0x1820), mload(0x7a0), f_q)) +mstore(0x1860, addmod(mload(0x1720), mload(0x1840), f_q)) +mstore(0x1880, mulmod(mload(0x3e0), mload(0x1860), f_q)) +mstore(0x18a0, addmod(1, sub(f_q, mload(0x760)), f_q)) +mstore(0x18c0, mulmod(mload(0x18a0), mload(0x760), f_q)) +mstore(0x18e0, addmod(2, sub(f_q, mload(0x760)), f_q)) +mstore(0x1900, mulmod(mload(0x18e0), mload(0x18c0), f_q)) +mstore(0x1920, addmod(4, sub(f_q, mload(0x760)), f_q)) +mstore(0x1940, mulmod(mload(0x1920), mload(0x1900), f_q)) +mstore(0x1960, addmod(mload(0x680), mload(0x5c0), f_q)) +mstore(0x1980, addmod(mload(0x1960), sub(f_q, mload(0x600)), f_q)) +mstore(0x19a0, mulmod(mload(0x1980), mload(0x1940), f_q)) +mstore(0x19c0, addmod(mload(0x1880), mload(0x19a0), f_q)) +mstore(0x19e0, mulmod(mload(0x3e0), mload(0x19c0), f_q)) +mstore(0x1a00, addmod(mload(0x660), sub(f_q, mload(0x620)), f_q)) +mstore(0x1a20, mulmod(mload(0x1a00), mload(0x1940), f_q)) +mstore(0x1a40, addmod(mload(0x19e0), mload(0x1a20), f_q)) +mstore(0x1a60, mulmod(mload(0x3e0), mload(0x1a40), f_q)) +mstore(0x1a80, mulmod(mload(0x13c0), mload(0x7c0), f_q)) +mstore(0x1aa0, addmod(mload(0x1a60), mload(0x1a80), f_q)) +mstore(0x1ac0, mulmod(mload(0x3e0), mload(0x1aa0), f_q)) +mstore(0x1ae0, mulmod(mload(0x1480), mload(0x7c0), f_q)) +mstore(0x1b00, addmod(mload(0x1ac0), mload(0x1ae0), f_q)) +mstore(0x1b20, mulmod(mload(0x3e0), mload(0x1b00), f_q)) +mstore(0x1b40, mulmod(mload(0x1500), mload(0x7e0), f_q)) +mstore(0x1b60, addmod(mload(0x1b20), mload(0x1b40), f_q)) +mstore(0x1b80, mulmod(mload(0x3e0), mload(0x1b60), f_q)) +mstore(0x1ba0, mulmod(mload(0x16c0), mload(0x7e0), f_q)) +mstore(0x1bc0, addmod(mload(0x1b80), mload(0x1ba0), f_q)) +mstore(0x1be0, mulmod(mload(0x3e0), mload(0x1bc0), f_q)) +mstore(0x1c00, mulmod(mload(0x1820), mload(0x7e0), f_q)) +mstore(0x1c20, addmod(mload(0x1be0), mload(0x1c00), f_q)) +mstore(0x1c40, mulmod(mload(0x3e0), mload(0x1c20), f_q)) +mstore(0x1c60, addmod(3, sub(f_q, mload(0x760)), f_q)) +mstore(0x1c80, mulmod(mload(0x1c60), mload(0x1900), f_q)) +mstore(0x1ca0, mulmod(mload(0x1980), mload(0x1c80), f_q)) +mstore(0x1cc0, addmod(mload(0x1c40), mload(0x1ca0), f_q)) +mstore(0x1ce0, mulmod(mload(0x3e0), mload(0x1cc0), f_q)) +mstore(0x1d00, mulmod(mload(0x1a00), mload(0x1c80), f_q)) +mstore(0x1d20, addmod(mload(0x1ce0), mload(0x1d00), f_q)) +mstore(0x1d40, mulmod(mload(0x3e0), mload(0x1d20), f_q)) +mstore(0x1d60, mulmod(mload(0x18e0), mload(0x760), f_q)) +mstore(0x1d80, mulmod(mload(0x1c60), mload(0x1d60), f_q)) +mstore(0x1da0, mulmod(mload(0x1920), mload(0x1d80), f_q)) +mstore(0x1dc0, mulmod(mload(0x640), mload(0x1da0), f_q)) +mstore(0x1de0, addmod(1, sub(f_q, mload(0x640)), f_q)) +mstore(0x1e00, mulmod(mload(0x1de0), mload(0x1dc0), f_q)) +mstore(0x1e20, addmod(mload(0x1d40), mload(0x1e00), f_q)) +mstore(0x1e40, mulmod(mload(0x3e0), mload(0x1e20), f_q)) +mstore(0x1e60, mulmod(2, mload(0x640), f_q)) +mstore(0x1e80, addmod(mload(0x5e0), sub(f_q, mload(0x5c0)), f_q)) +mstore(0x1ea0, mulmod(mload(0x1e80), mload(0x1e60), f_q)) +mstore(0x1ec0, addmod(mload(0x600), sub(f_q, mload(0x5c0)), f_q)) +mstore(0x1ee0, addmod(mload(0x1ea0), sub(f_q, mload(0x1ec0)), f_q)) +mstore(0x1f00, addmod(mload(0x5e0), sub(f_q, mload(0x620)), f_q)) +mstore(0x1f20, addmod(mload(0x1ee0), sub(f_q, mload(0x1f00)), f_q)) +mstore(0x1f40, mulmod(mload(0x1f20), mload(0x1da0), f_q)) +mstore(0x1f60, addmod(mload(0x1e40), mload(0x1f40), f_q)) +mstore(0x1f80, mulmod(mload(0x3e0), mload(0x1f60), f_q)) +mstore(0x1fa0, mulmod(mload(0x1c60), mload(0x18c0), f_q)) +mstore(0x1fc0, mulmod(mload(0x1920), mload(0x1fa0), f_q)) +mstore(0x1fe0, addmod(mload(0x5c0), mload(0x5e0), f_q)) +mstore(0x2000, addmod(mload(0x1fe0), sub(f_q, mload(0x640)), f_q)) +mstore(0x2020, mulmod(mload(0x2000), mload(0x1fc0), f_q)) +mstore(0x2040, addmod(mload(0x1f80), mload(0x2020), f_q)) +mstore(0x2060, mulmod(mload(0x3e0), mload(0x2040), f_q)) +mstore(0x2080, addmod(mload(0x2060), mload(0x2020), f_q)) +mstore(0x20a0, mulmod(mload(0x3e0), mload(0x2080), f_q)) +mstore(0x20c0, addmod(1, sub(f_q, mload(0x8e0)), f_q)) +mstore(0x20e0, mulmod(mload(0x20c0), mload(0x1200), f_q)) +mstore(0x2100, addmod(mload(0x20a0), mload(0x20e0), f_q)) +mstore(0x2120, mulmod(mload(0x3e0), mload(0x2100), f_q)) +mstore(0x2140, mulmod(mload(0x940), mload(0x940), f_q)) +mstore(0x2160, addmod(mload(0x2140), sub(f_q, mload(0x940)), f_q)) +mstore(0x2180, mulmod(mload(0x2160), mload(0x1140), f_q)) +mstore(0x21a0, addmod(mload(0x2120), mload(0x2180), f_q)) +mstore(0x21c0, mulmod(mload(0x3e0), mload(0x21a0), f_q)) +mstore(0x21e0, addmod(mload(0x940), sub(f_q, mload(0x920)), f_q)) +mstore(0x2200, mulmod(mload(0x21e0), mload(0x1200), f_q)) +mstore(0x2220, addmod(mload(0x21c0), mload(0x2200), f_q)) +mstore(0x2240, mulmod(mload(0x3e0), mload(0x2220), f_q)) +mstore(0x2260, addmod(1, sub(f_q, mload(0x1140)), f_q)) +mstore(0x2280, addmod(mload(0x1160), mload(0x1180), f_q)) +mstore(0x22a0, addmod(mload(0x2280), mload(0x11a0), f_q)) +mstore(0x22c0, addmod(mload(0x22a0), mload(0x11c0), f_q)) +mstore(0x22e0, addmod(mload(0x22c0), mload(0x11e0), f_q)) +mstore(0x2300, addmod(mload(0x2260), sub(f_q, mload(0x22e0)), f_q)) +mstore(0x2320, mulmod(mload(0x820), mload(0x220), f_q)) +mstore(0x2340, addmod(mload(0x6a0), mload(0x2320), f_q)) +mstore(0x2360, addmod(mload(0x2340), mload(0x280), f_q)) +mstore(0x2380, mulmod(mload(0x840), mload(0x220), f_q)) +mstore(0x23a0, addmod(mload(0x5c0), mload(0x2380), f_q)) +mstore(0x23c0, addmod(mload(0x23a0), mload(0x280), f_q)) +mstore(0x23e0, mulmod(mload(0x23c0), mload(0x2360), f_q)) +mstore(0x2400, mulmod(mload(0x860), mload(0x220), f_q)) +mstore(0x2420, addmod(mload(0x5e0), mload(0x2400), f_q)) +mstore(0x2440, addmod(mload(0x2420), mload(0x280), f_q)) +mstore(0x2460, mulmod(mload(0x2440), mload(0x23e0), f_q)) +mstore(0x2480, mulmod(mload(0x880), mload(0x220), f_q)) +mstore(0x24a0, addmod(mload(0x6c0), mload(0x2480), f_q)) +mstore(0x24c0, addmod(mload(0x24a0), mload(0x280), f_q)) +mstore(0x24e0, mulmod(mload(0x24c0), mload(0x2460), f_q)) +mstore(0x2500, mulmod(mload(0x24e0), mload(0x900), f_q)) +mstore(0x2520, mulmod(1, mload(0x220), f_q)) +mstore(0x2540, mulmod(mload(0x580), mload(0x2520), f_q)) +mstore(0x2560, addmod(mload(0x6a0), mload(0x2540), f_q)) +mstore(0x2580, addmod(mload(0x2560), mload(0x280), f_q)) +mstore(0x25a0, mulmod(4131629893567559867359510883348571134090853742863529169391034518566172092834, mload(0x220), f_q)) +mstore(0x25c0, mulmod(mload(0x580), mload(0x25a0), f_q)) +mstore(0x25e0, addmod(mload(0x5c0), mload(0x25c0), f_q)) +mstore(0x2600, addmod(mload(0x25e0), mload(0x280), f_q)) +mstore(0x2620, mulmod(mload(0x2600), mload(0x2580), f_q)) +mstore(0x2640, mulmod(8910878055287538404433155982483128285667088683464058436815641868457422632747, mload(0x220), f_q)) +mstore(0x2660, mulmod(mload(0x580), mload(0x2640), f_q)) +mstore(0x2680, addmod(mload(0x5e0), mload(0x2660), f_q)) +mstore(0x26a0, addmod(mload(0x2680), mload(0x280), f_q)) +mstore(0x26c0, mulmod(mload(0x26a0), mload(0x2620), f_q)) +mstore(0x26e0, mulmod(11166246659983828508719468090013646171463329086121580628794302409516816350802, mload(0x220), f_q)) +mstore(0x2700, mulmod(mload(0x580), mload(0x26e0), f_q)) +mstore(0x2720, addmod(mload(0x6c0), mload(0x2700), f_q)) +mstore(0x2740, addmod(mload(0x2720), mload(0x280), f_q)) +mstore(0x2760, mulmod(mload(0x2740), mload(0x26c0), f_q)) +mstore(0x2780, mulmod(mload(0x2760), mload(0x8e0), f_q)) +mstore(0x27a0, addmod(mload(0x2500), sub(f_q, mload(0x2780)), f_q)) +mstore(0x27c0, mulmod(mload(0x27a0), mload(0x2300), f_q)) +mstore(0x27e0, addmod(mload(0x2240), mload(0x27c0), f_q)) +mstore(0x2800, mulmod(mload(0x3e0), mload(0x27e0), f_q)) +mstore(0x2820, mulmod(mload(0x8a0), mload(0x220), f_q)) +mstore(0x2840, addmod(mload(0x640), mload(0x2820), f_q)) +mstore(0x2860, addmod(mload(0x2840), mload(0x280), f_q)) +mstore(0x2880, mulmod(mload(0x8c0), mload(0x220), f_q)) +mstore(0x28a0, addmod(mload(0x1240), mload(0x2880), f_q)) +mstore(0x28c0, addmod(mload(0x28a0), mload(0x280), f_q)) +mstore(0x28e0, mulmod(mload(0x28c0), mload(0x2860), f_q)) +mstore(0x2900, mulmod(mload(0x28e0), mload(0x960), f_q)) +mstore(0x2920, mulmod(284840088355319032285349970403338060113257071685626700086398481893096618818, mload(0x220), f_q)) +mstore(0x2940, mulmod(mload(0x580), mload(0x2920), f_q)) +mstore(0x2960, addmod(mload(0x640), mload(0x2940), f_q)) +mstore(0x2980, addmod(mload(0x2960), mload(0x280), f_q)) +mstore(0x29a0, mulmod(21134065618345176623193549882539580312263652408302468683943992798037078993309, mload(0x220), f_q)) +mstore(0x29c0, mulmod(mload(0x580), mload(0x29a0), f_q)) +mstore(0x29e0, addmod(mload(0x1240), mload(0x29c0), f_q)) +mstore(0x2a00, addmod(mload(0x29e0), mload(0x280), f_q)) +mstore(0x2a20, mulmod(mload(0x2a00), mload(0x2980), f_q)) +mstore(0x2a40, mulmod(mload(0x2a20), mload(0x940), f_q)) +mstore(0x2a60, addmod(mload(0x2900), sub(f_q, mload(0x2a40)), f_q)) +mstore(0x2a80, mulmod(mload(0x2a60), mload(0x2300), f_q)) +mstore(0x2aa0, addmod(mload(0x2800), mload(0x2a80), f_q)) +mstore(0x2ac0, mulmod(mload(0x3e0), mload(0x2aa0), f_q)) +mstore(0x2ae0, addmod(1, sub(f_q, mload(0x980)), f_q)) +mstore(0x2b00, mulmod(mload(0x2ae0), mload(0x1200), f_q)) +mstore(0x2b20, addmod(mload(0x2ac0), mload(0x2b00), f_q)) +mstore(0x2b40, mulmod(mload(0x3e0), mload(0x2b20), f_q)) +mstore(0x2b60, mulmod(mload(0x980), mload(0x980), f_q)) +mstore(0x2b80, addmod(mload(0x2b60), sub(f_q, mload(0x980)), f_q)) +mstore(0x2ba0, mulmod(mload(0x2b80), mload(0x1140), f_q)) +mstore(0x2bc0, addmod(mload(0x2b40), mload(0x2ba0), f_q)) +mstore(0x2be0, mulmod(mload(0x3e0), mload(0x2bc0), f_q)) +mstore(0x2c00, addmod(mload(0x9c0), mload(0x220), f_q)) +mstore(0x2c20, mulmod(mload(0x2c00), mload(0x9a0), f_q)) +mstore(0x2c40, addmod(mload(0xa00), mload(0x280), f_q)) +mstore(0x2c60, mulmod(mload(0x2c40), mload(0x2c20), f_q)) +mstore(0x2c80, mulmod(256, mload(0x600), f_q)) +mstore(0x2ca0, addmod(mload(0x5c0), sub(f_q, mload(0x2c80)), f_q)) +mstore(0x2cc0, mulmod(mload(0x2ca0), mload(0x740), f_q)) +mstore(0x2ce0, addmod(mload(0x2cc0), mload(0x220), f_q)) +mstore(0x2d00, mulmod(mload(0x2ce0), mload(0x980), f_q)) +mstore(0x2d20, addmod(mload(0x720), mload(0x280), f_q)) +mstore(0x2d40, mulmod(mload(0x2d20), mload(0x2d00), f_q)) +mstore(0x2d60, addmod(mload(0x2c60), sub(f_q, mload(0x2d40)), f_q)) +mstore(0x2d80, mulmod(mload(0x2d60), mload(0x2300), f_q)) +mstore(0x2da0, addmod(mload(0x2be0), mload(0x2d80), f_q)) +mstore(0x2dc0, mulmod(mload(0x3e0), mload(0x2da0), f_q)) +mstore(0x2de0, addmod(mload(0x9c0), sub(f_q, mload(0xa00)), f_q)) +mstore(0x2e00, mulmod(mload(0x2de0), mload(0x1200), f_q)) +mstore(0x2e20, addmod(mload(0x2dc0), mload(0x2e00), f_q)) +mstore(0x2e40, mulmod(mload(0x3e0), mload(0x2e20), f_q)) +mstore(0x2e60, mulmod(mload(0x2de0), mload(0x2300), f_q)) +mstore(0x2e80, addmod(mload(0x9c0), sub(f_q, mload(0x9e0)), f_q)) +mstore(0x2ea0, mulmod(mload(0x2e80), mload(0x2e60), f_q)) +mstore(0x2ec0, addmod(mload(0x2e40), mload(0x2ea0), f_q)) +mstore(0x2ee0, mulmod(mload(0xd00), mload(0xd00), f_q)) +mstore(0x2f00, mulmod(mload(0x2ee0), mload(0xd00), f_q)) +mstore(0x2f20, mulmod(mload(0x2f00), mload(0xd00), f_q)) +mstore(0x2f40, mulmod(mload(0x2f20), mload(0xd00), f_q)) +mstore(0x2f60, mulmod(1, mload(0xd00), f_q)) +mstore(0x2f80, mulmod(1, mload(0x2ee0), f_q)) +mstore(0x2fa0, mulmod(1, mload(0x2f00), f_q)) +mstore(0x2fc0, mulmod(1, mload(0x2f20), f_q)) +mstore(0x2fe0, mulmod(mload(0x2ec0), mload(0xd20), f_q)) +mstore(0x3000, mulmod(mload(0xbc0), mload(0x580), f_q)) +mstore(0x3020, mulmod(mload(0x580), 1, f_q)) +mstore(0x3040, addmod(mload(0xb40), sub(f_q, mload(0x3020)), f_q)) +mstore(0x3060, mulmod(mload(0x580), 9396103202274256930945606623206526900461945684265495839012435492634193195103, f_q)) +mstore(0x3080, addmod(mload(0xb40), sub(f_q, mload(0x3060)), f_q)) +mstore(0x30a0, mulmod(mload(0x580), 15699029810934084314820646074566828280617789951162923449200398535581206172418, f_q)) +mstore(0x30c0, addmod(mload(0xb40), sub(f_q, mload(0x30a0)), f_q)) +mstore(0x30e0, mulmod(mload(0x580), 19444693496467964793333684482470811869395409953158764080291550423779334624794, f_q)) +mstore(0x3100, addmod(mload(0xb40), sub(f_q, mload(0x30e0)), f_q)) +{ + let result := mulmod(mload(0xb40), mulmod(mload(0xbc0), 14935689044936328720213520384837211407239373163407808768092422456738089171339, f_q), f_q) +result := addmod(mulmod(mload(0x580), mulmod(mload(0xbc0), 6952553826902946502032885360420063681308991237008225575605781729837719324278, f_q), f_q), result, f_q) +mstore(12576, result) + } +{ + let result := mulmod(mload(0xb40), mulmod(mload(0xbc0), 7540907510155698387256503820143330389809914548046512731972450943457626251574, f_q), f_q) +result := addmod(mulmod(mload(0x580), mulmod(mload(0xbc0), 17454089668527239794105182244994964593641145239866915085378986192780276655988, f_q), f_q), result, f_q) +mstore(12608, result) + } +{ + let result := mulmod(mload(0xb40), mulmod(mload(0xbc0), 16765245179638222004592619476379737764479697804128512065226459610007790881832, f_q), f_q) +result := addmod(mulmod(mload(0x580), mulmod(mload(0xbc0), 6067403861988280018436561787453590745850405443026581205331008293509136248791, f_q), f_q), result, f_q) +mstore(12640, result) + } +mstore(0x3180, mulmod(1, mload(0x3040), f_q)) +mstore(0x31a0, mulmod(mload(0x3180), mload(0x3080), f_q)) +mstore(0x31c0, mulmod(mload(0x31a0), mload(0x3100), f_q)) +{ + let result := mulmod(mload(0xb40), 1, f_q) +result := addmod(mulmod(mload(0x580), 21888242871839275222246405745257275088548364400416034343698204186575808495616, f_q), result, f_q) +mstore(12768, result) + } +{ + let result := mulmod(mload(0xb40), mulmod(mload(0xbc0), 13346277807347402051479003338644866680074640264080882830084838995653627694322, f_q), f_q) +result := addmod(mulmod(mload(0x580), mulmod(mload(0xbc0), 8541965064491873170767402406612408408473724136335151513613365190922180801295, f_q), f_q), result, f_q) +mstore(12800, result) + } +{ + let result := mulmod(mload(0xb40), mulmod(mload(0xbc0), 9130318747744625055991020866335675116974647447373438669980034404542087728591, f_q), f_q) +result := addmod(mulmod(mload(0x580), mulmod(mload(0xbc0), 17654030801727560324741115319652541746559479525075366613702001578587072243451, f_q), f_q), result, f_q) +mstore(12832, result) + } +{ + let result := mulmod(mload(0xb40), mulmod(mload(0xbc0), 8968217942074169282201771672973351205073655055696863512223304343263448008755, f_q), f_q) +result := addmod(mulmod(mload(0x580), mulmod(mload(0xbc0), 15489683287416706862113636648384499783884413315698913841173435408703605255719, f_q), f_q), result, f_q) +mstore(12864, result) + } +mstore(0x3260, mulmod(mload(0x31a0), mload(0x30c0), f_q)) +{ + let result := mulmod(mload(0xb40), mulmod(mload(0x580), 12492139669565018291300799122050748188086418716150538504685768693941615300515, f_q), f_q) +result := addmod(mulmod(mload(0x580), mulmod(mload(0x580), 9396103202274256930945606623206526900461945684265495839012435492634193195102, f_q), f_q), result, f_q) +mstore(12928, result) + } +{ + let result := mulmod(mload(0xb40), mulmod(mload(0x580), 9396103202274256930945606623206526900461945684265495839012435492634193195102, f_q), f_q) +result := addmod(mulmod(mload(0x580), mulmod(mload(0x580), 11903785986312266406077180662327481479585495405112251348319099480321708373219, f_q), f_q), result, f_q) +mstore(12960, result) + } +{ + let result := mulmod(mload(0xb40), mulmod(mload(0x580), 2443549375371310428912721262786463219152954447257270263406653762796473870824, f_q), f_q) +result := addmod(mulmod(mload(0x580), mulmod(mload(0x580), 19444693496467964793333684482470811869395409953158764080291550423779334624793, f_q), f_q), result, f_q) +mstore(12992, result) + } +{ + let result := mulmod(mload(0xb40), mulmod(mload(0x580), 19444693496467964793333684482470811869395409953158764080291550423779334624793, f_q), f_q) +result := addmod(mulmod(mload(0x580), mulmod(mload(0x580), 14519100894475310148599392892084064224530612280553018117484180069202210808887, f_q), f_q), result, f_q) +mstore(13024, result) + } +mstore(0x3300, mulmod(mload(0x3180), mload(0x3100), f_q)) +{ + let prod := mload(0x3120) + + prod := mulmod(mload(0x3140), prod, f_q) + mstore(0x3320, prod) + + prod := mulmod(mload(0x3160), prod, f_q) + mstore(0x3340, prod) + + prod := mulmod(mload(0x31e0), prod, f_q) + mstore(0x3360, prod) + + prod := mulmod(mload(0x3180), prod, f_q) + mstore(0x3380, prod) + + prod := mulmod(mload(0x3200), prod, f_q) + mstore(0x33a0, prod) + + prod := mulmod(mload(0x3220), prod, f_q) + mstore(0x33c0, prod) + + prod := mulmod(mload(0x3240), prod, f_q) + mstore(0x33e0, prod) + + prod := mulmod(mload(0x3260), prod, f_q) + mstore(0x3400, prod) + + prod := mulmod(mload(0x3280), prod, f_q) + mstore(0x3420, prod) + + prod := mulmod(mload(0x32a0), prod, f_q) + mstore(0x3440, prod) + + prod := mulmod(mload(0x31a0), prod, f_q) + mstore(0x3460, prod) + + prod := mulmod(mload(0x32c0), prod, f_q) + mstore(0x3480, prod) + + prod := mulmod(mload(0x32e0), prod, f_q) + mstore(0x34a0, prod) + + prod := mulmod(mload(0x3300), prod, f_q) + mstore(0x34c0, prod) + + } +mstore(0x3500, 32) +mstore(0x3520, 32) +mstore(0x3540, 32) +mstore(0x3560, mload(0x34c0)) +mstore(0x3580, 21888242871839275222246405745257275088548364400416034343698204186575808495615) +mstore(0x35a0, 21888242871839275222246405745257275088548364400416034343698204186575808495617) +success := and(eq(staticcall(gas(), 0x5, 0x3500, 0xc0, 0x34e0, 0x20), 1), success) +{ + + let inv := mload(0x34e0) + let v + + v := mload(0x3300) + mstore(13056, mulmod(mload(0x34a0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x32e0) + mstore(13024, mulmod(mload(0x3480), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x32c0) + mstore(12992, mulmod(mload(0x3460), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x31a0) + mstore(12704, mulmod(mload(0x3440), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x32a0) + mstore(12960, mulmod(mload(0x3420), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x3280) + mstore(12928, mulmod(mload(0x3400), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x3260) + mstore(12896, mulmod(mload(0x33e0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x3240) + mstore(12864, mulmod(mload(0x33c0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x3220) + mstore(12832, mulmod(mload(0x33a0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x3200) + mstore(12800, mulmod(mload(0x3380), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x3180) + mstore(12672, mulmod(mload(0x3360), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x31e0) + mstore(12768, mulmod(mload(0x3340), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x3160) + mstore(12640, mulmod(mload(0x3320), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x3140) + mstore(12608, mulmod(mload(0x3120), inv, f_q)) + inv := mulmod(v, inv, f_q) + mstore(0x3120, inv) + + } +{ + let result := mload(0x3120) +result := addmod(mload(0x3140), result, f_q) +result := addmod(mload(0x3160), result, f_q) +mstore(13760, result) + } +mstore(0x35e0, mulmod(mload(0x31c0), mload(0x3180), f_q)) +{ + let result := mload(0x31e0) +mstore(13824, result) + } +mstore(0x3620, mulmod(mload(0x31c0), mload(0x3260), f_q)) +{ + let result := mload(0x3200) +result := addmod(mload(0x3220), result, f_q) +result := addmod(mload(0x3240), result, f_q) +mstore(13888, result) + } +mstore(0x3660, mulmod(mload(0x31c0), mload(0x31a0), f_q)) +{ + let result := mload(0x3280) +result := addmod(mload(0x32a0), result, f_q) +mstore(13952, result) + } +mstore(0x36a0, mulmod(mload(0x31c0), mload(0x3300), f_q)) +{ + let result := mload(0x32c0) +result := addmod(mload(0x32e0), result, f_q) +mstore(14016, result) + } +{ + let prod := mload(0x35c0) + + prod := mulmod(mload(0x3600), prod, f_q) + mstore(0x36e0, prod) + + prod := mulmod(mload(0x3640), prod, f_q) + mstore(0x3700, prod) + + prod := mulmod(mload(0x3680), prod, f_q) + mstore(0x3720, prod) + + prod := mulmod(mload(0x36c0), prod, f_q) + mstore(0x3740, prod) + + } +mstore(0x3780, 32) +mstore(0x37a0, 32) +mstore(0x37c0, 32) +mstore(0x37e0, mload(0x3740)) +mstore(0x3800, 21888242871839275222246405745257275088548364400416034343698204186575808495615) +mstore(0x3820, 21888242871839275222246405745257275088548364400416034343698204186575808495617) +success := and(eq(staticcall(gas(), 0x5, 0x3780, 0xc0, 0x3760, 0x20), 1), success) +{ + + let inv := mload(0x3760) + let v + + v := mload(0x36c0) + mstore(14016, mulmod(mload(0x3720), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x3680) + mstore(13952, mulmod(mload(0x3700), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x3640) + mstore(13888, mulmod(mload(0x36e0), inv, f_q)) + inv := mulmod(v, inv, f_q) + + v := mload(0x3600) + mstore(13824, mulmod(mload(0x35c0), inv, f_q)) + inv := mulmod(v, inv, f_q) + mstore(0x35c0, inv) + + } +mstore(0x3840, mulmod(mload(0x35e0), mload(0x3600), f_q)) +mstore(0x3860, mulmod(mload(0x3620), mload(0x3640), f_q)) +mstore(0x3880, mulmod(mload(0x3660), mload(0x3680), f_q)) +mstore(0x38a0, mulmod(mload(0x36a0), mload(0x36c0), f_q)) +mstore(0x38c0, mulmod(mload(0xa40), mload(0xa40), f_q)) +mstore(0x38e0, mulmod(mload(0x38c0), mload(0xa40), f_q)) +mstore(0x3900, mulmod(mload(0x38e0), mload(0xa40), f_q)) +mstore(0x3920, mulmod(mload(0x3900), mload(0xa40), f_q)) +mstore(0x3940, mulmod(mload(0x3920), mload(0xa40), f_q)) +mstore(0x3960, mulmod(mload(0x3940), mload(0xa40), f_q)) +mstore(0x3980, mulmod(mload(0x3960), mload(0xa40), f_q)) +mstore(0x39a0, mulmod(mload(0x3980), mload(0xa40), f_q)) +mstore(0x39c0, mulmod(mload(0x39a0), mload(0xa40), f_q)) +mstore(0x39e0, mulmod(mload(0x39c0), mload(0xa40), f_q)) +mstore(0x3a00, mulmod(mload(0x39e0), mload(0xa40), f_q)) +mstore(0x3a20, mulmod(mload(0x3a00), mload(0xa40), f_q)) +mstore(0x3a40, mulmod(mload(0x3a20), mload(0xa40), f_q)) +mstore(0x3a60, mulmod(mload(0x3a40), mload(0xa40), f_q)) +mstore(0x3a80, mulmod(mload(0x3a60), mload(0xa40), f_q)) +mstore(0x3aa0, mulmod(mload(0x3a80), mload(0xa40), f_q)) +mstore(0x3ac0, mulmod(mload(0x3aa0), mload(0xa40), f_q)) +mstore(0x3ae0, mulmod(mload(0x3ac0), mload(0xa40), f_q)) +mstore(0x3b00, mulmod(mload(0x3ae0), mload(0xa40), f_q)) +mstore(0x3b20, mulmod(mload(0x3b00), mload(0xa40), f_q)) +mstore(0x3b40, mulmod(mload(0xaa0), mload(0xaa0), f_q)) +mstore(0x3b60, mulmod(mload(0x3b40), mload(0xaa0), f_q)) +mstore(0x3b80, mulmod(mload(0x3b60), mload(0xaa0), f_q)) +mstore(0x3ba0, mulmod(mload(0x3b80), mload(0xaa0), f_q)) +{ + let result := mulmod(mload(0x5c0), mload(0x3120), f_q) +result := addmod(mulmod(mload(0x600), mload(0x3140), f_q), result, f_q) +result := addmod(mulmod(mload(0x680), mload(0x3160), f_q), result, f_q) +mstore(15296, result) + } +mstore(0x3be0, mulmod(mload(0x3bc0), mload(0x35c0), f_q)) +mstore(0x3c00, mulmod(sub(f_q, mload(0x3be0)), 1, f_q)) +{ + let result := mulmod(mload(0x5e0), mload(0x3120), f_q) +result := addmod(mulmod(mload(0x620), mload(0x3140), f_q), result, f_q) +result := addmod(mulmod(mload(0x660), mload(0x3160), f_q), result, f_q) +mstore(15392, result) + } +mstore(0x3c40, mulmod(mload(0x3c20), mload(0x35c0), f_q)) +mstore(0x3c60, mulmod(sub(f_q, mload(0x3c40)), mload(0xa40), f_q)) +mstore(0x3c80, mulmod(1, mload(0xa40), f_q)) +mstore(0x3ca0, addmod(mload(0x3c00), mload(0x3c60), f_q)) +mstore(0x3cc0, mulmod(mload(0x3ca0), 1, f_q)) +mstore(0x3ce0, mulmod(mload(0x3c80), 1, f_q)) +mstore(0x3d00, mulmod(1, mload(0x35e0), f_q)) +{ + let result := mulmod(mload(0x640), mload(0x31e0), f_q) +mstore(15648, result) + } +mstore(0x3d40, mulmod(mload(0x3d20), mload(0x3840), f_q)) +mstore(0x3d60, mulmod(sub(f_q, mload(0x3d40)), 1, f_q)) +mstore(0x3d80, mulmod(mload(0x3d00), 1, f_q)) +{ + let result := mulmod(mload(0xa00), mload(0x31e0), f_q) +mstore(15776, result) + } +mstore(0x3dc0, mulmod(mload(0x3da0), mload(0x3840), f_q)) +mstore(0x3de0, mulmod(sub(f_q, mload(0x3dc0)), mload(0xa40), f_q)) +mstore(0x3e00, mulmod(mload(0x3d00), mload(0xa40), f_q)) +mstore(0x3e20, addmod(mload(0x3d60), mload(0x3de0), f_q)) +{ + let result := mulmod(mload(0x6a0), mload(0x31e0), f_q) +mstore(15936, result) + } +mstore(0x3e60, mulmod(mload(0x3e40), mload(0x3840), f_q)) +mstore(0x3e80, mulmod(sub(f_q, mload(0x3e60)), mload(0x38c0), f_q)) +mstore(0x3ea0, mulmod(mload(0x3d00), mload(0x38c0), f_q)) +mstore(0x3ec0, addmod(mload(0x3e20), mload(0x3e80), f_q)) +{ + let result := mulmod(mload(0x6c0), mload(0x31e0), f_q) +mstore(16096, result) + } +mstore(0x3f00, mulmod(mload(0x3ee0), mload(0x3840), f_q)) +mstore(0x3f20, mulmod(sub(f_q, mload(0x3f00)), mload(0x38e0), f_q)) +mstore(0x3f40, mulmod(mload(0x3d00), mload(0x38e0), f_q)) +mstore(0x3f60, addmod(mload(0x3ec0), mload(0x3f20), f_q)) +{ + let result := mulmod(mload(0x6e0), mload(0x31e0), f_q) +mstore(16256, result) + } +mstore(0x3fa0, mulmod(mload(0x3f80), mload(0x3840), f_q)) +mstore(0x3fc0, mulmod(sub(f_q, mload(0x3fa0)), mload(0x3900), f_q)) +mstore(0x3fe0, mulmod(mload(0x3d00), mload(0x3900), f_q)) +mstore(0x4000, addmod(mload(0x3f60), mload(0x3fc0), f_q)) +{ + let result := mulmod(mload(0x700), mload(0x31e0), f_q) +mstore(16416, result) + } +mstore(0x4040, mulmod(mload(0x4020), mload(0x3840), f_q)) +mstore(0x4060, mulmod(sub(f_q, mload(0x4040)), mload(0x3920), f_q)) +mstore(0x4080, mulmod(mload(0x3d00), mload(0x3920), f_q)) +mstore(0x40a0, addmod(mload(0x4000), mload(0x4060), f_q)) +{ + let result := mulmod(mload(0x720), mload(0x31e0), f_q) +mstore(16576, result) + } +mstore(0x40e0, mulmod(mload(0x40c0), mload(0x3840), f_q)) +mstore(0x4100, mulmod(sub(f_q, mload(0x40e0)), mload(0x3940), f_q)) +mstore(0x4120, mulmod(mload(0x3d00), mload(0x3940), f_q)) +mstore(0x4140, addmod(mload(0x40a0), mload(0x4100), f_q)) +{ + let result := mulmod(mload(0x740), mload(0x31e0), f_q) +mstore(16736, result) + } +mstore(0x4180, mulmod(mload(0x4160), mload(0x3840), f_q)) +mstore(0x41a0, mulmod(sub(f_q, mload(0x4180)), mload(0x3960), f_q)) +mstore(0x41c0, mulmod(mload(0x3d00), mload(0x3960), f_q)) +mstore(0x41e0, addmod(mload(0x4140), mload(0x41a0), f_q)) +{ + let result := mulmod(mload(0x760), mload(0x31e0), f_q) +mstore(16896, result) + } +mstore(0x4220, mulmod(mload(0x4200), mload(0x3840), f_q)) +mstore(0x4240, mulmod(sub(f_q, mload(0x4220)), mload(0x3980), f_q)) +mstore(0x4260, mulmod(mload(0x3d00), mload(0x3980), f_q)) +mstore(0x4280, addmod(mload(0x41e0), mload(0x4240), f_q)) +{ + let result := mulmod(mload(0x780), mload(0x31e0), f_q) +mstore(17056, result) + } +mstore(0x42c0, mulmod(mload(0x42a0), mload(0x3840), f_q)) +mstore(0x42e0, mulmod(sub(f_q, mload(0x42c0)), mload(0x39a0), f_q)) +mstore(0x4300, mulmod(mload(0x3d00), mload(0x39a0), f_q)) +mstore(0x4320, addmod(mload(0x4280), mload(0x42e0), f_q)) +{ + let result := mulmod(mload(0x7a0), mload(0x31e0), f_q) +mstore(17216, result) + } +mstore(0x4360, mulmod(mload(0x4340), mload(0x3840), f_q)) +mstore(0x4380, mulmod(sub(f_q, mload(0x4360)), mload(0x39c0), f_q)) +mstore(0x43a0, mulmod(mload(0x3d00), mload(0x39c0), f_q)) +mstore(0x43c0, addmod(mload(0x4320), mload(0x4380), f_q)) +{ + let result := mulmod(mload(0x7c0), mload(0x31e0), f_q) +mstore(17376, result) + } +mstore(0x4400, mulmod(mload(0x43e0), mload(0x3840), f_q)) +mstore(0x4420, mulmod(sub(f_q, mload(0x4400)), mload(0x39e0), f_q)) +mstore(0x4440, mulmod(mload(0x3d00), mload(0x39e0), f_q)) +mstore(0x4460, addmod(mload(0x43c0), mload(0x4420), f_q)) +{ + let result := mulmod(mload(0x7e0), mload(0x31e0), f_q) +mstore(17536, result) + } +mstore(0x44a0, mulmod(mload(0x4480), mload(0x3840), f_q)) +mstore(0x44c0, mulmod(sub(f_q, mload(0x44a0)), mload(0x3a00), f_q)) +mstore(0x44e0, mulmod(mload(0x3d00), mload(0x3a00), f_q)) +mstore(0x4500, addmod(mload(0x4460), mload(0x44c0), f_q)) +{ + let result := mulmod(mload(0x820), mload(0x31e0), f_q) +mstore(17696, result) + } +mstore(0x4540, mulmod(mload(0x4520), mload(0x3840), f_q)) +mstore(0x4560, mulmod(sub(f_q, mload(0x4540)), mload(0x3a20), f_q)) +mstore(0x4580, mulmod(mload(0x3d00), mload(0x3a20), f_q)) +mstore(0x45a0, addmod(mload(0x4500), mload(0x4560), f_q)) +{ + let result := mulmod(mload(0x840), mload(0x31e0), f_q) +mstore(17856, result) + } +mstore(0x45e0, mulmod(mload(0x45c0), mload(0x3840), f_q)) +mstore(0x4600, mulmod(sub(f_q, mload(0x45e0)), mload(0x3a40), f_q)) +mstore(0x4620, mulmod(mload(0x3d00), mload(0x3a40), f_q)) +mstore(0x4640, addmod(mload(0x45a0), mload(0x4600), f_q)) +{ + let result := mulmod(mload(0x860), mload(0x31e0), f_q) +mstore(18016, result) + } +mstore(0x4680, mulmod(mload(0x4660), mload(0x3840), f_q)) +mstore(0x46a0, mulmod(sub(f_q, mload(0x4680)), mload(0x3a60), f_q)) +mstore(0x46c0, mulmod(mload(0x3d00), mload(0x3a60), f_q)) +mstore(0x46e0, addmod(mload(0x4640), mload(0x46a0), f_q)) +{ + let result := mulmod(mload(0x880), mload(0x31e0), f_q) +mstore(18176, result) + } +mstore(0x4720, mulmod(mload(0x4700), mload(0x3840), f_q)) +mstore(0x4740, mulmod(sub(f_q, mload(0x4720)), mload(0x3a80), f_q)) +mstore(0x4760, mulmod(mload(0x3d00), mload(0x3a80), f_q)) +mstore(0x4780, addmod(mload(0x46e0), mload(0x4740), f_q)) +{ + let result := mulmod(mload(0x8a0), mload(0x31e0), f_q) +mstore(18336, result) + } +mstore(0x47c0, mulmod(mload(0x47a0), mload(0x3840), f_q)) +mstore(0x47e0, mulmod(sub(f_q, mload(0x47c0)), mload(0x3aa0), f_q)) +mstore(0x4800, mulmod(mload(0x3d00), mload(0x3aa0), f_q)) +mstore(0x4820, addmod(mload(0x4780), mload(0x47e0), f_q)) +{ + let result := mulmod(mload(0x8c0), mload(0x31e0), f_q) +mstore(18496, result) + } +mstore(0x4860, mulmod(mload(0x4840), mload(0x3840), f_q)) +mstore(0x4880, mulmod(sub(f_q, mload(0x4860)), mload(0x3ac0), f_q)) +mstore(0x48a0, mulmod(mload(0x3d00), mload(0x3ac0), f_q)) +mstore(0x48c0, addmod(mload(0x4820), mload(0x4880), f_q)) +mstore(0x48e0, mulmod(mload(0x2f60), mload(0x35e0), f_q)) +mstore(0x4900, mulmod(mload(0x2f80), mload(0x35e0), f_q)) +mstore(0x4920, mulmod(mload(0x2fa0), mload(0x35e0), f_q)) +mstore(0x4940, mulmod(mload(0x2fc0), mload(0x35e0), f_q)) +{ + let result := mulmod(mload(0x2fe0), mload(0x31e0), f_q) +mstore(18784, result) + } +mstore(0x4980, mulmod(mload(0x4960), mload(0x3840), f_q)) +mstore(0x49a0, mulmod(sub(f_q, mload(0x4980)), mload(0x3ae0), f_q)) +mstore(0x49c0, mulmod(mload(0x3d00), mload(0x3ae0), f_q)) +mstore(0x49e0, mulmod(mload(0x48e0), mload(0x3ae0), f_q)) +mstore(0x4a00, mulmod(mload(0x4900), mload(0x3ae0), f_q)) +mstore(0x4a20, mulmod(mload(0x4920), mload(0x3ae0), f_q)) +mstore(0x4a40, mulmod(mload(0x4940), mload(0x3ae0), f_q)) +mstore(0x4a60, addmod(mload(0x48c0), mload(0x49a0), f_q)) +{ + let result := mulmod(mload(0x800), mload(0x31e0), f_q) +mstore(19072, result) + } +mstore(0x4aa0, mulmod(mload(0x4a80), mload(0x3840), f_q)) +mstore(0x4ac0, mulmod(sub(f_q, mload(0x4aa0)), mload(0x3b00), f_q)) +mstore(0x4ae0, mulmod(mload(0x3d00), mload(0x3b00), f_q)) +mstore(0x4b00, addmod(mload(0x4a60), mload(0x4ac0), f_q)) +mstore(0x4b20, mulmod(mload(0x4b00), mload(0xaa0), f_q)) +mstore(0x4b40, mulmod(mload(0x3d80), mload(0xaa0), f_q)) +mstore(0x4b60, mulmod(mload(0x3e00), mload(0xaa0), f_q)) +mstore(0x4b80, mulmod(mload(0x3ea0), mload(0xaa0), f_q)) +mstore(0x4ba0, mulmod(mload(0x3f40), mload(0xaa0), f_q)) +mstore(0x4bc0, mulmod(mload(0x3fe0), mload(0xaa0), f_q)) +mstore(0x4be0, mulmod(mload(0x4080), mload(0xaa0), f_q)) +mstore(0x4c00, mulmod(mload(0x4120), mload(0xaa0), f_q)) +mstore(0x4c20, mulmod(mload(0x41c0), mload(0xaa0), f_q)) +mstore(0x4c40, mulmod(mload(0x4260), mload(0xaa0), f_q)) +mstore(0x4c60, mulmod(mload(0x4300), mload(0xaa0), f_q)) +mstore(0x4c80, mulmod(mload(0x43a0), mload(0xaa0), f_q)) +mstore(0x4ca0, mulmod(mload(0x4440), mload(0xaa0), f_q)) +mstore(0x4cc0, mulmod(mload(0x44e0), mload(0xaa0), f_q)) +mstore(0x4ce0, mulmod(mload(0x4580), mload(0xaa0), f_q)) +mstore(0x4d00, mulmod(mload(0x4620), mload(0xaa0), f_q)) +mstore(0x4d20, mulmod(mload(0x46c0), mload(0xaa0), f_q)) +mstore(0x4d40, mulmod(mload(0x4760), mload(0xaa0), f_q)) +mstore(0x4d60, mulmod(mload(0x4800), mload(0xaa0), f_q)) +mstore(0x4d80, mulmod(mload(0x48a0), mload(0xaa0), f_q)) +mstore(0x4da0, mulmod(mload(0x49c0), mload(0xaa0), f_q)) +mstore(0x4dc0, mulmod(mload(0x49e0), mload(0xaa0), f_q)) +mstore(0x4de0, mulmod(mload(0x4a00), mload(0xaa0), f_q)) +mstore(0x4e00, mulmod(mload(0x4a20), mload(0xaa0), f_q)) +mstore(0x4e20, mulmod(mload(0x4a40), mload(0xaa0), f_q)) +mstore(0x4e40, mulmod(mload(0x4ae0), mload(0xaa0), f_q)) +mstore(0x4e60, addmod(mload(0x3cc0), mload(0x4b20), f_q)) +mstore(0x4e80, mulmod(1, mload(0x3620), f_q)) +{ + let result := mulmod(mload(0x8e0), mload(0x3200), f_q) +result := addmod(mulmod(mload(0x900), mload(0x3220), f_q), result, f_q) +result := addmod(mulmod(mload(0x920), mload(0x3240), f_q), result, f_q) +mstore(20128, result) + } +mstore(0x4ec0, mulmod(mload(0x4ea0), mload(0x3860), f_q)) +mstore(0x4ee0, mulmod(sub(f_q, mload(0x4ec0)), 1, f_q)) +mstore(0x4f00, mulmod(mload(0x4e80), 1, f_q)) +mstore(0x4f20, mulmod(mload(0x4ee0), mload(0x3b40), f_q)) +mstore(0x4f40, mulmod(mload(0x4f00), mload(0x3b40), f_q)) +mstore(0x4f60, addmod(mload(0x4e60), mload(0x4f20), f_q)) +mstore(0x4f80, mulmod(1, mload(0x3660), f_q)) +{ + let result := mulmod(mload(0x940), mload(0x3280), f_q) +result := addmod(mulmod(mload(0x960), mload(0x32a0), f_q), result, f_q) +mstore(20384, result) + } +mstore(0x4fc0, mulmod(mload(0x4fa0), mload(0x3880), f_q)) +mstore(0x4fe0, mulmod(sub(f_q, mload(0x4fc0)), 1, f_q)) +mstore(0x5000, mulmod(mload(0x4f80), 1, f_q)) +{ + let result := mulmod(mload(0x980), mload(0x3280), f_q) +result := addmod(mulmod(mload(0x9a0), mload(0x32a0), f_q), result, f_q) +mstore(20512, result) + } +mstore(0x5040, mulmod(mload(0x5020), mload(0x3880), f_q)) +mstore(0x5060, mulmod(sub(f_q, mload(0x5040)), mload(0xa40), f_q)) +mstore(0x5080, mulmod(mload(0x4f80), mload(0xa40), f_q)) +mstore(0x50a0, addmod(mload(0x4fe0), mload(0x5060), f_q)) +mstore(0x50c0, mulmod(mload(0x50a0), mload(0x3b60), f_q)) +mstore(0x50e0, mulmod(mload(0x5000), mload(0x3b60), f_q)) +mstore(0x5100, mulmod(mload(0x5080), mload(0x3b60), f_q)) +mstore(0x5120, addmod(mload(0x4f60), mload(0x50c0), f_q)) +mstore(0x5140, mulmod(1, mload(0x36a0), f_q)) +{ + let result := mulmod(mload(0x9c0), mload(0x32c0), f_q) +result := addmod(mulmod(mload(0x9e0), mload(0x32e0), f_q), result, f_q) +mstore(20832, result) + } +mstore(0x5180, mulmod(mload(0x5160), mload(0x38a0), f_q)) +mstore(0x51a0, mulmod(sub(f_q, mload(0x5180)), 1, f_q)) +mstore(0x51c0, mulmod(mload(0x5140), 1, f_q)) +mstore(0x51e0, mulmod(mload(0x51a0), mload(0x3b80), f_q)) +mstore(0x5200, mulmod(mload(0x51c0), mload(0x3b80), f_q)) +mstore(0x5220, addmod(mload(0x5120), mload(0x51e0), f_q)) +mstore(0x5240, mulmod(1, mload(0x31c0), f_q)) +mstore(0x5260, mulmod(1, mload(0xb40), f_q)) +mstore(0x5280, 0x0000000000000000000000000000000000000000000000000000000000000001) + mstore(0x52a0, 0x0000000000000000000000000000000000000000000000000000000000000002) +mstore(0x52c0, mload(0x5220)) +success := and(eq(staticcall(gas(), 0x7, 0x5280, 0x60, 0x5280, 0x40), 1), success) +mstore(0x52e0, mload(0x5280)) + mstore(0x5300, mload(0x52a0)) +mstore(0x5320, mload(0x60)) + mstore(0x5340, mload(0x80)) +success := and(eq(staticcall(gas(), 0x6, 0x52e0, 0x80, 0x52e0, 0x40), 1), success) +mstore(0x5360, mload(0xa0)) + mstore(0x5380, mload(0xc0)) +mstore(0x53a0, mload(0x3ce0)) +success := and(eq(staticcall(gas(), 0x7, 0x5360, 0x60, 0x5360, 0x40), 1), success) +mstore(0x53c0, mload(0x52e0)) + mstore(0x53e0, mload(0x5300)) +mstore(0x5400, mload(0x5360)) + mstore(0x5420, mload(0x5380)) +success := and(eq(staticcall(gas(), 0x6, 0x53c0, 0x80, 0x53c0, 0x40), 1), success) +mstore(0x5440, mload(0xe0)) + mstore(0x5460, mload(0x100)) +mstore(0x5480, mload(0x4b40)) +success := and(eq(staticcall(gas(), 0x7, 0x5440, 0x60, 0x5440, 0x40), 1), success) +mstore(0x54a0, mload(0x53c0)) + mstore(0x54c0, mload(0x53e0)) +mstore(0x54e0, mload(0x5440)) + mstore(0x5500, mload(0x5460)) +success := and(eq(staticcall(gas(), 0x6, 0x54a0, 0x80, 0x54a0, 0x40), 1), success) +mstore(0x5520, mload(0x1c0)) + mstore(0x5540, mload(0x1e0)) +mstore(0x5560, mload(0x4b60)) +success := and(eq(staticcall(gas(), 0x7, 0x5520, 0x60, 0x5520, 0x40), 1), success) +mstore(0x5580, mload(0x54a0)) + mstore(0x55a0, mload(0x54c0)) +mstore(0x55c0, mload(0x5520)) + mstore(0x55e0, mload(0x5540)) +success := and(eq(staticcall(gas(), 0x6, 0x5580, 0x80, 0x5580, 0x40), 1), success) +mstore(0x5600, 0x14113d2da8037ec77f55dffb91151a8e7bb3eeea2fe44f6804703d0f82f344a0) + mstore(0x5620, 0x1c5b5f4c28346cfddf08edde8db492f19a24b5f73fc2bd48dc19137a11ce53bf) +mstore(0x5640, mload(0x4b80)) +success := and(eq(staticcall(gas(), 0x7, 0x5600, 0x60, 0x5600, 0x40), 1), success) +mstore(0x5660, mload(0x5580)) + mstore(0x5680, mload(0x55a0)) +mstore(0x56a0, mload(0x5600)) + mstore(0x56c0, mload(0x5620)) +success := and(eq(staticcall(gas(), 0x6, 0x5660, 0x80, 0x5660, 0x40), 1), success) +mstore(0x56e0, 0x0491714ea02953469195ca0768b5aafb03166b27284de7cc9ffa7b3879a959a5) + mstore(0x5700, 0x2dbaa9a59dc7fd9657798dd9c00ffc85d2033e9555b699f4d9706bc2b77dce77) +mstore(0x5720, mload(0x4ba0)) +success := and(eq(staticcall(gas(), 0x7, 0x56e0, 0x60, 0x56e0, 0x40), 1), success) +mstore(0x5740, mload(0x5660)) + mstore(0x5760, mload(0x5680)) +mstore(0x5780, mload(0x56e0)) + mstore(0x57a0, mload(0x5700)) +success := and(eq(staticcall(gas(), 0x6, 0x5740, 0x80, 0x5740, 0x40), 1), success) +mstore(0x57c0, 0x16da8fcde785c6df1fe13aec4a088e06790750dfa9a2e9c6e05464a06b99679d) + mstore(0x57e0, 0x19fffa5d91549cdec737262e6cc5fa01c2f1c39c7b5f567d65d68e2cf3077bdb) +mstore(0x5800, mload(0x4bc0)) +success := and(eq(staticcall(gas(), 0x7, 0x57c0, 0x60, 0x57c0, 0x40), 1), success) +mstore(0x5820, mload(0x5740)) + mstore(0x5840, mload(0x5760)) +mstore(0x5860, mload(0x57c0)) + mstore(0x5880, mload(0x57e0)) +success := and(eq(staticcall(gas(), 0x6, 0x5820, 0x80, 0x5820, 0x40), 1), success) +mstore(0x58a0, 0x1542d7d471049c346e9b97abc2a351948d23438019a76df2b1989c8f76b28760) + mstore(0x58c0, 0x0e26e13db1f178f85dbcb83b0a617d766c0b36fc4a49bafab13b20e83d0557f3) +mstore(0x58e0, mload(0x4be0)) +success := and(eq(staticcall(gas(), 0x7, 0x58a0, 0x60, 0x58a0, 0x40), 1), success) +mstore(0x5900, mload(0x5820)) + mstore(0x5920, mload(0x5840)) +mstore(0x5940, mload(0x58a0)) + mstore(0x5960, mload(0x58c0)) +success := and(eq(staticcall(gas(), 0x6, 0x5900, 0x80, 0x5900, 0x40), 1), success) +mstore(0x5980, 0x2b692b9199891f86e3fc5613991e72b47098220c9d883415244271cc74b1218d) + mstore(0x59a0, 0x042f929afe4bc56206b4ace41a3d283848753d5014597bcd0ec14f8a9261c584) +mstore(0x59c0, mload(0x4c00)) +success := and(eq(staticcall(gas(), 0x7, 0x5980, 0x60, 0x5980, 0x40), 1), success) +mstore(0x59e0, mload(0x5900)) + mstore(0x5a00, mload(0x5920)) +mstore(0x5a20, mload(0x5980)) + mstore(0x5a40, mload(0x59a0)) +success := and(eq(staticcall(gas(), 0x6, 0x59e0, 0x80, 0x59e0, 0x40), 1), success) +mstore(0x5a60, 0x29c09f206a2fb04b15a3a0c220024c6b0ffa448a19fe3d4ec45ffa20748fc946) + mstore(0x5a80, 0x1d27c69fbfa99caecf06376d79cbde5436726836ad63582954e2618d3899a6f6) +mstore(0x5aa0, mload(0x4c20)) +success := and(eq(staticcall(gas(), 0x7, 0x5a60, 0x60, 0x5a60, 0x40), 1), success) +mstore(0x5ac0, mload(0x59e0)) + mstore(0x5ae0, mload(0x5a00)) +mstore(0x5b00, mload(0x5a60)) + mstore(0x5b20, mload(0x5a80)) +success := and(eq(staticcall(gas(), 0x6, 0x5ac0, 0x80, 0x5ac0, 0x40), 1), success) +mstore(0x5b40, 0x20a3113a48bc99d14016666990d982af3fc8ef6269c2f37e053bbb801e1bda37) + mstore(0x5b60, 0x11874a3348a60113ed95b25c4bdb198369e449967dfe7fe3253cb39afdee2672) +mstore(0x5b80, mload(0x4c40)) +success := and(eq(staticcall(gas(), 0x7, 0x5b40, 0x60, 0x5b40, 0x40), 1), success) +mstore(0x5ba0, mload(0x5ac0)) + mstore(0x5bc0, mload(0x5ae0)) +mstore(0x5be0, mload(0x5b40)) + mstore(0x5c00, mload(0x5b60)) +success := and(eq(staticcall(gas(), 0x6, 0x5ba0, 0x80, 0x5ba0, 0x40), 1), success) +mstore(0x5c20, 0x22ee677d2be1568a5ed89b73c8499d415c7c48b12184a48781e4f08d37755757) + mstore(0x5c40, 0x16f2744bb8dae65b5c5a6e0836cd5b59014c25f2481b024dec21ccbf26a9808c) +mstore(0x5c60, mload(0x4c60)) +success := and(eq(staticcall(gas(), 0x7, 0x5c20, 0x60, 0x5c20, 0x40), 1), success) +mstore(0x5c80, mload(0x5ba0)) + mstore(0x5ca0, mload(0x5bc0)) +mstore(0x5cc0, mload(0x5c20)) + mstore(0x5ce0, mload(0x5c40)) +success := and(eq(staticcall(gas(), 0x6, 0x5c80, 0x80, 0x5c80, 0x40), 1), success) +mstore(0x5d00, 0x0fccf37dc6868cb450c1cc971a9005c20acf19ddb1c82b9ceae7579aaaf6e5dc) + mstore(0x5d20, 0x1053a5adbb841ceb0c804c8e4188b2eb030d0a623ae199553173d818df46a8f8) +mstore(0x5d40, mload(0x4c80)) +success := and(eq(staticcall(gas(), 0x7, 0x5d00, 0x60, 0x5d00, 0x40), 1), success) +mstore(0x5d60, mload(0x5c80)) + mstore(0x5d80, mload(0x5ca0)) +mstore(0x5da0, mload(0x5d00)) + mstore(0x5dc0, mload(0x5d20)) +success := and(eq(staticcall(gas(), 0x6, 0x5d60, 0x80, 0x5d60, 0x40), 1), success) +mstore(0x5de0, 0x03c3c5792394acd6230174342c0fb4ceba9b35c38d4ab0ddb4a0fb177db54308) + mstore(0x5e00, 0x1fd7d3ae57e2ef4c7b1023ce495503e40ca89532cbf6a740e57d9fa57d2b6f93) +mstore(0x5e20, mload(0x4ca0)) +success := and(eq(staticcall(gas(), 0x7, 0x5de0, 0x60, 0x5de0, 0x40), 1), success) +mstore(0x5e40, mload(0x5d60)) + mstore(0x5e60, mload(0x5d80)) +mstore(0x5e80, mload(0x5de0)) + mstore(0x5ea0, mload(0x5e00)) +success := and(eq(staticcall(gas(), 0x6, 0x5e40, 0x80, 0x5e40, 0x40), 1), success) +mstore(0x5ec0, 0x15b64cf223d375ca6c983ab84102a960bfeb54a0a29a085844e0e571b09f3d71) + mstore(0x5ee0, 0x23d8408484b6b10b897f9b0cc33314d9060dac48f43a62a0e5660be5882a7a8e) +mstore(0x5f00, mload(0x4cc0)) +success := and(eq(staticcall(gas(), 0x7, 0x5ec0, 0x60, 0x5ec0, 0x40), 1), success) +mstore(0x5f20, mload(0x5e40)) + mstore(0x5f40, mload(0x5e60)) +mstore(0x5f60, mload(0x5ec0)) + mstore(0x5f80, mload(0x5ee0)) +success := and(eq(staticcall(gas(), 0x6, 0x5f20, 0x80, 0x5f20, 0x40), 1), success) +mstore(0x5fa0, 0x2b069d8e2e57e6add6f216816a31936af27540959bfd7b845d3e74d84196639d) + mstore(0x5fc0, 0x0840b8c0bdbb760a926c4046da2614e14d3c8b2fafc18c7471ce21298ca57c17) +mstore(0x5fe0, mload(0x4ce0)) +success := and(eq(staticcall(gas(), 0x7, 0x5fa0, 0x60, 0x5fa0, 0x40), 1), success) +mstore(0x6000, mload(0x5f20)) + mstore(0x6020, mload(0x5f40)) +mstore(0x6040, mload(0x5fa0)) + mstore(0x6060, mload(0x5fc0)) +success := and(eq(staticcall(gas(), 0x6, 0x6000, 0x80, 0x6000, 0x40), 1), success) +mstore(0x6080, 0x2a6e42bf68afa452351faa949dc279f9fe3c68b126280aca278121888fcbaf73) + mstore(0x60a0, 0x04ddb656fb4f29069ada65c848b2ab177b495c0869aba6fe9216dab3a043f759) +mstore(0x60c0, mload(0x4d00)) +success := and(eq(staticcall(gas(), 0x7, 0x6080, 0x60, 0x6080, 0x40), 1), success) +mstore(0x60e0, mload(0x6000)) + mstore(0x6100, mload(0x6020)) +mstore(0x6120, mload(0x6080)) + mstore(0x6140, mload(0x60a0)) +success := and(eq(staticcall(gas(), 0x6, 0x60e0, 0x80, 0x60e0, 0x40), 1), success) +mstore(0x6160, 0x0182a509c08487b8c3d5b8507251cc8a46f5b313c687c1e7262d08eb8dfa4c10) + mstore(0x6180, 0x0474aa258fa2d41afc65596c3ada20b889a0f27825905a2a176560b27e2d2c8e) +mstore(0x61a0, mload(0x4d20)) +success := and(eq(staticcall(gas(), 0x7, 0x6160, 0x60, 0x6160, 0x40), 1), success) +mstore(0x61c0, mload(0x60e0)) + mstore(0x61e0, mload(0x6100)) +mstore(0x6200, mload(0x6160)) + mstore(0x6220, mload(0x6180)) +success := and(eq(staticcall(gas(), 0x6, 0x61c0, 0x80, 0x61c0, 0x40), 1), success) +mstore(0x6240, 0x1b5b2f748768c343be69fd761df14910a926a77da095db2912e96ac9f73ab6a2) + mstore(0x6260, 0x2c0bb520bc601497c6b7f1bf683c83cab3a0440c41d8fdfbae0c775a57e727f5) +mstore(0x6280, mload(0x4d40)) +success := and(eq(staticcall(gas(), 0x7, 0x6240, 0x60, 0x6240, 0x40), 1), success) +mstore(0x62a0, mload(0x61c0)) + mstore(0x62c0, mload(0x61e0)) +mstore(0x62e0, mload(0x6240)) + mstore(0x6300, mload(0x6260)) +success := and(eq(staticcall(gas(), 0x6, 0x62a0, 0x80, 0x62a0, 0x40), 1), success) +mstore(0x6320, 0x0013dfb44248755cf12dcbac0ec5563e577e5b804ade04abc4e9baadac00e7ff) + mstore(0x6340, 0x264d42845662a911a5c37ae71cce463c1c387c12eed1a675e957440020045cb1) +mstore(0x6360, mload(0x4d60)) +success := and(eq(staticcall(gas(), 0x7, 0x6320, 0x60, 0x6320, 0x40), 1), success) +mstore(0x6380, mload(0x62a0)) + mstore(0x63a0, mload(0x62c0)) +mstore(0x63c0, mload(0x6320)) + mstore(0x63e0, mload(0x6340)) +success := and(eq(staticcall(gas(), 0x6, 0x6380, 0x80, 0x6380, 0x40), 1), success) +mstore(0x6400, 0x2386d5258846b3fc1e5ffca77fde43316fd15ea08e7ce940927f7212c1b37bb7) + mstore(0x6420, 0x23306e0a53ba71047743578c8fb135d2b843a8dded816b5a9e0b06b72f07be96) +mstore(0x6440, mload(0x4d80)) +success := and(eq(staticcall(gas(), 0x7, 0x6400, 0x60, 0x6400, 0x40), 1), success) +mstore(0x6460, mload(0x6380)) + mstore(0x6480, mload(0x63a0)) +mstore(0x64a0, mload(0x6400)) + mstore(0x64c0, mload(0x6420)) +success := and(eq(staticcall(gas(), 0x6, 0x6460, 0x80, 0x6460, 0x40), 1), success) +mstore(0x64e0, mload(0x420)) + mstore(0x6500, mload(0x440)) +mstore(0x6520, mload(0x4da0)) +success := and(eq(staticcall(gas(), 0x7, 0x64e0, 0x60, 0x64e0, 0x40), 1), success) +mstore(0x6540, mload(0x6460)) + mstore(0x6560, mload(0x6480)) +mstore(0x6580, mload(0x64e0)) + mstore(0x65a0, mload(0x6500)) +success := and(eq(staticcall(gas(), 0x6, 0x6540, 0x80, 0x6540, 0x40), 1), success) +mstore(0x65c0, mload(0x460)) + mstore(0x65e0, mload(0x480)) +mstore(0x6600, mload(0x4dc0)) +success := and(eq(staticcall(gas(), 0x7, 0x65c0, 0x60, 0x65c0, 0x40), 1), success) +mstore(0x6620, mload(0x6540)) + mstore(0x6640, mload(0x6560)) +mstore(0x6660, mload(0x65c0)) + mstore(0x6680, mload(0x65e0)) +success := and(eq(staticcall(gas(), 0x6, 0x6620, 0x80, 0x6620, 0x40), 1), success) +mstore(0x66a0, mload(0x4a0)) + mstore(0x66c0, mload(0x4c0)) +mstore(0x66e0, mload(0x4de0)) +success := and(eq(staticcall(gas(), 0x7, 0x66a0, 0x60, 0x66a0, 0x40), 1), success) +mstore(0x6700, mload(0x6620)) + mstore(0x6720, mload(0x6640)) +mstore(0x6740, mload(0x66a0)) + mstore(0x6760, mload(0x66c0)) +success := and(eq(staticcall(gas(), 0x6, 0x6700, 0x80, 0x6700, 0x40), 1), success) +mstore(0x6780, mload(0x4e0)) + mstore(0x67a0, mload(0x500)) +mstore(0x67c0, mload(0x4e00)) +success := and(eq(staticcall(gas(), 0x7, 0x6780, 0x60, 0x6780, 0x40), 1), success) +mstore(0x67e0, mload(0x6700)) + mstore(0x6800, mload(0x6720)) +mstore(0x6820, mload(0x6780)) + mstore(0x6840, mload(0x67a0)) +success := and(eq(staticcall(gas(), 0x6, 0x67e0, 0x80, 0x67e0, 0x40), 1), success) +mstore(0x6860, mload(0x520)) + mstore(0x6880, mload(0x540)) +mstore(0x68a0, mload(0x4e20)) +success := and(eq(staticcall(gas(), 0x7, 0x6860, 0x60, 0x6860, 0x40), 1), success) +mstore(0x68c0, mload(0x67e0)) + mstore(0x68e0, mload(0x6800)) +mstore(0x6900, mload(0x6860)) + mstore(0x6920, mload(0x6880)) +success := and(eq(staticcall(gas(), 0x6, 0x68c0, 0x80, 0x68c0, 0x40), 1), success) +mstore(0x6940, mload(0x380)) + mstore(0x6960, mload(0x3a0)) +mstore(0x6980, mload(0x4e40)) +success := and(eq(staticcall(gas(), 0x7, 0x6940, 0x60, 0x6940, 0x40), 1), success) +mstore(0x69a0, mload(0x68c0)) + mstore(0x69c0, mload(0x68e0)) +mstore(0x69e0, mload(0x6940)) + mstore(0x6a00, mload(0x6960)) +success := and(eq(staticcall(gas(), 0x6, 0x69a0, 0x80, 0x69a0, 0x40), 1), success) +mstore(0x6a20, mload(0x2c0)) + mstore(0x6a40, mload(0x2e0)) +mstore(0x6a60, mload(0x4f40)) +success := and(eq(staticcall(gas(), 0x7, 0x6a20, 0x60, 0x6a20, 0x40), 1), success) +mstore(0x6a80, mload(0x69a0)) + mstore(0x6aa0, mload(0x69c0)) +mstore(0x6ac0, mload(0x6a20)) + mstore(0x6ae0, mload(0x6a40)) +success := and(eq(staticcall(gas(), 0x6, 0x6a80, 0x80, 0x6a80, 0x40), 1), success) +mstore(0x6b00, mload(0x300)) + mstore(0x6b20, mload(0x320)) +mstore(0x6b40, mload(0x50e0)) +success := and(eq(staticcall(gas(), 0x7, 0x6b00, 0x60, 0x6b00, 0x40), 1), success) +mstore(0x6b60, mload(0x6a80)) + mstore(0x6b80, mload(0x6aa0)) +mstore(0x6ba0, mload(0x6b00)) + mstore(0x6bc0, mload(0x6b20)) +success := and(eq(staticcall(gas(), 0x6, 0x6b60, 0x80, 0x6b60, 0x40), 1), success) +mstore(0x6be0, mload(0x340)) + mstore(0x6c00, mload(0x360)) +mstore(0x6c20, mload(0x5100)) +success := and(eq(staticcall(gas(), 0x7, 0x6be0, 0x60, 0x6be0, 0x40), 1), success) +mstore(0x6c40, mload(0x6b60)) + mstore(0x6c60, mload(0x6b80)) +mstore(0x6c80, mload(0x6be0)) + mstore(0x6ca0, mload(0x6c00)) +success := and(eq(staticcall(gas(), 0x6, 0x6c40, 0x80, 0x6c40, 0x40), 1), success) +mstore(0x6cc0, mload(0x180)) + mstore(0x6ce0, mload(0x1a0)) +mstore(0x6d00, mload(0x5200)) +success := and(eq(staticcall(gas(), 0x7, 0x6cc0, 0x60, 0x6cc0, 0x40), 1), success) +mstore(0x6d20, mload(0x6c40)) + mstore(0x6d40, mload(0x6c60)) +mstore(0x6d60, mload(0x6cc0)) + mstore(0x6d80, mload(0x6ce0)) +success := and(eq(staticcall(gas(), 0x6, 0x6d20, 0x80, 0x6d20, 0x40), 1), success) +mstore(0x6da0, mload(0xae0)) + mstore(0x6dc0, mload(0xb00)) +mstore(0x6de0, sub(f_q, mload(0x5240))) +success := and(eq(staticcall(gas(), 0x7, 0x6da0, 0x60, 0x6da0, 0x40), 1), success) +mstore(0x6e00, mload(0x6d20)) + mstore(0x6e20, mload(0x6d40)) +mstore(0x6e40, mload(0x6da0)) + mstore(0x6e60, mload(0x6dc0)) +success := and(eq(staticcall(gas(), 0x6, 0x6e00, 0x80, 0x6e00, 0x40), 1), success) +mstore(0x6e80, mload(0xb80)) + mstore(0x6ea0, mload(0xba0)) +mstore(0x6ec0, mload(0x5260)) +success := and(eq(staticcall(gas(), 0x7, 0x6e80, 0x60, 0x6e80, 0x40), 1), success) +mstore(0x6ee0, mload(0x6e00)) + mstore(0x6f00, mload(0x6e20)) +mstore(0x6f20, mload(0x6e80)) + mstore(0x6f40, mload(0x6ea0)) +success := and(eq(staticcall(gas(), 0x6, 0x6ee0, 0x80, 0x6ee0, 0x40), 1), success) +mstore(0x6f60, mload(0x6ee0)) + mstore(0x6f80, mload(0x6f00)) +mstore(0x6fa0, 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2) + mstore(0x6fc0, 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed) + mstore(0x6fe0, 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b) + mstore(0x7000, 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa) +mstore(0x7020, mload(0xb80)) + mstore(0x7040, mload(0xba0)) +mstore(0x7060, 0x1e46f29916af7be8122d38ce700e9f73b49830b4aa672d58c5fa83daa6f49038) + mstore(0x7080, 0x203ccabc1b45b69a6dfd92fe117dfbdbeb48e684dccdf8cb2f466f4b86073034) + mstore(0x70a0, 0x0bd22dcbe71a1faeea29bf6783cbc63f06788ff9ea2488a2af9036ac52d4ae82) + mstore(0x70c0, 0x23b7b2c332fca16856cc8bd1ca0b56f6872ed95ef4291917fce124bf48c13609) +success := and(eq(staticcall(gas(), 0x8, 0x6f60, 0x180, 0x6f60, 0x20), 1), success) +success := and(eq(mload(0x6f60), 1), success) + + if not(success) { revert(0, 0) } + return(0, 0) + + } + } + } \ No newline at end of file diff --git a/contracts/src/Summa.sol b/contracts/src/Summa.sol index 2e8e2b17..2134c4f0 100644 --- a/contracts/src/Summa.sol +++ b/contracts/src/Summa.sol @@ -37,17 +37,9 @@ contract Summa is Ownable { uint256 amount; } - /** - * @dev Zero-knowledge proof and its inputs - * @param proof zero-knowledge proof - * @param publicInputs proof inputs - */ - struct ZKProof { - bytes proof; - uint256[] publicInputs; - } - - IVerifier private immutable verifier; + //Verifier contracts + IVerifier private immutable solvencyVerifier; + IVerifier private immutable inclusionVerifier; //All address ownership proofs submitted by the CEX AddressOwnershipProof[] public addressOwnershipProofs; @@ -55,6 +47,9 @@ contract Summa is Ownable { //Convenience mapping to check if an address has already been verified mapping(bytes32 => uint256) public ownershipProofByAddress; + // MST roots corresponding to successfully verified solvency proofs by timestamp + mapping(uint256 => uint256) public mstRoots; + event AddressOwnershipProofSubmitted( AddressOwnershipProof[] addressOwnershipProofs ); @@ -64,8 +59,9 @@ contract Summa is Ownable { Asset[] assets ); - constructor(IVerifier _verifier) { - verifier = _verifier; + constructor(IVerifier _solvencyVerifier, IVerifier _inclusionVerifier) { + solvencyVerifier = _solvencyVerifier; + inclusionVerifier = _inclusionVerifier; } /** @@ -100,7 +96,7 @@ contract Summa is Ownable { * @param mstRoot Merkle sum tree root of the CEX's liabilities * @param assets The list of assets owned by the CEX * @param proof The ZK proof - * @param timestamp The timestamp at which the CEX took the snapshot of its assets and liabilites + * @param timestamp The timestamp at which the CEX took the snapshot of its assets and liabilities */ function submitProofOfSolvency( uint256 mstRoot, @@ -122,16 +118,36 @@ contract Summa is Ownable { ); inputs[i + 1] = assets[i].amount; } - // Verify ZK proof - require(verifyZkProof(proof, inputs), "Invalid ZK proof"); + require(verifySolvencyProof(proof, inputs), "Invalid ZK proof"); + + mstRoots[timestamp] = mstRoot; emit SolvencyProofSubmitted(timestamp, inputs[0], assets); } - function verifyZkProof( + /** + * Verify the proof of CEX solvency + * @param proof ZK proof + * @param publicInputs proof inputs + */ + function verifySolvencyProof( bytes memory proof, uint256[] memory publicInputs - ) public view onlyOwner returns (bool) { - return verifier.verify(publicInputs, proof); + ) public view returns (bool) { + return solvencyVerifier.verify(publicInputs, proof); + } + + /** + * Verify the proof of user inclusion into the liabilities tree + * @param proof ZK proof + * @param publicInputs proof inputs + */ + function verifyInclusionProof( + bytes memory proof, + uint256[] memory publicInputs, + uint256 timestamp + ) public view returns (bool) { + require(mstRoots[timestamp] == publicInputs[1], "Invalid MST root"); + return inclusionVerifier.verify(publicInputs, proof); } } diff --git a/contracts/test/Summa.ts b/contracts/test/Summa.ts index 0c37d430..2ab793f1 100644 --- a/contracts/test/Summa.ts +++ b/contracts/test/Summa.ts @@ -9,17 +9,63 @@ import * as fs from "fs"; import * as path from "path"; describe("Summa Contract", () => { + function submitProofOfSolvency( + summa: Summa, + mstRoot: BigNumber, + proof: string, + assets = [ + { + chain: "ETH", + assetName: "ETH", + amount: BigNumber.from(556863), + }, + { + chain: "ETH", + assetName: "USDT", + amount: BigNumber.from(556863), + }, + ] + ): any { + return summa.submitProofOfSolvency( + mstRoot, + assets, + proof, + BigNumber.from(1693559255) + ); + } + + function verifyInclusionProof( + summa: Summa, + inclusionProof: string, + leafHash: BigNumber, + mstRoot: BigNumber + ): any { + return summa.verifyInclusionProof( + inclusionProof, + [leafHash, mstRoot], + 1693559255 + ); + } + async function deploySummaFixture() { // Contracts are deployed using the first signer/account by default const [owner, addr1, addr2, addr3]: SignerWithAddress[] = await ethers.getSigners(); - const verifier = await ethers.deployContract( + const solvencyVerifier = await ethers.deployContract( "src/SolvencyVerifier.sol:Verifier" ); - await verifier.deployed(); + await solvencyVerifier.deployed(); + + const inclusionVerifier = await ethers.deployContract( + "src/InclusionVerifier.sol:Verifier" + ); + await inclusionVerifier.deployed(); - const summa = await ethers.deployContract("Summa", [verifier.address]); + const summa = await ethers.deployContract("Summa", [ + solvencyVerifier.address, + inclusionVerifier.address, + ]); await summa.deployed(); return { @@ -58,7 +104,7 @@ describe("Summa Contract", () => { // ["bytes"], // [message] // ); - // const signature = await deployemtnInfo.addr3.signMessage( + // const signature = await deploymentInfo.addr3.signMessage( // ethers.utils.arrayify(hashedMessage) // ); // console.log("signature", signature); @@ -121,6 +167,12 @@ describe("Summa Contract", () => { expect(proofOfAddressOwnership1.message).to.be.equal(message); }); + it("should revert if the caller is not the owner", async () => { + await expect( + summa.connect(account3).submitProofOfAddressOwnership(ownedAddresses) + ).to.be.revertedWith("Ownable: caller is not the owner"); + }); + it("should revert if the address ownership has already been verified", async () => { await summa.submitProofOfAddressOwnership(ownedAddresses); await expect( @@ -196,7 +248,7 @@ describe("Summa Contract", () => { const jsonData = fs.readFileSync( path.resolve( __dirname, - "../../zk_prover/examples/proof_solidity_calldata.json" + "../../zk_prover/examples/solvency_proof_solidity_calldata.json" ), "utf-8" ); @@ -209,8 +261,27 @@ describe("Summa Contract", () => { it("should verify the proof of solvency for the given public input", async () => { await summa.submitProofOfAddressOwnership(ownedAddresses); + await expect(submitProofOfSolvency(summa, mstRoot, proof)) + .to.emit(summa, "SolvencyProofSubmitted") + .withArgs( + BigNumber.from(1693559255), + mstRoot, + (assets: Summa.AssetStruct[]) => { + return ( + assets[0].chain == "ETH" && + assets[0].assetName == "ETH" && + BigNumber.from(556863).eq(assets[0].amount as BigNumber) && + assets[1].chain == "ETH" && + assets[1].assetName == "USDT" && + BigNumber.from(556863).eq(assets[1].amount as BigNumber) + ); + } + ); + }); + + it("should revert if the caller is not the owner", async () => { await expect( - summa.submitProofOfSolvency( + summa.connect(account2).submitProofOfSolvency( mstRoot, [ { @@ -225,41 +296,14 @@ describe("Summa Contract", () => { }, ], proof, - BigNumber.from(0) + BigNumber.from(1693559255) ) - ) - .to.emit(summa, "SolvencyProofSubmitted") - .withArgs(BigNumber.from(0), mstRoot, (assets: Summa.AssetStruct[]) => { - return ( - assets[0].chain == "ETH" && - assets[0].assetName == "ETH" && - BigNumber.from(556863).eq(assets[0].amount as BigNumber) && - assets[1].chain == "ETH" && - assets[1].assetName == "USDT" && - BigNumber.from(556863).eq(assets[1].amount as BigNumber) - ); - }); + ).to.be.revertedWith("Ownable: caller is not the owner"); }); it("should not verify the proof of solvency if the CEX hasn't proven the address ownership", async () => { await expect( - summa.submitProofOfSolvency( - mstRoot, - [ - { - chain: "ETH", - assetName: "ETH", - amount: BigNumber.from(556863), - }, - { - chain: "ETH", - assetName: "USDT", - amount: BigNumber.from(556863), - }, - ], - proof, - BigNumber.from(0) - ) + submitProofOfSolvency(summa, mstRoot, proof) ).to.be.revertedWith( "The CEX has not submitted any address ownership proofs" ); @@ -271,23 +315,7 @@ describe("Summa Contract", () => { await summa.submitProofOfAddressOwnership(ownedAddresses); await expect( - summa.submitProofOfSolvency( - mstRoot, - [ - { - chain: "ETH", - assetName: "ETH", - amount: BigNumber.from(556863), - }, - { - chain: "ETH", - assetName: "USDT", - amount: BigNumber.from(556863), - }, - ], - proof, - BigNumber.from(0) - ) + submitProofOfSolvency(summa, mstRoot, proof) ).to.be.revertedWith("Invalid ZK proof"); }); @@ -295,60 +323,148 @@ describe("Summa Contract", () => { await summa.submitProofOfAddressOwnership(ownedAddresses); await expect( - summa.submitProofOfSolvency( - mstRoot, - [ - { - chain: "", - assetName: "ETH", - amount: BigNumber.from(556863), - }, - ], - proof, - BigNumber.from(0) - ) + submitProofOfSolvency(summa, mstRoot, proof, [ + { + chain: "", + assetName: "ETH", + amount: BigNumber.from(556863), + }, + ]) ).to.be.revertedWith("Invalid asset"); await expect( - summa.submitProofOfSolvency( - mstRoot, - [ - { - chain: "ETH", - assetName: "", - amount: BigNumber.from(556863), - }, - ], - proof, - BigNumber.from(0) - ) + submitProofOfSolvency(summa, mstRoot, proof, [ + { + chain: "ETH", + assetName: "", + amount: BigNumber.from(556863), + }, + ]) ).to.be.revertedWith("Invalid asset"); }); it("should revert with invalid proof", async () => { + await summa.submitProofOfAddressOwnership(ownedAddresses); + + proof = proof.replace("1", "2"); + + await expect( + submitProofOfSolvency(summa, mstRoot, proof) + ).to.be.revertedWith("Invalid ZK proof"); + proof = "0x000000"; + await expect( + submitProofOfSolvency(summa, mstRoot, proof) + ).to.be.revertedWithoutReason(); + }); + }); + + describe("verify proof of inclusion", () => { + let mstRoot: BigNumber; + let leafHash: BigNumber; + let summa: Summa; + let account1: SignerWithAddress; + let account2: SignerWithAddress; + let inclusionProof: string; + let solvencyProof: string; + let ownedAddresses: Summa.AddressOwnershipProofStruct[]; + const message = ethers.utils.defaultAbiCoder.encode( + ["string"], + ["Summa proof of solvency for CryptoExchange"] + ); + + beforeEach(async () => { + const deploymentInfo = await loadFixture(deploySummaFixture); + summa = deploymentInfo.summa as Summa; + account1 = deploymentInfo.addr1; + account2 = deploymentInfo.addr2; + + ownedAddresses = [ + { + chain: "ETH", + cexAddress: defaultAbiCoder.encode(["address"], [account1.address]), + signature: + "0x089b32327d332c295dc3b8873c205b72153211de6dc1c51235782b091cefb9d06d6df2661b86a7d441cd322f125b84901486b150e684221a7b7636eb8182af551b", + message: message, + }, + { + chain: "ETH", + cexAddress: defaultAbiCoder.encode(["address"], [account2.address]), + signature: + "0xb17a9e25265d3b88de7bfad81e7accad6e3d5612308ff83cc0fef76a34152b0444309e8fc3dea5139e49b6fc83a8553071a7af3d0cfd3fb8c1aea2a4c171729c1c", + message: message, + }, + ]; + + const solvencyJson = fs.readFileSync( + path.resolve( + __dirname, + "../../zk_prover/examples/solvency_proof_solidity_calldata.json" + ), + "utf-8" + ); + const solvencyCalldata: any = JSON.parse(solvencyJson); + + mstRoot = solvencyCalldata.public_inputs[0]; + solvencyProof = solvencyCalldata.proof; + + const inclusionJson = fs.readFileSync( + path.resolve( + __dirname, + "../../zk_prover/examples/inclusion_proof_solidity_calldata.json" + ), + "utf-8" + ); + const inclusionCalldata: any = JSON.parse(inclusionJson); + + leafHash = inclusionCalldata.public_inputs[0]; + mstRoot = inclusionCalldata.public_inputs[1]; + inclusionProof = inclusionCalldata.proof; + }); + + it("should verify the proof of inclusion for the given public input", async () => { await summa.submitProofOfAddressOwnership(ownedAddresses); + await submitProofOfSolvency(summa, mstRoot, solvencyProof); + expect( + await verifyInclusionProof(summa, inclusionProof, leafHash, mstRoot) + ).to.be.equal(true); + }); + it("should not verify with invalid MST root", async () => { + await summa.submitProofOfAddressOwnership(ownedAddresses); + await submitProofOfSolvency(summa, mstRoot, solvencyProof); + mstRoot = BigNumber.from(0); await expect( - summa.submitProofOfSolvency( - mstRoot, - [ - { - chain: "ETH", - assetName: "ETH", - amount: BigNumber.from(556863), - }, - { - chain: "ETH", - assetName: "USDT", - amount: BigNumber.from(556863), - }, - ], - proof, - BigNumber.from(0) - ) - ).to.be.revertedWithoutReason(); + verifyInclusionProof(summa, inclusionProof, leafHash, mstRoot) + ).to.be.revertedWith("Invalid MST root"); + }); + + it("should not verify if the MST root lookup by timestamp returns an incorrect MST root", async () => { + // The lookup will return a zero MST root as no MST root has been stored yet + await expect( + verifyInclusionProof(summa, inclusionProof, leafHash, mstRoot) + ).to.be.revertedWith("Invalid MST root"); + }); + + it("should not verify with invalid leaf", async () => { + leafHash = BigNumber.from(0); + + await summa.submitProofOfAddressOwnership(ownedAddresses); + await submitProofOfSolvency(summa, mstRoot, solvencyProof); + expect( + await verifyInclusionProof(summa, inclusionProof, leafHash, mstRoot) + ).to.be.equal(false); + }); + + it("should not verify with invalid proof", async () => { + inclusionProof = inclusionProof.replace("1", "2"); + + await summa.submitProofOfAddressOwnership(ownedAddresses); + await submitProofOfSolvency(summa, mstRoot, solvencyProof); + expect( + await verifyInclusionProof(summa, inclusionProof, leafHash, mstRoot) + ).to.be.equal(false); }); }); }); diff --git a/zk_prover/README.md b/zk_prover/README.md index f2a8aa93..38a0c7ae 100644 --- a/zk_prover/README.md +++ b/zk_prover/README.md @@ -1,6 +1,6 @@ # ZK Prover -This directory contains the Halo2 ZK circuit implementation for the Summa Proof of Solvency protocol. +This directory contains the Halo2 ZK circuit implementation for the Summa Proof of Solvency protocol. ## Usage @@ -10,15 +10,16 @@ To build, test and print the circuits, execute cargo build cargo test --release --features dev-graph ``` -## Documentation -The documentation for the circuits can be generated by running +## Documentation + +The documentation for the circuits can be generated by running ``` cargo doc --no-deps --open ``` -## Powers of Tau Trusted Setup +## Powers of Tau Trusted Setup For testing purposes, it's not necessary to download the `ptau` file. The `generate_setup_artifacts` function can manage this by generating a new setup from a randomly generated value. This automated generation process is intended for testing and development convenience, and it should not be used in production. For real-world situations, you must provide the path of a specific `ptau` file to the `generate_setup_artifacts`. The circuit will use the randomness from the given file. You can find an example that initializes a `Snapshot` instance [here](https://github.com/summa-dev/summa-solvency/blob/11d4fce5d18f6175804aa792fc9fc5ac27bf5c00/backend/src/apis/snapshot.rs#L115-L116) in the backend. @@ -31,19 +32,33 @@ A `gen_solvency_verifier.rs` script is provided to generate a solidity contract cargo run --release --example gen_solvency_verifier ``` -The script will generate a new `SolvencyVerifier.sol` and `SolvencyVerifier.yul` contracts in `contracts/src`. +The script will generate a new `SolvencyVerifier.sol` and `SolvencyVerifier.yul` contracts in `contracts/src`. Note that the generic parameters of the circuits `N_ASSETS` and `N_BYTES` are set to `2` and `14`. This means that the circuit is tuned to verify the proof of solvency for an exchange with 2 assets and a balances in a range of 14 bytes. These parameters can be changed in the script. Furthermore, the verifier are generated based on an unsafe setup. For a production ready verifier, the setup should be generated by providing a `ptau` file generated after a trusted setup ceremony to `generate_setup_artifacts` function. -On top of that the script will also generate a `proof_solidity_calldata.json` file that contains some testing calldata to be used within `contracts` and `backend` to test the verifier. +On top of that the script will also generate a `solvency_proof_solidity_calldata.json` file that contains some testing calldata to be used within `contracts` and `backend` to test the verifier. + +## Build an Inclusion Verifier Contract + +A `gen_inclusion_verifier.rs` script is provided to generate a solidity contract that can be used to verify the proof of user inclusion into CEX liabilites. The script can be run as follows: + +``` +cargo run --release --example gen_inclusion_verifier +``` + +The script will generate a new `InclusionVerifier.sol` and `InclusionVerifier.yul` contracts in `contracts/src`. + +The verifier are generated based on an unsafe setup. For a production ready verifier, the setup should be generated by providing a `ptau` file generated after a trusted setup ceremony to `generate_setup_artifacts` function. + +The script will also generate a `inclusion_proof_solidity_calldata.json` file that contains some testing calldata to be used within `contracts` and `backend` to test the verifier. -## Benches +## Benches The benchmarking included the following areas: -- Merkle Sum Tree Generation +- Merkle Sum Tree Generation - Verification Key Gen for MstInclusion Circuit - Proving Key Gen for MstInclusion Circuit - ZK Proof Generation for MstInclusion Circuit @@ -53,21 +68,21 @@ The benchmarking included the following areas: - ZK Proof Generation for Solvency Circuit - ZK Proof Verification for Solvency Circuit -In order to run the benchmarking, we provide a set of dummy `username, balances` entries formatted in csv files. The csv files can be downloaded as follows +In order to run the benchmarking, we provide a set of dummy `username, balances` entries formatted in csv files. The csv files can be downloaded as follows -``` +``` cd benches mkdir csv -cd csv +cd csv wget https://summa-solvency.s3.eu-central-1.amazonaws.com/csv_files.tar.bz2 tar -xjf csv_files.tar.bz2 ``` The csv folder will contain two subfolder namely `one_asset` and `two_assets`. Each folders will contain files named as `one_asset_entry_2_17.csv` or `two_assets_entry_2_5.csv`. 2^17 or 2^5 is the number of entries in the file that will be used to feed the merkle sum tree and, eventually, the zk prover. These entries represent the number of users of the exchange. -To run the benches +To run the benches -`cargo bench` +`cargo bench` You can set the following parameters to run the benches: @@ -83,28 +98,26 @@ Furthermore the benchmarking function `verify_zk_proof_benchmark` will also prin Run on MacBook Pro 2023, M2 Pro, 32GB RAM, 12 cores -Benches run after PR #80 (`add solidity verifier`). In order to achieve small proof size, to be cheap to verify on-chain. +Benches run after PR #80 (`add solidity verifier`). In order to achieve small proof size, to be cheap to verify on-chain. 2^15 entries (32768) users, 2 assets. Range is 14 bytes, considering SHIBA INU token supply (110 bits) as the upper bound. -| MST init | -| -------- | -| 4.2 s | +| MST init | +| -------- | +| 4.2 s | For Merkle Sum Tree Proof of Inclusion circuit -| VK Gen | Pk Gen | Proof Generation | Proof Verification | Proof Size (bytes) | -| ------------------ | ------------------- | ------------------- | ------------------- | ------------------ | -| 176.05 ms | 122.75 ms | 473.98 ms | 3.8 ms | 1632 | +| VK Gen | Pk Gen | Proof Generation | Proof Verification | Proof Size (bytes) | +| --------- | --------- | ---------------- | ------------------ | ------------------ | +| 176.05 ms | 122.75 ms | 473.98 ms | 3.8 ms | 1632 | For Proof of Solvency circuit -| VK Gen | Pk Gen | Proof Generation | Proof Verification | Proof Size (bytes) | -| ------ | ------ | ---------------- | ------------------ | ------------------ | -| 63.22 ms | 27.075 ms | 133.82 ms | 3.4476 ms | 1568 | +| VK Gen | Pk Gen | Proof Generation | Proof Verification | Proof Size (bytes) | +| -------- | --------- | ---------------- | ------------------ | ------------------ | +| 63.22 ms | 27.075 ms | 133.82 ms | 3.4476 ms | 1568 | -Gas cost to verify proof of solvency +Gas cost to verify proof of solvency 395579 gas units (run `cargo run --release --example gen_solvency_verifier`) - - diff --git a/zk_prover/examples/gen_inclusion_verifier.rs b/zk_prover/examples/gen_inclusion_verifier.rs new file mode 100644 index 00000000..178e0aa6 --- /dev/null +++ b/zk_prover/examples/gen_inclusion_verifier.rs @@ -0,0 +1,71 @@ +#![feature(generic_const_exprs)] + +use serde_json::to_string_pretty; +use snark_verifier_sdk::{ + evm::{evm_verify, gen_evm_proof_shplonk, gen_evm_verifier_shplonk}, + CircuitExt, +}; +use std::{fs::File, io::Write, path::Path}; +use summa_solvency::{ + circuits::{ + merkle_sum_tree::MstInclusionCircuit, + types::ProofSolidityCallData, + utils::{ + gen_proof_solidity_calldata, generate_setup_artifacts, write_verifier_sol_from_yul, + }, + }, + merkle_sum_tree::MerkleSumTree, +}; + +const LEVELS: usize = 4; +const N_ASSETS: usize = 2; +const N_BYTES: usize = 14; + +fn main() { + let merkle_sum_tree = + MerkleSumTree::::new("src/merkle_sum_tree/csv/entry_16.csv").unwrap(); + + let circuit = MstInclusionCircuit::::init(merkle_sum_tree, 0); + + // generate a universal trusted setup for testing, along with the verification key (vk) and the proving key (pk). + let (params, pk, _) = generate_setup_artifacts(11, None, circuit.clone()).unwrap(); + + let num_instances = circuit.num_instance(); + let instances = circuit.instances(); + + let proof = gen_evm_proof_shplonk(¶ms, &pk, circuit.clone(), instances.clone()); + + let proof_solidity_calldata = gen_proof_solidity_calldata(¶ms, &pk, circuit.clone()); + + let proof_hex_string = format!("0x{}", hex::encode(&proof_solidity_calldata.clone().0 .0)); + + let data = ProofSolidityCallData { + proof: proof_hex_string, + public_inputs: proof_solidity_calldata.1, + }; + + // Serialize the data to a JSON string + let serialized_data = to_string_pretty(&data).expect("Failed to serialize data"); + + // Save the serialized data to a JSON file + let mut file = File::create("./examples/inclusion_proof_solidity_calldata.json") + .expect("Unable to create file"); + file.write_all(serialized_data.as_bytes()) + .expect("Unable to write data to file"); + + let yul_output_path = "../contracts/src/InclusionVerifier.yul"; + let sol_output_path = "../contracts/src/InclusionVerifier.sol"; + + let deployment_code = gen_evm_verifier_shplonk::>( + ¶ms, + pk.get_vk(), + num_instances, + Some(Path::new(yul_output_path)), + ); + + write_verifier_sol_from_yul(yul_output_path, sol_output_path).unwrap(); + + let gas_cost = evm_verify(deployment_code, instances, proof); + + print!("gas_cost: {:?}", gas_cost); +} diff --git a/zk_prover/examples/gen_solvency_verifier.rs b/zk_prover/examples/gen_solvency_verifier.rs index 767f9d09..8a32502e 100644 --- a/zk_prover/examples/gen_solvency_verifier.rs +++ b/zk_prover/examples/gen_solvency_verifier.rs @@ -50,8 +50,8 @@ fn main() { let serialized_data = to_string_pretty(&data).expect("Failed to serialize data"); // Save the serialized data to a JSON file - let mut file = - File::create("./examples/proof_solidity_calldata.json").expect("Unable to create file"); + let mut file = File::create("./examples/solvency_proof_solidity_calldata.json") + .expect("Unable to create file"); file.write_all(serialized_data.as_bytes()) .expect("Unable to write data to file"); diff --git a/zk_prover/examples/inclusion_proof_solidity_calldata.json b/zk_prover/examples/inclusion_proof_solidity_calldata.json new file mode 100644 index 00000000..bd2c835b --- /dev/null +++ b/zk_prover/examples/inclusion_proof_solidity_calldata.json @@ -0,0 +1,7 @@ +{ + "proof": "0x1ffa97d3558269dbdef09a34328193c1585509ccf481de844ce4dcc5514dfb5b1554734cb5b71baa7e6ff341f10f3c70f2ee68d005c4409a39c98f7d4c3124991e0060f2c7693b707fe3b52586d31488e6fc3661e4cf756fb257a4a186c22ebe1d8c50a4da16c205b6be41a6d716adb9591d6eb97f24ddaeaef06f6b900dfadd26c4ce3f3476790a2e0b5f12052690f36aff6dcd342773d682bea6cbd41daa8e1c6295e3e2dd930e030ee62fe98f8bef42a493e4aeb42f00bd621fbf3ea201d8134a5679f09d436629c52160cb21e0443c1906606c409409ae66f5daf605969200f04ec0d776d49f2f5eaff2e04c88c9064c908f4a0d266c612a15bd88858f5f0ed50084c72f3c79113e05c3674fa14d26e497cc71b404acdd56cf1eb64037002b180b8bd7b4908ef5098ea7f51c6fe7e38dec6dfa0de1360f4c0674a445f8432a03d84390a1276ee7ee553765bac303dbf374a8cdaab6f2bf2734cb21d556701c5131d20846a4913d8e1c34b79f44da7a7f7b55e8155570ad1e1137f88c31f90ae673653b5f2e987fbfe8206cc21ade378eaf9a8665ffa2e3e490cdeecf70722e10b2d2ad8b9edc26bdd213c1910b558451094cf473c9050e32c516ea7860500d54fccbb5dc98192493e0babd8f85b22553a07a4e8053da749c91ce98225fe724acc06dea4c81da2f89462ffebaa5869aaa29630bbcb0c2d62570dbc004b2bb176cb7116152408720c325fece609150915a7b7a6e436437a2be03ba70d049551c8278ac13cc4c2b65b9bb2c4ee2ba6c6e1d9faf2bc20c92ea8a4218c84e444128b9d75126946d454432e913409ff70360bd49246f42ec35fcf1632c45f6c75a2cbaab894857e72d88b15ab417e34a4fd886ea209cc616a810c237a8fd33e81c1cb173872f471edfb573ef3e61320a37d663d25a470c1f894bf8688d2851b7dc2cd3e5231d2e2ec586dec42b1cbc6a262727ed1266fde554bdbb3ca9987f66391cd56a8ec2bc59176ba6408acafdd05262293040c570e2318978b6297132436f20a5e5437f1720bda4a29c749870a1d9064a2949f232aa7103259976fc9c1e1b0653e91dfbab7372440e915eb17abbd762e9c305b7fafc9cede04c5e7489078c05c7792c7be6c9c48ca93c51abccd586c73889c364cdcae82371f0741e88a703193cc834116a358fbaae3ae932db3c21b7c023f024964a912cf5c15d4cd9a3200cbf794d47eea27f0462c3d817081de0860bc9a04699c86b37f9b1a35d30307b2b7a4374c391c698b71f5d3036f2314911dc23c5b25fb0e283632f5bd64997650c6d9117b3ed92b08da2746033c4b961bb5b1300403e8a8cd78e9396ad97ef09063637c3f1ef26e5086d86f0b28a15643b5e00e96058a9f0205a558d119802fb05df49d1747ec550ff8f9d6ac12ca6b2ecd23a7d13f77b2f5d3c48ffcb88a18709f7b780dbe4677ff2ad54d1b89394368f114f0dd59656a4151f6cc0949d29fa26491b7f793a156032218adb0975fb774d85c4b742c34a5ef5f80ae5b8f2e6a70e3fce3917906d6d0e9d80b77f75c9a30b6a120177b5a5b2a5c757ceac9a07b816e9b7133cb463134cb049bea7a8a6e37e183d2d78e6d9ffdc83b4ade929e8b60438704c61f2abea11f2524cc7cb83ee144dc968c2886cf1b30201a1bd36c02a15a30280bc17bc578bdb667b3685e4d35672e981f7043fd0075d4f36eceb37c51f6c8785d39d8786b2b942de2bc087507ed48ca60389a9a358ce25a56969ee3912f4a3adcf400b18a1a057b3e41de61977116611409e65eabec0a0ff69325021090bba89cca12a2bdceeabe5b2a20a0f1169607e8e7654d71d0caf7b04a5e61014b285a83ae7d785c29f15d8bda0c86feb60e280184780400a42660506698aad1c096d171bf1edddb63069c4f35bd55a3bfa3373b76204eff2b635b5ea264a200f26587f41c5c4792a217737f45f28c9d3aacb5f4fcdeb5628dfc43508c0ee162c0ffef91b53bffa67face99f6e89041f490c2b0aa9a2e33e601ab509326a4750215060e8f17a25c8308a259e4f260d39766f6c696eb9417ea21d2ca1cc35ab52bad68220a24a2e7fbd1e529a3ee1f4e11e5d30f786b802d53b785d4a07ee96c21cc9a18cde3975cb702f4cf764db0e931fe729422273eba3956bfd903e99dc51c782eadf2695de097c94113568edb5a68609d54c23bf84335fd0267a080ac3b22a7be0cbe64173bf833306de904cc5337f4ff9950a62969ea8c753d3727d2771a2ee36cecb28467f0ac8c300e3306d312cc6f89c92febe36064852614400f951d0026004643c1a9828ae72fe4fc6da4884b63ed71fd8b65da79782bab70bc060ca29772907da6c0ba45b4818880a2b633ba18295377c1c672dc7c8e04f9d5b324dc8e38ca0facb87ac9f47a2a24d762c87d283a7cac5a674a7c09155e72aa1804da69c39954e72a505448c997e1c1154efe1906429bcfb6206754daa8112d3c0a48f5a6473e2750ce953c98ca5bf4166c062ae8320d311a1051023f837c23380515ab375fc3dd7e41560ddf448b0dcd1295cd65e7cd5ac3185cddcd37df1b9230617dbc740521116c78a9585c54abd8c421c14168b28220fc26048dc9801f9d1a796db0300f2eaded1209ffad4a0e34e3a0ee3a222c7cdadb100fe912a168e82f69122a8e7cfa2e6b9ecb5253ff32985fc6590d851c8d659fdacfe2acc3c28921bb36afeb8efa1093dbdef1024cb2e76022941d4e7d5f6f7b53253204878d4f0fccc88f476bdad72ccbabf1e0dc43e86ec1e20bf95c45a8f88941e47d5453d0288feb508bcef0367ed40717af927e6b6f061922bc8743e3edf4f088d6c1d24803a2ccafc4218209dc42d22513090587d1d6d71395c2da5818a81707da1452b008c3372627fcd84b05a1067ce2e3d38f3c48427f219b591c7a65809c24b2fde52031baf2142679de17fc9e6197734c65edcaaa48e1521c0fe23fa3ef8c1e2214264622a1ec5baab0b766c31f651fcf0a3d3086d19294284032b5550c5a62452e", + "public_inputs": [ + "0xe113acd03b98f0bab0ef6f577245d5d008cbcc19ef2dab3608aa4f37f72a407", + "0x2e021d9bf99c5bd7267488b6a7a5cf5f7d00222a41b6a9b971899c44089e0c5" + ] +} \ No newline at end of file diff --git a/zk_prover/examples/proof_solidity_calldata.json b/zk_prover/examples/solvency_proof_solidity_calldata.json similarity index 100% rename from zk_prover/examples/proof_solidity_calldata.json rename to zk_prover/examples/solvency_proof_solidity_calldata.json