diff --git a/.env.contracts.example b/.env.contracts.example index 78bdcfd450..a849bd1a85 100644 --- a/.env.contracts.example +++ b/.env.contracts.example @@ -38,4 +38,4 @@ export DEPLOYER_PRIVATE_KEY= #include the 0x prefix export DEPLOYER_MNEMONIC= export DEPLOYER_MNEMONIC_OFFSET= export DEPLOYER_HARDWARE_WALLET_ADDRESS= -export USE_HARDWARE_WALLET=false # values {true, false} \ No newline at end of file +export USE_HARDWARE_WALLET=false # values {true, false} diff --git a/.gas-snapshot b/.gas-snapshot index 32c4d32fed..cd63590776 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -1,3 +1,2 @@ -LightClientBench:testCorrectUpdateBench() (gas: 499764) -PlonkVerifier2_verify_Test:test_verify_succeeds() (gas: 381889) -PlonkVerifier_verify_Test:test_verify_succeeds() (gas: 388519) \ No newline at end of file +LightClientBench:testCorrectUpdateBench() (gas: 516005) +PlonkVerifier_verify_Test:test_verify_succeeds() (gas: 389906) \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 1964edd963..c30423a0a6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3463,6 +3463,7 @@ dependencies = [ "ethers", "hotshot-contract-adapter", "hotshot-state-prover", + "hotshot-types", "jf-pcs", "jf-plonk", "jf-signature 0.2.0", diff --git a/contract-bindings-alloy/src/lib.rs b/contract-bindings-alloy/src/lib.rs index ec4b26153a..0b0b813930 100644 --- a/contract-bindings-alloy/src/lib.rs +++ b/contract-bindings-alloy/src/lib.rs @@ -11,4 +11,3 @@ pub mod lightclientarbitrum; pub mod lightclientmock; pub mod permissionedstaketable; pub mod plonkverifier; -pub mod plonkverifier2; diff --git a/contract-bindings-alloy/src/lightclient.rs b/contract-bindings-alloy/src/lightclient.rs index a2e27b0672..bed4d078d0 100644 --- a/contract-bindings-alloy/src/lightclient.rs +++ b/contract-bindings-alloy/src/lightclient.rs @@ -1304,6 +1304,7 @@ interface LightClient { error InvalidInitialization(); error InvalidMaxStateHistory(); error InvalidProof(); + error MissingLastBlockInEpochUpdate(); error NoChangeRequired(); error NotInitializing(); error OutdatedState(); @@ -1315,6 +1316,7 @@ interface LightClient { error WrongStakeTableUsed(); event Initialized(uint64 version); + event NewEpoch(uint64 epoch); event NewState(uint64 indexed viewNum, uint64 indexed blockHeight, BN254.ScalarField blockCommRoot); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); event PermissionedProverNotRequired(); @@ -1325,18 +1327,22 @@ interface LightClient { constructor(); function UPGRADE_INTERFACE_VERSION() external view returns (string memory); + function _blocksPerEpoch() external view returns (uint64); function currentBlockNumber() external view returns (uint256); + function currentEpoch() external view returns (uint64); function disablePermissionedProverMode() external; + function epochFromBlockNumber(uint64 blockNum, uint64 blocksPerEpoch) external pure returns (uint64); function finalizedState() external view returns (uint64 viewNum, uint64 blockHeight, BN254.ScalarField blockCommRoot); function genesisStakeTableState() external view returns (uint256 threshold, BN254.ScalarField blsKeyComm, BN254.ScalarField schnorrKeyComm, BN254.ScalarField amountComm); function genesisState() external view returns (uint64 viewNum, uint64 blockHeight, BN254.ScalarField blockCommRoot); function getHotShotCommitment(uint256 hotShotBlockHeight) external view returns (BN254.ScalarField hotShotBlockCommRoot, uint64 hotshotBlockHeight); function getStateHistoryCount() external view returns (uint256); function getVersion() external pure returns (uint8 majorVersion, uint8 minorVersion, uint8 patchVersion); - function initialize(LightClientState memory _genesis, StakeTableState memory _genesisStakeTableState, uint32 _stateHistoryRetentionPeriod, address owner) external; + function initialize(LightClientState memory _genesis, StakeTableState memory _genesisStakeTableState, uint32 _stateHistoryRetentionPeriod, address owner, uint64 blocksPerEpoch) external; + function isLastBlockInEpoch(uint64 blockHeight) external view returns (bool); function isPermissionedProverEnabled() external view returns (bool); function lagOverEscapeHatchThreshold(uint256 blockNumber, uint256 blockThreshold) external view returns (bool); - function newFinalizedState(LightClientState memory newState, IPlonkVerifier.PlonkProof memory proof) external; + function newFinalizedState(LightClientState memory newState, StakeTableState memory nextStakeTable, IPlonkVerifier.PlonkProof memory proof) external; function owner() external view returns (address); function permissionedProver() external view returns (address); function proxiableUUID() external view returns (bytes32); @@ -1348,6 +1354,7 @@ interface LightClient { function stateHistoryRetentionPeriod() external view returns (uint32); function transferOwnership(address newOwner) external; function upgradeToAndCall(address newImplementation, bytes memory data) external payable; + function votingStakeTableState() external view returns (uint256 threshold, BN254.ScalarField blsKeyComm, BN254.ScalarField schnorrKeyComm, BN254.ScalarField amountComm); } ``` @@ -1372,6 +1379,19 @@ interface LightClient { ], "stateMutability": "view" }, + { + "type": "function", + "name": "_blocksPerEpoch", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint64", + "internalType": "uint64" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "currentBlockNumber", @@ -1385,6 +1405,19 @@ interface LightClient { ], "stateMutability": "view" }, + { + "type": "function", + "name": "currentEpoch", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint64", + "internalType": "uint64" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "disablePermissionedProverMode", @@ -1392,6 +1425,30 @@ interface LightClient { "outputs": [], "stateMutability": "nonpayable" }, + { + "type": "function", + "name": "epochFromBlockNumber", + "inputs": [ + { + "name": "blockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "blocksPerEpoch", + "type": "uint64", + "internalType": "uint64" + } + ], + "outputs": [ + { + "name": "", + "type": "uint64", + "internalType": "uint64" + } + ], + "stateMutability": "pure" + }, { "type": "function", "name": "finalizedState", @@ -1588,11 +1645,35 @@ interface LightClient { "name": "owner", "type": "address", "internalType": "address" + }, + { + "name": "blocksPerEpoch", + "type": "uint64", + "internalType": "uint64" } ], "outputs": [], "stateMutability": "nonpayable" }, + { + "type": "function", + "name": "isLastBlockInEpoch", + "inputs": [ + { + "name": "blockHeight", + "type": "uint64", + "internalType": "uint64" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "isPermissionedProverEnabled", @@ -1656,6 +1737,33 @@ interface LightClient { } ] }, + { + "name": "nextStakeTable", + "type": "tuple", + "internalType": "struct LightClient.StakeTableState", + "components": [ + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "blsKeyComm", + "type": "uint256", + "internalType": "BN254.ScalarField" + }, + { + "name": "schnorrKeyComm", + "type": "uint256", + "internalType": "BN254.ScalarField" + }, + { + "name": "amountComm", + "type": "uint256", + "internalType": "BN254.ScalarField" + } + ] + }, { "name": "proof", "type": "tuple", @@ -2101,6 +2209,34 @@ interface LightClient { "outputs": [], "stateMutability": "payable" }, + { + "type": "function", + "name": "votingStakeTableState", + "inputs": [], + "outputs": [ + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "blsKeyComm", + "type": "uint256", + "internalType": "BN254.ScalarField" + }, + { + "name": "schnorrKeyComm", + "type": "uint256", + "internalType": "BN254.ScalarField" + }, + { + "name": "amountComm", + "type": "uint256", + "internalType": "BN254.ScalarField" + } + ], + "stateMutability": "view" + }, { "type": "event", "name": "Initialized", @@ -2114,6 +2250,19 @@ interface LightClient { ], "anonymous": false }, + { + "type": "event", + "name": "NewEpoch", + "inputs": [ + { + "name": "epoch", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, { "type": "event", "name": "NewState", @@ -2270,6 +2419,11 @@ interface LightClient { "name": "InvalidProof", "inputs": [] }, + { + "type": "error", + "name": "MissingLastBlockInEpochUpdate", + "inputs": [] + }, { "type": "error", "name": "NoChangeRequired", @@ -2348,22 +2502,22 @@ pub mod LightClient { /// The creation / init bytecode of the contract. /// /// ```text - ///0x60a06040523060805234801562000014575f80fd5b506200001f62000025565b620000d9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000765760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051612968620001005f395f8181611094015281816110bd015261123a01526129685ff3fe608060405260043610610147575f3560e01c8063826e41fc116100b3578063ad3cb1cc1161006d578063ad3cb1cc1461046a578063c23b9e9e146104a7578063d24d933d146104df578063e03033011461050e578063f2fde38b1461052d578063f9e50d191461054c575f80fd5b8063826e41fc146103345780638584d23f1461035f5780638da5cb5b1461039b57806396c1ca61146103d75780639baa3cc9146103f65780639fdb54a714610415575f80fd5b8063378ec23b11610104578063378ec23b14610288578063426d3194146102a45780634f1ef286146102e557806352d1902d146102f857806369cc6a041461030c578063715018a614610320575f80fd5b8063013fa5fc1461014b57806302b592f31461016c5780630d8e6e2c146101c95780632063d4f7146101f45780632f79889d14610213578063313df7b114610251575b5f80fd5b348015610156575f80fd5b5061016a610165366004611f1d565b610560565b005b348015610177575f80fd5b5061018b610186366004611f36565b610613565b6040516101c094939291906001600160401b039485168152928416602084015292166040820152606081019190915260800190565b60405180910390f35b3480156101d4575f80fd5b5060408051600181525f60208201819052918101919091526060016101c0565b3480156101ff575f80fd5b5061016a61020e366004612081565b61065c565b34801561021e575f80fd5b5060085461023990600160c01b90046001600160401b031681565b6040516001600160401b0390911681526020016101c0565b34801561025c575f80fd5b50600854610270906001600160a01b031681565b6040516001600160a01b0390911681526020016101c0565b348015610293575f80fd5b50435b6040519081526020016101c0565b3480156102af575f80fd5b505f546001546002546003546102c59392919084565b6040805194855260208501939093529183015260608201526080016101c0565b61016a6102f3366004612232565b6107b6565b348015610303575f80fd5b506102966107d5565b348015610317575f80fd5b5061016a6107f0565b34801561032b575f80fd5b5061016a61085e565b34801561033f575f80fd5b506008546001600160a01b031615155b60405190151581526020016101c0565b34801561036a575f80fd5b5061037e610379366004611f36565b61086f565b604080519283526001600160401b039091166020830152016101c0565b3480156103a6575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610270565b3480156103e2575f80fd5b5061016a6103f13660046122e4565b61099a565b348015610401575f80fd5b5061016a6104103660046122fd565b610a23565b348015610420575f80fd5b50600654600754610444916001600160401b0380821692600160401b909204169083565b604080516001600160401b039485168152939092166020840152908201526060016101c0565b348015610475575f80fd5b5061049a604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101c091906123c8565b3480156104b2575f80fd5b506008546104ca90600160a01b900463ffffffff1681565b60405163ffffffff90911681526020016101c0565b3480156104ea575f80fd5b50600454600554610444916001600160401b0380821692600160401b909204169083565b348015610519575f80fd5b5061034f6105283660046123fa565b610b45565b348015610538575f80fd5b5061016a610547366004611f1d565b610c9f565b348015610557575f80fd5b50600954610296565b610568610ce1565b6001600160a01b03811661058f5760405163e6c4247b60e01b815260040160405180910390fd5b6008546001600160a01b03908116908216036105be5760405163a863aec960e01b815260040160405180910390fd5b600880546001600160a01b0319166001600160a01b0383169081179091556040519081527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b60098181548110610622575f80fd5b5f918252602090912060029091020180546001909101546001600160401b038083169350600160401b8304811692600160801b9004169084565b6008546001600160a01b03161515801561068157506008546001600160a01b03163314155b1561069f576040516301474c8f60e71b815260040160405180910390fd5b60065482516001600160401b0391821691161115806106d8575060065460208301516001600160401b03600160401b9092048216911611155b156106f65760405163051c46ef60e01b815260040160405180910390fd5b6107038260400151610d3c565b61070d8282610dac565b81516006805460208501516001600160401b03908116600160401b026001600160801b0319909216931692909217919091179055604082015160075561075a6107534390565b4284610ea0565b81602001516001600160401b0316825f01516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae684604001516040516107aa91815260200190565b60405180910390a35050565b6107be611089565b6107c78261112d565b6107d1828261116e565b5050565b5f6107de61122f565b505f8051602061293c83398151915290565b6107f8610ce1565b6008546001600160a01b03161561084357600880546001600160a01b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c02450905f90a1565b60405163a863aec960e01b815260040160405180910390fd5b565b610866610ce1565b61085c5f611278565b600980545f9182919061088360018361242e565b8154811061089357610893612441565b5f918252602090912060029091020154600160801b90046001600160401b031684106108d257604051631856a49960e21b815260040160405180910390fd5b600854600160c01b90046001600160401b03165b8181101561099357846009828154811061090257610902612441565b5f918252602090912060029091020154600160801b90046001600160401b0316111561098b576009818154811061093b5761093b612441565b905f5260205f209060020201600101546009828154811061095e5761095e612441565b905f5260205f2090600202015f0160109054906101000a90046001600160401b0316935093505050915091565b6001016108e6565b5050915091565b6109a2610ce1565b610e108163ffffffff1610806109c157506301e133808163ffffffff16115b806109df575060085463ffffffff600160a01b909104811690821611155b156109fd576040516307a5077760e51b815260040160405180910390fd5b6008805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610a675750825b90505f826001600160401b03166001148015610a825750303b155b905081158015610a90575080155b15610aae5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ad857845460ff60401b1916600160401b1785555b610ae1866112e8565b610ae96112f9565b610af4898989611301565b8315610b3a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b6009545f9043841180610b56575080155b80610ba05750600854600980549091600160c01b90046001600160401b0316908110610b8457610b84612441565b5f9182526020909120600290910201546001600160401b031684105b15610bbe5760405163b0b4387760e01b815260040160405180910390fd5b5f8080610bcc60018561242e565b90505b81610c6857600854600160c01b90046001600160401b03168110610c68578660098281548110610c0157610c01612441565b5f9182526020909120600290910201546001600160401b031611610c56576001915060098181548110610c3657610c36612441565b5f9182526020909120600290910201546001600160401b03169250610c68565b80610c6081612455565b915050610bcf565b81610c865760405163b0b4387760e01b815260040160405180910390fd5b85610c91848961242e565b119450505050505b92915050565b610ca7610ce1565b6001600160a01b038116610cd557604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b610cde81611278565b50565b33610d137f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461085c5760405163118cdaa760e01b8152336004820152602401610ccc565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110806107d15760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401610ccc565b5f610db561142d565b9050610dbf611c7e565b83516001600160401b0390811682526020850151168160016020020152604084810151828201526001546060830152600254608083015260035460a08301525f5460c08301525163ce537a7760e01b8152735fbdb2315678afecb367f032d93f642f64180aa39063ce537a7790610e3e90859085908890600401612670565b602060405180830381865af4158015610e59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e7d919061289e565b610e9a576040516309bde33960e01b815260040160405180910390fd5b50505050565b60095415801590610f15575060085460098054600160a01b830463ffffffff1692600160c01b90046001600160401b0316908110610ee057610ee0612441565b5f918252602090912060029091020154610f0a90600160401b90046001600160401b0316846128bd565b6001600160401b0316115b15610fa857600854600980549091600160c01b90046001600160401b0316908110610f4257610f42612441565b5f9182526020822060029091020180546001600160c01b03191681556001015560088054600160c01b90046001600160401b0316906018610f82836128e4565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516080810182526001600160401b03948516815292841660208085019182528301518516848301908152929091015160608401908152600980546001810182555f91909152935160029094027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af81018054935194518716600160801b0267ffffffffffffffff60801b19958816600160401b026001600160801b03199095169690971695909517929092179290921693909317909155517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b090910155565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061110f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166111035f8051602061293c833981519152546001600160a01b031690565b6001600160a01b031614155b1561085c5760405163703e46dd60e11b815260040160405180910390fd5b611135610ce1565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d90602001610608565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156111c8575060408051601f3d908101601f191682019092526111c591810190612909565b60015b6111f057604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610ccc565b5f8051602061293c833981519152811461122057604051632a87526960e21b815260048101829052602401610ccc565b61122a8383611a5c565b505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461085c5760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b6112f0611ab1565b610cde81611afa565b61085c611ab1565b82516001600160401b0316151580611325575060208301516001600160401b031615155b8061133257506020820151155b8061133f57506040820151155b8061134c57506060820151155b8061135657508151155b806113685750610e108163ffffffff16105b8061137c57506301e133808163ffffffff16115b1561139a576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b03908116600160401b026001600160801b0319938416919095169081178517909355604096870151600581905586515f5590860151600155958501516002556060909401516003556006805490941617179091556007919091556008805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b611435611c9c565b621000008152600760208201527f23783d0e9777b7af65fbf849da7edb75e74b1eaf503e025d7f2f7f80991befa26040820151527f2a4e2fe8adfa53f468525582d5184c4c70bbdb946c21f216418a9879705e54a76020604083015101527f0624b2c1e77f24afceaf39451743b9fa80d5853fca7ba00389c675650774009b6060820151527f250d7719e94ca2df00dfe327938f5a8d4d837779b99837ca777a53d39127b1796020606083015101527f0dc09515152eaea66d0db2f571cc995e369d26fe647394f10db5398c917519dc6080820151527f1273144d6cec2c4a68b24a149379c0f5592bb7fbddbe32fa171919950ca404cb6020608083015101527f119521bb68caec216e2f05eeb466fb3abfe1f39baf7fe7cb392ea057b6a2d9bf60a0820151527f2d52adeaba8045e53ab526fe9982d0ea452def6b3ea0253d27a19ef3b46e8428602060a083015101527f16c3b5b217d302975a920d13374524d7a52e4a50fd7fb930842271ebf4a84efd60c0820151527f200788916b907b196972bde304318e885a2521514b2db5e4a11899c51204f089602060c083015101527f1127581afe753defca9aef12e7332db9978a200b1699ce3888c0f3aea6111dc360e0820151527f0881e13f00723be1a04872ed02b2d078c31e80feaf27724e262ce97c2cb0bb1d602060e083015101527f1482a3a6bb91d6483d153683e2404f2f5546e0e895530fdf132091498406e3de610100820151527efa52db3d52d905ead1248102f3a80a43a90d8400c68f60a62c543c417b2f4b602061010083015101527f0a57dadd4a55199525ac6ac6fabc87a4cccfdc98142bcef9dbf47de00ecc5164610120820151527f18d95abd9b8e12c36936aa218cfff582548a6bbff25c338c2006eaeb1fe5b696602061012083015101527f2bc40e91dd169b8bc143a02952a1b6c6e627bfeb7a2bbe5078e14123f3c54c1c610140820151527f108d65a20c579b6d9883275eb6889fc3f5fc79735ca9f611a13b67daa2fbc8d0602061014083015101527f21bc1f86d0608e5f0626b467ee6f8282b619223f60a7acb0fc63ba7bdaf783be610160820151527f05ef3282f8eef01515fb9a8a7d6ca06b8b007d1d512403efb268fb03ce5f09e9602061016083015101527f2cab66c1cb5a83869e73ac34fbe467486999babd541d9010ee9a804806eee4ef610180820151527f2db1982419c5a4a17593acff9535fa967683d75c8aec01319b64b84aada2ad84602061018083015101527f2c38667c6c7eb868bdd30c34dd3f4b84d9b9b1a27d7867b364c8b7831423e9086101a0820151527f2b2cb4044dd51165c48138219d51cf8d1689f91ed3eeefead6e055eb488a2ce260206101a083015101527f2d48e54703011df2c74a14dafde3af4fd83ec71875d8ddc3554658640cc955016101c0820151527f243a99d80d32eb5408b59d5b08302bede070d3fb0a8efe2f2262f865bffb4d0d60206101c083015101527f0455d2325bf6269a66f07d838f55f36947a3cd9b87edd8480bced95cbb45cc116101e0820151527f0f66d9085a6ed60b838179987e240992bff4c0516ccf6ccde4a1ca94ce8b986460206101e083015101527f2bac0d23c8585d1487ec611b5effc97e5852fea43a7cba36ccdd2c207931f394610200820151527f1860b54e01a06aea5adb4b13bf5baebab92b736807a3a89ff2040992b06ee6ec602061020083015101527f0c0bfa1c2fc6f8ed01233d5168db1e1dfe725504f032f669f50a92ae77c72906610220820151527f0d741e124c7d1069b8a400cbcdcfd90128a533901ad4de1e037fe72984dc34cf602061022083015101527f01cfed30085c9efce04668205794aa39b1a8ee591234b4c77a22f8c26d899e05610240820151527f2ab68ac82d36cedb647d14a5b0035e8c9a0be84780b7bae1133a27a880966ed1602061024083015101527f072e1d50f8b5cf8d574b3847276477d95bbd5116351000841f728da44f4043b5610260820151527f23f8ea6eacd0876d57220f57eabacbe76a2323411663731a251d5dca36f1b59f602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b611a6582611b02565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611aa95761122a8282611b65565b6107d1611bd7565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661085c57604051631afcd79f60e31b815260040160405180910390fd5b610ca7611ab1565b806001600160a01b03163b5f03611b3757604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610ccc565b5f8051602061293c83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b031684604051611b819190612920565b5f60405180830381855af49150503d805f8114611bb9576040519150601f19603f3d011682016040523d82523d5f602084013e611bbe565b606091505b5091509150611bce858383611bf6565b95945050505050565b341561085c5760405163b398979f60e01b815260040160405180910390fd5b606082611c0b57611c0682611c55565b611c4e565b8151158015611c2257506001600160a01b0384163b155b15611c4b57604051639996b31560e01b81526001600160a01b0385166004820152602401610ccc565b50805b9392505050565b805115611c655780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6040518060e001604052806007906020820280368337509192915050565b604051806102c001604052805f81526020015f8152602001611ccf60405180604001604052805f81526020015f81525090565b8152602001611cef60405180604001604052805f81526020015f81525090565b8152602001611d0f60405180604001604052805f81526020015f81525090565b8152602001611d2f60405180604001604052805f81526020015f81525090565b8152602001611d4f60405180604001604052805f81526020015f81525090565b8152602001611d6f60405180604001604052805f81526020015f81525090565b8152602001611d8f60405180604001604052805f81526020015f81525090565b8152602001611daf60405180604001604052805f81526020015f81525090565b8152602001611dcf60405180604001604052805f81526020015f81525090565b8152602001611def60405180604001604052805f81526020015f81525090565b8152602001611e0f60405180604001604052805f81526020015f81525090565b8152602001611e2f60405180604001604052805f81526020015f81525090565b8152602001611e4f60405180604001604052805f81526020015f81525090565b8152602001611e6f60405180604001604052805f81526020015f81525090565b8152602001611e8f60405180604001604052805f81526020015f81525090565b8152602001611eaf60405180604001604052805f81526020015f81525090565b8152602001611ecf60405180604001604052805f81526020015f81525090565b8152602001611eef60405180604001604052805f81526020015f81525090565b81525f6020820181905260409091015290565b80356001600160a01b0381168114611f18575f80fd5b919050565b5f60208284031215611f2d575f80fd5b611c4e82611f02565b5f60208284031215611f46575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b6040516102e081016001600160401b0381118282101715611f8457611f84611f4d565b60405290565b604051601f8201601f191681016001600160401b0381118282101715611fb257611fb2611f4d565b604052919050565b80356001600160401b0381168114611f18575f80fd5b5f60608284031215611fe0575f80fd5b604051606081018181106001600160401b038211171561200257612002611f4d565b60405290508061201183611fba565b815261201f60208401611fba565b6020820152604083013560408201525092915050565b5f60408284031215612045575f80fd5b604051604081018181106001600160401b038211171561206757612067611f4d565b604052823581526020928301359281019290925250919050565b5f808284036104e0811215612094575f80fd5b61209e8585611fd0565b925061048080605f19830112156120b3575f80fd5b6120bb611f61565b91506120ca8660608701612035565b82526120d98660a08701612035565b60208301526120eb8660e08701612035565b60408301526101206120ff87828801612035565b606084015261016061211388828901612035565b60808501526101a061212789828a01612035565b60a08601526101e061213b8a828b01612035565b60c087015261022061214f8b828c01612035565b60e08801526102606121638c828d01612035565b6101008901526102a06121788d828e01612035565b878a015261218a8d6102e08e01612035565b6101408a015261219e8d6103208e01612035565b868a01526121b08d6103608e01612035565b6101808a01526103a08c0135948901949094526103c08b01356101c08901526103e08b0135928801929092526104008a01356102008801526104208a013590870152610440890135610240870152610460890135908601529287013561028085015250506104a0850135908201526104c0909301356102c08401525092909150565b5f8060408385031215612243575f80fd5b61224c83611f02565b91506020808401356001600160401b0380821115612268575f80fd5b818601915086601f83011261227b575f80fd5b81358181111561228d5761228d611f4d565b61229f601f8201601f19168501611f8a565b915080825287848285010111156122b4575f80fd5b80848401858401375f848284010152508093505050509250929050565b803563ffffffff81168114611f18575f80fd5b5f602082840312156122f4575f80fd5b611c4e826122d1565b5f805f80848603610120811215612312575f80fd5b61231c8787611fd0565b94506080605f198201121561232f575f80fd5b50604051608081018181106001600160401b038211171561235257612352611f4d565b8060405250606086013581526080860135602082015260a0860135604082015260c086013560608201528093505061238c60e086016122d1565b915061239b6101008601611f02565b905092959194509250565b5f5b838110156123c05781810151838201526020016123a8565b50505f910152565b602081525f82518060208401526123e68160408501602087016123a6565b601f01601f19169190910160400192915050565b5f806040838503121561240b575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610c9957610c9961241a565b634e487b7160e01b5f52603260045260245ffd5b5f816124635761246361241a565b505f190190565b805f5b6007811015610e9a57815184526020938401939091019060010161246d565b6124a182825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e08401525060808101516101006125048185018380518252602090810151910152565b60a083015191506101406125248186018480518252602090810151910152565b60c084015192506101806125448187018580518252602090810151910152565b60e085015193506101c06125648188018680518252602090810151910152565b928501519350610200926125848785018680518252602090810151910152565b61012086015194506102406125a58189018780518252602090810151910152565b928601519450610280926125c58885018780518252602090810151910152565b61016087015195506102c06125e6818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b5f610a6082019050845182526020850151602083015260408501516126a2604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a08501516101006126ef8185018380518252602090810151910152565b60c0870151915061014061270f8186018480518252602090810151910152565b60e0880151925061018061272f8187018580518252602090810151910152565b9188015192506101c09161274f8684018580518252602090810151910152565b61012089015193506102006127708188018680518252602090810151910152565b918901519350610240916127908784018680518252602090810151910152565b6101608a015194506102806127b18189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e083015261288861050083018561246a565b6128966105e083018461248c565b949350505050565b5f602082840312156128ae575f80fd5b81518015158114611c4e575f80fd5b6001600160401b038281168282160390808211156128dd576128dd61241a565b5092915050565b5f6001600160401b038083168181036128ff576128ff61241a565b6001019392505050565b5f60208284031215612919575f80fd5b5051919050565b5f82516129318184602087016123a6565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a + ///0x60a06040523060805234801562000014575f80fd5b506200001f62000025565b620000d9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000765760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051612e55620001005f395f8181611087015281816110b0015261122d0152612e555ff3fe6080604052600436106101ba575f3560e01c8063811f853f116100f2578063a1be8d5211610092578063d24d933d11610062578063d24d933d146105e5578063e030330114610614578063f2fde38b14610633578063f9e50d1914610652575f80fd5b8063a1be8d5214610533578063ad3cb1cc14610552578063b2424e3f1461058f578063c23b9e9e146105ad575f80fd5b80638da5cb5b116100cd5780638da5cb5b1461046457806390c14390146104a057806396c1ca61146104bf5780639fdb54a7146104de575f80fd5b8063811f853f146103de578063826e41fc146103fd5780638584d23f14610428575f80fd5b8063426d31941161015d57806369cc6a041161013857806369cc6a0414610383578063715018a614610397578063757c37ad146103ab57806376671808146103ca575f80fd5b8063426d31941461033a5780634f1ef2861461035c57806352d1902d1461036f575f80fd5b80630d8e6e2c116101985780630d8e6e2c1461027e5780632f79889d146102a9578063313df7b1146102e7578063378ec23b1461031e575f80fd5b8063013fa5fc146101be57806302b592f3146101df5780630625e19b1461023c575b5f80fd5b3480156101c9575f80fd5b506101dd6101d8366004612307565b610666565b005b3480156101ea575f80fd5b506101fe6101f9366004612320565b610719565b60405161023394939291906001600160401b039485168152928416602084015292166040820152606081019190915260800190565b60405180910390f35b348015610247575f80fd5b5060055460065460075460085461025e9392919084565b604080519485526020850193909352918301526060820152608001610233565b348015610289575f80fd5b5060408051600181525f6020820181905291810191909152606001610233565b3480156102b4575f80fd5b50600d546102cf90600160c01b90046001600160401b031681565b6040516001600160401b039091168152602001610233565b3480156102f2575f80fd5b50600d54610306906001600160a01b031681565b6040516001600160a01b039091168152602001610233565b348015610329575f80fd5b50435b604051908152602001610233565b348015610345575f80fd5b5060015460025460035460045461025e9392919084565b6101dd61036a3660046123a4565b610762565b34801561037a575f80fd5b5061032c610781565b34801561038e575f80fd5b506101dd61079c565b3480156103a2575f80fd5b506101dd61080a565b3480156103b6575f80fd5b506101dd6103c536600461256d565b61081b565b3480156103d5575f80fd5b506102cf610ae6565b3480156103e9575f80fd5b506101dd6103f8366004612746565b610b10565b348015610408575f80fd5b50600d546001600160a01b031615155b6040519015158152602001610233565b348015610433575f80fd5b50610447610442366004612320565b610c34565b604080519283526001600160401b03909116602083015201610233565b34801561046f575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610306565b3480156104ab575f80fd5b506102cf6104ba3660046127ac565b610d5f565b3480156104ca575f80fd5b506101dd6104d93660046127dd565b610dbc565b3480156104e9575f80fd5b50600b54600c5461050d916001600160401b0380821692600160401b909204169083565b604080516001600160401b03948516815293909216602084015290820152606001610233565b34801561053e575f80fd5b5061041861054d3660046127f6565b610e45565b34801561055d575f80fd5b50610582604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516102339190612831565b34801561059a575f80fd5b505f546102cf906001600160401b031681565b3480156105b8575f80fd5b50600d546105d090600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610233565b3480156105f0575f80fd5b50600954600a5461050d916001600160401b0380821692600160401b909204169083565b34801561061f575f80fd5b5061041861062e366004612863565b610e87565b34801561063e575f80fd5b506101dd61064d366004612307565b610fdf565b34801561065d575f80fd5b50600e5461032c565b61066e611021565b6001600160a01b0381166106955760405163e6c4247b60e01b815260040160405180910390fd5b600d546001600160a01b03908116908216036106c45760405163a863aec960e01b815260040160405180910390fd5b600d80546001600160a01b0319166001600160a01b0383169081179091556040519081527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b600e8181548110610728575f80fd5b5f918252602090912060029091020180546001909101546001600160401b038083169350600160401b8304811692600160801b9004169084565b61076a61107c565b61077382611120565b61077d8282611161565b5050565b5f61078a611222565b505f80516020612e2983398151915290565b6107a4611021565b600d546001600160a01b0316156107ef57600d80546001600160a01b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c02450905f90a1565b60405163a863aec960e01b815260040160405180910390fd5b565b610812611021565b6108085f61126b565b600d546001600160a01b0316151580156108405750600d546001600160a01b03163314155b1561085e576040516301474c8f60e71b815260040160405180910390fd5b600b5483516001600160401b0391821691161115806108975750600b5460208401516001600160401b03600160401b9092048216911611155b156108b55760405163051c46ef60e01b815260040160405180910390fd5b6108c283604001516112db565b5f6108cb610ae6565b60208501515f8054929350916108ea91906001600160401b0316610d5f565b90506108f7826001612897565b6001600160401b0316816001600160401b03161480156109305750600b5461092e90600160401b90046001600160401b0316610e45565b155b801561094457505f826001600160401b0316115b1561096257604051637150de4560e01b815260040160405180910390fd5b61096d826002612897565b6001600160401b0316816001600160401b03161061099e57604051637150de4560e01b815260040160405180910390fd5b6109ab84602001516112db565b6109b884604001516112db565b6109c584606001516112db565b6109d085858561134b565b8451600b805460208801516001600160401b03818116600160401b026001600160801b03199093169416939093171790556040860151600c55610a1290610e45565b15610a7c5783516005556020840151600655604084015160075560608401516008557f31eabd9099fdb25dacddd206abff87311e553441fc9d0fcdef201062d7e7071b610a60826001612897565b6040516001600160401b03909116815260200160405180910390a15b610a874342876114a3565b84602001516001600160401b0316855f01516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae68760400151604051610ad791815260200190565b60405180910390a35050505050565b600b545f80549091610b0b916001600160401b03600160401b90920482169116610d5f565b905090565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610b545750825b90505f826001600160401b03166001148015610b6f5750303b155b905081158015610b7d575080155b15610b9b5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610bc557845460ff60401b1916600160401b1785555b610bce8761168c565b610bd661169d565b610be28a8a8a896116a5565b8315610c2857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b600e80545f91829190610c486001836128be565b81548110610c5857610c586128d1565b5f918252602090912060029091020154600160801b90046001600160401b03168410610c9757604051631856a49960e21b815260040160405180910390fd5b600d54600160c01b90046001600160401b03165b81811015610d585784600e8281548110610cc757610cc76128d1565b5f918252602090912060029091020154600160801b90046001600160401b03161115610d5057600e8181548110610d0057610d006128d1565b905f5260205f20906002020160010154600e8281548110610d2357610d236128d1565b905f5260205f2090600202015f0160109054906101000a90046001600160401b0316935093505050915091565b600101610cab565b5050915091565b5f816001600160401b03165f03610d7757505f610db6565b610d8182846128f9565b6001600160401b03165f03610da157610d9a828461291e565b9050610db6565b610dab828461291e565b610d9a906001612897565b92915050565b610dc4611021565b610e108163ffffffff161080610de357506301e133808163ffffffff16115b80610e015750600d5463ffffffff600160a01b909104811690821611155b15610e1f576040516307a5077760e51b815260040160405180910390fd5b600d805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b5f816001600160401b03165f03610e5d57505f919050565b5f54610e72906001600160401b0316836128f9565b6001600160401b03161592915050565b919050565b600e545f9043841180610e98575080155b80610ee25750600d54600e80549091600160c01b90046001600160401b0316908110610ec657610ec66128d1565b5f9182526020909120600290910201546001600160401b031684105b15610f005760405163b0b4387760e01b815260040160405180910390fd5b5f8080610f0e6001856128be565b90505b81610faa57600d54600160c01b90046001600160401b03168110610faa5786600e8281548110610f4357610f436128d1565b5f9182526020909120600290910201546001600160401b031611610f985760019150600e8181548110610f7857610f786128d1565b5f9182526020909120600290910201546001600160401b03169250610faa565b80610fa281612943565b915050610f11565b81610fc85760405163b0b4387760e01b815260040160405180910390fd5b85610fd384896128be565b11979650505050505050565b610fe7611021565b6001600160a01b03811661101557604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61101e8161126b565b50565b336110537f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146108085760405163118cdaa760e01b815233600482015260240161100c565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061110257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166110f65f80516020612e29833981519152546001600160a01b031690565b6001600160a01b031614155b156108085760405163703e46dd60e11b815260040160405180910390fd5b611128611021565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d9060200161070e565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156111bb575060408051601f3d908101601f191682019092526111b891810190612958565b60015b6111e357604051634c9c8ce360e01b81526001600160a01b038316600482015260240161100c565b5f80516020612e29833981519152811461121357604051632a87526960e21b81526004810182905260240161100c565b61121d838361181f565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108085760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181108061077d5760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c640000000000604482015260640161100c565b5f611354611874565b905061135e61206c565b84516001600160401b0390811682526020808701805190921690830152604080870151908301526006546060830152600754608083015260085460a083015260055460c0830152516113af90610e45565b156113e157602084015160e0820152604084015161010082015260608401516101208201528351610140820152611405565b60065460e08201526007546101008201526008546101208201526005546101408201525b60405163fc8660c760e01b8152735fbdb2315678afecb367f032d93f642f64180aa39063fc8660c79061144090859085908890600401612b7b565b602060405180830381865af415801561145b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061147f9190612da9565b61149c576040516309bde33960e01b815260040160405180910390fd5b5050505050565b600e54158015906115185750600d54600e8054600160a01b830463ffffffff1692600160c01b90046001600160401b03169081106114e3576114e36128d1565b5f91825260209091206002909102015461150d90600160401b90046001600160401b031684612dc8565b6001600160401b0316115b156115ab57600d54600e80549091600160c01b90046001600160401b0316908110611545576115456128d1565b5f9182526020822060029091020180546001600160c01b031916815560010155600d8054600160c01b90046001600160401b031690601861158583612de8565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516080810182526001600160401b03948516815292841660208085019182528301518516848301908152929091015160608401908152600e80546001810182555f91909152935160029094027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd81018054935194518716600160801b0267ffffffffffffffff60801b19958816600160401b026001600160801b03199095169690971695909517929092179290921693909317909155517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe90910155565b611694611e9f565b61101e81611ee8565b610808611e9f565b83516001600160401b03161515806116c9575060208401516001600160401b031615155b806116d657506020830151155b806116e357506040830151155b806116f057506060830151155b806116fa57508251155b8061170c5750610e108263ffffffff16105b8061172057506301e133808263ffffffff16115b8061173257506001600160401b038116155b15611750576040516350dd03f760e11b815260040160405180910390fd5b8351600980546020808801516001600160401b03908116600160401b026001600160801b03199384169582169586178117909455604098890151600a819055600b8054909416909517909317909155600c92909255845160018190559185015160028190559585015160038190556060909501516004819055600592909255600695909555600793909355600892909255600d805463ffffffff909216600160a01b0263ffffffff60a01b199092169190911790555f80549190921667ffffffffffffffff1991909116179055565b61182882611ef0565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561186c5761121d8282611f53565b61077d611fc5565b61187c61208b565b621000008152600b60208201527f26867ee58aaf860fc9e0e3a78666ffc51f3ba1ad8ae001c196830c55b5af0b8c6040820151527f091230adb753f82815151277060cc56b546bb2e950a0de19ed061ec68c071a906020604083015101527f02a509a06d8c56f83f204688ff6e42eac6e3cbdd063b0971a3af953e81badbb66060820151527f06f43ed2b9cece35d1201abc13ffdaea35560cf0f1446277138ce812b9ad9f396020606083015101527f1a588c99ad88f789c87722b061bb5535daa0abcc1dc6d176d7fea51e5d80b9266080820151527f2062b995e61a6ab8aab6cd6e7520b879d84f965ab1f094c104f0c1213b28038b6020608083015101527f21a2fd766a0cebecfdbfdfe56139a1bbd9aec15e2e35be8ef01934a0ec43868560a0820151527f20fe500ac7d1aa7820db8c6f7f9d509e3b2e88731e3a12dd65f06f43ca930da0602060a083015101527f0ab53d1285c7f4819b3ff6e1ddada6bf2515d34bbaf61186c6a04be47dfd65a360c0820151527f0b80a9878082cdfdd9fcc16bb33fa424c0ad66b81949bf642153d3c7ad082f22602060c083015101527f1b900f8e5f8e8064a5888a1bd796b54a2652fc02034fe4b6e6fc8d6650f7453b60e0820151527ecca258a8832c64d1f8e1721a78fc25b13d29adbb81e35a79fc2f49f8902786602060e083015101527f0d1d3348d642e6f2e9739d735d8c723676dbaefdcbb4e96641defa353d26ebb3610100820151527f14fe9d6a335104e7491ca6d5086113e6b0f52946960d726664667bd58539d41e602061010083015101527f1da94364440c4e3fb8af2d363cdefa4edda437579e1b056a16a5e9a11dffa2ab610120820151527f0a077bd307ed31222db55cb0128bafce5e22557b57f5ac915359c50296cb5c77602061012083015101527f28ff80b133d989235c7129dea54469b780ac4717449290067e7c9a7d5be7dbd5610140820151527f1c0fc22eef23b50a2ddc553f9fc1b61fd8c57a58ca321a829c7ec255f757b3a6602061014083015101527e3c4e21e5dfba62a5b1702fb0ef234bfe95a77701a456882350526d140243f5610160820151527f06012db82876ba33e6e8f80a51013662e56c4abc86a7d85c272e19a6d7f57d0b602061016083015101527f16d5247dbdeae1df70093e5ee77272959661e0fbabda431777fa729f5b532f44610180820151527e8d9ee00f799cf00608b082d03b9de5a42b8126c35fbfbd1e602108df10e0e3602061018083015101527f2f526c6981643ff6f6e9d2b5a921e06cf95f274629b5a145bd552b7fda6a87006101a0820151527f2fe7108fd4e24231f3dadb6e09072e106fca0694fe39dff96557a88221a89a5060206101a083015101527f26a3568598a6981e6325f4816736e381087b5b0e4b27ef364d8ae1e29fe9df996101c0820151527f1db81cdf82a9ec99f3c9716df22d38317e6bb84fc57d2f0e7b2bc8a0569f7cc460206101c083015101527e99888088e11de6ed086c99b9bba986d908df5b0c5007680d97567d485719946101e0820151527f1f91576eadffff932b6e54bab022f93f6fec3e5b7674d0006bc5f2223527a34860206101e083015101527e68b3c117ee7e84d6b670b6af20197759ec80d34f3c594328663031e9cd7e02610200820151527f1c3832e24877346680e7047bae2cfcd51fafe3e7caf199e9dfc8e8f10c2b6943602061020083015101527f164cdd9ad5d4e96e109073e8e735cd4ac64aba6ddaa244da6701369c8cba5daf610220820151527f16c41e647f1ab0d45c891544299e4ef9c004d8bc0a3bf096dc38ce8ed90c0d67602061022083015101527f134ba7a9567ba20e1f35959ee8c2cd688d3a962bb1797e8ab8e511768de0ce83610240820151527f02e4d286c9435f7bd94c1a2c78b99966d06faca1ae45de78149950a4fefcd6e7602061024083015101527f039a0b2d920f29e35cb2a9e1ec6cc22ac1d482af45e47399724a0745d542e839610260820151527f15ac2658bfdd2227aebf8e20935935a648819e1dcea807da1c838abfa7896c63602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661080857604051631afcd79f60e31b815260040160405180910390fd5b610fe7611e9f565b806001600160a01b03163b5f03611f2557604051634c9c8ce360e01b81526001600160a01b038216600482015260240161100c565b5f80516020612e2983398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b031684604051611f6f9190612e0d565b5f60405180830381855af49150503d805f8114611fa7576040519150601f19603f3d011682016040523d82523d5f602084013e611fac565b606091505b5091509150611fbc858383611fe4565b95945050505050565b34156108085760405163b398979f60e01b815260040160405180910390fd5b606082611ff957611ff482612043565b61203c565b815115801561201057506001600160a01b0384163b155b1561203957604051639996b31560e01b81526001600160a01b038516600482015260240161100c565b50805b9392505050565b8051156120535780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b604051806101600160405280600b906020820280368337509192915050565b604051806102c001604052805f81526020015f81526020016120be60405180604001604052805f81526020015f81525090565b81526020016120de60405180604001604052805f81526020015f81525090565b81526020016120fe60405180604001604052805f81526020015f81525090565b815260200161211e60405180604001604052805f81526020015f81525090565b815260200161213e60405180604001604052805f81526020015f81525090565b815260200161215e60405180604001604052805f81526020015f81525090565b815260200161217e60405180604001604052805f81526020015f81525090565b815260200161219e60405180604001604052805f81526020015f81525090565b81526020016121be60405180604001604052805f81526020015f81525090565b81526020016121de60405180604001604052805f81526020015f81525090565b81526020016121fe60405180604001604052805f81526020015f81525090565b815260200161221e60405180604001604052805f81526020015f81525090565b815260200161223e60405180604001604052805f81526020015f81525090565b815260200161225e60405180604001604052805f81526020015f81525090565b815260200161227e60405180604001604052805f81526020015f81525090565b815260200161229e60405180604001604052805f81526020015f81525090565b81526020016122be60405180604001604052805f81526020015f81525090565b81526020016122de60405180604001604052805f81526020015f81525090565b81525f6020820181905260409091015290565b80356001600160a01b0381168114610e82575f80fd5b5f60208284031215612317575f80fd5b61203c826122f1565b5f60208284031215612330575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b6040516102e081016001600160401b038111828210171561236e5761236e612337565b60405290565b604051601f8201601f191681016001600160401b038111828210171561239c5761239c612337565b604052919050565b5f80604083850312156123b5575f80fd5b6123be836122f1565b91506020808401356001600160401b03808211156123da575f80fd5b818601915086601f8301126123ed575f80fd5b8135818111156123ff576123ff612337565b612411601f8201601f19168501612374565b91508082528784828501011115612426575f80fd5b80848401858401375f848284010152508093505050509250929050565b80356001600160401b0381168114610e82575f80fd5b5f60608284031215612469575f80fd5b604051606081018181106001600160401b038211171561248b5761248b612337565b60405290508061249a83612443565b81526124a860208401612443565b6020820152604083013560408201525092915050565b5f608082840312156124ce575f80fd5b604051608081018181106001600160401b03821117156124f0576124f0612337565b8060405250809150823581526020830135602082015260408301356040820152606083013560608201525092915050565b5f60408284031215612531575f80fd5b604051604081018181106001600160401b038211171561255357612553612337565b604052823581526020928301359281019290925250919050565b5f805f838503610560811215612581575f80fd5b61258b8686612459565b935061259a86606087016124be565b92506104808060df19830112156125af575f80fd5b6125b761234b565b91506125c68760e08801612521565b82526101206125d788828901612521565b60208401526101606125eb89828a01612521565b60408501526101a06125ff8a828b01612521565b60608601526101e06126138b828c01612521565b60808701526102206126278c828d01612521565b60a088015261026061263b8d828e01612521565b60c08901526102a061264f8e828f01612521565b60e08a01526126628e6102e08f01612521565b6101008a01526126768e6103208f01612521565b878a01526126888e6103608f01612521565b6101408a015261269c8e6103a08f01612521565b868a01526126ae8e6103e08f01612521565b6101808a01526104208d0135858a01526104408d01356101c08a01526104608d0135848a0152878d01356102008a01526104a08d0135838a01526104c08d01356102408a01526104e08d0135828a01526105008d01356102808a01526105208d0135818a015250505050505050506105408501356102c0820152809150509250925092565b803563ffffffff81168114610e82575f80fd5b5f805f805f610140868803121561275b575f80fd5b6127658787612459565b945061277487606088016124be565b935061278260e08701612733565b925061279161010087016122f1565b91506127a06101208701612443565b90509295509295909350565b5f80604083850312156127bd575f80fd5b6127c683612443565b91506127d460208401612443565b90509250929050565b5f602082840312156127ed575f80fd5b61203c82612733565b5f60208284031215612806575f80fd5b61203c82612443565b5f5b83811015612829578181015183820152602001612811565b50505f910152565b602081525f825180602084015261284f81604085016020870161280f565b601f01601f19169190910160400192915050565b5f8060408385031215612874575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038181168382160190808211156128b7576128b7612883565b5092915050565b81810381811115610db657610db6612883565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f6001600160401b0380841680612912576129126128e5565b92169190910692915050565b5f6001600160401b0380841680612937576129376128e5565b92169190910492915050565b5f8161295157612951612883565b505f190190565b5f60208284031215612968575f80fd5b5051919050565b805f5b600b811015612991578151845260209384019390910190600101612972565b50505050565b6129ac82825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e0840152506080810151610100612a0f8185018380518252602090810151910152565b60a08301519150610140612a2f8186018480518252602090810151910152565b60c08401519250610180612a4f8187018580518252602090810151910152565b60e085015193506101c0612a6f8188018680518252602090810151910152565b92850151935061020092612a8f8785018680518252602090810151910152565b6101208601519450610240612ab08189018780518252602090810151910152565b92860151945061028092612ad08885018780518252602090810151910152565b61016087015195506102c0612af1818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b5f610ae08201905084518252602085015160208301526040850151612bad604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a0850151610100612bfa8185018380518252602090810151910152565b60c08701519150610140612c1a8186018480518252602090810151910152565b60e08801519250610180612c3a8187018580518252602090810151910152565b9188015192506101c091612c5a8684018580518252602090810151910152565b6101208901519350610200612c7b8188018680518252602090810151910152565b91890151935061024091612c9b8784018680518252602090810151910152565b6101608a01519450610280612cbc8189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e0830152612d9361050083018561296f565b612da1610660830184612997565b949350505050565b5f60208284031215612db9575f80fd5b8151801515811461203c575f80fd5b6001600160401b038281168282160390808211156128b7576128b7612883565b5f6001600160401b03808316818103612e0357612e03612883565b6001019392505050565b5f8251612e1e81846020870161280f565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a /// ``` #[rustfmt::skip] #[allow(clippy::all)] pub static BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( - b"`\xA0`@R0`\x80R4\x80\x15b\0\0\x14W_\x80\xFD[Pb\0\0\x1Fb\0\0%V[b\0\0\xD9V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15b\0\0vW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80T`\x01`\x01`@\x1B\x03\x90\x81\x16\x14b\0\0\xD6W\x80T`\x01`\x01`@\x1B\x03\x19\x16`\x01`\x01`@\x1B\x03\x90\x81\x17\x82U`@Q\x90\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PV[`\x80Qa)hb\0\x01\0_9_\x81\x81a\x10\x94\x01R\x81\x81a\x10\xBD\x01Ra\x12:\x01Ra)h_\xF3\xFE`\x80`@R`\x046\x10a\x01GW_5`\xE0\x1C\x80c\x82nA\xFC\x11a\0\xB3W\x80c\xAD<\xB1\xCC\x11a\0mW\x80c\xAD<\xB1\xCC\x14a\x04jW\x80c\xC2;\x9E\x9E\x14a\x04\xA7W\x80c\xD2M\x93=\x14a\x04\xDFW\x80c\xE003\x01\x14a\x05\x0EW\x80c\xF2\xFD\xE3\x8B\x14a\x05-W\x80c\xF9\xE5\r\x19\x14a\x05LW_\x80\xFD[\x80c\x82nA\xFC\x14a\x034W\x80c\x85\x84\xD2?\x14a\x03_W\x80c\x8D\xA5\xCB[\x14a\x03\x9BW\x80c\x96\xC1\xCAa\x14a\x03\xD7W\x80c\x9B\xAA<\xC9\x14a\x03\xF6W\x80c\x9F\xDBT\xA7\x14a\x04\x15W_\x80\xFD[\x80c7\x8E\xC2;\x11a\x01\x04W\x80c7\x8E\xC2;\x14a\x02\x88W\x80cBm1\x94\x14a\x02\xA4W\x80cO\x1E\xF2\x86\x14a\x02\xE5W\x80cR\xD1\x90-\x14a\x02\xF8W\x80ci\xCCj\x04\x14a\x03\x0CW\x80cqP\x18\xA6\x14a\x03 W_\x80\xFD[\x80c\x01?\xA5\xFC\x14a\x01KW\x80c\x02\xB5\x92\xF3\x14a\x01lW\x80c\r\x8En,\x14a\x01\xC9W\x80c c\xD4\xF7\x14a\x01\xF4W\x80c/y\x88\x9D\x14a\x02\x13W\x80c1=\xF7\xB1\x14a\x02QW[_\x80\xFD[4\x80\x15a\x01VW_\x80\xFD[Pa\x01ja\x01e6`\x04a\x1F\x1DV[a\x05`V[\0[4\x80\x15a\x01wW_\x80\xFD[Pa\x01\x8Ba\x01\x866`\x04a\x1F6V[a\x06\x13V[`@Qa\x01\xC0\x94\x93\x92\x91\x90`\x01`\x01`@\x1B\x03\x94\x85\x16\x81R\x92\x84\x16` \x84\x01R\x92\x16`@\x82\x01R``\x81\x01\x91\x90\x91R`\x80\x01\x90V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xD4W_\x80\xFD[P`@\x80Q`\x01\x81R_` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01a\x01\xC0V[4\x80\x15a\x01\xFFW_\x80\xFD[Pa\x01ja\x02\x0E6`\x04a \x81V[a\x06\\V[4\x80\x15a\x02\x1EW_\x80\xFD[P`\x08Ta\x029\x90`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x81V[`@Q`\x01`\x01`@\x1B\x03\x90\x91\x16\x81R` \x01a\x01\xC0V[4\x80\x15a\x02\\W_\x80\xFD[P`\x08Ta\x02p\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x01\xC0V[4\x80\x15a\x02\x93W_\x80\xFD[PC[`@Q\x90\x81R` \x01a\x01\xC0V[4\x80\x15a\x02\xAFW_\x80\xFD[P_T`\x01T`\x02T`\x03Ta\x02\xC5\x93\x92\x91\x90\x84V[`@\x80Q\x94\x85R` \x85\x01\x93\x90\x93R\x91\x83\x01R``\x82\x01R`\x80\x01a\x01\xC0V[a\x01ja\x02\xF36`\x04a\"2V[a\x07\xB6V[4\x80\x15a\x03\x03W_\x80\xFD[Pa\x02\x96a\x07\xD5V[4\x80\x15a\x03\x17W_\x80\xFD[Pa\x01ja\x07\xF0V[4\x80\x15a\x03+W_\x80\xFD[Pa\x01ja\x08^V[4\x80\x15a\x03?W_\x80\xFD[P`\x08T`\x01`\x01`\xA0\x1B\x03\x16\x15\x15[`@Q\x90\x15\x15\x81R` \x01a\x01\xC0V[4\x80\x15a\x03jW_\x80\xFD[Pa\x03~a\x03y6`\x04a\x1F6V[a\x08oV[`@\x80Q\x92\x83R`\x01`\x01`@\x1B\x03\x90\x91\x16` \x83\x01R\x01a\x01\xC0V[4\x80\x15a\x03\xA6W_\x80\xFD[P\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16a\x02pV[4\x80\x15a\x03\xE2W_\x80\xFD[Pa\x01ja\x03\xF16`\x04a\"\xE4V[a\t\x9AV[4\x80\x15a\x04\x01W_\x80\xFD[Pa\x01ja\x04\x106`\x04a\"\xFDV[a\n#V[4\x80\x15a\x04 W_\x80\xFD[P`\x06T`\x07Ta\x04D\x91`\x01`\x01`@\x1B\x03\x80\x82\x16\x92`\x01`@\x1B\x90\x92\x04\x16\x90\x83V[`@\x80Q`\x01`\x01`@\x1B\x03\x94\x85\x16\x81R\x93\x90\x92\x16` \x84\x01R\x90\x82\x01R``\x01a\x01\xC0V[4\x80\x15a\x04uW_\x80\xFD[Pa\x04\x9A`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\x01\xC0\x91\x90a#\xC8V[4\x80\x15a\x04\xB2W_\x80\xFD[P`\x08Ta\x04\xCA\x90`\x01`\xA0\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81V[`@Qc\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01a\x01\xC0V[4\x80\x15a\x04\xEAW_\x80\xFD[P`\x04T`\x05Ta\x04D\x91`\x01`\x01`@\x1B\x03\x80\x82\x16\x92`\x01`@\x1B\x90\x92\x04\x16\x90\x83V[4\x80\x15a\x05\x19W_\x80\xFD[Pa\x03Oa\x05(6`\x04a#\xFAV[a\x0BEV[4\x80\x15a\x058W_\x80\xFD[Pa\x01ja\x05G6`\x04a\x1F\x1DV[a\x0C\x9FV[4\x80\x15a\x05WW_\x80\xFD[P`\tTa\x02\x96V[a\x05ha\x0C\xE1V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x05\x8FW`@Qc\xE6\xC4${`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x08T`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x90\x82\x16\x03a\x05\xBEW`@Qc\xA8c\xAE\xC9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x08\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x81\x17\x90\x91U`@Q\x90\x81R\x7F\x80\x17\xBB\x88\x7F\xDF\x8F\xCAC\x14\xA9\xD4\x0Fns\xB3\xB8\x10\x02\xD6~\\\xFA\x85\xD8\x81s\xAFj\xA4`r\x90` \x01[`@Q\x80\x91\x03\x90\xA1PV[`\t\x81\x81T\x81\x10a\x06\"W_\x80\xFD[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01\x80T`\x01\x90\x91\x01T`\x01`\x01`@\x1B\x03\x80\x83\x16\x93P`\x01`@\x1B\x83\x04\x81\x16\x92`\x01`\x80\x1B\x90\x04\x16\x90\x84V[`\x08T`\x01`\x01`\xA0\x1B\x03\x16\x15\x15\x80\x15a\x06\x81WP`\x08T`\x01`\x01`\xA0\x1B\x03\x163\x14\x15[\x15a\x06\x9FW`@Qc\x01GL\x8F`\xE7\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x06T\x82Q`\x01`\x01`@\x1B\x03\x91\x82\x16\x91\x16\x11\x15\x80a\x06\xD8WP`\x06T` \x83\x01Q`\x01`\x01`@\x1B\x03`\x01`@\x1B\x90\x92\x04\x82\x16\x91\x16\x11\x15[\x15a\x06\xF6W`@Qc\x05\x1CF\xEF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x07\x03\x82`@\x01Qa\r#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16_\x81\x15\x80\x15a\ngWP\x82[\x90P_\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\n\x82WP0;\x15[\x90P\x81\x15\x80\x15a\n\x90WP\x80\x15[\x15a\n\xAEW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\n\xD8W\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\n\xE1\x86a\x12\xE8V[a\n\xE9a\x12\xF9V[a\n\xF4\x89\x89\x89a\x13\x01V[\x83\x15a\x0B:W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPPPV[`\tT_\x90C\x84\x11\x80a\x0BVWP\x80\x15[\x80a\x0B\xA0WP`\x08T`\t\x80T\x90\x91`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x0B\x84Wa\x0B\x84a$AV[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x84\x10[\x15a\x0B\xBEW`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_\x80\x80a\x0B\xCC`\x01\x85a$.V[\x90P[\x81a\x0ChW`\x08T`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x81\x10a\x0ChW\x86`\t\x82\x81T\x81\x10a\x0C\x01Wa\x0C\x01a$AV[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x11a\x0CVW`\x01\x91P`\t\x81\x81T\x81\x10a\x0C6Wa\x0C6a$AV[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x92Pa\x0ChV[\x80a\x0C`\x81a$UV[\x91PPa\x0B\xCFV[\x81a\x0C\x86W`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x85a\x0C\x91\x84\x89a$.V[\x11\x94PPPPP[\x92\x91PPV[a\x0C\xA7a\x0C\xE1V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x0C\xD5W`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R_`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[a\x0C\xDE\x81a\x12xV[PV[3a\r\x13\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\x08\\W`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R3`\x04\x82\x01R`$\x01a\x0C\xCCV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x81\x10\x80a\x07\xD1W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01a\x0C\xCCV[_a\r\xB5a\x14-V[\x90Pa\r\xBFa\x1C~V[\x83Q`\x01`\x01`@\x1B\x03\x90\x81\x16\x82R` \x85\x01Q\x16\x81`\x01` \x02\x01R`@\x84\x81\x01Q\x82\x82\x01R`\x01T``\x83\x01R`\x02T`\x80\x83\x01R`\x03T`\xA0\x83\x01R_T`\xC0\x83\x01RQc\xCESzw`\xE0\x1B\x81Rs_\xBD\xB21Vx\xAF\xEC\xB3g\xF02\xD9?d/d\x18\n\xA3\x90c\xCESzw\x90a\x0E>\x90\x85\x90\x85\x90\x88\x90`\x04\x01a&pV[` `@Q\x80\x83\x03\x81\x86Z\xF4\x15\x80\x15a\x0EYW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0E}\x91\x90a(\x9EV[a\x0E\x9AW`@Qc\t\xBD\xE39`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPV[`\tT\x15\x80\x15\x90a\x0F\x15WP`\x08T`\t\x80T`\x01`\xA0\x1B\x83\x04c\xFF\xFF\xFF\xFF\x16\x92`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x0E\xE0Wa\x0E\xE0a$AV[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01Ta\x0F\n\x90`\x01`@\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x84a(\xBDV[`\x01`\x01`@\x1B\x03\x16\x11[\x15a\x0F\xA8W`\x08T`\t\x80T\x90\x91`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x0FBWa\x0FBa$AV[_\x91\x82R` \x82 `\x02\x90\x91\x02\x01\x80T`\x01`\x01`\xC0\x1B\x03\x19\x16\x81U`\x01\x01U`\x08\x80T`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90`\x18a\x0F\x82\x83a(\xE4V[\x91\x90a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UPP[`@\x80Q`\x80\x81\x01\x82R`\x01`\x01`@\x1B\x03\x94\x85\x16\x81R\x92\x84\x16` \x80\x85\x01\x91\x82R\x83\x01Q\x85\x16\x84\x83\x01\x90\x81R\x92\x90\x91\x01Q``\x84\x01\x90\x81R`\t\x80T`\x01\x81\x01\x82U_\x91\x90\x91R\x93Q`\x02\x90\x94\x02\x7Fn\x15@\x17\x1Bl\x0C\x96\x0Bq\xA7\x02\r\x9F`\x07\x7Fj\xF91\xA8\xBB\xF5\x90\xDA\x02#\xDA\xCFu\xC7\xAF\x81\x01\x80T\x93Q\x94Q\x87\x16`\x01`\x80\x1B\x02g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`\x80\x1B\x19\x95\x88\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x95\x16\x96\x90\x97\x16\x95\x90\x95\x17\x92\x90\x92\x17\x92\x90\x92\x16\x93\x90\x93\x17\x90\x91UQ\x7Fn\x15@\x17\x1Bl\x0C\x96\x0Bq\xA7\x02\r\x9F`\x07\x7Fj\xF91\xA8\xBB\xF5\x90\xDA\x02#\xDA\xCFu\xC7\xB0\x90\x91\x01UV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a\x11\x0FWP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a\x11\x03_\x80Q` a)<\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x08\\W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x115a\x0C\xE1V[`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x81R\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x90` \x01a\x06\x08V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x11\xC8WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x11\xC5\x91\x81\x01\x90a)\tV[`\x01[a\x11\xF0W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x0C\xCCV[_\x80Q` a)<\x839\x81Q\x91R\x81\x14a\x12 W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0C\xCCV[a\x12*\x83\x83a\x1A\\V[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\x08\\W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T`\x01`\x01`\xA0\x1B\x03\x19\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90_\x90\xA3PPPV[a\x12\xF0a\x1A\xB1V[a\x0C\xDE\x81a\x1A\xFAV[a\x08\\a\x1A\xB1V[\x82Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80a\x13%WP` \x83\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80a\x132WP` \x82\x01Q\x15[\x80a\x13?WP`@\x82\x01Q\x15[\x80a\x13LWP``\x82\x01Q\x15[\x80a\x13VWP\x81Q\x15[\x80a\x13hWPa\x0E\x10\x81c\xFF\xFF\xFF\xFF\x16\x10[\x80a\x13|WPc\x01\xE13\x80\x81c\xFF\xFF\xFF\xFF\x16\x11[\x15a\x13\x9AW`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x82Q`\x04\x80T` \x80\x87\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x93\x84\x16\x91\x90\x95\x16\x90\x81\x17\x85\x17\x90\x93U`@\x96\x87\x01Q`\x05\x81\x90U\x86Q_U\x90\x86\x01Q`\x01U\x95\x85\x01Q`\x02U``\x90\x94\x01Q`\x03U`\x06\x80T\x90\x94\x16\x17\x17\x90\x91U`\x07\x91\x90\x91U`\x08\x80Tc\xFF\xFF\xFF\xFF\x90\x92\x16`\x01`\xA0\x1B\x02c\xFF\xFF\xFF\xFF`\xA0\x1B\x19\x90\x92\x16\x91\x90\x91\x17\x90UV[a\x145a\x1C\x9CV[b\x10\0\0\x81R`\x07` \x82\x01R\x7F#x=\x0E\x97w\xB7\xAFe\xFB\xF8I\xDA~\xDBu\xE7K\x1E\xAFP>\x02]\x7F/\x7F\x80\x99\x1B\xEF\xA2`@\x82\x01QR\x7F*N/\xE8\xAD\xFAS\xF4hRU\x82\xD5\x18LLp\xBB\xDB\x94l!\xF2\x16A\x8A\x98yp^T\xA7` `@\x83\x01Q\x01R\x7F\x06$\xB2\xC1\xE7\x7F$\xAF\xCE\xAF9E\x17C\xB9\xFA\x80\xD5\x85?\xCA{\xA0\x03\x89\xC6ue\x07t\0\x9B``\x82\x01QR\x7F%\rw\x19\xE9L\xA2\xDF\0\xDF\xE3'\x93\x8FZ\x8DM\x83wy\xB9\x987\xCAwzS\xD3\x91'\xB1y` ``\x83\x01Q\x01R\x7F\r\xC0\x95\x15\x15.\xAE\xA6m\r\xB2\xF5q\xCC\x99^6\x9D&\xFEds\x94\xF1\r\xB59\x8C\x91u\x19\xDC`\x80\x82\x01QR\x7F\x12s\x14Ml\xEC,Jh\xB2J\x14\x93y\xC0\xF5Y+\xB7\xFB\xDD\xBE2\xFA\x17\x19\x19\x95\x0C\xA4\x04\xCB` `\x80\x83\x01Q\x01R\x7F\x11\x95!\xBBh\xCA\xEC!n/\x05\xEE\xB4f\xFB:\xBF\xE1\xF3\x9B\xAF\x7F\xE7\xCB9.\xA0W\xB6\xA2\xD9\xBF`\xA0\x82\x01QR\x7F-R\xAD\xEA\xBA\x80E\xE5:\xB5&\xFE\x99\x82\xD0\xEAE-\xEFk>\xA0%='\xA1\x9E\xF3\xB4n\x84(` `\xA0\x83\x01Q\x01R\x7F\x16\xC3\xB5\xB2\x17\xD3\x02\x97Z\x92\r\x137E$\xD7\xA5.JP\xFD\x7F\xB90\x84\"q\xEB\xF4\xA8N\xFD`\xC0\x82\x01QR\x7F \x07\x88\x91k\x90{\x19ir\xBD\xE3\x041\x8E\x88Z%!QK-\xB5\xE4\xA1\x18\x99\xC5\x12\x04\xF0\x89` `\xC0\x83\x01Q\x01R\x7F\x11'X\x1A\xFEu=\xEF\xCA\x9A\xEF\x12\xE73-\xB9\x97\x8A \x0B\x16\x99\xCE8\x88\xC0\xF3\xAE\xA6\x11\x1D\xC3`\xE0\x82\x01QR\x7F\x08\x81\xE1?\0r;\xE1\xA0Hr\xED\x02\xB2\xD0x\xC3\x1E\x80\xFE\xAF'rN&,\xE9|,\xB0\xBB\x1D` `\xE0\x83\x01Q\x01R\x7F\x14\x82\xA3\xA6\xBB\x91\xD6H=\x156\x83\xE2@O/UF\xE0\xE8\x95S\x0F\xDF\x13 \x91I\x84\x06\xE3\xDEa\x01\0\x82\x01QR~\xFAR\xDB=R\xD9\x05\xEA\xD1$\x81\x02\xF3\xA8\nC\xA9\r\x84\0\xC6\x8F`\xA6,T\xC7\x18u\xD8\xDD\xC3UFXd\x0C\xC9U\x01a\x01\xC0\x82\x01QR\x7F$:\x99\xD8\r2\xEBT\x08\xB5\x9D[\x080+\xED\xE0p\xD3\xFB\n\x8E\xFE/\"b\xF8e\xBF\xFBM\r` a\x01\xC0\x83\x01Q\x01R\x7F\x04U\xD22[\xF6&\x9Af\xF0}\x83\x8FU\xF3iG\xA3\xCD\x9B\x87\xED\xD8H\x0B\xCE\xD9\\\xBBE\xCC\x11a\x01\xE0\x82\x01QR\x7F\x0Ff\xD9\x08Zn\xD6\x0B\x83\x81y\x98~$\t\x92\xBF\xF4\xC0Ql\xCFl\xCD\xE4\xA1\xCA\x94\xCE\x8B\x98d` a\x01\xE0\x83\x01Q\x01R\x7F+\xAC\r#\xC8X]\x14\x87\xECa\x1B^\xFF\xC9~XR\xFE\xA4:|\xBA6\xCC\xDD, y1\xF3\x94a\x02\0\x82\x01QR\x7F\x18`\xB5N\x01\xA0j\xEAZ\xDBK\x13\xBF[\xAE\xBA\xB9+sh\x07\xA3\xA8\x9F\xF2\x04\t\x92\xB0n\xE6\xEC` a\x02\0\x83\x01Q\x01R\x7F\x0C\x0B\xFA\x1C/\xC6\xF8\xED\x01#=Qh\xDB\x1E\x1D\xFErU\x04\xF02\xF6i\xF5\n\x92\xAEw\xC7)\x06a\x02 \x82\x01QR\x7F\rt\x1E\x12L}\x10i\xB8\xA4\0\xCB\xCD\xCF\xD9\x01(\xA53\x90\x1A\xD4\xDE\x1E\x03\x7F\xE7)\x84\xDC4\xCF` a\x02 \x83\x01Q\x01R\x7F\x01\xCF\xED0\x08\\\x9E\xFC\xE0Fh W\x94\xAA9\xB1\xA8\xEEY\x124\xB4\xC7z\"\xF8\xC2m\x89\x9E\x05a\x02@\x82\x01QR\x7F*\xB6\x8A\xC8-6\xCE\xDBd}\x14\xA5\xB0\x03^\x8C\x9A\x0B\xE8G\x80\xB7\xBA\xE1\x13:'\xA8\x80\x96n\xD1` a\x02@\x83\x01Q\x01R\x7F\x07.\x1DP\xF8\xB5\xCF\x8DWK8G'dw\xD9[\xBDQ\x165\x10\0\x84\x1Fr\x8D\xA4O@C\xB5a\x02`\x82\x01QR\x7F#\xF8\xEAn\xAC\xD0\x87mW\"\x0FW\xEA\xBA\xCB\xE7j##A\x16cs\x1A%\x1D]\xCA6\xF1\xB5\x9F` a\x02`\x83\x01Q\x01R\x7F\xB0\x83\x88\x93\xEC\x1F#~\x8B\x072;\x07DY\x9FN\x97\xB5\x98\xB3\xB5\x89\xBC\xC2\xBC7\xB8\xD5\xC4\x18\x01a\x02\x80\x82\x01R\x7F\xC1\x83\x93\xC0\xFA0\xFEN\x8B\x03\x8E5z\xD8Q\xEA\xE8\xDE\x91\x07XN\xFF\xE7\xC7\xF1\xF6Q\xB2\x01\x0E&a\x02\xA0\x82\x01R\x90V[a\x1Ae\x82a\x1B\x02V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90_\x90\xA2\x80Q\x15a\x1A\xA9Wa\x12*\x82\x82a\x1BeV[a\x07\xD1a\x1B\xD7V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a\x08\\W`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0C\xA7a\x1A\xB1V[\x80`\x01`\x01`\xA0\x1B\x03\x16;_\x03a\x1B7W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x0C\xCCV[_\x80Q` a)<\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[``_\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x1B\x81\x91\x90a) V[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a\x1B\xB9W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a\x1B\xBEV[``\x91P[P\x91P\x91Pa\x1B\xCE\x85\x83\x83a\x1B\xF6V[\x95\x94PPPPPV[4\x15a\x08\\W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a\x1C\x0BWa\x1C\x06\x82a\x1CUV[a\x1CNV[\x81Q\x15\x80\x15a\x1C\"WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x1CKW`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x0C\xCCV[P\x80[\x93\x92PPPV[\x80Q\x15a\x1CeW\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Q\x80`\xE0\x01`@R\x80`\x07\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80a\x02\xC0\x01`@R\x80_\x81R` \x01_\x81R` \x01a\x1C\xCF`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1C\xEF`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1D\x0F`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1D/`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1DO`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1Do`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1D\x8F`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1D\xAF`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1D\xCF`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1D\xEF`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1E\x0F`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1E/`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1EO`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1Eo`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1E\x8F`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1E\xAF`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1E\xCF`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1E\xEF`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R_` \x82\x01\x81\x90R`@\x90\x91\x01R\x90V[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x1F\x18W_\x80\xFD[\x91\x90PV[_` \x82\x84\x03\x12\x15a\x1F-W_\x80\xFD[a\x1CN\x82a\x1F\x02V[_` \x82\x84\x03\x12\x15a\x1FFW_\x80\xFD[P5\x91\x90PV[cNH{q`\xE0\x1B_R`A`\x04R`$_\xFD[`@Qa\x02\xE0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x1F\x84Wa\x1F\x84a\x1FMV[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x1F\xB2Wa\x1F\xB2a\x1FMV[`@R\x91\x90PV[\x805`\x01`\x01`@\x1B\x03\x81\x16\x81\x14a\x1F\x18W_\x80\xFD[_``\x82\x84\x03\x12\x15a\x1F\xE0W_\x80\xFD[`@Q``\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a \x02Wa \x02a\x1FMV[`@R\x90P\x80a \x11\x83a\x1F\xBAV[\x81Ra \x1F` \x84\x01a\x1F\xBAV[` \x82\x01R`@\x83\x015`@\x82\x01RP\x92\x91PPV[_`@\x82\x84\x03\x12\x15a EW_\x80\xFD[`@Q`@\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a gWa ga\x1FMV[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[_\x80\x82\x84\x03a\x04\xE0\x81\x12\x15a \x94W_\x80\xFD[a \x9E\x85\x85a\x1F\xD0V[\x92Pa\x04\x80\x80`_\x19\x83\x01\x12\x15a \xB3W_\x80\xFD[a \xBBa\x1FaV[\x91Pa \xCA\x86``\x87\x01a 5V[\x82Ra \xD9\x86`\xA0\x87\x01a 5V[` \x83\x01Ra \xEB\x86`\xE0\x87\x01a 5V[`@\x83\x01Ra\x01 a \xFF\x87\x82\x88\x01a 5V[``\x84\x01Ra\x01`a!\x13\x88\x82\x89\x01a 5V[`\x80\x85\x01Ra\x01\xA0a!'\x89\x82\x8A\x01a 5V[`\xA0\x86\x01Ra\x01\xE0a!;\x8A\x82\x8B\x01a 5V[`\xC0\x87\x01Ra\x02 a!O\x8B\x82\x8C\x01a 5V[`\xE0\x88\x01Ra\x02`a!c\x8C\x82\x8D\x01a 5V[a\x01\0\x89\x01Ra\x02\xA0a!x\x8D\x82\x8E\x01a 5V[\x87\x8A\x01Ra!\x8A\x8Da\x02\xE0\x8E\x01a 5V[a\x01@\x8A\x01Ra!\x9E\x8Da\x03 \x8E\x01a 5V[\x86\x8A\x01Ra!\xB0\x8Da\x03`\x8E\x01a 5V[a\x01\x80\x8A\x01Ra\x03\xA0\x8C\x015\x94\x89\x01\x94\x90\x94Ra\x03\xC0\x8B\x015a\x01\xC0\x89\x01Ra\x03\xE0\x8B\x015\x92\x88\x01\x92\x90\x92Ra\x04\0\x8A\x015a\x02\0\x88\x01Ra\x04 \x8A\x015\x90\x87\x01Ra\x04@\x89\x015a\x02@\x87\x01Ra\x04`\x89\x015\x90\x86\x01R\x92\x87\x015a\x02\x80\x85\x01RPPa\x04\xA0\x85\x015\x90\x82\x01Ra\x04\xC0\x90\x93\x015a\x02\xC0\x84\x01RP\x92\x90\x91PV[_\x80`@\x83\x85\x03\x12\x15a\"CW_\x80\xFD[a\"L\x83a\x1F\x02V[\x91P` \x80\x84\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\"hW_\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12a\"{W_\x80\xFD[\x815\x81\x81\x11\x15a\"\x8DWa\"\x8Da\x1FMV[a\"\x9F`\x1F\x82\x01`\x1F\x19\x16\x85\x01a\x1F\x8AV[\x91P\x80\x82R\x87\x84\x82\x85\x01\x01\x11\x15a\"\xB4W_\x80\xFD[\x80\x84\x84\x01\x85\x84\x017_\x84\x82\x84\x01\x01RP\x80\x93PPPP\x92P\x92\x90PV[\x805c\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x1F\x18W_\x80\xFD[_` \x82\x84\x03\x12\x15a\"\xF4W_\x80\xFD[a\x1CN\x82a\"\xD1V[_\x80_\x80\x84\x86\x03a\x01 \x81\x12\x15a#\x12W_\x80\xFD[a#\x1C\x87\x87a\x1F\xD0V[\x94P`\x80`_\x19\x82\x01\x12\x15a#/W_\x80\xFD[P`@Q`\x80\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a#RWa#Ra\x1FMV[\x80`@RP``\x86\x015\x81R`\x80\x86\x015` \x82\x01R`\xA0\x86\x015`@\x82\x01R`\xC0\x86\x015``\x82\x01R\x80\x93PPa#\x8C`\xE0\x86\x01a\"\xD1V[\x91Pa#\x9Ba\x01\0\x86\x01a\x1F\x02V[\x90P\x92\x95\x91\x94P\x92PV[_[\x83\x81\x10\x15a#\xC0W\x81\x81\x01Q\x83\x82\x01R` \x01a#\xA8V[PP_\x91\x01RV[` \x81R_\x82Q\x80` \x84\x01Ra#\xE6\x81`@\x85\x01` \x87\x01a#\xA6V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15a$\x0BW_\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[cNH{q`\xE0\x1B_R`\x11`\x04R`$_\xFD[\x81\x81\x03\x81\x81\x11\x15a\x0C\x99Wa\x0C\x99a$\x1AV[cNH{q`\xE0\x1B_R`2`\x04R`$_\xFD[_\x81a$cWa$ca$\x1AV[P_\x19\x01\x90V[\x80_[`\x07\x81\x10\x15a\x0E\x9AW\x81Q\x84R` \x93\x84\x01\x93\x90\x91\x01\x90`\x01\x01a$mV[a$\xA1\x82\x82Q\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[` \x81\x81\x01Q\x80Q`@\x85\x01R\x90\x81\x01Q``\x84\x01RP`@\x81\x01Q\x80Q`\x80\x84\x01R` \x81\x01Q`\xA0\x84\x01RP``\x81\x01Q\x80Q`\xC0\x84\x01R` \x81\x01Q`\xE0\x84\x01RP`\x80\x81\x01Qa\x01\0a%\x04\x81\x85\x01\x83\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xA0\x83\x01Q\x91Pa\x01@a%$\x81\x86\x01\x84\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xC0\x84\x01Q\x92Pa\x01\x80a%D\x81\x87\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xE0\x85\x01Q\x93Pa\x01\xC0a%d\x81\x88\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x85\x01Q\x93Pa\x02\0\x92a%\x84\x87\x85\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01 \x86\x01Q\x94Pa\x02@a%\xA5\x81\x89\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x86\x01Q\x94Pa\x02\x80\x92a%\xC5\x88\x85\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01`\x87\x01Q\x95Pa\x02\xC0a%\xE6\x81\x8A\x01\x88\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x87\x01Q\x80Qa\x03\0\x8A\x01R` \x01Qa\x03 \x89\x01Ra\x01\xA0\x87\x01Qa\x03@\x89\x01R\x90\x86\x01Qa\x03`\x88\x01Ra\x01\xE0\x86\x01Qa\x03\x80\x88\x01R\x92\x85\x01Qa\x03\xA0\x87\x01Ra\x02 \x85\x01Qa\x03\xC0\x87\x01R\x91\x84\x01Qa\x03\xE0\x86\x01Ra\x02`\x84\x01Qa\x04\0\x86\x01R\x83\x01Qa\x04 \x85\x01Ra\x02\xA0\x83\x01Qa\x04@\x85\x01R\x90\x91\x01Qa\x04`\x90\x92\x01\x91\x90\x91RPV[_a\n`\x82\x01\x90P\x84Q\x82R` \x85\x01Q` \x83\x01R`@\x85\x01Qa&\xA2`@\x84\x01\x82\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[P``\x85\x01Q\x80Q`\x80\x84\x01R` \x81\x01Q`\xA0\x84\x01RP`\x80\x85\x01Q\x80Q`\xC0\x84\x01R` \x81\x01Q`\xE0\x84\x01RP`\xA0\x85\x01Qa\x01\0a&\xEF\x81\x85\x01\x83\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xC0\x87\x01Q\x91Pa\x01@a'\x0F\x81\x86\x01\x84\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xE0\x88\x01Q\x92Pa\x01\x80a'/\x81\x87\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x88\x01Q\x92Pa\x01\xC0\x91a'O\x86\x84\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01 \x89\x01Q\x93Pa\x02\0a'p\x81\x88\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x89\x01Q\x93Pa\x02@\x91a'\x90\x87\x84\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01`\x8A\x01Q\x94Pa\x02\x80a'\xB1\x81\x89\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x8A\x01Q\x80Qa\x02\xC0\x89\x01R` \x90\x81\x01Qa\x02\xE0\x89\x01Ra\x01\xA0\x8B\x01Q\x80Qa\x03\0\x8A\x01R\x81\x01Qa\x03 \x89\x01R\x93\x8A\x01Q\x80Qa\x03@\x89\x01R\x84\x01Qa\x03`\x88\x01Ra\x01\xE0\x8A\x01Q\x80Qa\x03\x80\x89\x01R\x84\x01Qa\x03\xA0\x88\x01R\x89\x01Q\x80Qa\x03\xC0\x88\x01R\x83\x01Qa\x03\xE0\x87\x01Ra\x02 \x89\x01Q\x80Qa\x04\0\x88\x01R\x83\x01Qa\x04 \x87\x01R\x90\x88\x01Q\x80Qa\x04@\x87\x01R\x82\x01Qa\x04`\x86\x01Ra\x02`\x88\x01Q\x80Qa\x04\x80\x87\x01R\x90\x91\x01Qa\x04\xA0\x85\x01R\x86\x01Qa\x04\xC0\x84\x01RPa\x02\xA0\x85\x01Qa\x04\xE0\x83\x01Ra(\x88a\x05\0\x83\x01\x85a$jV[a(\x96a\x05\xE0\x83\x01\x84a$\x8CV[\x94\x93PPPPV[_` \x82\x84\x03\x12\x15a(\xAEW_\x80\xFD[\x81Q\x80\x15\x15\x81\x14a\x1CNW_\x80\xFD[`\x01`\x01`@\x1B\x03\x82\x81\x16\x82\x82\x16\x03\x90\x80\x82\x11\x15a(\xDDWa(\xDDa$\x1AV[P\x92\x91PPV[_`\x01`\x01`@\x1B\x03\x80\x83\x16\x81\x81\x03a(\xFFWa(\xFFa$\x1AV[`\x01\x01\x93\x92PPPV[_` \x82\x84\x03\x12\x15a)\x19W_\x80\xFD[PQ\x91\x90PV[_\x82Qa)1\x81\x84` \x87\x01a#\xA6V[\x91\x90\x91\x01\x92\x91PPV\xFE6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\xA1dsolcC\0\x08\x17\0\n", + b"`\xA0`@R0`\x80R4\x80\x15b\0\0\x14W_\x80\xFD[Pb\0\0\x1Fb\0\0%V[b\0\0\xD9V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15b\0\0vW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80T`\x01`\x01`@\x1B\x03\x90\x81\x16\x14b\0\0\xD6W\x80T`\x01`\x01`@\x1B\x03\x19\x16`\x01`\x01`@\x1B\x03\x90\x81\x17\x82U`@Q\x90\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PV[`\x80Qa.Ub\0\x01\0_9_\x81\x81a\x10\x87\x01R\x81\x81a\x10\xB0\x01Ra\x12-\x01Ra.U_\xF3\xFE`\x80`@R`\x046\x10a\x01\xBAW_5`\xE0\x1C\x80c\x81\x1F\x85?\x11a\0\xF2W\x80c\xA1\xBE\x8DR\x11a\0\x92W\x80c\xD2M\x93=\x11a\0bW\x80c\xD2M\x93=\x14a\x05\xE5W\x80c\xE003\x01\x14a\x06\x14W\x80c\xF2\xFD\xE3\x8B\x14a\x063W\x80c\xF9\xE5\r\x19\x14a\x06RW_\x80\xFD[\x80c\xA1\xBE\x8DR\x14a\x053W\x80c\xAD<\xB1\xCC\x14a\x05RW\x80c\xB2BN?\x14a\x05\x8FW\x80c\xC2;\x9E\x9E\x14a\x05\xADW_\x80\xFD[\x80c\x8D\xA5\xCB[\x11a\0\xCDW\x80c\x8D\xA5\xCB[\x14a\x04dW\x80c\x90\xC1C\x90\x14a\x04\xA0W\x80c\x96\xC1\xCAa\x14a\x04\xBFW\x80c\x9F\xDBT\xA7\x14a\x04\xDEW_\x80\xFD[\x80c\x81\x1F\x85?\x14a\x03\xDEW\x80c\x82nA\xFC\x14a\x03\xFDW\x80c\x85\x84\xD2?\x14a\x04(W_\x80\xFD[\x80cBm1\x94\x11a\x01]W\x80ci\xCCj\x04\x11a\x018W\x80ci\xCCj\x04\x14a\x03\x83W\x80cqP\x18\xA6\x14a\x03\x97W\x80cu|7\xAD\x14a\x03\xABW\x80cvg\x18\x08\x14a\x03\xCAW_\x80\xFD[\x80cBm1\x94\x14a\x03:W\x80cO\x1E\xF2\x86\x14a\x03\\W\x80cR\xD1\x90-\x14a\x03oW_\x80\xFD[\x80c\r\x8En,\x11a\x01\x98W\x80c\r\x8En,\x14a\x02~W\x80c/y\x88\x9D\x14a\x02\xA9W\x80c1=\xF7\xB1\x14a\x02\xE7W\x80c7\x8E\xC2;\x14a\x03\x1EW_\x80\xFD[\x80c\x01?\xA5\xFC\x14a\x01\xBEW\x80c\x02\xB5\x92\xF3\x14a\x01\xDFW\x80c\x06%\xE1\x9B\x14a\x02W_\x80\xFD[Pa\x04\x18a\x05M6`\x04a'\xF6V[a\x0EEV[4\x80\x15a\x05]W_\x80\xFD[Pa\x05\x82`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\x023\x91\x90a(1V[4\x80\x15a\x05\x9AW_\x80\xFD[P_Ta\x02\xCF\x90`\x01`\x01`@\x1B\x03\x16\x81V[4\x80\x15a\x05\xB8W_\x80\xFD[P`\rTa\x05\xD0\x90`\x01`\xA0\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81V[`@Qc\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01a\x023V[4\x80\x15a\x05\xF0W_\x80\xFD[P`\tT`\nTa\x05\r\x91`\x01`\x01`@\x1B\x03\x80\x82\x16\x92`\x01`@\x1B\x90\x92\x04\x16\x90\x83V[4\x80\x15a\x06\x1FW_\x80\xFD[Pa\x04\x18a\x06.6`\x04a(cV[a\x0E\x87V[4\x80\x15a\x06>W_\x80\xFD[Pa\x01\xDDa\x06M6`\x04a#\x07V[a\x0F\xDFV[4\x80\x15a\x06]W_\x80\xFD[P`\x0ETa\x03,V[a\x06na\x10!V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x06\x95W`@Qc\xE6\xC4${`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\rT`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x90\x82\x16\x03a\x06\xC4W`@Qc\xA8c\xAE\xC9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\r\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x81\x17\x90\x91U`@Q\x90\x81R\x7F\x80\x17\xBB\x88\x7F\xDF\x8F\xCAC\x14\xA9\xD4\x0Fns\xB3\xB8\x10\x02\xD6~\\\xFA\x85\xD8\x81s\xAFj\xA4`r\x90` \x01[`@Q\x80\x91\x03\x90\xA1PV[`\x0E\x81\x81T\x81\x10a\x07(W_\x80\xFD[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01\x80T`\x01\x90\x91\x01T`\x01`\x01`@\x1B\x03\x80\x83\x16\x93P`\x01`@\x1B\x83\x04\x81\x16\x92`\x01`\x80\x1B\x90\x04\x16\x90\x84V[a\x07ja\x10|V[a\x07s\x82a\x11 V[a\x07}\x82\x82a\x11aV[PPV[_a\x07\x8Aa\x12\"V[P_\x80Q` a.)\x839\x81Q\x91R\x90V[a\x07\xA4a\x10!V[`\rT`\x01`\x01`\xA0\x1B\x03\x16\x15a\x07\xEFW`\r\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16\x90U`@Q\x7F\x9A_W\xDE\x85m\xD6h\xC5M\xD9^\\U\xDF\x93C!q\xCB\xCAI\xA8wmV \xEAY\xC0$P\x90_\x90\xA1V[`@Qc\xA8c\xAE\xC9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a\x08\x12a\x10!V[a\x08\x08_a\x12kV[`\rT`\x01`\x01`\xA0\x1B\x03\x16\x15\x15\x80\x15a\x08@WP`\rT`\x01`\x01`\xA0\x1B\x03\x163\x14\x15[\x15a\x08^W`@Qc\x01GL\x8F`\xE7\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x0BT\x83Q`\x01`\x01`@\x1B\x03\x91\x82\x16\x91\x16\x11\x15\x80a\x08\x97WP`\x0BT` \x84\x01Q`\x01`\x01`@\x1B\x03`\x01`@\x1B\x90\x92\x04\x82\x16\x91\x16\x11\x15[\x15a\x08\xB5W`@Qc\x05\x1CF\xEF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x08\xC2\x83`@\x01Qa\x12\xDBV[_a\x08\xCBa\n\xE6V[` \x85\x01Q_\x80T\x92\x93P\x91a\x08\xEA\x91\x90`\x01`\x01`@\x1B\x03\x16a\r_V[\x90Pa\x08\xF7\x82`\x01a(\x97V[`\x01`\x01`@\x1B\x03\x16\x81`\x01`\x01`@\x1B\x03\x16\x14\x80\x15a\t0WP`\x0BTa\t.\x90`\x01`@\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16a\x0EEV[\x15[\x80\x15a\tDWP_\x82`\x01`\x01`@\x1B\x03\x16\x11[\x15a\tbW`@QcqP\xDEE`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\tm\x82`\x02a(\x97V[`\x01`\x01`@\x1B\x03\x16\x81`\x01`\x01`@\x1B\x03\x16\x10a\t\x9EW`@QcqP\xDEE`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\t\xAB\x84` \x01Qa\x12\xDBV[a\t\xB8\x84`@\x01Qa\x12\xDBV[a\t\xC5\x84``\x01Qa\x12\xDBV[a\t\xD0\x85\x85\x85a\x13KV[\x84Q`\x0B\x80T` \x88\x01Q`\x01`\x01`@\x1B\x03\x81\x81\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x93\x16\x94\x16\x93\x90\x93\x17\x17\x90U`@\x86\x01Q`\x0CUa\n\x12\x90a\x0EEV[\x15a\n|W\x83Q`\x05U` \x84\x01Q`\x06U`@\x84\x01Q`\x07U``\x84\x01Q`\x08U\x7F1\xEA\xBD\x90\x99\xFD\xB2]\xAC\xDD\xD2\x06\xAB\xFF\x871\x1EU4A\xFC\x9D\x0F\xCD\xEF \x10b\xD7\xE7\x07\x1Ba\n`\x82`\x01a(\x97V[`@Q`\x01`\x01`@\x1B\x03\x90\x91\x16\x81R` \x01`@Q\x80\x91\x03\x90\xA1[a\n\x87CB\x87a\x14\xA3V[\x84` \x01Q`\x01`\x01`@\x1B\x03\x16\x85_\x01Q`\x01`\x01`@\x1B\x03\x16\x7F\xA0Jw9$PZA\x85d67%\xF5h2\xF5w.k\x8D\r\xBDn\xFC\xE7$\xDF\xE8\x03\xDA\xE6\x87`@\x01Q`@Qa\n\xD7\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA3PPPPPV[`\x0BT_\x80T\x90\x91a\x0B\x0B\x91`\x01`\x01`@\x1B\x03`\x01`@\x1B\x90\x92\x04\x82\x16\x91\x16a\r_V[\x90P\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16_\x81\x15\x80\x15a\x0BTWP\x82[\x90P_\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\x0BoWP0;\x15[\x90P\x81\x15\x80\x15a\x0B}WP\x80\x15[\x15a\x0B\x9BW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\x0B\xC5W\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\x0B\xCE\x87a\x16\x8CV[a\x0B\xD6a\x16\x9DV[a\x0B\xE2\x8A\x8A\x8A\x89a\x16\xA5V[\x83\x15a\x0C(W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPPPPV[`\x0E\x80T_\x91\x82\x91\x90a\x0CH`\x01\x83a(\xBEV[\x81T\x81\x10a\x0CXWa\x0CXa(\xD1V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x80\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x84\x10a\x0C\x97W`@Qc\x18V\xA4\x99`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\rT`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16[\x81\x81\x10\x15a\rXW\x84`\x0E\x82\x81T\x81\x10a\x0C\xC7Wa\x0C\xC7a(\xD1V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x80\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x11\x15a\rPW`\x0E\x81\x81T\x81\x10a\r\0Wa\r\0a(\xD1V[\x90_R` _ \x90`\x02\x02\x01`\x01\x01T`\x0E\x82\x81T\x81\x10a\r#Wa\r#a(\xD1V[\x90_R` _ \x90`\x02\x02\x01_\x01`\x10\x90T\x90a\x01\0\n\x90\x04`\x01`\x01`@\x1B\x03\x16\x93P\x93PPP\x91P\x91V[`\x01\x01a\x0C\xABV[PP\x91P\x91V[_\x81`\x01`\x01`@\x1B\x03\x16_\x03a\rwWP_a\r\xB6V[a\r\x81\x82\x84a(\xF9V[`\x01`\x01`@\x1B\x03\x16_\x03a\r\xA1Wa\r\x9A\x82\x84a)\x1EV[\x90Pa\r\xB6V[a\r\xAB\x82\x84a)\x1EV[a\r\x9A\x90`\x01a(\x97V[\x92\x91PPV[a\r\xC4a\x10!V[a\x0E\x10\x81c\xFF\xFF\xFF\xFF\x16\x10\x80a\r\xE3WPc\x01\xE13\x80\x81c\xFF\xFF\xFF\xFF\x16\x11[\x80a\x0E\x01WP`\rTc\xFF\xFF\xFF\xFF`\x01`\xA0\x1B\x90\x91\x04\x81\x16\x90\x82\x16\x11\x15[\x15a\x0E\x1FW`@Qc\x07\xA5\x07w`\xE5\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\r\x80Tc\xFF\xFF\xFF\xFF\x90\x92\x16`\x01`\xA0\x1B\x02c\xFF\xFF\xFF\xFF`\xA0\x1B\x19\x90\x92\x16\x91\x90\x91\x17\x90UV[_\x81`\x01`\x01`@\x1B\x03\x16_\x03a\x0E]WP_\x91\x90PV[_Ta\x0Er\x90`\x01`\x01`@\x1B\x03\x16\x83a(\xF9V[`\x01`\x01`@\x1B\x03\x16\x15\x92\x91PPV[\x91\x90PV[`\x0ET_\x90C\x84\x11\x80a\x0E\x98WP\x80\x15[\x80a\x0E\xE2WP`\rT`\x0E\x80T\x90\x91`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x0E\xC6Wa\x0E\xC6a(\xD1V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x84\x10[\x15a\x0F\0W`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_\x80\x80a\x0F\x0E`\x01\x85a(\xBEV[\x90P[\x81a\x0F\xAAW`\rT`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x81\x10a\x0F\xAAW\x86`\x0E\x82\x81T\x81\x10a\x0FCWa\x0FCa(\xD1V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x11a\x0F\x98W`\x01\x91P`\x0E\x81\x81T\x81\x10a\x0FxWa\x0Fxa(\xD1V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x92Pa\x0F\xAAV[\x80a\x0F\xA2\x81a)CV[\x91PPa\x0F\x11V[\x81a\x0F\xC8W`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x85a\x0F\xD3\x84\x89a(\xBEV[\x11\x97\x96PPPPPPPV[a\x0F\xE7a\x10!V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x10\x15W`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R_`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[a\x10\x1E\x81a\x12kV[PV[3a\x10S\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\x08\x08W`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R3`\x04\x82\x01R`$\x01a\x10\x0CV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a\x11\x02WP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a\x10\xF6_\x80Q` a.)\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x08\x08W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x11(a\x10!V[`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x81R\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x90` \x01a\x07\x0EV[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x11\xBBWP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x11\xB8\x91\x81\x01\x90a)XV[`\x01[a\x11\xE3W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x10\x0CV[_\x80Q` a.)\x839\x81Q\x91R\x81\x14a\x12\x13W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x10\x0CV[a\x12\x1D\x83\x83a\x18\x1FV[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\x08\x08W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T`\x01`\x01`\xA0\x1B\x03\x19\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90_\x90\xA3PPPV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x81\x10\x80a\x07}W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01a\x10\x0CV[_a\x13Ta\x18tV[\x90Pa\x13^a lV[\x84Q`\x01`\x01`@\x1B\x03\x90\x81\x16\x82R` \x80\x87\x01\x80Q\x90\x92\x16\x90\x83\x01R`@\x80\x87\x01Q\x90\x83\x01R`\x06T``\x83\x01R`\x07T`\x80\x83\x01R`\x08T`\xA0\x83\x01R`\x05T`\xC0\x83\x01RQa\x13\xAF\x90a\x0EEV[\x15a\x13\xE1W` \x84\x01Q`\xE0\x82\x01R`@\x84\x01Qa\x01\0\x82\x01R``\x84\x01Qa\x01 \x82\x01R\x83Qa\x01@\x82\x01Ra\x14\x05V[`\x06T`\xE0\x82\x01R`\x07Ta\x01\0\x82\x01R`\x08Ta\x01 \x82\x01R`\x05Ta\x01@\x82\x01R[`@Qc\xFC\x86`\xC7`\xE0\x1B\x81Rs_\xBD\xB21Vx\xAF\xEC\xB3g\xF02\xD9?d/d\x18\n\xA3\x90c\xFC\x86`\xC7\x90a\x14@\x90\x85\x90\x85\x90\x88\x90`\x04\x01a+{V[` `@Q\x80\x83\x03\x81\x86Z\xF4\x15\x80\x15a\x14[W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x14\x7F\x91\x90a-\xA9V[a\x14\x9CW`@Qc\t\xBD\xE39`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPPV[`\x0ET\x15\x80\x15\x90a\x15\x18WP`\rT`\x0E\x80T`\x01`\xA0\x1B\x83\x04c\xFF\xFF\xFF\xFF\x16\x92`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x14\xE3Wa\x14\xE3a(\xD1V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01Ta\x15\r\x90`\x01`@\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x84a-\xC8V[`\x01`\x01`@\x1B\x03\x16\x11[\x15a\x15\xABW`\rT`\x0E\x80T\x90\x91`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x15EWa\x15Ea(\xD1V[_\x91\x82R` \x82 `\x02\x90\x91\x02\x01\x80T`\x01`\x01`\xC0\x1B\x03\x19\x16\x81U`\x01\x01U`\r\x80T`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90`\x18a\x15\x85\x83a-\xE8V[\x91\x90a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UPP[`@\x80Q`\x80\x81\x01\x82R`\x01`\x01`@\x1B\x03\x94\x85\x16\x81R\x92\x84\x16` \x80\x85\x01\x91\x82R\x83\x01Q\x85\x16\x84\x83\x01\x90\x81R\x92\x90\x91\x01Q``\x84\x01\x90\x81R`\x0E\x80T`\x01\x81\x01\x82U_\x91\x90\x91R\x93Q`\x02\x90\x94\x02\x7F\xBB{JEM\xC3I9#H/\x07\x82#)\xED\x19\xE8$N\xFFX,\xC2\x04\xF8UL6 \xC3\xFD\x81\x01\x80T\x93Q\x94Q\x87\x16`\x01`\x80\x1B\x02g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`\x80\x1B\x19\x95\x88\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x95\x16\x96\x90\x97\x16\x95\x90\x95\x17\x92\x90\x92\x17\x92\x90\x92\x16\x93\x90\x93\x17\x90\x91UQ\x7F\xBB{JEM\xC3I9#H/\x07\x82#)\xED\x19\xE8$N\xFFX,\xC2\x04\xF8UL6 \xC3\xFE\x90\x91\x01UV[a\x16\x94a\x1E\x9FV[a\x10\x1E\x81a\x1E\xE8V[a\x08\x08a\x1E\x9FV[\x83Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80a\x16\xC9WP` \x84\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80a\x16\xD6WP` \x83\x01Q\x15[\x80a\x16\xE3WP`@\x83\x01Q\x15[\x80a\x16\xF0WP``\x83\x01Q\x15[\x80a\x16\xFAWP\x82Q\x15[\x80a\x17\x0CWPa\x0E\x10\x82c\xFF\xFF\xFF\xFF\x16\x10[\x80a\x17 WPc\x01\xE13\x80\x82c\xFF\xFF\xFF\xFF\x16\x11[\x80a\x172WP`\x01`\x01`@\x1B\x03\x81\x16\x15[\x15a\x17PW`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x83Q`\t\x80T` \x80\x88\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x93\x84\x16\x95\x82\x16\x95\x86\x17\x81\x17\x90\x94U`@\x98\x89\x01Q`\n\x81\x90U`\x0B\x80T\x90\x94\x16\x90\x95\x17\x90\x93\x17\x90\x91U`\x0C\x92\x90\x92U\x84Q`\x01\x81\x90U\x91\x85\x01Q`\x02\x81\x90U\x95\x85\x01Q`\x03\x81\x90U``\x90\x95\x01Q`\x04\x81\x90U`\x05\x92\x90\x92U`\x06\x95\x90\x95U`\x07\x93\x90\x93U`\x08\x92\x90\x92U`\r\x80Tc\xFF\xFF\xFF\xFF\x90\x92\x16`\x01`\xA0\x1B\x02c\xFF\xFF\xFF\xFF`\xA0\x1B\x19\x90\x92\x16\x91\x90\x91\x17\x90U_\x80T\x91\x90\x92\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x91\x90\x91\x16\x17\x90UV[a\x18(\x82a\x1E\xF0V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90_\x90\xA2\x80Q\x15a\x18lWa\x12\x1D\x82\x82a\x1FSV[a\x07}a\x1F\xC5V[a\x18|a \x8BV[b\x10\0\0\x81R`\x0B` \x82\x01R\x7F&\x86~\xE5\x8A\xAF\x86\x0F\xC9\xE0\xE3\xA7\x86f\xFF\xC5\x1F;\xA1\xAD\x8A\xE0\x01\xC1\x96\x83\x0CU\xB5\xAF\x0B\x8C`@\x82\x01QR\x7F\t\x120\xAD\xB7S\xF8(\x15\x15\x12w\x06\x0C\xC5kTk\xB2\xE9P\xA0\xDE\x19\xED\x06\x1E\xC6\x8C\x07\x1A\x90` `@\x83\x01Q\x01R\x7F\x02\xA5\t\xA0m\x8CV\xF8? F\x88\xFFnB\xEA\xC6\xE3\xCB\xDD\x06;\tq\xA3\xAF\x95>\x81\xBA\xDB\xB6``\x82\x01QR\x7F\x06\xF4>\xD2\xB9\xCE\xCE5\xD1 \x1A\xBC\x13\xFF\xDA\xEA5V\x0C\xF0\xF1Dbw\x13\x8C\xE8\x12\xB9\xAD\x9F9` ``\x83\x01Q\x01R\x7F\x1AX\x8C\x99\xAD\x88\xF7\x89\xC8w\"\xB0a\xBBU5\xDA\xA0\xAB\xCC\x1D\xC6\xD1v\xD7\xFE\xA5\x1E]\x80\xB9&`\x80\x82\x01QR\x7F b\xB9\x95\xE6\x1Aj\xB8\xAA\xB6\xCDnu \xB8y\xD8O\x96Z\xB1\xF0\x94\xC1\x04\xF0\xC1!;(\x03\x8B` `\x80\x83\x01Q\x01R\x7F!\xA2\xFDvj\x0C\xEB\xEC\xFD\xBF\xDF\xE5a9\xA1\xBB\xD9\xAE\xC1^.5\xBE\x8E\xF0\x194\xA0\xECC\x86\x85`\xA0\x82\x01QR\x7F \xFEP\n\xC7\xD1\xAAx \xDB\x8Co\x7F\x9DP\x9E;.\x88s\x1E:\x12\xDDe\xF0oC\xCA\x93\r\xA0` `\xA0\x83\x01Q\x01R\x7F\n\xB5=\x12\x85\xC7\xF4\x81\x9B?\xF6\xE1\xDD\xAD\xA6\xBF%\x15\xD3K\xBA\xF6\x11\x86\xC6\xA0K\xE4}\xFDe\xA3`\xC0\x82\x01QR\x7F\x0B\x80\xA9\x87\x80\x82\xCD\xFD\xD9\xFC\xC1k\xB3?\xA4$\xC0\xADf\xB8\x19I\xBFd!S\xD3\xC7\xAD\x08/\"` `\xC0\x83\x01Q\x01R\x7F\x1B\x90\x0F\x8E_\x8E\x80d\xA5\x88\x8A\x1B\xD7\x96\xB5J&R\xFC\x02\x03O\xE4\xB6\xE6\xFC\x8DfP\xF7E;`\xE0\x82\x01QR~\xCC\xA2X\xA8\x83,d\xD1\xF8\xE1r\x1Ax\xFC%\xB1=)\xAD\xBB\x81\xE3Zy\xFC/I\xF8\x90'\x86` `\xE0\x83\x01Q\x01R\x7F\r\x1D3H\xD6B\xE6\xF2\xE9s\x9Ds]\x8Cr6v\xDB\xAE\xFD\xCB\xB4\xE9fA\xDE\xFA5=&\xEB\xB3a\x01\0\x82\x01QR\x7F\x14\xFE\x9Dj3Q\x04\xE7I\x1C\xA6\xD5\x08a\x13\xE6\xB0\xF5)F\x96\rrfdf{\xD5\x859\xD4\x1E` a\x01\0\x83\x01Q\x01R\x7F\x1D\xA9CdD\x0CN?\xB8\xAF-6<\xDE\xFAN\xDD\xA47W\x9E\x1B\x05j\x16\xA5\xE9\xA1\x1D\xFF\xA2\xABa\x01 \x82\x01QR\x7F\n\x07{\xD3\x07\xED1\"-\xB5\\\xB0\x12\x8B\xAF\xCE^\"U{W\xF5\xAC\x91SY\xC5\x02\x96\xCB\\w` a\x01 \x83\x01Q\x01R\x7F(\xFF\x80\xB13\xD9\x89#\\q)\xDE\xA5Di\xB7\x80\xACG\x17D\x92\x90\x06~|\x9A}[\xE7\xDB\xD5a\x01@\x82\x01QR\x7F\x1C\x0F\xC2.\xEF#\xB5\n-\xDCU?\x9F\xC1\xB6\x1F\xD8\xC5zX\xCA2\x1A\x82\x9C~\xC2U\xF7W\xB3\xA6` a\x01@\x83\x01Q\x01R~^\xE7rr\x95\x96a\xE0\xFB\xAB\xDAC\x17w\xFAr\x9F[S/Da\x01\x80\x82\x01QR~\x8D\x9E\xE0\x0Fy\x9C\xF0\x06\x08\xB0\x82\xD0;\x9D\xE5\xA4+\x81&\xC3_\xBF\xBD\x1E`!\x08\xDF\x10\xE0\xE3` a\x01\x80\x83\x01Q\x01R\x7F/Rli\x81d?\xF6\xF6\xE9\xD2\xB5\xA9!\xE0l\xF9_'F)\xB5\xA1E\xBDU+\x7F\xDAj\x87\0a\x01\xA0\x82\x01QR\x7F/\xE7\x10\x8F\xD4\xE2B1\xF3\xDA\xDBn\t\x07.\x10o\xCA\x06\x94\xFE9\xDF\xF9eW\xA8\x82!\xA8\x9AP` a\x01\xA0\x83\x01Q\x01R\x7F&\xA3V\x85\x98\xA6\x98\x1Ec%\xF4\x81g6\xE3\x81\x08{[\x0EK'\xEF6M\x8A\xE1\xE2\x9F\xE9\xDF\x99a\x01\xC0\x82\x01QR\x7F\x1D\xB8\x1C\xDF\x82\xA9\xEC\x99\xF3\xC9qm\xF2-81~k\xB8O\xC5}/\x0E{+\xC8\xA0V\x9F|\xC4` a\x01\xC0\x83\x01Q\x01R~\x99\x88\x80\x88\xE1\x1D\xE6\xED\x08l\x99\xB9\xBB\xA9\x86\xD9\x08\xDF[\x0CP\x07h\r\x97V}HW\x19\x94a\x01\xE0\x82\x01QR\x7F\x1F\x91Wn\xAD\xFF\xFF\x93+nT\xBA\xB0\"\xF9?o\xEC>[vt\xD0\0k\xC5\xF2\"5'\xA3H` a\x01\xE0\x83\x01Q\x01R~h\xB3\xC1\x17\xEE~\x84\xD6\xB6p\xB6\xAF \x19wY\xEC\x80\xD3O#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a\x08\x08W`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0F\xE7a\x1E\x9FV[\x80`\x01`\x01`\xA0\x1B\x03\x16;_\x03a\x1F%W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x10\x0CV[_\x80Q` a.)\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[``_\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x1Fo\x91\x90a.\rV[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a\x1F\xA7W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a\x1F\xACV[``\x91P[P\x91P\x91Pa\x1F\xBC\x85\x83\x83a\x1F\xE4V[\x95\x94PPPPPV[4\x15a\x08\x08W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a\x1F\xF9Wa\x1F\xF4\x82a CV[a `@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a!^`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a!~`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a!\x9E`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a!\xBE`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a!\xDE`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a!\xFE`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"\x1E`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\">`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"^`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"~`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"\x9E`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"\xBE`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"\xDE`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R_` \x82\x01\x81\x90R`@\x90\x91\x01R\x90V[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x0E\x82W_\x80\xFD[_` \x82\x84\x03\x12\x15a#\x17W_\x80\xFD[a <\x82a\"\xF1V[_` \x82\x84\x03\x12\x15a#0W_\x80\xFD[P5\x91\x90PV[cNH{q`\xE0\x1B_R`A`\x04R`$_\xFD[`@Qa\x02\xE0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a#nWa#na#7V[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a#\x9CWa#\x9Ca#7V[`@R\x91\x90PV[_\x80`@\x83\x85\x03\x12\x15a#\xB5W_\x80\xFD[a#\xBE\x83a\"\xF1V[\x91P` \x80\x84\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a#\xDAW_\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12a#\xEDW_\x80\xFD[\x815\x81\x81\x11\x15a#\xFFWa#\xFFa#7V[a$\x11`\x1F\x82\x01`\x1F\x19\x16\x85\x01a#tV[\x91P\x80\x82R\x87\x84\x82\x85\x01\x01\x11\x15a$&W_\x80\xFD[\x80\x84\x84\x01\x85\x84\x017_\x84\x82\x84\x01\x01RP\x80\x93PPPP\x92P\x92\x90PV[\x805`\x01`\x01`@\x1B\x03\x81\x16\x81\x14a\x0E\x82W_\x80\xFD[_``\x82\x84\x03\x12\x15a$iW_\x80\xFD[`@Q``\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a$\x8BWa$\x8Ba#7V[`@R\x90P\x80a$\x9A\x83a$CV[\x81Ra$\xA8` \x84\x01a$CV[` \x82\x01R`@\x83\x015`@\x82\x01RP\x92\x91PPV[_`\x80\x82\x84\x03\x12\x15a$\xCEW_\x80\xFD[`@Q`\x80\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a$\xF0Wa$\xF0a#7V[\x80`@RP\x80\x91P\x825\x81R` \x83\x015` \x82\x01R`@\x83\x015`@\x82\x01R``\x83\x015``\x82\x01RP\x92\x91PPV[_`@\x82\x84\x03\x12\x15a%1W_\x80\xFD[`@Q`@\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a%SWa%Sa#7V[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[_\x80_\x83\x85\x03a\x05`\x81\x12\x15a%\x81W_\x80\xFD[a%\x8B\x86\x86a$YV[\x93Pa%\x9A\x86``\x87\x01a$\xBEV[\x92Pa\x04\x80\x80`\xDF\x19\x83\x01\x12\x15a%\xAFW_\x80\xFD[a%\xB7a#KV[\x91Pa%\xC6\x87`\xE0\x88\x01a%!V[\x82Ra\x01 a%\xD7\x88\x82\x89\x01a%!V[` \x84\x01Ra\x01`a%\xEB\x89\x82\x8A\x01a%!V[`@\x85\x01Ra\x01\xA0a%\xFF\x8A\x82\x8B\x01a%!V[``\x86\x01Ra\x01\xE0a&\x13\x8B\x82\x8C\x01a%!V[`\x80\x87\x01Ra\x02 a&'\x8C\x82\x8D\x01a%!V[`\xA0\x88\x01Ra\x02`a&;\x8D\x82\x8E\x01a%!V[`\xC0\x89\x01Ra\x02\xA0a&O\x8E\x82\x8F\x01a%!V[`\xE0\x8A\x01Ra&b\x8Ea\x02\xE0\x8F\x01a%!V[a\x01\0\x8A\x01Ra&v\x8Ea\x03 \x8F\x01a%!V[\x87\x8A\x01Ra&\x88\x8Ea\x03`\x8F\x01a%!V[a\x01@\x8A\x01Ra&\x9C\x8Ea\x03\xA0\x8F\x01a%!V[\x86\x8A\x01Ra&\xAE\x8Ea\x03\xE0\x8F\x01a%!V[a\x01\x80\x8A\x01Ra\x04 \x8D\x015\x85\x8A\x01Ra\x04@\x8D\x015a\x01\xC0\x8A\x01Ra\x04`\x8D\x015\x84\x8A\x01R\x87\x8D\x015a\x02\0\x8A\x01Ra\x04\xA0\x8D\x015\x83\x8A\x01Ra\x04\xC0\x8D\x015a\x02@\x8A\x01Ra\x04\xE0\x8D\x015\x82\x8A\x01Ra\x05\0\x8D\x015a\x02\x80\x8A\x01Ra\x05 \x8D\x015\x81\x8A\x01RPPPPPPPPa\x05@\x85\x015a\x02\xC0\x82\x01R\x80\x91PP\x92P\x92P\x92V[\x805c\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x0E\x82W_\x80\xFD[_\x80_\x80_a\x01@\x86\x88\x03\x12\x15a'[W_\x80\xFD[a'e\x87\x87a$YV[\x94Pa't\x87``\x88\x01a$\xBEV[\x93Pa'\x82`\xE0\x87\x01a'3V[\x92Pa'\x91a\x01\0\x87\x01a\"\xF1V[\x91Pa'\xA0a\x01 \x87\x01a$CV[\x90P\x92\x95P\x92\x95\x90\x93PV[_\x80`@\x83\x85\x03\x12\x15a'\xBDW_\x80\xFD[a'\xC6\x83a$CV[\x91Pa'\xD4` \x84\x01a$CV[\x90P\x92P\x92\x90PV[_` \x82\x84\x03\x12\x15a'\xEDW_\x80\xFD[a <\x82a'3V[_` \x82\x84\x03\x12\x15a(\x06W_\x80\xFD[a <\x82a$CV[_[\x83\x81\x10\x15a()W\x81\x81\x01Q\x83\x82\x01R` \x01a(\x11V[PP_\x91\x01RV[` \x81R_\x82Q\x80` \x84\x01Ra(O\x81`@\x85\x01` \x87\x01a(\x0FV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15a(tW_\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[cNH{q`\xE0\x1B_R`\x11`\x04R`$_\xFD[`\x01`\x01`@\x1B\x03\x81\x81\x16\x83\x82\x16\x01\x90\x80\x82\x11\x15a(\xB7Wa(\xB7a(\x83V[P\x92\x91PPV[\x81\x81\x03\x81\x81\x11\x15a\r\xB6Wa\r\xB6a(\x83V[cNH{q`\xE0\x1B_R`2`\x04R`$_\xFD[cNH{q`\xE0\x1B_R`\x12`\x04R`$_\xFD[_`\x01`\x01`@\x1B\x03\x80\x84\x16\x80a)\x12Wa)\x12a(\xE5V[\x92\x16\x91\x90\x91\x06\x92\x91PPV[_`\x01`\x01`@\x1B\x03\x80\x84\x16\x80a)7Wa)7a(\xE5V[\x92\x16\x91\x90\x91\x04\x92\x91PPV[_\x81a)QWa)Qa(\x83V[P_\x19\x01\x90V[_` \x82\x84\x03\x12\x15a)hW_\x80\xFD[PQ\x91\x90PV[\x80_[`\x0B\x81\x10\x15a)\x91W\x81Q\x84R` \x93\x84\x01\x93\x90\x91\x01\x90`\x01\x01a)rV[PPPPV[a)\xAC\x82\x82Q\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[` \x81\x81\x01Q\x80Q`@\x85\x01R\x90\x81\x01Q``\x84\x01RP`@\x81\x01Q\x80Q`\x80\x84\x01R` \x81\x01Q`\xA0\x84\x01RP``\x81\x01Q\x80Q`\xC0\x84\x01R` \x81\x01Q`\xE0\x84\x01RP`\x80\x81\x01Qa\x01\0a*\x0F\x81\x85\x01\x83\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xA0\x83\x01Q\x91Pa\x01@a*/\x81\x86\x01\x84\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xC0\x84\x01Q\x92Pa\x01\x80a*O\x81\x87\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xE0\x85\x01Q\x93Pa\x01\xC0a*o\x81\x88\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x85\x01Q\x93Pa\x02\0\x92a*\x8F\x87\x85\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01 \x86\x01Q\x94Pa\x02@a*\xB0\x81\x89\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x86\x01Q\x94Pa\x02\x80\x92a*\xD0\x88\x85\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01`\x87\x01Q\x95Pa\x02\xC0a*\xF1\x81\x8A\x01\x88\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x87\x01Q\x80Qa\x03\0\x8A\x01R` \x01Qa\x03 \x89\x01Ra\x01\xA0\x87\x01Qa\x03@\x89\x01R\x90\x86\x01Qa\x03`\x88\x01Ra\x01\xE0\x86\x01Qa\x03\x80\x88\x01R\x92\x85\x01Qa\x03\xA0\x87\x01Ra\x02 \x85\x01Qa\x03\xC0\x87\x01R\x91\x84\x01Qa\x03\xE0\x86\x01Ra\x02`\x84\x01Qa\x04\0\x86\x01R\x83\x01Qa\x04 \x85\x01Ra\x02\xA0\x83\x01Qa\x04@\x85\x01R\x90\x91\x01Qa\x04`\x90\x92\x01\x91\x90\x91RPV[_a\n\xE0\x82\x01\x90P\x84Q\x82R` \x85\x01Q` \x83\x01R`@\x85\x01Qa+\xAD`@\x84\x01\x82\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[P``\x85\x01Q\x80Q`\x80\x84\x01R` \x81\x01Q`\xA0\x84\x01RP`\x80\x85\x01Q\x80Q`\xC0\x84\x01R` \x81\x01Q`\xE0\x84\x01RP`\xA0\x85\x01Qa\x01\0a+\xFA\x81\x85\x01\x83\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xC0\x87\x01Q\x91Pa\x01@a,\x1A\x81\x86\x01\x84\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xE0\x88\x01Q\x92Pa\x01\x80a,:\x81\x87\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x88\x01Q\x92Pa\x01\xC0\x91a,Z\x86\x84\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01 \x89\x01Q\x93Pa\x02\0a,{\x81\x88\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x89\x01Q\x93Pa\x02@\x91a,\x9B\x87\x84\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01`\x8A\x01Q\x94Pa\x02\x80a,\xBC\x81\x89\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x8A\x01Q\x80Qa\x02\xC0\x89\x01R` \x90\x81\x01Qa\x02\xE0\x89\x01Ra\x01\xA0\x8B\x01Q\x80Qa\x03\0\x8A\x01R\x81\x01Qa\x03 \x89\x01R\x93\x8A\x01Q\x80Qa\x03@\x89\x01R\x84\x01Qa\x03`\x88\x01Ra\x01\xE0\x8A\x01Q\x80Qa\x03\x80\x89\x01R\x84\x01Qa\x03\xA0\x88\x01R\x89\x01Q\x80Qa\x03\xC0\x88\x01R\x83\x01Qa\x03\xE0\x87\x01Ra\x02 \x89\x01Q\x80Qa\x04\0\x88\x01R\x83\x01Qa\x04 \x87\x01R\x90\x88\x01Q\x80Qa\x04@\x87\x01R\x82\x01Qa\x04`\x86\x01Ra\x02`\x88\x01Q\x80Qa\x04\x80\x87\x01R\x90\x91\x01Qa\x04\xA0\x85\x01R\x86\x01Qa\x04\xC0\x84\x01RPa\x02\xA0\x85\x01Qa\x04\xE0\x83\x01Ra-\x93a\x05\0\x83\x01\x85a)oV[a-\xA1a\x06`\x83\x01\x84a)\x97V[\x94\x93PPPPV[_` \x82\x84\x03\x12\x15a-\xB9W_\x80\xFD[\x81Q\x80\x15\x15\x81\x14a v\xCC75\xA9 \xA3\xCAP]8+\xBC\xA1dsolcC\0\x08\x17\0\n", ); /// The runtime bytecode of the contract, as deployed on the network. /// /// ```text - ///0x608060405260043610610147575f3560e01c8063826e41fc116100b3578063ad3cb1cc1161006d578063ad3cb1cc1461046a578063c23b9e9e146104a7578063d24d933d146104df578063e03033011461050e578063f2fde38b1461052d578063f9e50d191461054c575f80fd5b8063826e41fc146103345780638584d23f1461035f5780638da5cb5b1461039b57806396c1ca61146103d75780639baa3cc9146103f65780639fdb54a714610415575f80fd5b8063378ec23b11610104578063378ec23b14610288578063426d3194146102a45780634f1ef286146102e557806352d1902d146102f857806369cc6a041461030c578063715018a614610320575f80fd5b8063013fa5fc1461014b57806302b592f31461016c5780630d8e6e2c146101c95780632063d4f7146101f45780632f79889d14610213578063313df7b114610251575b5f80fd5b348015610156575f80fd5b5061016a610165366004611f1d565b610560565b005b348015610177575f80fd5b5061018b610186366004611f36565b610613565b6040516101c094939291906001600160401b039485168152928416602084015292166040820152606081019190915260800190565b60405180910390f35b3480156101d4575f80fd5b5060408051600181525f60208201819052918101919091526060016101c0565b3480156101ff575f80fd5b5061016a61020e366004612081565b61065c565b34801561021e575f80fd5b5060085461023990600160c01b90046001600160401b031681565b6040516001600160401b0390911681526020016101c0565b34801561025c575f80fd5b50600854610270906001600160a01b031681565b6040516001600160a01b0390911681526020016101c0565b348015610293575f80fd5b50435b6040519081526020016101c0565b3480156102af575f80fd5b505f546001546002546003546102c59392919084565b6040805194855260208501939093529183015260608201526080016101c0565b61016a6102f3366004612232565b6107b6565b348015610303575f80fd5b506102966107d5565b348015610317575f80fd5b5061016a6107f0565b34801561032b575f80fd5b5061016a61085e565b34801561033f575f80fd5b506008546001600160a01b031615155b60405190151581526020016101c0565b34801561036a575f80fd5b5061037e610379366004611f36565b61086f565b604080519283526001600160401b039091166020830152016101c0565b3480156103a6575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610270565b3480156103e2575f80fd5b5061016a6103f13660046122e4565b61099a565b348015610401575f80fd5b5061016a6104103660046122fd565b610a23565b348015610420575f80fd5b50600654600754610444916001600160401b0380821692600160401b909204169083565b604080516001600160401b039485168152939092166020840152908201526060016101c0565b348015610475575f80fd5b5061049a604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101c091906123c8565b3480156104b2575f80fd5b506008546104ca90600160a01b900463ffffffff1681565b60405163ffffffff90911681526020016101c0565b3480156104ea575f80fd5b50600454600554610444916001600160401b0380821692600160401b909204169083565b348015610519575f80fd5b5061034f6105283660046123fa565b610b45565b348015610538575f80fd5b5061016a610547366004611f1d565b610c9f565b348015610557575f80fd5b50600954610296565b610568610ce1565b6001600160a01b03811661058f5760405163e6c4247b60e01b815260040160405180910390fd5b6008546001600160a01b03908116908216036105be5760405163a863aec960e01b815260040160405180910390fd5b600880546001600160a01b0319166001600160a01b0383169081179091556040519081527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b60098181548110610622575f80fd5b5f918252602090912060029091020180546001909101546001600160401b038083169350600160401b8304811692600160801b9004169084565b6008546001600160a01b03161515801561068157506008546001600160a01b03163314155b1561069f576040516301474c8f60e71b815260040160405180910390fd5b60065482516001600160401b0391821691161115806106d8575060065460208301516001600160401b03600160401b9092048216911611155b156106f65760405163051c46ef60e01b815260040160405180910390fd5b6107038260400151610d3c565b61070d8282610dac565b81516006805460208501516001600160401b03908116600160401b026001600160801b0319909216931692909217919091179055604082015160075561075a6107534390565b4284610ea0565b81602001516001600160401b0316825f01516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae684604001516040516107aa91815260200190565b60405180910390a35050565b6107be611089565b6107c78261112d565b6107d1828261116e565b5050565b5f6107de61122f565b505f8051602061293c83398151915290565b6107f8610ce1565b6008546001600160a01b03161561084357600880546001600160a01b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c02450905f90a1565b60405163a863aec960e01b815260040160405180910390fd5b565b610866610ce1565b61085c5f611278565b600980545f9182919061088360018361242e565b8154811061089357610893612441565b5f918252602090912060029091020154600160801b90046001600160401b031684106108d257604051631856a49960e21b815260040160405180910390fd5b600854600160c01b90046001600160401b03165b8181101561099357846009828154811061090257610902612441565b5f918252602090912060029091020154600160801b90046001600160401b0316111561098b576009818154811061093b5761093b612441565b905f5260205f209060020201600101546009828154811061095e5761095e612441565b905f5260205f2090600202015f0160109054906101000a90046001600160401b0316935093505050915091565b6001016108e6565b5050915091565b6109a2610ce1565b610e108163ffffffff1610806109c157506301e133808163ffffffff16115b806109df575060085463ffffffff600160a01b909104811690821611155b156109fd576040516307a5077760e51b815260040160405180910390fd5b6008805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610a675750825b90505f826001600160401b03166001148015610a825750303b155b905081158015610a90575080155b15610aae5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ad857845460ff60401b1916600160401b1785555b610ae1866112e8565b610ae96112f9565b610af4898989611301565b8315610b3a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b6009545f9043841180610b56575080155b80610ba05750600854600980549091600160c01b90046001600160401b0316908110610b8457610b84612441565b5f9182526020909120600290910201546001600160401b031684105b15610bbe5760405163b0b4387760e01b815260040160405180910390fd5b5f8080610bcc60018561242e565b90505b81610c6857600854600160c01b90046001600160401b03168110610c68578660098281548110610c0157610c01612441565b5f9182526020909120600290910201546001600160401b031611610c56576001915060098181548110610c3657610c36612441565b5f9182526020909120600290910201546001600160401b03169250610c68565b80610c6081612455565b915050610bcf565b81610c865760405163b0b4387760e01b815260040160405180910390fd5b85610c91848961242e565b119450505050505b92915050565b610ca7610ce1565b6001600160a01b038116610cd557604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b610cde81611278565b50565b33610d137f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461085c5760405163118cdaa760e01b8152336004820152602401610ccc565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110806107d15760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401610ccc565b5f610db561142d565b9050610dbf611c7e565b83516001600160401b0390811682526020850151168160016020020152604084810151828201526001546060830152600254608083015260035460a08301525f5460c08301525163ce537a7760e01b8152735fbdb2315678afecb367f032d93f642f64180aa39063ce537a7790610e3e90859085908890600401612670565b602060405180830381865af4158015610e59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e7d919061289e565b610e9a576040516309bde33960e01b815260040160405180910390fd5b50505050565b60095415801590610f15575060085460098054600160a01b830463ffffffff1692600160c01b90046001600160401b0316908110610ee057610ee0612441565b5f918252602090912060029091020154610f0a90600160401b90046001600160401b0316846128bd565b6001600160401b0316115b15610fa857600854600980549091600160c01b90046001600160401b0316908110610f4257610f42612441565b5f9182526020822060029091020180546001600160c01b03191681556001015560088054600160c01b90046001600160401b0316906018610f82836128e4565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516080810182526001600160401b03948516815292841660208085019182528301518516848301908152929091015160608401908152600980546001810182555f91909152935160029094027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af81018054935194518716600160801b0267ffffffffffffffff60801b19958816600160401b026001600160801b03199095169690971695909517929092179290921693909317909155517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b090910155565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061110f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166111035f8051602061293c833981519152546001600160a01b031690565b6001600160a01b031614155b1561085c5760405163703e46dd60e11b815260040160405180910390fd5b611135610ce1565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d90602001610608565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156111c8575060408051601f3d908101601f191682019092526111c591810190612909565b60015b6111f057604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610ccc565b5f8051602061293c833981519152811461122057604051632a87526960e21b815260048101829052602401610ccc565b61122a8383611a5c565b505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461085c5760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b6112f0611ab1565b610cde81611afa565b61085c611ab1565b82516001600160401b0316151580611325575060208301516001600160401b031615155b8061133257506020820151155b8061133f57506040820151155b8061134c57506060820151155b8061135657508151155b806113685750610e108163ffffffff16105b8061137c57506301e133808163ffffffff16115b1561139a576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b03908116600160401b026001600160801b0319938416919095169081178517909355604096870151600581905586515f5590860151600155958501516002556060909401516003556006805490941617179091556007919091556008805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b611435611c9c565b621000008152600760208201527f23783d0e9777b7af65fbf849da7edb75e74b1eaf503e025d7f2f7f80991befa26040820151527f2a4e2fe8adfa53f468525582d5184c4c70bbdb946c21f216418a9879705e54a76020604083015101527f0624b2c1e77f24afceaf39451743b9fa80d5853fca7ba00389c675650774009b6060820151527f250d7719e94ca2df00dfe327938f5a8d4d837779b99837ca777a53d39127b1796020606083015101527f0dc09515152eaea66d0db2f571cc995e369d26fe647394f10db5398c917519dc6080820151527f1273144d6cec2c4a68b24a149379c0f5592bb7fbddbe32fa171919950ca404cb6020608083015101527f119521bb68caec216e2f05eeb466fb3abfe1f39baf7fe7cb392ea057b6a2d9bf60a0820151527f2d52adeaba8045e53ab526fe9982d0ea452def6b3ea0253d27a19ef3b46e8428602060a083015101527f16c3b5b217d302975a920d13374524d7a52e4a50fd7fb930842271ebf4a84efd60c0820151527f200788916b907b196972bde304318e885a2521514b2db5e4a11899c51204f089602060c083015101527f1127581afe753defca9aef12e7332db9978a200b1699ce3888c0f3aea6111dc360e0820151527f0881e13f00723be1a04872ed02b2d078c31e80feaf27724e262ce97c2cb0bb1d602060e083015101527f1482a3a6bb91d6483d153683e2404f2f5546e0e895530fdf132091498406e3de610100820151527efa52db3d52d905ead1248102f3a80a43a90d8400c68f60a62c543c417b2f4b602061010083015101527f0a57dadd4a55199525ac6ac6fabc87a4cccfdc98142bcef9dbf47de00ecc5164610120820151527f18d95abd9b8e12c36936aa218cfff582548a6bbff25c338c2006eaeb1fe5b696602061012083015101527f2bc40e91dd169b8bc143a02952a1b6c6e627bfeb7a2bbe5078e14123f3c54c1c610140820151527f108d65a20c579b6d9883275eb6889fc3f5fc79735ca9f611a13b67daa2fbc8d0602061014083015101527f21bc1f86d0608e5f0626b467ee6f8282b619223f60a7acb0fc63ba7bdaf783be610160820151527f05ef3282f8eef01515fb9a8a7d6ca06b8b007d1d512403efb268fb03ce5f09e9602061016083015101527f2cab66c1cb5a83869e73ac34fbe467486999babd541d9010ee9a804806eee4ef610180820151527f2db1982419c5a4a17593acff9535fa967683d75c8aec01319b64b84aada2ad84602061018083015101527f2c38667c6c7eb868bdd30c34dd3f4b84d9b9b1a27d7867b364c8b7831423e9086101a0820151527f2b2cb4044dd51165c48138219d51cf8d1689f91ed3eeefead6e055eb488a2ce260206101a083015101527f2d48e54703011df2c74a14dafde3af4fd83ec71875d8ddc3554658640cc955016101c0820151527f243a99d80d32eb5408b59d5b08302bede070d3fb0a8efe2f2262f865bffb4d0d60206101c083015101527f0455d2325bf6269a66f07d838f55f36947a3cd9b87edd8480bced95cbb45cc116101e0820151527f0f66d9085a6ed60b838179987e240992bff4c0516ccf6ccde4a1ca94ce8b986460206101e083015101527f2bac0d23c8585d1487ec611b5effc97e5852fea43a7cba36ccdd2c207931f394610200820151527f1860b54e01a06aea5adb4b13bf5baebab92b736807a3a89ff2040992b06ee6ec602061020083015101527f0c0bfa1c2fc6f8ed01233d5168db1e1dfe725504f032f669f50a92ae77c72906610220820151527f0d741e124c7d1069b8a400cbcdcfd90128a533901ad4de1e037fe72984dc34cf602061022083015101527f01cfed30085c9efce04668205794aa39b1a8ee591234b4c77a22f8c26d899e05610240820151527f2ab68ac82d36cedb647d14a5b0035e8c9a0be84780b7bae1133a27a880966ed1602061024083015101527f072e1d50f8b5cf8d574b3847276477d95bbd5116351000841f728da44f4043b5610260820151527f23f8ea6eacd0876d57220f57eabacbe76a2323411663731a251d5dca36f1b59f602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b611a6582611b02565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611aa95761122a8282611b65565b6107d1611bd7565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661085c57604051631afcd79f60e31b815260040160405180910390fd5b610ca7611ab1565b806001600160a01b03163b5f03611b3757604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610ccc565b5f8051602061293c83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b031684604051611b819190612920565b5f60405180830381855af49150503d805f8114611bb9576040519150601f19603f3d011682016040523d82523d5f602084013e611bbe565b606091505b5091509150611bce858383611bf6565b95945050505050565b341561085c5760405163b398979f60e01b815260040160405180910390fd5b606082611c0b57611c0682611c55565b611c4e565b8151158015611c2257506001600160a01b0384163b155b15611c4b57604051639996b31560e01b81526001600160a01b0385166004820152602401610ccc565b50805b9392505050565b805115611c655780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6040518060e001604052806007906020820280368337509192915050565b604051806102c001604052805f81526020015f8152602001611ccf60405180604001604052805f81526020015f81525090565b8152602001611cef60405180604001604052805f81526020015f81525090565b8152602001611d0f60405180604001604052805f81526020015f81525090565b8152602001611d2f60405180604001604052805f81526020015f81525090565b8152602001611d4f60405180604001604052805f81526020015f81525090565b8152602001611d6f60405180604001604052805f81526020015f81525090565b8152602001611d8f60405180604001604052805f81526020015f81525090565b8152602001611daf60405180604001604052805f81526020015f81525090565b8152602001611dcf60405180604001604052805f81526020015f81525090565b8152602001611def60405180604001604052805f81526020015f81525090565b8152602001611e0f60405180604001604052805f81526020015f81525090565b8152602001611e2f60405180604001604052805f81526020015f81525090565b8152602001611e4f60405180604001604052805f81526020015f81525090565b8152602001611e6f60405180604001604052805f81526020015f81525090565b8152602001611e8f60405180604001604052805f81526020015f81525090565b8152602001611eaf60405180604001604052805f81526020015f81525090565b8152602001611ecf60405180604001604052805f81526020015f81525090565b8152602001611eef60405180604001604052805f81526020015f81525090565b81525f6020820181905260409091015290565b80356001600160a01b0381168114611f18575f80fd5b919050565b5f60208284031215611f2d575f80fd5b611c4e82611f02565b5f60208284031215611f46575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b6040516102e081016001600160401b0381118282101715611f8457611f84611f4d565b60405290565b604051601f8201601f191681016001600160401b0381118282101715611fb257611fb2611f4d565b604052919050565b80356001600160401b0381168114611f18575f80fd5b5f60608284031215611fe0575f80fd5b604051606081018181106001600160401b038211171561200257612002611f4d565b60405290508061201183611fba565b815261201f60208401611fba565b6020820152604083013560408201525092915050565b5f60408284031215612045575f80fd5b604051604081018181106001600160401b038211171561206757612067611f4d565b604052823581526020928301359281019290925250919050565b5f808284036104e0811215612094575f80fd5b61209e8585611fd0565b925061048080605f19830112156120b3575f80fd5b6120bb611f61565b91506120ca8660608701612035565b82526120d98660a08701612035565b60208301526120eb8660e08701612035565b60408301526101206120ff87828801612035565b606084015261016061211388828901612035565b60808501526101a061212789828a01612035565b60a08601526101e061213b8a828b01612035565b60c087015261022061214f8b828c01612035565b60e08801526102606121638c828d01612035565b6101008901526102a06121788d828e01612035565b878a015261218a8d6102e08e01612035565b6101408a015261219e8d6103208e01612035565b868a01526121b08d6103608e01612035565b6101808a01526103a08c0135948901949094526103c08b01356101c08901526103e08b0135928801929092526104008a01356102008801526104208a013590870152610440890135610240870152610460890135908601529287013561028085015250506104a0850135908201526104c0909301356102c08401525092909150565b5f8060408385031215612243575f80fd5b61224c83611f02565b91506020808401356001600160401b0380821115612268575f80fd5b818601915086601f83011261227b575f80fd5b81358181111561228d5761228d611f4d565b61229f601f8201601f19168501611f8a565b915080825287848285010111156122b4575f80fd5b80848401858401375f848284010152508093505050509250929050565b803563ffffffff81168114611f18575f80fd5b5f602082840312156122f4575f80fd5b611c4e826122d1565b5f805f80848603610120811215612312575f80fd5b61231c8787611fd0565b94506080605f198201121561232f575f80fd5b50604051608081018181106001600160401b038211171561235257612352611f4d565b8060405250606086013581526080860135602082015260a0860135604082015260c086013560608201528093505061238c60e086016122d1565b915061239b6101008601611f02565b905092959194509250565b5f5b838110156123c05781810151838201526020016123a8565b50505f910152565b602081525f82518060208401526123e68160408501602087016123a6565b601f01601f19169190910160400192915050565b5f806040838503121561240b575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610c9957610c9961241a565b634e487b7160e01b5f52603260045260245ffd5b5f816124635761246361241a565b505f190190565b805f5b6007811015610e9a57815184526020938401939091019060010161246d565b6124a182825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e08401525060808101516101006125048185018380518252602090810151910152565b60a083015191506101406125248186018480518252602090810151910152565b60c084015192506101806125448187018580518252602090810151910152565b60e085015193506101c06125648188018680518252602090810151910152565b928501519350610200926125848785018680518252602090810151910152565b61012086015194506102406125a58189018780518252602090810151910152565b928601519450610280926125c58885018780518252602090810151910152565b61016087015195506102c06125e6818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b5f610a6082019050845182526020850151602083015260408501516126a2604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a08501516101006126ef8185018380518252602090810151910152565b60c0870151915061014061270f8186018480518252602090810151910152565b60e0880151925061018061272f8187018580518252602090810151910152565b9188015192506101c09161274f8684018580518252602090810151910152565b61012089015193506102006127708188018680518252602090810151910152565b918901519350610240916127908784018680518252602090810151910152565b6101608a015194506102806127b18189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e083015261288861050083018561246a565b6128966105e083018461248c565b949350505050565b5f602082840312156128ae575f80fd5b81518015158114611c4e575f80fd5b6001600160401b038281168282160390808211156128dd576128dd61241a565b5092915050565b5f6001600160401b038083168181036128ff576128ff61241a565b6001019392505050565b5f60208284031215612919575f80fd5b5051919050565b5f82516129318184602087016123a6565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a + ///0x6080604052600436106101ba575f3560e01c8063811f853f116100f2578063a1be8d5211610092578063d24d933d11610062578063d24d933d146105e5578063e030330114610614578063f2fde38b14610633578063f9e50d1914610652575f80fd5b8063a1be8d5214610533578063ad3cb1cc14610552578063b2424e3f1461058f578063c23b9e9e146105ad575f80fd5b80638da5cb5b116100cd5780638da5cb5b1461046457806390c14390146104a057806396c1ca61146104bf5780639fdb54a7146104de575f80fd5b8063811f853f146103de578063826e41fc146103fd5780638584d23f14610428575f80fd5b8063426d31941161015d57806369cc6a041161013857806369cc6a0414610383578063715018a614610397578063757c37ad146103ab57806376671808146103ca575f80fd5b8063426d31941461033a5780634f1ef2861461035c57806352d1902d1461036f575f80fd5b80630d8e6e2c116101985780630d8e6e2c1461027e5780632f79889d146102a9578063313df7b1146102e7578063378ec23b1461031e575f80fd5b8063013fa5fc146101be57806302b592f3146101df5780630625e19b1461023c575b5f80fd5b3480156101c9575f80fd5b506101dd6101d8366004612307565b610666565b005b3480156101ea575f80fd5b506101fe6101f9366004612320565b610719565b60405161023394939291906001600160401b039485168152928416602084015292166040820152606081019190915260800190565b60405180910390f35b348015610247575f80fd5b5060055460065460075460085461025e9392919084565b604080519485526020850193909352918301526060820152608001610233565b348015610289575f80fd5b5060408051600181525f6020820181905291810191909152606001610233565b3480156102b4575f80fd5b50600d546102cf90600160c01b90046001600160401b031681565b6040516001600160401b039091168152602001610233565b3480156102f2575f80fd5b50600d54610306906001600160a01b031681565b6040516001600160a01b039091168152602001610233565b348015610329575f80fd5b50435b604051908152602001610233565b348015610345575f80fd5b5060015460025460035460045461025e9392919084565b6101dd61036a3660046123a4565b610762565b34801561037a575f80fd5b5061032c610781565b34801561038e575f80fd5b506101dd61079c565b3480156103a2575f80fd5b506101dd61080a565b3480156103b6575f80fd5b506101dd6103c536600461256d565b61081b565b3480156103d5575f80fd5b506102cf610ae6565b3480156103e9575f80fd5b506101dd6103f8366004612746565b610b10565b348015610408575f80fd5b50600d546001600160a01b031615155b6040519015158152602001610233565b348015610433575f80fd5b50610447610442366004612320565b610c34565b604080519283526001600160401b03909116602083015201610233565b34801561046f575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610306565b3480156104ab575f80fd5b506102cf6104ba3660046127ac565b610d5f565b3480156104ca575f80fd5b506101dd6104d93660046127dd565b610dbc565b3480156104e9575f80fd5b50600b54600c5461050d916001600160401b0380821692600160401b909204169083565b604080516001600160401b03948516815293909216602084015290820152606001610233565b34801561053e575f80fd5b5061041861054d3660046127f6565b610e45565b34801561055d575f80fd5b50610582604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516102339190612831565b34801561059a575f80fd5b505f546102cf906001600160401b031681565b3480156105b8575f80fd5b50600d546105d090600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610233565b3480156105f0575f80fd5b50600954600a5461050d916001600160401b0380821692600160401b909204169083565b34801561061f575f80fd5b5061041861062e366004612863565b610e87565b34801561063e575f80fd5b506101dd61064d366004612307565b610fdf565b34801561065d575f80fd5b50600e5461032c565b61066e611021565b6001600160a01b0381166106955760405163e6c4247b60e01b815260040160405180910390fd5b600d546001600160a01b03908116908216036106c45760405163a863aec960e01b815260040160405180910390fd5b600d80546001600160a01b0319166001600160a01b0383169081179091556040519081527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b600e8181548110610728575f80fd5b5f918252602090912060029091020180546001909101546001600160401b038083169350600160401b8304811692600160801b9004169084565b61076a61107c565b61077382611120565b61077d8282611161565b5050565b5f61078a611222565b505f80516020612e2983398151915290565b6107a4611021565b600d546001600160a01b0316156107ef57600d80546001600160a01b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c02450905f90a1565b60405163a863aec960e01b815260040160405180910390fd5b565b610812611021565b6108085f61126b565b600d546001600160a01b0316151580156108405750600d546001600160a01b03163314155b1561085e576040516301474c8f60e71b815260040160405180910390fd5b600b5483516001600160401b0391821691161115806108975750600b5460208401516001600160401b03600160401b9092048216911611155b156108b55760405163051c46ef60e01b815260040160405180910390fd5b6108c283604001516112db565b5f6108cb610ae6565b60208501515f8054929350916108ea91906001600160401b0316610d5f565b90506108f7826001612897565b6001600160401b0316816001600160401b03161480156109305750600b5461092e90600160401b90046001600160401b0316610e45565b155b801561094457505f826001600160401b0316115b1561096257604051637150de4560e01b815260040160405180910390fd5b61096d826002612897565b6001600160401b0316816001600160401b03161061099e57604051637150de4560e01b815260040160405180910390fd5b6109ab84602001516112db565b6109b884604001516112db565b6109c584606001516112db565b6109d085858561134b565b8451600b805460208801516001600160401b03818116600160401b026001600160801b03199093169416939093171790556040860151600c55610a1290610e45565b15610a7c5783516005556020840151600655604084015160075560608401516008557f31eabd9099fdb25dacddd206abff87311e553441fc9d0fcdef201062d7e7071b610a60826001612897565b6040516001600160401b03909116815260200160405180910390a15b610a874342876114a3565b84602001516001600160401b0316855f01516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae68760400151604051610ad791815260200190565b60405180910390a35050505050565b600b545f80549091610b0b916001600160401b03600160401b90920482169116610d5f565b905090565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610b545750825b90505f826001600160401b03166001148015610b6f5750303b155b905081158015610b7d575080155b15610b9b5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610bc557845460ff60401b1916600160401b1785555b610bce8761168c565b610bd661169d565b610be28a8a8a896116a5565b8315610c2857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b600e80545f91829190610c486001836128be565b81548110610c5857610c586128d1565b5f918252602090912060029091020154600160801b90046001600160401b03168410610c9757604051631856a49960e21b815260040160405180910390fd5b600d54600160c01b90046001600160401b03165b81811015610d585784600e8281548110610cc757610cc76128d1565b5f918252602090912060029091020154600160801b90046001600160401b03161115610d5057600e8181548110610d0057610d006128d1565b905f5260205f20906002020160010154600e8281548110610d2357610d236128d1565b905f5260205f2090600202015f0160109054906101000a90046001600160401b0316935093505050915091565b600101610cab565b5050915091565b5f816001600160401b03165f03610d7757505f610db6565b610d8182846128f9565b6001600160401b03165f03610da157610d9a828461291e565b9050610db6565b610dab828461291e565b610d9a906001612897565b92915050565b610dc4611021565b610e108163ffffffff161080610de357506301e133808163ffffffff16115b80610e015750600d5463ffffffff600160a01b909104811690821611155b15610e1f576040516307a5077760e51b815260040160405180910390fd5b600d805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b5f816001600160401b03165f03610e5d57505f919050565b5f54610e72906001600160401b0316836128f9565b6001600160401b03161592915050565b919050565b600e545f9043841180610e98575080155b80610ee25750600d54600e80549091600160c01b90046001600160401b0316908110610ec657610ec66128d1565b5f9182526020909120600290910201546001600160401b031684105b15610f005760405163b0b4387760e01b815260040160405180910390fd5b5f8080610f0e6001856128be565b90505b81610faa57600d54600160c01b90046001600160401b03168110610faa5786600e8281548110610f4357610f436128d1565b5f9182526020909120600290910201546001600160401b031611610f985760019150600e8181548110610f7857610f786128d1565b5f9182526020909120600290910201546001600160401b03169250610faa565b80610fa281612943565b915050610f11565b81610fc85760405163b0b4387760e01b815260040160405180910390fd5b85610fd384896128be565b11979650505050505050565b610fe7611021565b6001600160a01b03811661101557604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61101e8161126b565b50565b336110537f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146108085760405163118cdaa760e01b815233600482015260240161100c565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061110257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166110f65f80516020612e29833981519152546001600160a01b031690565b6001600160a01b031614155b156108085760405163703e46dd60e11b815260040160405180910390fd5b611128611021565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d9060200161070e565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156111bb575060408051601f3d908101601f191682019092526111b891810190612958565b60015b6111e357604051634c9c8ce360e01b81526001600160a01b038316600482015260240161100c565b5f80516020612e29833981519152811461121357604051632a87526960e21b81526004810182905260240161100c565b61121d838361181f565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108085760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181108061077d5760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c640000000000604482015260640161100c565b5f611354611874565b905061135e61206c565b84516001600160401b0390811682526020808701805190921690830152604080870151908301526006546060830152600754608083015260085460a083015260055460c0830152516113af90610e45565b156113e157602084015160e0820152604084015161010082015260608401516101208201528351610140820152611405565b60065460e08201526007546101008201526008546101208201526005546101408201525b60405163fc8660c760e01b8152735fbdb2315678afecb367f032d93f642f64180aa39063fc8660c79061144090859085908890600401612b7b565b602060405180830381865af415801561145b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061147f9190612da9565b61149c576040516309bde33960e01b815260040160405180910390fd5b5050505050565b600e54158015906115185750600d54600e8054600160a01b830463ffffffff1692600160c01b90046001600160401b03169081106114e3576114e36128d1565b5f91825260209091206002909102015461150d90600160401b90046001600160401b031684612dc8565b6001600160401b0316115b156115ab57600d54600e80549091600160c01b90046001600160401b0316908110611545576115456128d1565b5f9182526020822060029091020180546001600160c01b031916815560010155600d8054600160c01b90046001600160401b031690601861158583612de8565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516080810182526001600160401b03948516815292841660208085019182528301518516848301908152929091015160608401908152600e80546001810182555f91909152935160029094027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd81018054935194518716600160801b0267ffffffffffffffff60801b19958816600160401b026001600160801b03199095169690971695909517929092179290921693909317909155517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe90910155565b611694611e9f565b61101e81611ee8565b610808611e9f565b83516001600160401b03161515806116c9575060208401516001600160401b031615155b806116d657506020830151155b806116e357506040830151155b806116f057506060830151155b806116fa57508251155b8061170c5750610e108263ffffffff16105b8061172057506301e133808263ffffffff16115b8061173257506001600160401b038116155b15611750576040516350dd03f760e11b815260040160405180910390fd5b8351600980546020808801516001600160401b03908116600160401b026001600160801b03199384169582169586178117909455604098890151600a819055600b8054909416909517909317909155600c92909255845160018190559185015160028190559585015160038190556060909501516004819055600592909255600695909555600793909355600892909255600d805463ffffffff909216600160a01b0263ffffffff60a01b199092169190911790555f80549190921667ffffffffffffffff1991909116179055565b61182882611ef0565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561186c5761121d8282611f53565b61077d611fc5565b61187c61208b565b621000008152600b60208201527f26867ee58aaf860fc9e0e3a78666ffc51f3ba1ad8ae001c196830c55b5af0b8c6040820151527f091230adb753f82815151277060cc56b546bb2e950a0de19ed061ec68c071a906020604083015101527f02a509a06d8c56f83f204688ff6e42eac6e3cbdd063b0971a3af953e81badbb66060820151527f06f43ed2b9cece35d1201abc13ffdaea35560cf0f1446277138ce812b9ad9f396020606083015101527f1a588c99ad88f789c87722b061bb5535daa0abcc1dc6d176d7fea51e5d80b9266080820151527f2062b995e61a6ab8aab6cd6e7520b879d84f965ab1f094c104f0c1213b28038b6020608083015101527f21a2fd766a0cebecfdbfdfe56139a1bbd9aec15e2e35be8ef01934a0ec43868560a0820151527f20fe500ac7d1aa7820db8c6f7f9d509e3b2e88731e3a12dd65f06f43ca930da0602060a083015101527f0ab53d1285c7f4819b3ff6e1ddada6bf2515d34bbaf61186c6a04be47dfd65a360c0820151527f0b80a9878082cdfdd9fcc16bb33fa424c0ad66b81949bf642153d3c7ad082f22602060c083015101527f1b900f8e5f8e8064a5888a1bd796b54a2652fc02034fe4b6e6fc8d6650f7453b60e0820151527ecca258a8832c64d1f8e1721a78fc25b13d29adbb81e35a79fc2f49f8902786602060e083015101527f0d1d3348d642e6f2e9739d735d8c723676dbaefdcbb4e96641defa353d26ebb3610100820151527f14fe9d6a335104e7491ca6d5086113e6b0f52946960d726664667bd58539d41e602061010083015101527f1da94364440c4e3fb8af2d363cdefa4edda437579e1b056a16a5e9a11dffa2ab610120820151527f0a077bd307ed31222db55cb0128bafce5e22557b57f5ac915359c50296cb5c77602061012083015101527f28ff80b133d989235c7129dea54469b780ac4717449290067e7c9a7d5be7dbd5610140820151527f1c0fc22eef23b50a2ddc553f9fc1b61fd8c57a58ca321a829c7ec255f757b3a6602061014083015101527e3c4e21e5dfba62a5b1702fb0ef234bfe95a77701a456882350526d140243f5610160820151527f06012db82876ba33e6e8f80a51013662e56c4abc86a7d85c272e19a6d7f57d0b602061016083015101527f16d5247dbdeae1df70093e5ee77272959661e0fbabda431777fa729f5b532f44610180820151527e8d9ee00f799cf00608b082d03b9de5a42b8126c35fbfbd1e602108df10e0e3602061018083015101527f2f526c6981643ff6f6e9d2b5a921e06cf95f274629b5a145bd552b7fda6a87006101a0820151527f2fe7108fd4e24231f3dadb6e09072e106fca0694fe39dff96557a88221a89a5060206101a083015101527f26a3568598a6981e6325f4816736e381087b5b0e4b27ef364d8ae1e29fe9df996101c0820151527f1db81cdf82a9ec99f3c9716df22d38317e6bb84fc57d2f0e7b2bc8a0569f7cc460206101c083015101527e99888088e11de6ed086c99b9bba986d908df5b0c5007680d97567d485719946101e0820151527f1f91576eadffff932b6e54bab022f93f6fec3e5b7674d0006bc5f2223527a34860206101e083015101527e68b3c117ee7e84d6b670b6af20197759ec80d34f3c594328663031e9cd7e02610200820151527f1c3832e24877346680e7047bae2cfcd51fafe3e7caf199e9dfc8e8f10c2b6943602061020083015101527f164cdd9ad5d4e96e109073e8e735cd4ac64aba6ddaa244da6701369c8cba5daf610220820151527f16c41e647f1ab0d45c891544299e4ef9c004d8bc0a3bf096dc38ce8ed90c0d67602061022083015101527f134ba7a9567ba20e1f35959ee8c2cd688d3a962bb1797e8ab8e511768de0ce83610240820151527f02e4d286c9435f7bd94c1a2c78b99966d06faca1ae45de78149950a4fefcd6e7602061024083015101527f039a0b2d920f29e35cb2a9e1ec6cc22ac1d482af45e47399724a0745d542e839610260820151527f15ac2658bfdd2227aebf8e20935935a648819e1dcea807da1c838abfa7896c63602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661080857604051631afcd79f60e31b815260040160405180910390fd5b610fe7611e9f565b806001600160a01b03163b5f03611f2557604051634c9c8ce360e01b81526001600160a01b038216600482015260240161100c565b5f80516020612e2983398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b031684604051611f6f9190612e0d565b5f60405180830381855af49150503d805f8114611fa7576040519150601f19603f3d011682016040523d82523d5f602084013e611fac565b606091505b5091509150611fbc858383611fe4565b95945050505050565b34156108085760405163b398979f60e01b815260040160405180910390fd5b606082611ff957611ff482612043565b61203c565b815115801561201057506001600160a01b0384163b155b1561203957604051639996b31560e01b81526001600160a01b038516600482015260240161100c565b50805b9392505050565b8051156120535780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b604051806101600160405280600b906020820280368337509192915050565b604051806102c001604052805f81526020015f81526020016120be60405180604001604052805f81526020015f81525090565b81526020016120de60405180604001604052805f81526020015f81525090565b81526020016120fe60405180604001604052805f81526020015f81525090565b815260200161211e60405180604001604052805f81526020015f81525090565b815260200161213e60405180604001604052805f81526020015f81525090565b815260200161215e60405180604001604052805f81526020015f81525090565b815260200161217e60405180604001604052805f81526020015f81525090565b815260200161219e60405180604001604052805f81526020015f81525090565b81526020016121be60405180604001604052805f81526020015f81525090565b81526020016121de60405180604001604052805f81526020015f81525090565b81526020016121fe60405180604001604052805f81526020015f81525090565b815260200161221e60405180604001604052805f81526020015f81525090565b815260200161223e60405180604001604052805f81526020015f81525090565b815260200161225e60405180604001604052805f81526020015f81525090565b815260200161227e60405180604001604052805f81526020015f81525090565b815260200161229e60405180604001604052805f81526020015f81525090565b81526020016122be60405180604001604052805f81526020015f81525090565b81526020016122de60405180604001604052805f81526020015f81525090565b81525f6020820181905260409091015290565b80356001600160a01b0381168114610e82575f80fd5b5f60208284031215612317575f80fd5b61203c826122f1565b5f60208284031215612330575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b6040516102e081016001600160401b038111828210171561236e5761236e612337565b60405290565b604051601f8201601f191681016001600160401b038111828210171561239c5761239c612337565b604052919050565b5f80604083850312156123b5575f80fd5b6123be836122f1565b91506020808401356001600160401b03808211156123da575f80fd5b818601915086601f8301126123ed575f80fd5b8135818111156123ff576123ff612337565b612411601f8201601f19168501612374565b91508082528784828501011115612426575f80fd5b80848401858401375f848284010152508093505050509250929050565b80356001600160401b0381168114610e82575f80fd5b5f60608284031215612469575f80fd5b604051606081018181106001600160401b038211171561248b5761248b612337565b60405290508061249a83612443565b81526124a860208401612443565b6020820152604083013560408201525092915050565b5f608082840312156124ce575f80fd5b604051608081018181106001600160401b03821117156124f0576124f0612337565b8060405250809150823581526020830135602082015260408301356040820152606083013560608201525092915050565b5f60408284031215612531575f80fd5b604051604081018181106001600160401b038211171561255357612553612337565b604052823581526020928301359281019290925250919050565b5f805f838503610560811215612581575f80fd5b61258b8686612459565b935061259a86606087016124be565b92506104808060df19830112156125af575f80fd5b6125b761234b565b91506125c68760e08801612521565b82526101206125d788828901612521565b60208401526101606125eb89828a01612521565b60408501526101a06125ff8a828b01612521565b60608601526101e06126138b828c01612521565b60808701526102206126278c828d01612521565b60a088015261026061263b8d828e01612521565b60c08901526102a061264f8e828f01612521565b60e08a01526126628e6102e08f01612521565b6101008a01526126768e6103208f01612521565b878a01526126888e6103608f01612521565b6101408a015261269c8e6103a08f01612521565b868a01526126ae8e6103e08f01612521565b6101808a01526104208d0135858a01526104408d01356101c08a01526104608d0135848a0152878d01356102008a01526104a08d0135838a01526104c08d01356102408a01526104e08d0135828a01526105008d01356102808a01526105208d0135818a015250505050505050506105408501356102c0820152809150509250925092565b803563ffffffff81168114610e82575f80fd5b5f805f805f610140868803121561275b575f80fd5b6127658787612459565b945061277487606088016124be565b935061278260e08701612733565b925061279161010087016122f1565b91506127a06101208701612443565b90509295509295909350565b5f80604083850312156127bd575f80fd5b6127c683612443565b91506127d460208401612443565b90509250929050565b5f602082840312156127ed575f80fd5b61203c82612733565b5f60208284031215612806575f80fd5b61203c82612443565b5f5b83811015612829578181015183820152602001612811565b50505f910152565b602081525f825180602084015261284f81604085016020870161280f565b601f01601f19169190910160400192915050565b5f8060408385031215612874575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038181168382160190808211156128b7576128b7612883565b5092915050565b81810381811115610db657610db6612883565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f6001600160401b0380841680612912576129126128e5565b92169190910692915050565b5f6001600160401b0380841680612937576129376128e5565b92169190910492915050565b5f8161295157612951612883565b505f190190565b5f60208284031215612968575f80fd5b5051919050565b805f5b600b811015612991578151845260209384019390910190600101612972565b50505050565b6129ac82825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e0840152506080810151610100612a0f8185018380518252602090810151910152565b60a08301519150610140612a2f8186018480518252602090810151910152565b60c08401519250610180612a4f8187018580518252602090810151910152565b60e085015193506101c0612a6f8188018680518252602090810151910152565b92850151935061020092612a8f8785018680518252602090810151910152565b6101208601519450610240612ab08189018780518252602090810151910152565b92860151945061028092612ad08885018780518252602090810151910152565b61016087015195506102c0612af1818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b5f610ae08201905084518252602085015160208301526040850151612bad604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a0850151610100612bfa8185018380518252602090810151910152565b60c08701519150610140612c1a8186018480518252602090810151910152565b60e08801519250610180612c3a8187018580518252602090810151910152565b9188015192506101c091612c5a8684018580518252602090810151910152565b6101208901519350610200612c7b8188018680518252602090810151910152565b91890151935061024091612c9b8784018680518252602090810151910152565b6101608a01519450610280612cbc8189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e0830152612d9361050083018561296f565b612da1610660830184612997565b949350505050565b5f60208284031215612db9575f80fd5b8151801515811461203c575f80fd5b6001600160401b038281168282160390808211156128b7576128b7612883565b5f6001600160401b03808316818103612e0357612e03612883565b6001019392505050565b5f8251612e1e81846020870161280f565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a /// ``` #[rustfmt::skip] #[allow(clippy::all)] pub static DEPLOYED_BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( - b"`\x80`@R`\x046\x10a\x01GW_5`\xE0\x1C\x80c\x82nA\xFC\x11a\0\xB3W\x80c\xAD<\xB1\xCC\x11a\0mW\x80c\xAD<\xB1\xCC\x14a\x04jW\x80c\xC2;\x9E\x9E\x14a\x04\xA7W\x80c\xD2M\x93=\x14a\x04\xDFW\x80c\xE003\x01\x14a\x05\x0EW\x80c\xF2\xFD\xE3\x8B\x14a\x05-W\x80c\xF9\xE5\r\x19\x14a\x05LW_\x80\xFD[\x80c\x82nA\xFC\x14a\x034W\x80c\x85\x84\xD2?\x14a\x03_W\x80c\x8D\xA5\xCB[\x14a\x03\x9BW\x80c\x96\xC1\xCAa\x14a\x03\xD7W\x80c\x9B\xAA<\xC9\x14a\x03\xF6W\x80c\x9F\xDBT\xA7\x14a\x04\x15W_\x80\xFD[\x80c7\x8E\xC2;\x11a\x01\x04W\x80c7\x8E\xC2;\x14a\x02\x88W\x80cBm1\x94\x14a\x02\xA4W\x80cO\x1E\xF2\x86\x14a\x02\xE5W\x80cR\xD1\x90-\x14a\x02\xF8W\x80ci\xCCj\x04\x14a\x03\x0CW\x80cqP\x18\xA6\x14a\x03 W_\x80\xFD[\x80c\x01?\xA5\xFC\x14a\x01KW\x80c\x02\xB5\x92\xF3\x14a\x01lW\x80c\r\x8En,\x14a\x01\xC9W\x80c c\xD4\xF7\x14a\x01\xF4W\x80c/y\x88\x9D\x14a\x02\x13W\x80c1=\xF7\xB1\x14a\x02QW[_\x80\xFD[4\x80\x15a\x01VW_\x80\xFD[Pa\x01ja\x01e6`\x04a\x1F\x1DV[a\x05`V[\0[4\x80\x15a\x01wW_\x80\xFD[Pa\x01\x8Ba\x01\x866`\x04a\x1F6V[a\x06\x13V[`@Qa\x01\xC0\x94\x93\x92\x91\x90`\x01`\x01`@\x1B\x03\x94\x85\x16\x81R\x92\x84\x16` \x84\x01R\x92\x16`@\x82\x01R``\x81\x01\x91\x90\x91R`\x80\x01\x90V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xD4W_\x80\xFD[P`@\x80Q`\x01\x81R_` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01a\x01\xC0V[4\x80\x15a\x01\xFFW_\x80\xFD[Pa\x01ja\x02\x0E6`\x04a \x81V[a\x06\\V[4\x80\x15a\x02\x1EW_\x80\xFD[P`\x08Ta\x029\x90`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x81V[`@Q`\x01`\x01`@\x1B\x03\x90\x91\x16\x81R` \x01a\x01\xC0V[4\x80\x15a\x02\\W_\x80\xFD[P`\x08Ta\x02p\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x01\xC0V[4\x80\x15a\x02\x93W_\x80\xFD[PC[`@Q\x90\x81R` \x01a\x01\xC0V[4\x80\x15a\x02\xAFW_\x80\xFD[P_T`\x01T`\x02T`\x03Ta\x02\xC5\x93\x92\x91\x90\x84V[`@\x80Q\x94\x85R` \x85\x01\x93\x90\x93R\x91\x83\x01R``\x82\x01R`\x80\x01a\x01\xC0V[a\x01ja\x02\xF36`\x04a\"2V[a\x07\xB6V[4\x80\x15a\x03\x03W_\x80\xFD[Pa\x02\x96a\x07\xD5V[4\x80\x15a\x03\x17W_\x80\xFD[Pa\x01ja\x07\xF0V[4\x80\x15a\x03+W_\x80\xFD[Pa\x01ja\x08^V[4\x80\x15a\x03?W_\x80\xFD[P`\x08T`\x01`\x01`\xA0\x1B\x03\x16\x15\x15[`@Q\x90\x15\x15\x81R` \x01a\x01\xC0V[4\x80\x15a\x03jW_\x80\xFD[Pa\x03~a\x03y6`\x04a\x1F6V[a\x08oV[`@\x80Q\x92\x83R`\x01`\x01`@\x1B\x03\x90\x91\x16` \x83\x01R\x01a\x01\xC0V[4\x80\x15a\x03\xA6W_\x80\xFD[P\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16a\x02pV[4\x80\x15a\x03\xE2W_\x80\xFD[Pa\x01ja\x03\xF16`\x04a\"\xE4V[a\t\x9AV[4\x80\x15a\x04\x01W_\x80\xFD[Pa\x01ja\x04\x106`\x04a\"\xFDV[a\n#V[4\x80\x15a\x04 W_\x80\xFD[P`\x06T`\x07Ta\x04D\x91`\x01`\x01`@\x1B\x03\x80\x82\x16\x92`\x01`@\x1B\x90\x92\x04\x16\x90\x83V[`@\x80Q`\x01`\x01`@\x1B\x03\x94\x85\x16\x81R\x93\x90\x92\x16` \x84\x01R\x90\x82\x01R``\x01a\x01\xC0V[4\x80\x15a\x04uW_\x80\xFD[Pa\x04\x9A`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\x01\xC0\x91\x90a#\xC8V[4\x80\x15a\x04\xB2W_\x80\xFD[P`\x08Ta\x04\xCA\x90`\x01`\xA0\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81V[`@Qc\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01a\x01\xC0V[4\x80\x15a\x04\xEAW_\x80\xFD[P`\x04T`\x05Ta\x04D\x91`\x01`\x01`@\x1B\x03\x80\x82\x16\x92`\x01`@\x1B\x90\x92\x04\x16\x90\x83V[4\x80\x15a\x05\x19W_\x80\xFD[Pa\x03Oa\x05(6`\x04a#\xFAV[a\x0BEV[4\x80\x15a\x058W_\x80\xFD[Pa\x01ja\x05G6`\x04a\x1F\x1DV[a\x0C\x9FV[4\x80\x15a\x05WW_\x80\xFD[P`\tTa\x02\x96V[a\x05ha\x0C\xE1V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x05\x8FW`@Qc\xE6\xC4${`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x08T`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x90\x82\x16\x03a\x05\xBEW`@Qc\xA8c\xAE\xC9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x08\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x81\x17\x90\x91U`@Q\x90\x81R\x7F\x80\x17\xBB\x88\x7F\xDF\x8F\xCAC\x14\xA9\xD4\x0Fns\xB3\xB8\x10\x02\xD6~\\\xFA\x85\xD8\x81s\xAFj\xA4`r\x90` \x01[`@Q\x80\x91\x03\x90\xA1PV[`\t\x81\x81T\x81\x10a\x06\"W_\x80\xFD[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01\x80T`\x01\x90\x91\x01T`\x01`\x01`@\x1B\x03\x80\x83\x16\x93P`\x01`@\x1B\x83\x04\x81\x16\x92`\x01`\x80\x1B\x90\x04\x16\x90\x84V[`\x08T`\x01`\x01`\xA0\x1B\x03\x16\x15\x15\x80\x15a\x06\x81WP`\x08T`\x01`\x01`\xA0\x1B\x03\x163\x14\x15[\x15a\x06\x9FW`@Qc\x01GL\x8F`\xE7\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x06T\x82Q`\x01`\x01`@\x1B\x03\x91\x82\x16\x91\x16\x11\x15\x80a\x06\xD8WP`\x06T` \x83\x01Q`\x01`\x01`@\x1B\x03`\x01`@\x1B\x90\x92\x04\x82\x16\x91\x16\x11\x15[\x15a\x06\xF6W`@Qc\x05\x1CF\xEF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x07\x03\x82`@\x01Qa\r#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16_\x81\x15\x80\x15a\ngWP\x82[\x90P_\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\n\x82WP0;\x15[\x90P\x81\x15\x80\x15a\n\x90WP\x80\x15[\x15a\n\xAEW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\n\xD8W\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\n\xE1\x86a\x12\xE8V[a\n\xE9a\x12\xF9V[a\n\xF4\x89\x89\x89a\x13\x01V[\x83\x15a\x0B:W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPPPV[`\tT_\x90C\x84\x11\x80a\x0BVWP\x80\x15[\x80a\x0B\xA0WP`\x08T`\t\x80T\x90\x91`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x0B\x84Wa\x0B\x84a$AV[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x84\x10[\x15a\x0B\xBEW`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_\x80\x80a\x0B\xCC`\x01\x85a$.V[\x90P[\x81a\x0ChW`\x08T`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x81\x10a\x0ChW\x86`\t\x82\x81T\x81\x10a\x0C\x01Wa\x0C\x01a$AV[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x11a\x0CVW`\x01\x91P`\t\x81\x81T\x81\x10a\x0C6Wa\x0C6a$AV[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x92Pa\x0ChV[\x80a\x0C`\x81a$UV[\x91PPa\x0B\xCFV[\x81a\x0C\x86W`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x85a\x0C\x91\x84\x89a$.V[\x11\x94PPPPP[\x92\x91PPV[a\x0C\xA7a\x0C\xE1V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x0C\xD5W`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R_`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[a\x0C\xDE\x81a\x12xV[PV[3a\r\x13\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\x08\\W`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R3`\x04\x82\x01R`$\x01a\x0C\xCCV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x81\x10\x80a\x07\xD1W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01a\x0C\xCCV[_a\r\xB5a\x14-V[\x90Pa\r\xBFa\x1C~V[\x83Q`\x01`\x01`@\x1B\x03\x90\x81\x16\x82R` \x85\x01Q\x16\x81`\x01` \x02\x01R`@\x84\x81\x01Q\x82\x82\x01R`\x01T``\x83\x01R`\x02T`\x80\x83\x01R`\x03T`\xA0\x83\x01R_T`\xC0\x83\x01RQc\xCESzw`\xE0\x1B\x81Rs_\xBD\xB21Vx\xAF\xEC\xB3g\xF02\xD9?d/d\x18\n\xA3\x90c\xCESzw\x90a\x0E>\x90\x85\x90\x85\x90\x88\x90`\x04\x01a&pV[` `@Q\x80\x83\x03\x81\x86Z\xF4\x15\x80\x15a\x0EYW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0E}\x91\x90a(\x9EV[a\x0E\x9AW`@Qc\t\xBD\xE39`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPV[`\tT\x15\x80\x15\x90a\x0F\x15WP`\x08T`\t\x80T`\x01`\xA0\x1B\x83\x04c\xFF\xFF\xFF\xFF\x16\x92`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x0E\xE0Wa\x0E\xE0a$AV[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01Ta\x0F\n\x90`\x01`@\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x84a(\xBDV[`\x01`\x01`@\x1B\x03\x16\x11[\x15a\x0F\xA8W`\x08T`\t\x80T\x90\x91`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x0FBWa\x0FBa$AV[_\x91\x82R` \x82 `\x02\x90\x91\x02\x01\x80T`\x01`\x01`\xC0\x1B\x03\x19\x16\x81U`\x01\x01U`\x08\x80T`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90`\x18a\x0F\x82\x83a(\xE4V[\x91\x90a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UPP[`@\x80Q`\x80\x81\x01\x82R`\x01`\x01`@\x1B\x03\x94\x85\x16\x81R\x92\x84\x16` \x80\x85\x01\x91\x82R\x83\x01Q\x85\x16\x84\x83\x01\x90\x81R\x92\x90\x91\x01Q``\x84\x01\x90\x81R`\t\x80T`\x01\x81\x01\x82U_\x91\x90\x91R\x93Q`\x02\x90\x94\x02\x7Fn\x15@\x17\x1Bl\x0C\x96\x0Bq\xA7\x02\r\x9F`\x07\x7Fj\xF91\xA8\xBB\xF5\x90\xDA\x02#\xDA\xCFu\xC7\xAF\x81\x01\x80T\x93Q\x94Q\x87\x16`\x01`\x80\x1B\x02g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`\x80\x1B\x19\x95\x88\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x95\x16\x96\x90\x97\x16\x95\x90\x95\x17\x92\x90\x92\x17\x92\x90\x92\x16\x93\x90\x93\x17\x90\x91UQ\x7Fn\x15@\x17\x1Bl\x0C\x96\x0Bq\xA7\x02\r\x9F`\x07\x7Fj\xF91\xA8\xBB\xF5\x90\xDA\x02#\xDA\xCFu\xC7\xB0\x90\x91\x01UV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a\x11\x0FWP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a\x11\x03_\x80Q` a)<\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x08\\W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x115a\x0C\xE1V[`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x81R\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x90` \x01a\x06\x08V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x11\xC8WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x11\xC5\x91\x81\x01\x90a)\tV[`\x01[a\x11\xF0W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x0C\xCCV[_\x80Q` a)<\x839\x81Q\x91R\x81\x14a\x12 W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0C\xCCV[a\x12*\x83\x83a\x1A\\V[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\x08\\W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T`\x01`\x01`\xA0\x1B\x03\x19\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90_\x90\xA3PPPV[a\x12\xF0a\x1A\xB1V[a\x0C\xDE\x81a\x1A\xFAV[a\x08\\a\x1A\xB1V[\x82Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80a\x13%WP` \x83\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80a\x132WP` \x82\x01Q\x15[\x80a\x13?WP`@\x82\x01Q\x15[\x80a\x13LWP``\x82\x01Q\x15[\x80a\x13VWP\x81Q\x15[\x80a\x13hWPa\x0E\x10\x81c\xFF\xFF\xFF\xFF\x16\x10[\x80a\x13|WPc\x01\xE13\x80\x81c\xFF\xFF\xFF\xFF\x16\x11[\x15a\x13\x9AW`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x82Q`\x04\x80T` \x80\x87\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x93\x84\x16\x91\x90\x95\x16\x90\x81\x17\x85\x17\x90\x93U`@\x96\x87\x01Q`\x05\x81\x90U\x86Q_U\x90\x86\x01Q`\x01U\x95\x85\x01Q`\x02U``\x90\x94\x01Q`\x03U`\x06\x80T\x90\x94\x16\x17\x17\x90\x91U`\x07\x91\x90\x91U`\x08\x80Tc\xFF\xFF\xFF\xFF\x90\x92\x16`\x01`\xA0\x1B\x02c\xFF\xFF\xFF\xFF`\xA0\x1B\x19\x90\x92\x16\x91\x90\x91\x17\x90UV[a\x145a\x1C\x9CV[b\x10\0\0\x81R`\x07` \x82\x01R\x7F#x=\x0E\x97w\xB7\xAFe\xFB\xF8I\xDA~\xDBu\xE7K\x1E\xAFP>\x02]\x7F/\x7F\x80\x99\x1B\xEF\xA2`@\x82\x01QR\x7F*N/\xE8\xAD\xFAS\xF4hRU\x82\xD5\x18LLp\xBB\xDB\x94l!\xF2\x16A\x8A\x98yp^T\xA7` `@\x83\x01Q\x01R\x7F\x06$\xB2\xC1\xE7\x7F$\xAF\xCE\xAF9E\x17C\xB9\xFA\x80\xD5\x85?\xCA{\xA0\x03\x89\xC6ue\x07t\0\x9B``\x82\x01QR\x7F%\rw\x19\xE9L\xA2\xDF\0\xDF\xE3'\x93\x8FZ\x8DM\x83wy\xB9\x987\xCAwzS\xD3\x91'\xB1y` ``\x83\x01Q\x01R\x7F\r\xC0\x95\x15\x15.\xAE\xA6m\r\xB2\xF5q\xCC\x99^6\x9D&\xFEds\x94\xF1\r\xB59\x8C\x91u\x19\xDC`\x80\x82\x01QR\x7F\x12s\x14Ml\xEC,Jh\xB2J\x14\x93y\xC0\xF5Y+\xB7\xFB\xDD\xBE2\xFA\x17\x19\x19\x95\x0C\xA4\x04\xCB` `\x80\x83\x01Q\x01R\x7F\x11\x95!\xBBh\xCA\xEC!n/\x05\xEE\xB4f\xFB:\xBF\xE1\xF3\x9B\xAF\x7F\xE7\xCB9.\xA0W\xB6\xA2\xD9\xBF`\xA0\x82\x01QR\x7F-R\xAD\xEA\xBA\x80E\xE5:\xB5&\xFE\x99\x82\xD0\xEAE-\xEFk>\xA0%='\xA1\x9E\xF3\xB4n\x84(` `\xA0\x83\x01Q\x01R\x7F\x16\xC3\xB5\xB2\x17\xD3\x02\x97Z\x92\r\x137E$\xD7\xA5.JP\xFD\x7F\xB90\x84\"q\xEB\xF4\xA8N\xFD`\xC0\x82\x01QR\x7F \x07\x88\x91k\x90{\x19ir\xBD\xE3\x041\x8E\x88Z%!QK-\xB5\xE4\xA1\x18\x99\xC5\x12\x04\xF0\x89` `\xC0\x83\x01Q\x01R\x7F\x11'X\x1A\xFEu=\xEF\xCA\x9A\xEF\x12\xE73-\xB9\x97\x8A \x0B\x16\x99\xCE8\x88\xC0\xF3\xAE\xA6\x11\x1D\xC3`\xE0\x82\x01QR\x7F\x08\x81\xE1?\0r;\xE1\xA0Hr\xED\x02\xB2\xD0x\xC3\x1E\x80\xFE\xAF'rN&,\xE9|,\xB0\xBB\x1D` `\xE0\x83\x01Q\x01R\x7F\x14\x82\xA3\xA6\xBB\x91\xD6H=\x156\x83\xE2@O/UF\xE0\xE8\x95S\x0F\xDF\x13 \x91I\x84\x06\xE3\xDEa\x01\0\x82\x01QR~\xFAR\xDB=R\xD9\x05\xEA\xD1$\x81\x02\xF3\xA8\nC\xA9\r\x84\0\xC6\x8F`\xA6,T\xC7\x18u\xD8\xDD\xC3UFXd\x0C\xC9U\x01a\x01\xC0\x82\x01QR\x7F$:\x99\xD8\r2\xEBT\x08\xB5\x9D[\x080+\xED\xE0p\xD3\xFB\n\x8E\xFE/\"b\xF8e\xBF\xFBM\r` a\x01\xC0\x83\x01Q\x01R\x7F\x04U\xD22[\xF6&\x9Af\xF0}\x83\x8FU\xF3iG\xA3\xCD\x9B\x87\xED\xD8H\x0B\xCE\xD9\\\xBBE\xCC\x11a\x01\xE0\x82\x01QR\x7F\x0Ff\xD9\x08Zn\xD6\x0B\x83\x81y\x98~$\t\x92\xBF\xF4\xC0Ql\xCFl\xCD\xE4\xA1\xCA\x94\xCE\x8B\x98d` a\x01\xE0\x83\x01Q\x01R\x7F+\xAC\r#\xC8X]\x14\x87\xECa\x1B^\xFF\xC9~XR\xFE\xA4:|\xBA6\xCC\xDD, y1\xF3\x94a\x02\0\x82\x01QR\x7F\x18`\xB5N\x01\xA0j\xEAZ\xDBK\x13\xBF[\xAE\xBA\xB9+sh\x07\xA3\xA8\x9F\xF2\x04\t\x92\xB0n\xE6\xEC` a\x02\0\x83\x01Q\x01R\x7F\x0C\x0B\xFA\x1C/\xC6\xF8\xED\x01#=Qh\xDB\x1E\x1D\xFErU\x04\xF02\xF6i\xF5\n\x92\xAEw\xC7)\x06a\x02 \x82\x01QR\x7F\rt\x1E\x12L}\x10i\xB8\xA4\0\xCB\xCD\xCF\xD9\x01(\xA53\x90\x1A\xD4\xDE\x1E\x03\x7F\xE7)\x84\xDC4\xCF` a\x02 \x83\x01Q\x01R\x7F\x01\xCF\xED0\x08\\\x9E\xFC\xE0Fh W\x94\xAA9\xB1\xA8\xEEY\x124\xB4\xC7z\"\xF8\xC2m\x89\x9E\x05a\x02@\x82\x01QR\x7F*\xB6\x8A\xC8-6\xCE\xDBd}\x14\xA5\xB0\x03^\x8C\x9A\x0B\xE8G\x80\xB7\xBA\xE1\x13:'\xA8\x80\x96n\xD1` a\x02@\x83\x01Q\x01R\x7F\x07.\x1DP\xF8\xB5\xCF\x8DWK8G'dw\xD9[\xBDQ\x165\x10\0\x84\x1Fr\x8D\xA4O@C\xB5a\x02`\x82\x01QR\x7F#\xF8\xEAn\xAC\xD0\x87mW\"\x0FW\xEA\xBA\xCB\xE7j##A\x16cs\x1A%\x1D]\xCA6\xF1\xB5\x9F` a\x02`\x83\x01Q\x01R\x7F\xB0\x83\x88\x93\xEC\x1F#~\x8B\x072;\x07DY\x9FN\x97\xB5\x98\xB3\xB5\x89\xBC\xC2\xBC7\xB8\xD5\xC4\x18\x01a\x02\x80\x82\x01R\x7F\xC1\x83\x93\xC0\xFA0\xFEN\x8B\x03\x8E5z\xD8Q\xEA\xE8\xDE\x91\x07XN\xFF\xE7\xC7\xF1\xF6Q\xB2\x01\x0E&a\x02\xA0\x82\x01R\x90V[a\x1Ae\x82a\x1B\x02V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90_\x90\xA2\x80Q\x15a\x1A\xA9Wa\x12*\x82\x82a\x1BeV[a\x07\xD1a\x1B\xD7V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a\x08\\W`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0C\xA7a\x1A\xB1V[\x80`\x01`\x01`\xA0\x1B\x03\x16;_\x03a\x1B7W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x0C\xCCV[_\x80Q` a)<\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[``_\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x1B\x81\x91\x90a) V[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a\x1B\xB9W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a\x1B\xBEV[``\x91P[P\x91P\x91Pa\x1B\xCE\x85\x83\x83a\x1B\xF6V[\x95\x94PPPPPV[4\x15a\x08\\W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a\x1C\x0BWa\x1C\x06\x82a\x1CUV[a\x1CNV[\x81Q\x15\x80\x15a\x1C\"WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x1CKW`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x0C\xCCV[P\x80[\x93\x92PPPV[\x80Q\x15a\x1CeW\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Q\x80`\xE0\x01`@R\x80`\x07\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80a\x02\xC0\x01`@R\x80_\x81R` \x01_\x81R` \x01a\x1C\xCF`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1C\xEF`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1D\x0F`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1D/`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1DO`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1Do`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1D\x8F`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1D\xAF`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1D\xCF`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1D\xEF`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1E\x0F`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1E/`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1EO`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1Eo`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1E\x8F`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1E\xAF`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1E\xCF`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1E\xEF`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R_` \x82\x01\x81\x90R`@\x90\x91\x01R\x90V[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x1F\x18W_\x80\xFD[\x91\x90PV[_` \x82\x84\x03\x12\x15a\x1F-W_\x80\xFD[a\x1CN\x82a\x1F\x02V[_` \x82\x84\x03\x12\x15a\x1FFW_\x80\xFD[P5\x91\x90PV[cNH{q`\xE0\x1B_R`A`\x04R`$_\xFD[`@Qa\x02\xE0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x1F\x84Wa\x1F\x84a\x1FMV[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x1F\xB2Wa\x1F\xB2a\x1FMV[`@R\x91\x90PV[\x805`\x01`\x01`@\x1B\x03\x81\x16\x81\x14a\x1F\x18W_\x80\xFD[_``\x82\x84\x03\x12\x15a\x1F\xE0W_\x80\xFD[`@Q``\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a \x02Wa \x02a\x1FMV[`@R\x90P\x80a \x11\x83a\x1F\xBAV[\x81Ra \x1F` \x84\x01a\x1F\xBAV[` \x82\x01R`@\x83\x015`@\x82\x01RP\x92\x91PPV[_`@\x82\x84\x03\x12\x15a EW_\x80\xFD[`@Q`@\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a gWa ga\x1FMV[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[_\x80\x82\x84\x03a\x04\xE0\x81\x12\x15a \x94W_\x80\xFD[a \x9E\x85\x85a\x1F\xD0V[\x92Pa\x04\x80\x80`_\x19\x83\x01\x12\x15a \xB3W_\x80\xFD[a \xBBa\x1FaV[\x91Pa \xCA\x86``\x87\x01a 5V[\x82Ra \xD9\x86`\xA0\x87\x01a 5V[` \x83\x01Ra \xEB\x86`\xE0\x87\x01a 5V[`@\x83\x01Ra\x01 a \xFF\x87\x82\x88\x01a 5V[``\x84\x01Ra\x01`a!\x13\x88\x82\x89\x01a 5V[`\x80\x85\x01Ra\x01\xA0a!'\x89\x82\x8A\x01a 5V[`\xA0\x86\x01Ra\x01\xE0a!;\x8A\x82\x8B\x01a 5V[`\xC0\x87\x01Ra\x02 a!O\x8B\x82\x8C\x01a 5V[`\xE0\x88\x01Ra\x02`a!c\x8C\x82\x8D\x01a 5V[a\x01\0\x89\x01Ra\x02\xA0a!x\x8D\x82\x8E\x01a 5V[\x87\x8A\x01Ra!\x8A\x8Da\x02\xE0\x8E\x01a 5V[a\x01@\x8A\x01Ra!\x9E\x8Da\x03 \x8E\x01a 5V[\x86\x8A\x01Ra!\xB0\x8Da\x03`\x8E\x01a 5V[a\x01\x80\x8A\x01Ra\x03\xA0\x8C\x015\x94\x89\x01\x94\x90\x94Ra\x03\xC0\x8B\x015a\x01\xC0\x89\x01Ra\x03\xE0\x8B\x015\x92\x88\x01\x92\x90\x92Ra\x04\0\x8A\x015a\x02\0\x88\x01Ra\x04 \x8A\x015\x90\x87\x01Ra\x04@\x89\x015a\x02@\x87\x01Ra\x04`\x89\x015\x90\x86\x01R\x92\x87\x015a\x02\x80\x85\x01RPPa\x04\xA0\x85\x015\x90\x82\x01Ra\x04\xC0\x90\x93\x015a\x02\xC0\x84\x01RP\x92\x90\x91PV[_\x80`@\x83\x85\x03\x12\x15a\"CW_\x80\xFD[a\"L\x83a\x1F\x02V[\x91P` \x80\x84\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\"hW_\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12a\"{W_\x80\xFD[\x815\x81\x81\x11\x15a\"\x8DWa\"\x8Da\x1FMV[a\"\x9F`\x1F\x82\x01`\x1F\x19\x16\x85\x01a\x1F\x8AV[\x91P\x80\x82R\x87\x84\x82\x85\x01\x01\x11\x15a\"\xB4W_\x80\xFD[\x80\x84\x84\x01\x85\x84\x017_\x84\x82\x84\x01\x01RP\x80\x93PPPP\x92P\x92\x90PV[\x805c\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x1F\x18W_\x80\xFD[_` \x82\x84\x03\x12\x15a\"\xF4W_\x80\xFD[a\x1CN\x82a\"\xD1V[_\x80_\x80\x84\x86\x03a\x01 \x81\x12\x15a#\x12W_\x80\xFD[a#\x1C\x87\x87a\x1F\xD0V[\x94P`\x80`_\x19\x82\x01\x12\x15a#/W_\x80\xFD[P`@Q`\x80\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a#RWa#Ra\x1FMV[\x80`@RP``\x86\x015\x81R`\x80\x86\x015` \x82\x01R`\xA0\x86\x015`@\x82\x01R`\xC0\x86\x015``\x82\x01R\x80\x93PPa#\x8C`\xE0\x86\x01a\"\xD1V[\x91Pa#\x9Ba\x01\0\x86\x01a\x1F\x02V[\x90P\x92\x95\x91\x94P\x92PV[_[\x83\x81\x10\x15a#\xC0W\x81\x81\x01Q\x83\x82\x01R` \x01a#\xA8V[PP_\x91\x01RV[` \x81R_\x82Q\x80` \x84\x01Ra#\xE6\x81`@\x85\x01` \x87\x01a#\xA6V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15a$\x0BW_\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[cNH{q`\xE0\x1B_R`\x11`\x04R`$_\xFD[\x81\x81\x03\x81\x81\x11\x15a\x0C\x99Wa\x0C\x99a$\x1AV[cNH{q`\xE0\x1B_R`2`\x04R`$_\xFD[_\x81a$cWa$ca$\x1AV[P_\x19\x01\x90V[\x80_[`\x07\x81\x10\x15a\x0E\x9AW\x81Q\x84R` \x93\x84\x01\x93\x90\x91\x01\x90`\x01\x01a$mV[a$\xA1\x82\x82Q\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[` \x81\x81\x01Q\x80Q`@\x85\x01R\x90\x81\x01Q``\x84\x01RP`@\x81\x01Q\x80Q`\x80\x84\x01R` \x81\x01Q`\xA0\x84\x01RP``\x81\x01Q\x80Q`\xC0\x84\x01R` \x81\x01Q`\xE0\x84\x01RP`\x80\x81\x01Qa\x01\0a%\x04\x81\x85\x01\x83\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xA0\x83\x01Q\x91Pa\x01@a%$\x81\x86\x01\x84\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xC0\x84\x01Q\x92Pa\x01\x80a%D\x81\x87\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xE0\x85\x01Q\x93Pa\x01\xC0a%d\x81\x88\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x85\x01Q\x93Pa\x02\0\x92a%\x84\x87\x85\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01 \x86\x01Q\x94Pa\x02@a%\xA5\x81\x89\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x86\x01Q\x94Pa\x02\x80\x92a%\xC5\x88\x85\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01`\x87\x01Q\x95Pa\x02\xC0a%\xE6\x81\x8A\x01\x88\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x87\x01Q\x80Qa\x03\0\x8A\x01R` \x01Qa\x03 \x89\x01Ra\x01\xA0\x87\x01Qa\x03@\x89\x01R\x90\x86\x01Qa\x03`\x88\x01Ra\x01\xE0\x86\x01Qa\x03\x80\x88\x01R\x92\x85\x01Qa\x03\xA0\x87\x01Ra\x02 \x85\x01Qa\x03\xC0\x87\x01R\x91\x84\x01Qa\x03\xE0\x86\x01Ra\x02`\x84\x01Qa\x04\0\x86\x01R\x83\x01Qa\x04 \x85\x01Ra\x02\xA0\x83\x01Qa\x04@\x85\x01R\x90\x91\x01Qa\x04`\x90\x92\x01\x91\x90\x91RPV[_a\n`\x82\x01\x90P\x84Q\x82R` \x85\x01Q` \x83\x01R`@\x85\x01Qa&\xA2`@\x84\x01\x82\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[P``\x85\x01Q\x80Q`\x80\x84\x01R` \x81\x01Q`\xA0\x84\x01RP`\x80\x85\x01Q\x80Q`\xC0\x84\x01R` \x81\x01Q`\xE0\x84\x01RP`\xA0\x85\x01Qa\x01\0a&\xEF\x81\x85\x01\x83\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xC0\x87\x01Q\x91Pa\x01@a'\x0F\x81\x86\x01\x84\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xE0\x88\x01Q\x92Pa\x01\x80a'/\x81\x87\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x88\x01Q\x92Pa\x01\xC0\x91a'O\x86\x84\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01 \x89\x01Q\x93Pa\x02\0a'p\x81\x88\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x89\x01Q\x93Pa\x02@\x91a'\x90\x87\x84\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01`\x8A\x01Q\x94Pa\x02\x80a'\xB1\x81\x89\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x8A\x01Q\x80Qa\x02\xC0\x89\x01R` \x90\x81\x01Qa\x02\xE0\x89\x01Ra\x01\xA0\x8B\x01Q\x80Qa\x03\0\x8A\x01R\x81\x01Qa\x03 \x89\x01R\x93\x8A\x01Q\x80Qa\x03@\x89\x01R\x84\x01Qa\x03`\x88\x01Ra\x01\xE0\x8A\x01Q\x80Qa\x03\x80\x89\x01R\x84\x01Qa\x03\xA0\x88\x01R\x89\x01Q\x80Qa\x03\xC0\x88\x01R\x83\x01Qa\x03\xE0\x87\x01Ra\x02 \x89\x01Q\x80Qa\x04\0\x88\x01R\x83\x01Qa\x04 \x87\x01R\x90\x88\x01Q\x80Qa\x04@\x87\x01R\x82\x01Qa\x04`\x86\x01Ra\x02`\x88\x01Q\x80Qa\x04\x80\x87\x01R\x90\x91\x01Qa\x04\xA0\x85\x01R\x86\x01Qa\x04\xC0\x84\x01RPa\x02\xA0\x85\x01Qa\x04\xE0\x83\x01Ra(\x88a\x05\0\x83\x01\x85a$jV[a(\x96a\x05\xE0\x83\x01\x84a$\x8CV[\x94\x93PPPPV[_` \x82\x84\x03\x12\x15a(\xAEW_\x80\xFD[\x81Q\x80\x15\x15\x81\x14a\x1CNW_\x80\xFD[`\x01`\x01`@\x1B\x03\x82\x81\x16\x82\x82\x16\x03\x90\x80\x82\x11\x15a(\xDDWa(\xDDa$\x1AV[P\x92\x91PPV[_`\x01`\x01`@\x1B\x03\x80\x83\x16\x81\x81\x03a(\xFFWa(\xFFa$\x1AV[`\x01\x01\x93\x92PPPV[_` \x82\x84\x03\x12\x15a)\x19W_\x80\xFD[PQ\x91\x90PV[_\x82Qa)1\x81\x84` \x87\x01a#\xA6V[\x91\x90\x91\x01\x92\x91PPV\xFE6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\xA1dsolcC\0\x08\x17\0\n", + b"`\x80`@R`\x046\x10a\x01\xBAW_5`\xE0\x1C\x80c\x81\x1F\x85?\x11a\0\xF2W\x80c\xA1\xBE\x8DR\x11a\0\x92W\x80c\xD2M\x93=\x11a\0bW\x80c\xD2M\x93=\x14a\x05\xE5W\x80c\xE003\x01\x14a\x06\x14W\x80c\xF2\xFD\xE3\x8B\x14a\x063W\x80c\xF9\xE5\r\x19\x14a\x06RW_\x80\xFD[\x80c\xA1\xBE\x8DR\x14a\x053W\x80c\xAD<\xB1\xCC\x14a\x05RW\x80c\xB2BN?\x14a\x05\x8FW\x80c\xC2;\x9E\x9E\x14a\x05\xADW_\x80\xFD[\x80c\x8D\xA5\xCB[\x11a\0\xCDW\x80c\x8D\xA5\xCB[\x14a\x04dW\x80c\x90\xC1C\x90\x14a\x04\xA0W\x80c\x96\xC1\xCAa\x14a\x04\xBFW\x80c\x9F\xDBT\xA7\x14a\x04\xDEW_\x80\xFD[\x80c\x81\x1F\x85?\x14a\x03\xDEW\x80c\x82nA\xFC\x14a\x03\xFDW\x80c\x85\x84\xD2?\x14a\x04(W_\x80\xFD[\x80cBm1\x94\x11a\x01]W\x80ci\xCCj\x04\x11a\x018W\x80ci\xCCj\x04\x14a\x03\x83W\x80cqP\x18\xA6\x14a\x03\x97W\x80cu|7\xAD\x14a\x03\xABW\x80cvg\x18\x08\x14a\x03\xCAW_\x80\xFD[\x80cBm1\x94\x14a\x03:W\x80cO\x1E\xF2\x86\x14a\x03\\W\x80cR\xD1\x90-\x14a\x03oW_\x80\xFD[\x80c\r\x8En,\x11a\x01\x98W\x80c\r\x8En,\x14a\x02~W\x80c/y\x88\x9D\x14a\x02\xA9W\x80c1=\xF7\xB1\x14a\x02\xE7W\x80c7\x8E\xC2;\x14a\x03\x1EW_\x80\xFD[\x80c\x01?\xA5\xFC\x14a\x01\xBEW\x80c\x02\xB5\x92\xF3\x14a\x01\xDFW\x80c\x06%\xE1\x9B\x14a\x02W_\x80\xFD[Pa\x04\x18a\x05M6`\x04a'\xF6V[a\x0EEV[4\x80\x15a\x05]W_\x80\xFD[Pa\x05\x82`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\x023\x91\x90a(1V[4\x80\x15a\x05\x9AW_\x80\xFD[P_Ta\x02\xCF\x90`\x01`\x01`@\x1B\x03\x16\x81V[4\x80\x15a\x05\xB8W_\x80\xFD[P`\rTa\x05\xD0\x90`\x01`\xA0\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81V[`@Qc\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01a\x023V[4\x80\x15a\x05\xF0W_\x80\xFD[P`\tT`\nTa\x05\r\x91`\x01`\x01`@\x1B\x03\x80\x82\x16\x92`\x01`@\x1B\x90\x92\x04\x16\x90\x83V[4\x80\x15a\x06\x1FW_\x80\xFD[Pa\x04\x18a\x06.6`\x04a(cV[a\x0E\x87V[4\x80\x15a\x06>W_\x80\xFD[Pa\x01\xDDa\x06M6`\x04a#\x07V[a\x0F\xDFV[4\x80\x15a\x06]W_\x80\xFD[P`\x0ETa\x03,V[a\x06na\x10!V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x06\x95W`@Qc\xE6\xC4${`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\rT`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x90\x82\x16\x03a\x06\xC4W`@Qc\xA8c\xAE\xC9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\r\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x81\x17\x90\x91U`@Q\x90\x81R\x7F\x80\x17\xBB\x88\x7F\xDF\x8F\xCAC\x14\xA9\xD4\x0Fns\xB3\xB8\x10\x02\xD6~\\\xFA\x85\xD8\x81s\xAFj\xA4`r\x90` \x01[`@Q\x80\x91\x03\x90\xA1PV[`\x0E\x81\x81T\x81\x10a\x07(W_\x80\xFD[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01\x80T`\x01\x90\x91\x01T`\x01`\x01`@\x1B\x03\x80\x83\x16\x93P`\x01`@\x1B\x83\x04\x81\x16\x92`\x01`\x80\x1B\x90\x04\x16\x90\x84V[a\x07ja\x10|V[a\x07s\x82a\x11 V[a\x07}\x82\x82a\x11aV[PPV[_a\x07\x8Aa\x12\"V[P_\x80Q` a.)\x839\x81Q\x91R\x90V[a\x07\xA4a\x10!V[`\rT`\x01`\x01`\xA0\x1B\x03\x16\x15a\x07\xEFW`\r\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16\x90U`@Q\x7F\x9A_W\xDE\x85m\xD6h\xC5M\xD9^\\U\xDF\x93C!q\xCB\xCAI\xA8wmV \xEAY\xC0$P\x90_\x90\xA1V[`@Qc\xA8c\xAE\xC9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a\x08\x12a\x10!V[a\x08\x08_a\x12kV[`\rT`\x01`\x01`\xA0\x1B\x03\x16\x15\x15\x80\x15a\x08@WP`\rT`\x01`\x01`\xA0\x1B\x03\x163\x14\x15[\x15a\x08^W`@Qc\x01GL\x8F`\xE7\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x0BT\x83Q`\x01`\x01`@\x1B\x03\x91\x82\x16\x91\x16\x11\x15\x80a\x08\x97WP`\x0BT` \x84\x01Q`\x01`\x01`@\x1B\x03`\x01`@\x1B\x90\x92\x04\x82\x16\x91\x16\x11\x15[\x15a\x08\xB5W`@Qc\x05\x1CF\xEF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x08\xC2\x83`@\x01Qa\x12\xDBV[_a\x08\xCBa\n\xE6V[` \x85\x01Q_\x80T\x92\x93P\x91a\x08\xEA\x91\x90`\x01`\x01`@\x1B\x03\x16a\r_V[\x90Pa\x08\xF7\x82`\x01a(\x97V[`\x01`\x01`@\x1B\x03\x16\x81`\x01`\x01`@\x1B\x03\x16\x14\x80\x15a\t0WP`\x0BTa\t.\x90`\x01`@\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16a\x0EEV[\x15[\x80\x15a\tDWP_\x82`\x01`\x01`@\x1B\x03\x16\x11[\x15a\tbW`@QcqP\xDEE`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\tm\x82`\x02a(\x97V[`\x01`\x01`@\x1B\x03\x16\x81`\x01`\x01`@\x1B\x03\x16\x10a\t\x9EW`@QcqP\xDEE`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\t\xAB\x84` \x01Qa\x12\xDBV[a\t\xB8\x84`@\x01Qa\x12\xDBV[a\t\xC5\x84``\x01Qa\x12\xDBV[a\t\xD0\x85\x85\x85a\x13KV[\x84Q`\x0B\x80T` \x88\x01Q`\x01`\x01`@\x1B\x03\x81\x81\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x93\x16\x94\x16\x93\x90\x93\x17\x17\x90U`@\x86\x01Q`\x0CUa\n\x12\x90a\x0EEV[\x15a\n|W\x83Q`\x05U` \x84\x01Q`\x06U`@\x84\x01Q`\x07U``\x84\x01Q`\x08U\x7F1\xEA\xBD\x90\x99\xFD\xB2]\xAC\xDD\xD2\x06\xAB\xFF\x871\x1EU4A\xFC\x9D\x0F\xCD\xEF \x10b\xD7\xE7\x07\x1Ba\n`\x82`\x01a(\x97V[`@Q`\x01`\x01`@\x1B\x03\x90\x91\x16\x81R` \x01`@Q\x80\x91\x03\x90\xA1[a\n\x87CB\x87a\x14\xA3V[\x84` \x01Q`\x01`\x01`@\x1B\x03\x16\x85_\x01Q`\x01`\x01`@\x1B\x03\x16\x7F\xA0Jw9$PZA\x85d67%\xF5h2\xF5w.k\x8D\r\xBDn\xFC\xE7$\xDF\xE8\x03\xDA\xE6\x87`@\x01Q`@Qa\n\xD7\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA3PPPPPV[`\x0BT_\x80T\x90\x91a\x0B\x0B\x91`\x01`\x01`@\x1B\x03`\x01`@\x1B\x90\x92\x04\x82\x16\x91\x16a\r_V[\x90P\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16_\x81\x15\x80\x15a\x0BTWP\x82[\x90P_\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\x0BoWP0;\x15[\x90P\x81\x15\x80\x15a\x0B}WP\x80\x15[\x15a\x0B\x9BW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\x0B\xC5W\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\x0B\xCE\x87a\x16\x8CV[a\x0B\xD6a\x16\x9DV[a\x0B\xE2\x8A\x8A\x8A\x89a\x16\xA5V[\x83\x15a\x0C(W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPPPPV[`\x0E\x80T_\x91\x82\x91\x90a\x0CH`\x01\x83a(\xBEV[\x81T\x81\x10a\x0CXWa\x0CXa(\xD1V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x80\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x84\x10a\x0C\x97W`@Qc\x18V\xA4\x99`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\rT`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16[\x81\x81\x10\x15a\rXW\x84`\x0E\x82\x81T\x81\x10a\x0C\xC7Wa\x0C\xC7a(\xD1V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x80\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x11\x15a\rPW`\x0E\x81\x81T\x81\x10a\r\0Wa\r\0a(\xD1V[\x90_R` _ \x90`\x02\x02\x01`\x01\x01T`\x0E\x82\x81T\x81\x10a\r#Wa\r#a(\xD1V[\x90_R` _ \x90`\x02\x02\x01_\x01`\x10\x90T\x90a\x01\0\n\x90\x04`\x01`\x01`@\x1B\x03\x16\x93P\x93PPP\x91P\x91V[`\x01\x01a\x0C\xABV[PP\x91P\x91V[_\x81`\x01`\x01`@\x1B\x03\x16_\x03a\rwWP_a\r\xB6V[a\r\x81\x82\x84a(\xF9V[`\x01`\x01`@\x1B\x03\x16_\x03a\r\xA1Wa\r\x9A\x82\x84a)\x1EV[\x90Pa\r\xB6V[a\r\xAB\x82\x84a)\x1EV[a\r\x9A\x90`\x01a(\x97V[\x92\x91PPV[a\r\xC4a\x10!V[a\x0E\x10\x81c\xFF\xFF\xFF\xFF\x16\x10\x80a\r\xE3WPc\x01\xE13\x80\x81c\xFF\xFF\xFF\xFF\x16\x11[\x80a\x0E\x01WP`\rTc\xFF\xFF\xFF\xFF`\x01`\xA0\x1B\x90\x91\x04\x81\x16\x90\x82\x16\x11\x15[\x15a\x0E\x1FW`@Qc\x07\xA5\x07w`\xE5\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\r\x80Tc\xFF\xFF\xFF\xFF\x90\x92\x16`\x01`\xA0\x1B\x02c\xFF\xFF\xFF\xFF`\xA0\x1B\x19\x90\x92\x16\x91\x90\x91\x17\x90UV[_\x81`\x01`\x01`@\x1B\x03\x16_\x03a\x0E]WP_\x91\x90PV[_Ta\x0Er\x90`\x01`\x01`@\x1B\x03\x16\x83a(\xF9V[`\x01`\x01`@\x1B\x03\x16\x15\x92\x91PPV[\x91\x90PV[`\x0ET_\x90C\x84\x11\x80a\x0E\x98WP\x80\x15[\x80a\x0E\xE2WP`\rT`\x0E\x80T\x90\x91`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x0E\xC6Wa\x0E\xC6a(\xD1V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x84\x10[\x15a\x0F\0W`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_\x80\x80a\x0F\x0E`\x01\x85a(\xBEV[\x90P[\x81a\x0F\xAAW`\rT`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x81\x10a\x0F\xAAW\x86`\x0E\x82\x81T\x81\x10a\x0FCWa\x0FCa(\xD1V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x11a\x0F\x98W`\x01\x91P`\x0E\x81\x81T\x81\x10a\x0FxWa\x0Fxa(\xD1V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x92Pa\x0F\xAAV[\x80a\x0F\xA2\x81a)CV[\x91PPa\x0F\x11V[\x81a\x0F\xC8W`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x85a\x0F\xD3\x84\x89a(\xBEV[\x11\x97\x96PPPPPPPV[a\x0F\xE7a\x10!V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x10\x15W`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R_`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[a\x10\x1E\x81a\x12kV[PV[3a\x10S\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\x08\x08W`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R3`\x04\x82\x01R`$\x01a\x10\x0CV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a\x11\x02WP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a\x10\xF6_\x80Q` a.)\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x08\x08W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x11(a\x10!V[`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x81R\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x90` \x01a\x07\x0EV[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x11\xBBWP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x11\xB8\x91\x81\x01\x90a)XV[`\x01[a\x11\xE3W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x10\x0CV[_\x80Q` a.)\x839\x81Q\x91R\x81\x14a\x12\x13W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x10\x0CV[a\x12\x1D\x83\x83a\x18\x1FV[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\x08\x08W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T`\x01`\x01`\xA0\x1B\x03\x19\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90_\x90\xA3PPPV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x81\x10\x80a\x07}W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01a\x10\x0CV[_a\x13Ta\x18tV[\x90Pa\x13^a lV[\x84Q`\x01`\x01`@\x1B\x03\x90\x81\x16\x82R` \x80\x87\x01\x80Q\x90\x92\x16\x90\x83\x01R`@\x80\x87\x01Q\x90\x83\x01R`\x06T``\x83\x01R`\x07T`\x80\x83\x01R`\x08T`\xA0\x83\x01R`\x05T`\xC0\x83\x01RQa\x13\xAF\x90a\x0EEV[\x15a\x13\xE1W` \x84\x01Q`\xE0\x82\x01R`@\x84\x01Qa\x01\0\x82\x01R``\x84\x01Qa\x01 \x82\x01R\x83Qa\x01@\x82\x01Ra\x14\x05V[`\x06T`\xE0\x82\x01R`\x07Ta\x01\0\x82\x01R`\x08Ta\x01 \x82\x01R`\x05Ta\x01@\x82\x01R[`@Qc\xFC\x86`\xC7`\xE0\x1B\x81Rs_\xBD\xB21Vx\xAF\xEC\xB3g\xF02\xD9?d/d\x18\n\xA3\x90c\xFC\x86`\xC7\x90a\x14@\x90\x85\x90\x85\x90\x88\x90`\x04\x01a+{V[` `@Q\x80\x83\x03\x81\x86Z\xF4\x15\x80\x15a\x14[W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x14\x7F\x91\x90a-\xA9V[a\x14\x9CW`@Qc\t\xBD\xE39`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPPV[`\x0ET\x15\x80\x15\x90a\x15\x18WP`\rT`\x0E\x80T`\x01`\xA0\x1B\x83\x04c\xFF\xFF\xFF\xFF\x16\x92`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x14\xE3Wa\x14\xE3a(\xD1V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01Ta\x15\r\x90`\x01`@\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x84a-\xC8V[`\x01`\x01`@\x1B\x03\x16\x11[\x15a\x15\xABW`\rT`\x0E\x80T\x90\x91`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x15EWa\x15Ea(\xD1V[_\x91\x82R` \x82 `\x02\x90\x91\x02\x01\x80T`\x01`\x01`\xC0\x1B\x03\x19\x16\x81U`\x01\x01U`\r\x80T`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90`\x18a\x15\x85\x83a-\xE8V[\x91\x90a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UPP[`@\x80Q`\x80\x81\x01\x82R`\x01`\x01`@\x1B\x03\x94\x85\x16\x81R\x92\x84\x16` \x80\x85\x01\x91\x82R\x83\x01Q\x85\x16\x84\x83\x01\x90\x81R\x92\x90\x91\x01Q``\x84\x01\x90\x81R`\x0E\x80T`\x01\x81\x01\x82U_\x91\x90\x91R\x93Q`\x02\x90\x94\x02\x7F\xBB{JEM\xC3I9#H/\x07\x82#)\xED\x19\xE8$N\xFFX,\xC2\x04\xF8UL6 \xC3\xFD\x81\x01\x80T\x93Q\x94Q\x87\x16`\x01`\x80\x1B\x02g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`\x80\x1B\x19\x95\x88\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x95\x16\x96\x90\x97\x16\x95\x90\x95\x17\x92\x90\x92\x17\x92\x90\x92\x16\x93\x90\x93\x17\x90\x91UQ\x7F\xBB{JEM\xC3I9#H/\x07\x82#)\xED\x19\xE8$N\xFFX,\xC2\x04\xF8UL6 \xC3\xFE\x90\x91\x01UV[a\x16\x94a\x1E\x9FV[a\x10\x1E\x81a\x1E\xE8V[a\x08\x08a\x1E\x9FV[\x83Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80a\x16\xC9WP` \x84\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80a\x16\xD6WP` \x83\x01Q\x15[\x80a\x16\xE3WP`@\x83\x01Q\x15[\x80a\x16\xF0WP``\x83\x01Q\x15[\x80a\x16\xFAWP\x82Q\x15[\x80a\x17\x0CWPa\x0E\x10\x82c\xFF\xFF\xFF\xFF\x16\x10[\x80a\x17 WPc\x01\xE13\x80\x82c\xFF\xFF\xFF\xFF\x16\x11[\x80a\x172WP`\x01`\x01`@\x1B\x03\x81\x16\x15[\x15a\x17PW`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x83Q`\t\x80T` \x80\x88\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x93\x84\x16\x95\x82\x16\x95\x86\x17\x81\x17\x90\x94U`@\x98\x89\x01Q`\n\x81\x90U`\x0B\x80T\x90\x94\x16\x90\x95\x17\x90\x93\x17\x90\x91U`\x0C\x92\x90\x92U\x84Q`\x01\x81\x90U\x91\x85\x01Q`\x02\x81\x90U\x95\x85\x01Q`\x03\x81\x90U``\x90\x95\x01Q`\x04\x81\x90U`\x05\x92\x90\x92U`\x06\x95\x90\x95U`\x07\x93\x90\x93U`\x08\x92\x90\x92U`\r\x80Tc\xFF\xFF\xFF\xFF\x90\x92\x16`\x01`\xA0\x1B\x02c\xFF\xFF\xFF\xFF`\xA0\x1B\x19\x90\x92\x16\x91\x90\x91\x17\x90U_\x80T\x91\x90\x92\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x91\x90\x91\x16\x17\x90UV[a\x18(\x82a\x1E\xF0V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90_\x90\xA2\x80Q\x15a\x18lWa\x12\x1D\x82\x82a\x1FSV[a\x07}a\x1F\xC5V[a\x18|a \x8BV[b\x10\0\0\x81R`\x0B` \x82\x01R\x7F&\x86~\xE5\x8A\xAF\x86\x0F\xC9\xE0\xE3\xA7\x86f\xFF\xC5\x1F;\xA1\xAD\x8A\xE0\x01\xC1\x96\x83\x0CU\xB5\xAF\x0B\x8C`@\x82\x01QR\x7F\t\x120\xAD\xB7S\xF8(\x15\x15\x12w\x06\x0C\xC5kTk\xB2\xE9P\xA0\xDE\x19\xED\x06\x1E\xC6\x8C\x07\x1A\x90` `@\x83\x01Q\x01R\x7F\x02\xA5\t\xA0m\x8CV\xF8? F\x88\xFFnB\xEA\xC6\xE3\xCB\xDD\x06;\tq\xA3\xAF\x95>\x81\xBA\xDB\xB6``\x82\x01QR\x7F\x06\xF4>\xD2\xB9\xCE\xCE5\xD1 \x1A\xBC\x13\xFF\xDA\xEA5V\x0C\xF0\xF1Dbw\x13\x8C\xE8\x12\xB9\xAD\x9F9` ``\x83\x01Q\x01R\x7F\x1AX\x8C\x99\xAD\x88\xF7\x89\xC8w\"\xB0a\xBBU5\xDA\xA0\xAB\xCC\x1D\xC6\xD1v\xD7\xFE\xA5\x1E]\x80\xB9&`\x80\x82\x01QR\x7F b\xB9\x95\xE6\x1Aj\xB8\xAA\xB6\xCDnu \xB8y\xD8O\x96Z\xB1\xF0\x94\xC1\x04\xF0\xC1!;(\x03\x8B` `\x80\x83\x01Q\x01R\x7F!\xA2\xFDvj\x0C\xEB\xEC\xFD\xBF\xDF\xE5a9\xA1\xBB\xD9\xAE\xC1^.5\xBE\x8E\xF0\x194\xA0\xECC\x86\x85`\xA0\x82\x01QR\x7F \xFEP\n\xC7\xD1\xAAx \xDB\x8Co\x7F\x9DP\x9E;.\x88s\x1E:\x12\xDDe\xF0oC\xCA\x93\r\xA0` `\xA0\x83\x01Q\x01R\x7F\n\xB5=\x12\x85\xC7\xF4\x81\x9B?\xF6\xE1\xDD\xAD\xA6\xBF%\x15\xD3K\xBA\xF6\x11\x86\xC6\xA0K\xE4}\xFDe\xA3`\xC0\x82\x01QR\x7F\x0B\x80\xA9\x87\x80\x82\xCD\xFD\xD9\xFC\xC1k\xB3?\xA4$\xC0\xADf\xB8\x19I\xBFd!S\xD3\xC7\xAD\x08/\"` `\xC0\x83\x01Q\x01R\x7F\x1B\x90\x0F\x8E_\x8E\x80d\xA5\x88\x8A\x1B\xD7\x96\xB5J&R\xFC\x02\x03O\xE4\xB6\xE6\xFC\x8DfP\xF7E;`\xE0\x82\x01QR~\xCC\xA2X\xA8\x83,d\xD1\xF8\xE1r\x1Ax\xFC%\xB1=)\xAD\xBB\x81\xE3Zy\xFC/I\xF8\x90'\x86` `\xE0\x83\x01Q\x01R\x7F\r\x1D3H\xD6B\xE6\xF2\xE9s\x9Ds]\x8Cr6v\xDB\xAE\xFD\xCB\xB4\xE9fA\xDE\xFA5=&\xEB\xB3a\x01\0\x82\x01QR\x7F\x14\xFE\x9Dj3Q\x04\xE7I\x1C\xA6\xD5\x08a\x13\xE6\xB0\xF5)F\x96\rrfdf{\xD5\x859\xD4\x1E` a\x01\0\x83\x01Q\x01R\x7F\x1D\xA9CdD\x0CN?\xB8\xAF-6<\xDE\xFAN\xDD\xA47W\x9E\x1B\x05j\x16\xA5\xE9\xA1\x1D\xFF\xA2\xABa\x01 \x82\x01QR\x7F\n\x07{\xD3\x07\xED1\"-\xB5\\\xB0\x12\x8B\xAF\xCE^\"U{W\xF5\xAC\x91SY\xC5\x02\x96\xCB\\w` a\x01 \x83\x01Q\x01R\x7F(\xFF\x80\xB13\xD9\x89#\\q)\xDE\xA5Di\xB7\x80\xACG\x17D\x92\x90\x06~|\x9A}[\xE7\xDB\xD5a\x01@\x82\x01QR\x7F\x1C\x0F\xC2.\xEF#\xB5\n-\xDCU?\x9F\xC1\xB6\x1F\xD8\xC5zX\xCA2\x1A\x82\x9C~\xC2U\xF7W\xB3\xA6` a\x01@\x83\x01Q\x01R~^\xE7rr\x95\x96a\xE0\xFB\xAB\xDAC\x17w\xFAr\x9F[S/Da\x01\x80\x82\x01QR~\x8D\x9E\xE0\x0Fy\x9C\xF0\x06\x08\xB0\x82\xD0;\x9D\xE5\xA4+\x81&\xC3_\xBF\xBD\x1E`!\x08\xDF\x10\xE0\xE3` a\x01\x80\x83\x01Q\x01R\x7F/Rli\x81d?\xF6\xF6\xE9\xD2\xB5\xA9!\xE0l\xF9_'F)\xB5\xA1E\xBDU+\x7F\xDAj\x87\0a\x01\xA0\x82\x01QR\x7F/\xE7\x10\x8F\xD4\xE2B1\xF3\xDA\xDBn\t\x07.\x10o\xCA\x06\x94\xFE9\xDF\xF9eW\xA8\x82!\xA8\x9AP` a\x01\xA0\x83\x01Q\x01R\x7F&\xA3V\x85\x98\xA6\x98\x1Ec%\xF4\x81g6\xE3\x81\x08{[\x0EK'\xEF6M\x8A\xE1\xE2\x9F\xE9\xDF\x99a\x01\xC0\x82\x01QR\x7F\x1D\xB8\x1C\xDF\x82\xA9\xEC\x99\xF3\xC9qm\xF2-81~k\xB8O\xC5}/\x0E{+\xC8\xA0V\x9F|\xC4` a\x01\xC0\x83\x01Q\x01R~\x99\x88\x80\x88\xE1\x1D\xE6\xED\x08l\x99\xB9\xBB\xA9\x86\xD9\x08\xDF[\x0CP\x07h\r\x97V}HW\x19\x94a\x01\xE0\x82\x01QR\x7F\x1F\x91Wn\xAD\xFF\xFF\x93+nT\xBA\xB0\"\xF9?o\xEC>[vt\xD0\0k\xC5\xF2\"5'\xA3H` a\x01\xE0\x83\x01Q\x01R~h\xB3\xC1\x17\xEE~\x84\xD6\xB6p\xB6\xAF \x19wY\xEC\x80\xD3O#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a\x08\x08W`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0F\xE7a\x1E\x9FV[\x80`\x01`\x01`\xA0\x1B\x03\x16;_\x03a\x1F%W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x10\x0CV[_\x80Q` a.)\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[``_\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x1Fo\x91\x90a.\rV[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a\x1F\xA7W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a\x1F\xACV[``\x91P[P\x91P\x91Pa\x1F\xBC\x85\x83\x83a\x1F\xE4V[\x95\x94PPPPPV[4\x15a\x08\x08W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a\x1F\xF9Wa\x1F\xF4\x82a CV[a `@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a!^`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a!~`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a!\x9E`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a!\xBE`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a!\xDE`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a!\xFE`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"\x1E`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\">`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"^`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"~`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"\x9E`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"\xBE`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"\xDE`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R_` \x82\x01\x81\x90R`@\x90\x91\x01R\x90V[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x0E\x82W_\x80\xFD[_` \x82\x84\x03\x12\x15a#\x17W_\x80\xFD[a <\x82a\"\xF1V[_` \x82\x84\x03\x12\x15a#0W_\x80\xFD[P5\x91\x90PV[cNH{q`\xE0\x1B_R`A`\x04R`$_\xFD[`@Qa\x02\xE0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a#nWa#na#7V[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a#\x9CWa#\x9Ca#7V[`@R\x91\x90PV[_\x80`@\x83\x85\x03\x12\x15a#\xB5W_\x80\xFD[a#\xBE\x83a\"\xF1V[\x91P` \x80\x84\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a#\xDAW_\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12a#\xEDW_\x80\xFD[\x815\x81\x81\x11\x15a#\xFFWa#\xFFa#7V[a$\x11`\x1F\x82\x01`\x1F\x19\x16\x85\x01a#tV[\x91P\x80\x82R\x87\x84\x82\x85\x01\x01\x11\x15a$&W_\x80\xFD[\x80\x84\x84\x01\x85\x84\x017_\x84\x82\x84\x01\x01RP\x80\x93PPPP\x92P\x92\x90PV[\x805`\x01`\x01`@\x1B\x03\x81\x16\x81\x14a\x0E\x82W_\x80\xFD[_``\x82\x84\x03\x12\x15a$iW_\x80\xFD[`@Q``\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a$\x8BWa$\x8Ba#7V[`@R\x90P\x80a$\x9A\x83a$CV[\x81Ra$\xA8` \x84\x01a$CV[` \x82\x01R`@\x83\x015`@\x82\x01RP\x92\x91PPV[_`\x80\x82\x84\x03\x12\x15a$\xCEW_\x80\xFD[`@Q`\x80\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a$\xF0Wa$\xF0a#7V[\x80`@RP\x80\x91P\x825\x81R` \x83\x015` \x82\x01R`@\x83\x015`@\x82\x01R``\x83\x015``\x82\x01RP\x92\x91PPV[_`@\x82\x84\x03\x12\x15a%1W_\x80\xFD[`@Q`@\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a%SWa%Sa#7V[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[_\x80_\x83\x85\x03a\x05`\x81\x12\x15a%\x81W_\x80\xFD[a%\x8B\x86\x86a$YV[\x93Pa%\x9A\x86``\x87\x01a$\xBEV[\x92Pa\x04\x80\x80`\xDF\x19\x83\x01\x12\x15a%\xAFW_\x80\xFD[a%\xB7a#KV[\x91Pa%\xC6\x87`\xE0\x88\x01a%!V[\x82Ra\x01 a%\xD7\x88\x82\x89\x01a%!V[` \x84\x01Ra\x01`a%\xEB\x89\x82\x8A\x01a%!V[`@\x85\x01Ra\x01\xA0a%\xFF\x8A\x82\x8B\x01a%!V[``\x86\x01Ra\x01\xE0a&\x13\x8B\x82\x8C\x01a%!V[`\x80\x87\x01Ra\x02 a&'\x8C\x82\x8D\x01a%!V[`\xA0\x88\x01Ra\x02`a&;\x8D\x82\x8E\x01a%!V[`\xC0\x89\x01Ra\x02\xA0a&O\x8E\x82\x8F\x01a%!V[`\xE0\x8A\x01Ra&b\x8Ea\x02\xE0\x8F\x01a%!V[a\x01\0\x8A\x01Ra&v\x8Ea\x03 \x8F\x01a%!V[\x87\x8A\x01Ra&\x88\x8Ea\x03`\x8F\x01a%!V[a\x01@\x8A\x01Ra&\x9C\x8Ea\x03\xA0\x8F\x01a%!V[\x86\x8A\x01Ra&\xAE\x8Ea\x03\xE0\x8F\x01a%!V[a\x01\x80\x8A\x01Ra\x04 \x8D\x015\x85\x8A\x01Ra\x04@\x8D\x015a\x01\xC0\x8A\x01Ra\x04`\x8D\x015\x84\x8A\x01R\x87\x8D\x015a\x02\0\x8A\x01Ra\x04\xA0\x8D\x015\x83\x8A\x01Ra\x04\xC0\x8D\x015a\x02@\x8A\x01Ra\x04\xE0\x8D\x015\x82\x8A\x01Ra\x05\0\x8D\x015a\x02\x80\x8A\x01Ra\x05 \x8D\x015\x81\x8A\x01RPPPPPPPPa\x05@\x85\x015a\x02\xC0\x82\x01R\x80\x91PP\x92P\x92P\x92V[\x805c\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x0E\x82W_\x80\xFD[_\x80_\x80_a\x01@\x86\x88\x03\x12\x15a'[W_\x80\xFD[a'e\x87\x87a$YV[\x94Pa't\x87``\x88\x01a$\xBEV[\x93Pa'\x82`\xE0\x87\x01a'3V[\x92Pa'\x91a\x01\0\x87\x01a\"\xF1V[\x91Pa'\xA0a\x01 \x87\x01a$CV[\x90P\x92\x95P\x92\x95\x90\x93PV[_\x80`@\x83\x85\x03\x12\x15a'\xBDW_\x80\xFD[a'\xC6\x83a$CV[\x91Pa'\xD4` \x84\x01a$CV[\x90P\x92P\x92\x90PV[_` \x82\x84\x03\x12\x15a'\xEDW_\x80\xFD[a <\x82a'3V[_` \x82\x84\x03\x12\x15a(\x06W_\x80\xFD[a <\x82a$CV[_[\x83\x81\x10\x15a()W\x81\x81\x01Q\x83\x82\x01R` \x01a(\x11V[PP_\x91\x01RV[` \x81R_\x82Q\x80` \x84\x01Ra(O\x81`@\x85\x01` \x87\x01a(\x0FV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15a(tW_\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[cNH{q`\xE0\x1B_R`\x11`\x04R`$_\xFD[`\x01`\x01`@\x1B\x03\x81\x81\x16\x83\x82\x16\x01\x90\x80\x82\x11\x15a(\xB7Wa(\xB7a(\x83V[P\x92\x91PPV[\x81\x81\x03\x81\x81\x11\x15a\r\xB6Wa\r\xB6a(\x83V[cNH{q`\xE0\x1B_R`2`\x04R`$_\xFD[cNH{q`\xE0\x1B_R`\x12`\x04R`$_\xFD[_`\x01`\x01`@\x1B\x03\x80\x84\x16\x80a)\x12Wa)\x12a(\xE5V[\x92\x16\x91\x90\x91\x06\x92\x91PPV[_`\x01`\x01`@\x1B\x03\x80\x84\x16\x80a)7Wa)7a(\xE5V[\x92\x16\x91\x90\x91\x04\x92\x91PPV[_\x81a)QWa)Qa(\x83V[P_\x19\x01\x90V[_` \x82\x84\x03\x12\x15a)hW_\x80\xFD[PQ\x91\x90PV[\x80_[`\x0B\x81\x10\x15a)\x91W\x81Q\x84R` \x93\x84\x01\x93\x90\x91\x01\x90`\x01\x01a)rV[PPPPV[a)\xAC\x82\x82Q\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[` \x81\x81\x01Q\x80Q`@\x85\x01R\x90\x81\x01Q``\x84\x01RP`@\x81\x01Q\x80Q`\x80\x84\x01R` \x81\x01Q`\xA0\x84\x01RP``\x81\x01Q\x80Q`\xC0\x84\x01R` \x81\x01Q`\xE0\x84\x01RP`\x80\x81\x01Qa\x01\0a*\x0F\x81\x85\x01\x83\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xA0\x83\x01Q\x91Pa\x01@a*/\x81\x86\x01\x84\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xC0\x84\x01Q\x92Pa\x01\x80a*O\x81\x87\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xE0\x85\x01Q\x93Pa\x01\xC0a*o\x81\x88\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x85\x01Q\x93Pa\x02\0\x92a*\x8F\x87\x85\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01 \x86\x01Q\x94Pa\x02@a*\xB0\x81\x89\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x86\x01Q\x94Pa\x02\x80\x92a*\xD0\x88\x85\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01`\x87\x01Q\x95Pa\x02\xC0a*\xF1\x81\x8A\x01\x88\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x87\x01Q\x80Qa\x03\0\x8A\x01R` \x01Qa\x03 \x89\x01Ra\x01\xA0\x87\x01Qa\x03@\x89\x01R\x90\x86\x01Qa\x03`\x88\x01Ra\x01\xE0\x86\x01Qa\x03\x80\x88\x01R\x92\x85\x01Qa\x03\xA0\x87\x01Ra\x02 \x85\x01Qa\x03\xC0\x87\x01R\x91\x84\x01Qa\x03\xE0\x86\x01Ra\x02`\x84\x01Qa\x04\0\x86\x01R\x83\x01Qa\x04 \x85\x01Ra\x02\xA0\x83\x01Qa\x04@\x85\x01R\x90\x91\x01Qa\x04`\x90\x92\x01\x91\x90\x91RPV[_a\n\xE0\x82\x01\x90P\x84Q\x82R` \x85\x01Q` \x83\x01R`@\x85\x01Qa+\xAD`@\x84\x01\x82\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[P``\x85\x01Q\x80Q`\x80\x84\x01R` \x81\x01Q`\xA0\x84\x01RP`\x80\x85\x01Q\x80Q`\xC0\x84\x01R` \x81\x01Q`\xE0\x84\x01RP`\xA0\x85\x01Qa\x01\0a+\xFA\x81\x85\x01\x83\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xC0\x87\x01Q\x91Pa\x01@a,\x1A\x81\x86\x01\x84\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xE0\x88\x01Q\x92Pa\x01\x80a,:\x81\x87\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x88\x01Q\x92Pa\x01\xC0\x91a,Z\x86\x84\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01 \x89\x01Q\x93Pa\x02\0a,{\x81\x88\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x89\x01Q\x93Pa\x02@\x91a,\x9B\x87\x84\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01`\x8A\x01Q\x94Pa\x02\x80a,\xBC\x81\x89\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x8A\x01Q\x80Qa\x02\xC0\x89\x01R` \x90\x81\x01Qa\x02\xE0\x89\x01Ra\x01\xA0\x8B\x01Q\x80Qa\x03\0\x8A\x01R\x81\x01Qa\x03 \x89\x01R\x93\x8A\x01Q\x80Qa\x03@\x89\x01R\x84\x01Qa\x03`\x88\x01Ra\x01\xE0\x8A\x01Q\x80Qa\x03\x80\x89\x01R\x84\x01Qa\x03\xA0\x88\x01R\x89\x01Q\x80Qa\x03\xC0\x88\x01R\x83\x01Qa\x03\xE0\x87\x01Ra\x02 \x89\x01Q\x80Qa\x04\0\x88\x01R\x83\x01Qa\x04 \x87\x01R\x90\x88\x01Q\x80Qa\x04@\x87\x01R\x82\x01Qa\x04`\x86\x01Ra\x02`\x88\x01Q\x80Qa\x04\x80\x87\x01R\x90\x91\x01Qa\x04\xA0\x85\x01R\x86\x01Qa\x04\xC0\x84\x01RPa\x02\xA0\x85\x01Qa\x04\xE0\x83\x01Ra-\x93a\x05\0\x83\x01\x85a)oV[a-\xA1a\x06`\x83\x01\x84a)\x97V[\x94\x93PPPPV[_` \x82\x84\x03\x12\x15a-\xB9W_\x80\xFD[\x81Q\x80\x15\x15\x81\x14a v\xCC75\xA9 \xA3\xCAP]8+\xBC\xA1dsolcC\0\x08\x17\0\n", ); /**```solidity struct LightClientState { uint64 viewNum; uint64 blockHeight; BN254.ScalarField blockCommRoot; } @@ -3486,6 +3640,66 @@ pub mod LightClient { } } }; + /**Custom error with signature `MissingLastBlockInEpochUpdate()` and selector `0x7150de45`. + ```solidity + error MissingLastBlockInEpochUpdate(); + ```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct MissingLastBlockInEpochUpdate {} + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: MissingLastBlockInEpochUpdate) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for MissingLastBlockInEpochUpdate { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for MissingLastBlockInEpochUpdate { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "MissingLastBlockInEpochUpdate()"; + const SELECTOR: [u8; 4] = [113u8, 80u8, 222u8, 69u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + } + }; /**Custom error with signature `NoChangeRequired()` and selector `0xa863aec9`. ```solidity error NoChangeRequired(); @@ -4142,9 +4356,9 @@ pub mod LightClient { } } }; - /**Event with signature `NewState(uint64,uint64,uint256)` and selector `0xa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6`. + /**Event with signature `NewEpoch(uint64)` and selector `0x31eabd9099fdb25dacddd206abff87311e553441fc9d0fcdef201062d7e7071b`. ```solidity - event NewState(uint64 indexed viewNum, uint64 indexed blockHeight, BN254.ScalarField blockCommRoot); + event NewEpoch(uint64 epoch); ```*/ #[allow( non_camel_case_types, @@ -4153,13 +4367,9 @@ pub mod LightClient { clippy::style )] #[derive(Clone)] - pub struct NewState { - #[allow(missing_docs)] - pub viewNum: u64, - #[allow(missing_docs)] - pub blockHeight: u64, + pub struct NewEpoch { #[allow(missing_docs)] - pub blockCommRoot: ::RustType, + pub epoch: u64, } #[allow( non_camel_case_types, @@ -4170,20 +4380,16 @@ pub mod LightClient { const _: () = { use alloy::sol_types as alloy_sol_types; #[automatically_derived] - impl alloy_sol_types::SolEvent for NewState { - type DataTuple<'a> = (BN254::ScalarField,); + impl alloy_sol_types::SolEvent for NewEpoch { + type DataTuple<'a> = (alloy::sol_types::sol_data::Uint<64>,); type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - type TopicList = ( - alloy_sol_types::sol_data::FixedBytes<32>, - alloy::sol_types::sol_data::Uint<64>, - alloy::sol_types::sol_data::Uint<64>, - ); - const SIGNATURE: &'static str = "NewState(uint64,uint64,uint256)"; + type TopicList = (alloy_sol_types::sol_data::FixedBytes<32>,); + const SIGNATURE: &'static str = "NewEpoch(uint64)"; const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ - 160u8, 74u8, 119u8, 57u8, 36u8, 80u8, 90u8, 65u8, 133u8, 100u8, 54u8, 55u8, - 37u8, 245u8, 104u8, 50u8, 245u8, 119u8, 46u8, 107u8, 141u8, 13u8, 189u8, 110u8, - 252u8, 231u8, 36u8, 223u8, 232u8, 3u8, 218u8, 230u8, + 49u8, 234u8, 189u8, 144u8, 153u8, 253u8, 178u8, 93u8, 172u8, 221u8, 210u8, 6u8, + 171u8, 255u8, 135u8, 49u8, 30u8, 85u8, 52u8, 65u8, 252u8, 157u8, 15u8, 205u8, + 239u8, 32u8, 16u8, 98u8, 215u8, 231u8, 7u8, 27u8, ]); const ANONYMOUS: bool = false; #[allow(unused_variables)] @@ -4192,11 +4398,7 @@ pub mod LightClient { topics: ::RustType, data: as alloy_sol_types::SolType>::RustType, ) -> Self { - Self { - viewNum: topics.1, - blockHeight: topics.2, - blockCommRoot: data.0, - } + Self { epoch: data.0 } } #[inline] fn check_signature( @@ -4213,17 +4415,15 @@ pub mod LightClient { } #[inline] fn tokenize_body(&self) -> Self::DataToken<'_> { - (::tokenize( - &self.blockCommRoot, - ),) + ( + as alloy_sol_types::SolType>::tokenize( + &self.epoch, + ), + ) } #[inline] fn topics(&self) -> ::RustType { - ( - Self::SIGNATURE_HASH.into(), - self.viewNum.clone(), - self.blockHeight.clone(), - ) + (Self::SIGNATURE_HASH.into(),) } #[inline] fn encode_topics_raw( @@ -4234,17 +4434,11 @@ pub mod LightClient { return Err(alloy_sol_types::Error::Overrun); } out[0usize] = alloy_sol_types::abi::token::WordToken(Self::SIGNATURE_HASH); - out[1usize] = as alloy_sol_types::EventTopic>::encode_topic(&self.viewNum); - out[2usize] = as alloy_sol_types::EventTopic>::encode_topic(&self.blockHeight); Ok(()) } } #[automatically_derived] - impl alloy_sol_types::private::IntoLogData for NewState { + impl alloy_sol_types::private::IntoLogData for NewEpoch { fn to_log_data(&self) -> alloy_sol_types::private::LogData { From::from(self) } @@ -4253,16 +4447,16 @@ pub mod LightClient { } } #[automatically_derived] - impl From<&NewState> for alloy_sol_types::private::LogData { + impl From<&NewEpoch> for alloy_sol_types::private::LogData { #[inline] - fn from(this: &NewState) -> alloy_sol_types::private::LogData { + fn from(this: &NewEpoch) -> alloy_sol_types::private::LogData { alloy_sol_types::SolEvent::encode_log_data(this) } } }; - /**Event with signature `OwnershipTransferred(address,address)` and selector `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0`. + /**Event with signature `NewState(uint64,uint64,uint256)` and selector `0xa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6`. ```solidity - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + event NewState(uint64 indexed viewNum, uint64 indexed blockHeight, BN254.ScalarField blockCommRoot); ```*/ #[allow( non_camel_case_types, @@ -4271,11 +4465,13 @@ pub mod LightClient { clippy::style )] #[derive(Clone)] - pub struct OwnershipTransferred { + pub struct NewState { #[allow(missing_docs)] - pub previousOwner: alloy::sol_types::private::Address, + pub viewNum: u64, #[allow(missing_docs)] - pub newOwner: alloy::sol_types::private::Address, + pub blockHeight: u64, + #[allow(missing_docs)] + pub blockCommRoot: ::RustType, } #[allow( non_camel_case_types, @@ -4286,15 +4482,131 @@ pub mod LightClient { const _: () = { use alloy::sol_types as alloy_sol_types; #[automatically_derived] - impl alloy_sol_types::SolEvent for OwnershipTransferred { - type DataTuple<'a> = (); + impl alloy_sol_types::SolEvent for NewState { + type DataTuple<'a> = (BN254::ScalarField,); type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; type TopicList = ( alloy_sol_types::sol_data::FixedBytes<32>, - alloy::sol_types::sol_data::Address, - alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Uint<64>, + alloy::sol_types::sol_data::Uint<64>, ); - const SIGNATURE: &'static str = "OwnershipTransferred(address,address)"; + const SIGNATURE: &'static str = "NewState(uint64,uint64,uint256)"; + const SIGNATURE_HASH: alloy_sol_types::private::B256 = + alloy_sol_types::private::B256::new([ + 160u8, 74u8, 119u8, 57u8, 36u8, 80u8, 90u8, 65u8, 133u8, 100u8, 54u8, 55u8, + 37u8, 245u8, 104u8, 50u8, 245u8, 119u8, 46u8, 107u8, 141u8, 13u8, 189u8, 110u8, + 252u8, 231u8, 36u8, 223u8, 232u8, 3u8, 218u8, 230u8, + ]); + const ANONYMOUS: bool = false; + #[allow(unused_variables)] + #[inline] + fn new( + topics: ::RustType, + data: as alloy_sol_types::SolType>::RustType, + ) -> Self { + Self { + viewNum: topics.1, + blockHeight: topics.2, + blockCommRoot: data.0, + } + } + #[inline] + fn check_signature( + topics: &::RustType, + ) -> alloy_sol_types::Result<()> { + if topics.0 != Self::SIGNATURE_HASH { + return Err(alloy_sol_types::Error::invalid_event_signature_hash( + Self::SIGNATURE, + topics.0, + Self::SIGNATURE_HASH, + )); + } + Ok(()) + } + #[inline] + fn tokenize_body(&self) -> Self::DataToken<'_> { + (::tokenize( + &self.blockCommRoot, + ),) + } + #[inline] + fn topics(&self) -> ::RustType { + ( + Self::SIGNATURE_HASH.into(), + self.viewNum.clone(), + self.blockHeight.clone(), + ) + } + #[inline] + fn encode_topics_raw( + &self, + out: &mut [alloy_sol_types::abi::token::WordToken], + ) -> alloy_sol_types::Result<()> { + if out.len() < ::COUNT { + return Err(alloy_sol_types::Error::Overrun); + } + out[0usize] = alloy_sol_types::abi::token::WordToken(Self::SIGNATURE_HASH); + out[1usize] = as alloy_sol_types::EventTopic>::encode_topic(&self.viewNum); + out[2usize] = as alloy_sol_types::EventTopic>::encode_topic(&self.blockHeight); + Ok(()) + } + } + #[automatically_derived] + impl alloy_sol_types::private::IntoLogData for NewState { + fn to_log_data(&self) -> alloy_sol_types::private::LogData { + From::from(self) + } + fn into_log_data(self) -> alloy_sol_types::private::LogData { + From::from(&self) + } + } + #[automatically_derived] + impl From<&NewState> for alloy_sol_types::private::LogData { + #[inline] + fn from(this: &NewState) -> alloy_sol_types::private::LogData { + alloy_sol_types::SolEvent::encode_log_data(this) + } + } + }; + /**Event with signature `OwnershipTransferred(address,address)` and selector `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0`. + ```solidity + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + ```*/ + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + #[derive(Clone)] + pub struct OwnershipTransferred { + #[allow(missing_docs)] + pub previousOwner: alloy::sol_types::private::Address, + #[allow(missing_docs)] + pub newOwner: alloy::sol_types::private::Address, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::SolEvent for OwnershipTransferred { + type DataTuple<'a> = (); + type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + type TopicList = ( + alloy_sol_types::sol_data::FixedBytes<32>, + alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Address, + ); + const SIGNATURE: &'static str = "OwnershipTransferred(address,address)"; const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ 139u8, 224u8, 7u8, 156u8, 83u8, 22u8, 89u8, 20u8, 19u8, 68u8, 205u8, 31u8, @@ -4930,6 +5242,116 @@ pub mod LightClient { } } }; + /**Function with signature `_blocksPerEpoch()` and selector `0xb2424e3f`. + ```solidity + function _blocksPerEpoch() external view returns (uint64); + ```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct _blocksPerEpochCall {} + ///Container type for the return parameters of the [`_blocksPerEpoch()`](_blocksPerEpochCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct _blocksPerEpochReturn { + pub _0: u64, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From<_blocksPerEpochCall> for UnderlyingRustTuple<'_> { + fn from(value: _blocksPerEpochCall) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for _blocksPerEpochCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<64>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (u64,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From<_blocksPerEpochReturn> for UnderlyingRustTuple<'_> { + fn from(value: _blocksPerEpochReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for _blocksPerEpochReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for _blocksPerEpochCall { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = _blocksPerEpochReturn; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<64>,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "_blocksPerEpoch()"; + const SELECTOR: [u8; 4] = [178u8, 66u8, 78u8, 63u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn abi_decode_returns( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence( + data, validate, + ) + .map(Into::into) + } + } + }; /**Function with signature `currentBlockNumber()` and selector `0x378ec23b`. ```solidity function currentBlockNumber() external view returns (uint256); @@ -5040,6 +5462,116 @@ pub mod LightClient { } } }; + /**Function with signature `currentEpoch()` and selector `0x76671808`. + ```solidity + function currentEpoch() external view returns (uint64); + ```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct currentEpochCall {} + ///Container type for the return parameters of the [`currentEpoch()`](currentEpochCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct currentEpochReturn { + pub _0: u64, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: currentEpochCall) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for currentEpochCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<64>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (u64,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: currentEpochReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for currentEpochReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for currentEpochCall { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = currentEpochReturn; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<64>,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "currentEpoch()"; + const SELECTOR: [u8; 4] = [118u8, 103u8, 24u8, 8u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn abi_decode_returns( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence( + data, validate, + ) + .map(Into::into) + } + } + }; /**Function with signature `disablePermissionedProverMode()` and selector `0x69cc6a04`. ```solidity function disablePermissionedProverMode() external; @@ -5111,21 +5643,143 @@ pub mod LightClient { } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for disablePermissionedProverModeReturn { + impl ::core::convert::From> for disablePermissionedProverModeReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for disablePermissionedProverModeCall { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = disablePermissionedProverModeReturn; + type ReturnTuple<'a> = (); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "disablePermissionedProverMode()"; + const SELECTOR: [u8; 4] = [105u8, 204u8, 106u8, 4u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn abi_decode_returns( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence( + data, validate, + ) + .map(Into::into) + } + } + }; + /**Function with signature `epochFromBlockNumber(uint64,uint64)` and selector `0x90c14390`. + ```solidity + function epochFromBlockNumber(uint64 blockNum, uint64 blocksPerEpoch) external pure returns (uint64); + ```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct epochFromBlockNumberCall { + pub blockNum: u64, + pub blocksPerEpoch: u64, + } + ///Container type for the return parameters of the [`epochFromBlockNumber(uint64,uint64)`](epochFromBlockNumberCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct epochFromBlockNumberReturn { + pub _0: u64, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<64>, + alloy::sol_types::sol_data::Uint<64>, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (u64, u64); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: epochFromBlockNumberCall) -> Self { + (value.blockNum, value.blocksPerEpoch) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for epochFromBlockNumberCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + blockNum: tuple.0, + blocksPerEpoch: tuple.1, + } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<64>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (u64,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: epochFromBlockNumberReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for epochFromBlockNumberReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self {} + Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for disablePermissionedProverModeCall { - type Parameters<'a> = (); + impl alloy_sol_types::SolCall for epochFromBlockNumberCall { + type Parameters<'a> = ( + alloy::sol_types::sol_data::Uint<64>, + alloy::sol_types::sol_data::Uint<64>, + ); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = disablePermissionedProverModeReturn; - type ReturnTuple<'a> = (); + type Return = epochFromBlockNumberReturn; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<64>,); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "disablePermissionedProverMode()"; - const SELECTOR: [u8; 4] = [105u8, 204u8, 106u8, 4u8]; + const SIGNATURE: &'static str = "epochFromBlockNumber(uint64,uint64)"; + const SELECTOR: [u8; 4] = [144u8, 193u8, 67u8, 144u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -5134,7 +5788,14 @@ pub mod LightClient { } #[inline] fn tokenize(&self) -> Self::Token<'_> { - () + ( + as alloy_sol_types::SolType>::tokenize( + &self.blockNum, + ), + as alloy_sol_types::SolType>::tokenize( + &self.blocksPerEpoch, + ), + ) } #[inline] fn abi_decode_returns( @@ -5902,9 +6563,9 @@ pub mod LightClient { } } }; - /**Function with signature `initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address)` and selector `0x9baa3cc9`. + /**Function with signature `initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address,uint64)` and selector `0x811f853f`. ```solidity - function initialize(LightClientState memory _genesis, StakeTableState memory _genesisStakeTableState, uint32 _stateHistoryRetentionPeriod, address owner) external; + function initialize(LightClientState memory _genesis, StakeTableState memory _genesisStakeTableState, uint32 _stateHistoryRetentionPeriod, address owner, uint64 blocksPerEpoch) external; ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] @@ -5913,8 +6574,9 @@ pub mod LightClient { pub _genesisStakeTableState: ::RustType, pub _stateHistoryRetentionPeriod: u32, pub owner: alloy::sol_types::private::Address, + pub blocksPerEpoch: u64, } - ///Container type for the return parameters of the [`initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address)`](initializeCall) function. + ///Container type for the return parameters of the [`initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address,uint64)`](initializeCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] pub struct initializeReturn {} @@ -5933,6 +6595,7 @@ pub mod LightClient { StakeTableState, alloy::sol_types::sol_data::Uint<32>, alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Uint<64>, ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( @@ -5940,6 +6603,7 @@ pub mod LightClient { ::RustType, u32, alloy::sol_types::private::Address, + u64, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -5959,6 +6623,7 @@ pub mod LightClient { value._genesisStakeTableState, value._stateHistoryRetentionPeriod, value.owner, + value.blocksPerEpoch, ) } } @@ -5971,6 +6636,7 @@ pub mod LightClient { _genesisStakeTableState: tuple.1, _stateHistoryRetentionPeriod: tuple.2, owner: tuple.3, + blocksPerEpoch: tuple.4, } } } @@ -6011,13 +6677,14 @@ pub mod LightClient { StakeTableState, alloy::sol_types::sol_data::Uint<32>, alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Uint<64>, ); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; type Return = initializeReturn; type ReturnTuple<'a> = (); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address)"; - const SELECTOR: [u8; 4] = [155u8, 170u8, 60u8, 201u8]; + const SIGNATURE: &'static str = "initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address,uint64)"; + const SELECTOR: [u8; 4] = [129u8, 31u8, 133u8, 63u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -6037,6 +6704,127 @@ pub mod LightClient { ::tokenize( &self.owner, ), + as alloy_sol_types::SolType>::tokenize( + &self.blocksPerEpoch, + ), + ) + } + #[inline] + fn abi_decode_returns( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence( + data, validate, + ) + .map(Into::into) + } + } + }; + /**Function with signature `isLastBlockInEpoch(uint64)` and selector `0xa1be8d52`. + ```solidity + function isLastBlockInEpoch(uint64 blockHeight) external view returns (bool); + ```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct isLastBlockInEpochCall { + pub blockHeight: u64, + } + ///Container type for the return parameters of the [`isLastBlockInEpoch(uint64)`](isLastBlockInEpochCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct isLastBlockInEpochReturn { + pub _0: bool, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<64>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (u64,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: isLastBlockInEpochCall) -> Self { + (value.blockHeight,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for isLastBlockInEpochCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + blockHeight: tuple.0, + } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Bool,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (bool,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: isLastBlockInEpochReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for isLastBlockInEpochReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for isLastBlockInEpochCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Uint<64>,); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = isLastBlockInEpochReturn; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Bool,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "isLastBlockInEpoch(uint64)"; + const SELECTOR: [u8; 4] = [161u8, 190u8, 141u8, 82u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize( + &self.blockHeight, + ), ) } #[inline] @@ -6293,17 +7081,18 @@ pub mod LightClient { } } }; - /**Function with signature `newFinalizedState((uint64,uint64,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0x2063d4f7`. + /**Function with signature `newFinalizedState((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0x757c37ad`. ```solidity - function newFinalizedState(LightClientState memory newState, IPlonkVerifier.PlonkProof memory proof) external; + function newFinalizedState(LightClientState memory newState, StakeTableState memory nextStakeTable, IPlonkVerifier.PlonkProof memory proof) external; ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] pub struct newFinalizedStateCall { pub newState: ::RustType, + pub nextStakeTable: ::RustType, pub proof: ::RustType, } - ///Container type for the return parameters of the [`newFinalizedState((uint64,uint64,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))`](newFinalizedStateCall) function. + ///Container type for the return parameters of the [`newFinalizedState((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))`](newFinalizedStateCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] pub struct newFinalizedStateReturn {} @@ -6317,10 +7106,15 @@ pub mod LightClient { use alloy::sol_types as alloy_sol_types; { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (LightClientState, IPlonkVerifier::PlonkProof); + type UnderlyingSolTuple<'a> = ( + LightClientState, + StakeTableState, + IPlonkVerifier::PlonkProof, + ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( ::RustType, + ::RustType, ::RustType, ); #[cfg(test)] @@ -6336,7 +7130,7 @@ pub mod LightClient { #[doc(hidden)] impl ::core::convert::From for UnderlyingRustTuple<'_> { fn from(value: newFinalizedStateCall) -> Self { - (value.newState, value.proof) + (value.newState, value.nextStakeTable, value.proof) } } #[automatically_derived] @@ -6345,7 +7139,8 @@ pub mod LightClient { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { newState: tuple.0, - proof: tuple.1, + nextStakeTable: tuple.1, + proof: tuple.2, } } } @@ -6381,13 +7176,17 @@ pub mod LightClient { } #[automatically_derived] impl alloy_sol_types::SolCall for newFinalizedStateCall { - type Parameters<'a> = (LightClientState, IPlonkVerifier::PlonkProof); + type Parameters<'a> = ( + LightClientState, + StakeTableState, + IPlonkVerifier::PlonkProof, + ); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; type Return = newFinalizedStateReturn; type ReturnTuple<'a> = (); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "newFinalizedState((uint64,uint64,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))"; - const SELECTOR: [u8; 4] = [32u8, 99u8, 212u8, 247u8]; + const SIGNATURE: &'static str = "newFinalizedState((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))"; + const SELECTOR: [u8; 4] = [117u8, 124u8, 55u8, 173u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -6398,6 +7197,7 @@ pub mod LightClient { fn tokenize(&self) -> Self::Token<'_> { ( ::tokenize(&self.newState), + ::tokenize(&self.nextStakeTable), ::tokenize(&self.proof), ) } @@ -7489,9 +8289,133 @@ pub mod LightClient { } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for transferOwnershipCall { + impl ::core::convert::From> for transferOwnershipCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { newOwner: tuple.0 } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: transferOwnershipReturn) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for transferOwnershipReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for transferOwnershipCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Address,); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = transferOwnershipReturn; + type ReturnTuple<'a> = (); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "transferOwnership(address)"; + const SELECTOR: [u8; 4] = [242u8, 253u8, 227u8, 139u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + ::tokenize( + &self.newOwner, + ), + ) + } + #[inline] + fn abi_decode_returns( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence( + data, validate, + ) + .map(Into::into) + } + } + }; + /**Function with signature `upgradeToAndCall(address,bytes)` and selector `0x4f1ef286`. + ```solidity + function upgradeToAndCall(address newImplementation, bytes memory data) external payable; + ```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct upgradeToAndCallCall { + pub newImplementation: alloy::sol_types::private::Address, + pub data: alloy::sol_types::private::Bytes, + } + ///Container type for the return parameters of the [`upgradeToAndCall(address,bytes)`](upgradeToAndCallCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct upgradeToAndCallReturn {} + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Bytes, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::Address, + alloy::sol_types::private::Bytes, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: upgradeToAndCallCall) -> Self { + (value.newImplementation, value.data) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for upgradeToAndCallCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { newOwner: tuple.0 } + Self { + newImplementation: tuple.0, + data: tuple.1, + } } } } @@ -7511,28 +8435,31 @@ pub mod LightClient { } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: transferOwnershipReturn) -> Self { + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: upgradeToAndCallReturn) -> Self { () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for transferOwnershipReturn { + impl ::core::convert::From> for upgradeToAndCallReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self {} } } } #[automatically_derived] - impl alloy_sol_types::SolCall for transferOwnershipCall { - type Parameters<'a> = (alloy::sol_types::sol_data::Address,); + impl alloy_sol_types::SolCall for upgradeToAndCallCall { + type Parameters<'a> = ( + alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Bytes, + ); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = transferOwnershipReturn; + type Return = upgradeToAndCallReturn; type ReturnTuple<'a> = (); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "transferOwnership(address)"; - const SELECTOR: [u8; 4] = [242u8, 253u8, 227u8, 139u8]; + const SIGNATURE: &'static str = "upgradeToAndCall(address,bytes)"; + const SELECTOR: [u8; 4] = [79u8, 30u8, 242u8, 134u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -7543,7 +8470,10 @@ pub mod LightClient { fn tokenize(&self) -> Self::Token<'_> { ( ::tokenize( - &self.newOwner, + &self.newImplementation, + ), + ::tokenize( + &self.data, ), ) } @@ -7559,20 +8489,22 @@ pub mod LightClient { } } }; - /**Function with signature `upgradeToAndCall(address,bytes)` and selector `0x4f1ef286`. + /**Function with signature `votingStakeTableState()` and selector `0x0625e19b`. ```solidity - function upgradeToAndCall(address newImplementation, bytes memory data) external payable; + function votingStakeTableState() external view returns (uint256 threshold, BN254.ScalarField blsKeyComm, BN254.ScalarField schnorrKeyComm, BN254.ScalarField amountComm); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct upgradeToAndCallCall { - pub newImplementation: alloy::sol_types::private::Address, - pub data: alloy::sol_types::private::Bytes, - } - ///Container type for the return parameters of the [`upgradeToAndCall(address,bytes)`](upgradeToAndCallCall) function. + pub struct votingStakeTableStateCall {} + ///Container type for the return parameters of the [`votingStakeTableState()`](votingStakeTableStateCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct upgradeToAndCallReturn {} + pub struct votingStakeTableStateReturn { + pub threshold: alloy::sol_types::private::primitives::aliases::U256, + pub blsKeyComm: ::RustType, + pub schnorrKeyComm: ::RustType, + pub amountComm: ::RustType, + } #[allow( non_camel_case_types, non_snake_case, @@ -7583,15 +8515,9 @@ pub mod LightClient { use alloy::sol_types as alloy_sol_types; { #[doc(hidden)] - type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::Address, - alloy::sol_types::sol_data::Bytes, - ); + type UnderlyingSolTuple<'a> = (); #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::Address, - alloy::sol_types::private::Bytes, - ); + type UnderlyingRustTuple<'a> = (); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { @@ -7603,27 +8529,34 @@ pub mod LightClient { } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: upgradeToAndCallCall) -> Self { - (value.newImplementation, value.data) + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: votingStakeTableStateCall) -> Self { + () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for upgradeToAndCallCall { + impl ::core::convert::From> for votingStakeTableStateCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - newImplementation: tuple.0, - data: tuple.1, - } + Self {} } } } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (); + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + BN254::ScalarField, + BN254::ScalarField, + BN254::ScalarField, + ); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ::RustType, + ::RustType, + ::RustType, + ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { @@ -7635,31 +8568,43 @@ pub mod LightClient { } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: upgradeToAndCallReturn) -> Self { - () + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: votingStakeTableStateReturn) -> Self { + ( + value.threshold, + value.blsKeyComm, + value.schnorrKeyComm, + value.amountComm, + ) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for upgradeToAndCallReturn { + impl ::core::convert::From> for votingStakeTableStateReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self {} + Self { + threshold: tuple.0, + blsKeyComm: tuple.1, + schnorrKeyComm: tuple.2, + amountComm: tuple.3, + } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for upgradeToAndCallCall { - type Parameters<'a> = ( - alloy::sol_types::sol_data::Address, - alloy::sol_types::sol_data::Bytes, - ); + impl alloy_sol_types::SolCall for votingStakeTableStateCall { + type Parameters<'a> = (); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = upgradeToAndCallReturn; - type ReturnTuple<'a> = (); + type Return = votingStakeTableStateReturn; + type ReturnTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + BN254::ScalarField, + BN254::ScalarField, + BN254::ScalarField, + ); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "upgradeToAndCall(address,bytes)"; - const SELECTOR: [u8; 4] = [79u8, 30u8, 242u8, 134u8]; + const SIGNATURE: &'static str = "votingStakeTableState()"; + const SELECTOR: [u8; 4] = [6u8, 37u8, 225u8, 155u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -7668,14 +8613,7 @@ pub mod LightClient { } #[inline] fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.newImplementation, - ), - ::tokenize( - &self.data, - ), - ) + () } #[inline] fn abi_decode_returns( @@ -7692,8 +8630,11 @@ pub mod LightClient { ///Container for all the [`LightClient`](self) function calls. pub enum LightClientCalls { UPGRADE_INTERFACE_VERSION(UPGRADE_INTERFACE_VERSIONCall), + _blocksPerEpoch(_blocksPerEpochCall), currentBlockNumber(currentBlockNumberCall), + currentEpoch(currentEpochCall), disablePermissionedProverMode(disablePermissionedProverModeCall), + epochFromBlockNumber(epochFromBlockNumberCall), finalizedState(finalizedStateCall), genesisStakeTableState(genesisStakeTableStateCall), genesisState(genesisStateCall), @@ -7701,6 +8642,7 @@ pub mod LightClient { getStateHistoryCount(getStateHistoryCountCall), getVersion(getVersionCall), initialize(initializeCall), + isLastBlockInEpoch(isLastBlockInEpochCall), isPermissionedProverEnabled(isPermissionedProverEnabledCall), lagOverEscapeHatchThreshold(lagOverEscapeHatchThresholdCall), newFinalizedState(newFinalizedStateCall), @@ -7715,6 +8657,7 @@ pub mod LightClient { stateHistoryRetentionPeriod(stateHistoryRetentionPeriodCall), transferOwnership(transferOwnershipCall), upgradeToAndCall(upgradeToAndCallCall), + votingStakeTableState(votingStakeTableStateCall), } #[automatically_derived] impl LightClientCalls { @@ -7727,8 +8670,8 @@ pub mod LightClient { pub const SELECTORS: &'static [[u8; 4usize]] = &[ [1u8, 63u8, 165u8, 252u8], [2u8, 181u8, 146u8, 243u8], + [6u8, 37u8, 225u8, 155u8], [13u8, 142u8, 110u8, 44u8], - [32u8, 99u8, 212u8, 247u8], [47u8, 121u8, 136u8, 157u8], [49u8, 61u8, 247u8, 177u8], [55u8, 142u8, 194u8, 59u8], @@ -7737,13 +8680,18 @@ pub mod LightClient { [82u8, 209u8, 144u8, 45u8], [105u8, 204u8, 106u8, 4u8], [113u8, 80u8, 24u8, 166u8], + [117u8, 124u8, 55u8, 173u8], + [118u8, 103u8, 24u8, 8u8], + [129u8, 31u8, 133u8, 63u8], [130u8, 110u8, 65u8, 252u8], [133u8, 132u8, 210u8, 63u8], [141u8, 165u8, 203u8, 91u8], + [144u8, 193u8, 67u8, 144u8], [150u8, 193u8, 202u8, 97u8], - [155u8, 170u8, 60u8, 201u8], [159u8, 219u8, 84u8, 167u8], + [161u8, 190u8, 141u8, 82u8], [173u8, 60u8, 177u8, 204u8], + [178u8, 66u8, 78u8, 63u8], [194u8, 59u8, 158u8, 158u8], [210u8, 77u8, 147u8, 61u8], [224u8, 48u8, 51u8, 1u8], @@ -7755,19 +8703,26 @@ pub mod LightClient { impl alloy_sol_types::SolInterface for LightClientCalls { const NAME: &'static str = "LightClientCalls"; const MIN_DATA_LENGTH: usize = 0usize; - const COUNT: usize = 24usize; + const COUNT: usize = 29usize; #[inline] fn selector(&self) -> [u8; 4] { match self { Self::UPGRADE_INTERFACE_VERSION(_) => { ::SELECTOR } + Self::_blocksPerEpoch(_) => { + <_blocksPerEpochCall as alloy_sol_types::SolCall>::SELECTOR + } Self::currentBlockNumber(_) => { ::SELECTOR } + Self::currentEpoch(_) => ::SELECTOR, Self::disablePermissionedProverMode(_) => { ::SELECTOR } + Self::epochFromBlockNumber(_) => { + ::SELECTOR + } Self::finalizedState(_) => { ::SELECTOR } @@ -7783,6 +8738,9 @@ pub mod LightClient { } Self::getVersion(_) => ::SELECTOR, Self::initialize(_) => ::SELECTOR, + Self::isLastBlockInEpoch(_) => { + ::SELECTOR + } Self::isPermissionedProverEnabled(_) => { ::SELECTOR } @@ -7821,6 +8779,9 @@ pub mod LightClient { Self::upgradeToAndCall(_) => { ::SELECTOR } + Self::votingStakeTableState(_) => { + ::SELECTOR + } } } #[inline] @@ -7866,28 +8827,28 @@ pub mod LightClient { stateHistoryCommitments }, { - fn getVersion( + fn votingStakeTableState( data: &[u8], validate: bool, ) -> alloy_sol_types::Result { - ::abi_decode_raw( + ::abi_decode_raw( data, validate, ) - .map(LightClientCalls::getVersion) + .map(LightClientCalls::votingStakeTableState) } - getVersion + votingStakeTableState }, { - fn newFinalizedState( + fn getVersion( data: &[u8], validate: bool, ) -> alloy_sol_types::Result { - ::abi_decode_raw( + ::abi_decode_raw( data, validate, ) - .map(LightClientCalls::newFinalizedState) + .map(LightClientCalls::getVersion) } - newFinalizedState + getVersion }, { fn stateHistoryFirstIndex( @@ -7988,6 +8949,42 @@ pub mod LightClient { } renounceOwnership }, + { + fn newFinalizedState( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, validate, + ) + .map(LightClientCalls::newFinalizedState) + } + newFinalizedState + }, + { + fn currentEpoch( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, validate, + ) + .map(LightClientCalls::currentEpoch) + } + currentEpoch + }, + { + fn initialize( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, validate, + ) + .map(LightClientCalls::initialize) + } + initialize + }, { fn isPermissionedProverEnabled( data: &[u8], @@ -8023,6 +9020,18 @@ pub mod LightClient { } owner }, + { + fn epochFromBlockNumber( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, validate, + ) + .map(LightClientCalls::epochFromBlockNumber) + } + epochFromBlockNumber + }, { fn setstateHistoryRetentionPeriod( data: &[u8], @@ -8037,28 +9046,28 @@ pub mod LightClient { setstateHistoryRetentionPeriod }, { - fn initialize( + fn finalizedState( data: &[u8], validate: bool, ) -> alloy_sol_types::Result { - ::abi_decode_raw( + ::abi_decode_raw( data, validate, ) - .map(LightClientCalls::initialize) + .map(LightClientCalls::finalizedState) } - initialize + finalizedState }, { - fn finalizedState( + fn isLastBlockInEpoch( data: &[u8], validate: bool, ) -> alloy_sol_types::Result { - ::abi_decode_raw( + ::abi_decode_raw( data, validate, ) - .map(LightClientCalls::finalizedState) + .map(LightClientCalls::isLastBlockInEpoch) } - finalizedState + isLastBlockInEpoch }, { fn UPGRADE_INTERFACE_VERSION( @@ -8073,6 +9082,18 @@ pub mod LightClient { } UPGRADE_INTERFACE_VERSION }, + { + fn _blocksPerEpoch( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + <_blocksPerEpochCall as alloy_sol_types::SolCall>::abi_decode_raw( + data, validate, + ) + .map(LightClientCalls::_blocksPerEpoch) + } + _blocksPerEpoch + }, { fn stateHistoryRetentionPeriod( data: &[u8], @@ -8152,16 +9173,31 @@ pub mod LightClient { inner, ) } + Self::_blocksPerEpoch(inner) => { + <_blocksPerEpochCall as alloy_sol_types::SolCall>::abi_encoded_size( + inner, + ) + } Self::currentBlockNumber(inner) => { ::abi_encoded_size( inner, ) } + Self::currentEpoch(inner) => { + ::abi_encoded_size( + inner, + ) + } Self::disablePermissionedProverMode(inner) => { ::abi_encoded_size( inner, ) } + Self::epochFromBlockNumber(inner) => { + ::abi_encoded_size( + inner, + ) + } Self::finalizedState(inner) => { ::abi_encoded_size( inner, @@ -8193,6 +9229,11 @@ pub mod LightClient { Self::initialize(inner) => { ::abi_encoded_size(inner) } + Self::isLastBlockInEpoch(inner) => { + ::abi_encoded_size( + inner, + ) + } Self::isPermissionedProverEnabled(inner) => { ::abi_encoded_size( inner, @@ -8261,6 +9302,11 @@ pub mod LightClient { inner, ) } + Self::votingStakeTableState(inner) => { + ::abi_encoded_size( + inner, + ) + } } } #[inline] @@ -8271,14 +9317,25 @@ pub mod LightClient { inner, out, ) } + Self::_blocksPerEpoch(inner) => { + <_blocksPerEpochCall as alloy_sol_types::SolCall>::abi_encode_raw(inner, out) + } Self::currentBlockNumber(inner) => { ::abi_encode_raw(inner, out) } + Self::currentEpoch(inner) => { + ::abi_encode_raw(inner, out) + } Self::disablePermissionedProverMode(inner) => { ::abi_encode_raw( inner, out, ) } + Self::epochFromBlockNumber(inner) => { + ::abi_encode_raw( + inner, out, + ) + } Self::finalizedState(inner) => { ::abi_encode_raw(inner, out) } @@ -8306,6 +9363,9 @@ pub mod LightClient { Self::initialize(inner) => { ::abi_encode_raw(inner, out) } + Self::isLastBlockInEpoch(inner) => { + ::abi_encode_raw(inner, out) + } Self::isPermissionedProverEnabled(inner) => { ::abi_encode_raw( inner, out, @@ -8362,6 +9422,11 @@ pub mod LightClient { Self::upgradeToAndCall(inner) => { ::abi_encode_raw(inner, out) } + Self::votingStakeTableState(inner) => { + ::abi_encode_raw( + inner, out, + ) + } } } } @@ -8378,6 +9443,7 @@ pub mod LightClient { InvalidInitialization(InvalidInitialization), InvalidMaxStateHistory(InvalidMaxStateHistory), InvalidProof(InvalidProof), + MissingLastBlockInEpochUpdate(MissingLastBlockInEpochUpdate), NoChangeRequired(NoChangeRequired), NotInitializing(NotInitializing), OutdatedState(OutdatedState), @@ -8405,6 +9471,7 @@ pub mod LightClient { [76u8, 156u8, 140u8, 227u8], [81u8, 97u8, 128u8, 137u8], [97u8, 90u8, 146u8, 100u8], + [113u8, 80u8, 222u8, 69u8], [153u8, 150u8, 179u8, 21u8], [161u8, 186u8, 7u8, 238u8], [163u8, 166u8, 71u8, 128u8], @@ -8423,7 +9490,7 @@ pub mod LightClient { impl alloy_sol_types::SolInterface for LightClientErrors { const NAME: &'static str = "LightClientErrors"; const MIN_DATA_LENGTH: usize = 0usize; - const COUNT: usize = 20usize; + const COUNT: usize = 21usize; #[inline] fn selector(&self) -> [u8; 4] { match self { @@ -8454,6 +9521,9 @@ pub mod LightClient { ::SELECTOR } Self::InvalidProof(_) => ::SELECTOR, + Self::MissingLastBlockInEpochUpdate(_) => { + ::SELECTOR + } Self::NoChangeRequired(_) => { ::SELECTOR } @@ -8596,6 +9666,19 @@ pub mod LightClient { } InvalidHotShotBlockForCommitmentCheck }, + { + fn MissingLastBlockInEpochUpdate( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + validate, + ) + .map(LightClientErrors::MissingLastBlockInEpochUpdate) + } + MissingLastBlockInEpochUpdate + }, { fn AddressEmptyCode( data: &[u8], @@ -8801,6 +9884,11 @@ pub mod LightClient { Self::InvalidProof(inner) => { ::abi_encoded_size(inner) } + Self::MissingLastBlockInEpochUpdate(inner) => { + ::abi_encoded_size( + inner, + ) + } Self::NoChangeRequired(inner) => { ::abi_encoded_size( inner, @@ -8915,6 +10003,12 @@ pub mod LightClient { out, ) } + Self::MissingLastBlockInEpochUpdate(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } Self::NoChangeRequired(inner) => { ::abi_encode_raw( inner, @@ -8975,6 +10069,7 @@ pub mod LightClient { ///Container for all the [`LightClient`](self) events. pub enum LightClientEvents { Initialized(Initialized), + NewEpoch(NewEpoch), NewState(NewState), OwnershipTransferred(OwnershipTransferred), PermissionedProverNotRequired(PermissionedProverNotRequired), @@ -8991,6 +10086,11 @@ pub mod LightClient { /// /// Prefer using `SolInterface` methods instead. pub const SELECTORS: &'static [[u8; 32usize]] = &[ + [ + 49u8, 234u8, 189u8, 144u8, 153u8, 253u8, 178u8, 93u8, 172u8, 221u8, 210u8, 6u8, + 171u8, 255u8, 135u8, 49u8, 30u8, 85u8, 52u8, 65u8, 252u8, 157u8, 15u8, 205u8, + 239u8, 32u8, 16u8, 98u8, 215u8, 231u8, 7u8, 27u8, + ], [ 128u8, 23u8, 187u8, 136u8, 127u8, 223u8, 143u8, 202u8, 67u8, 20u8, 169u8, 212u8, 15u8, 110u8, 115u8, 179u8, 184u8, 16u8, 2u8, 214u8, 126u8, 92u8, 250u8, 133u8, @@ -9031,7 +10131,7 @@ pub mod LightClient { #[automatically_derived] impl alloy_sol_types::SolEventInterface for LightClientEvents { const NAME: &'static str = "LightClientEvents"; - const COUNT: usize = 7usize; + const COUNT: usize = 8usize; fn decode_raw_log( topics: &[alloy_sol_types::Word], data: &[u8], @@ -9044,6 +10144,10 @@ pub mod LightClient { ) .map(Self::Initialized) } + Some(::SIGNATURE_HASH) => { + ::decode_raw_log(topics, data, validate) + .map(Self::NewEpoch) + } Some(::SIGNATURE_HASH) => { ::decode_raw_log(topics, data, validate) .map(Self::NewState) @@ -9093,6 +10197,7 @@ pub mod LightClient { Self::Initialized(inner) => { alloy_sol_types::private::IntoLogData::to_log_data(inner) } + Self::NewEpoch(inner) => alloy_sol_types::private::IntoLogData::to_log_data(inner), Self::NewState(inner) => alloy_sol_types::private::IntoLogData::to_log_data(inner), Self::OwnershipTransferred(inner) => { alloy_sol_types::private::IntoLogData::to_log_data(inner) @@ -9112,6 +10217,9 @@ pub mod LightClient { Self::Initialized(inner) => { alloy_sol_types::private::IntoLogData::into_log_data(inner) } + Self::NewEpoch(inner) => { + alloy_sol_types::private::IntoLogData::into_log_data(inner) + } Self::NewState(inner) => { alloy_sol_types::private::IntoLogData::into_log_data(inner) } @@ -9301,18 +10409,39 @@ pub mod LightClient { ) -> alloy_contract::SolCallBuilder { self.call_builder(&UPGRADE_INTERFACE_VERSIONCall {}) } + ///Creates a new call builder for the [`_blocksPerEpoch`] function. + pub fn _blocksPerEpoch( + &self, + ) -> alloy_contract::SolCallBuilder { + self.call_builder(&_blocksPerEpochCall {}) + } ///Creates a new call builder for the [`currentBlockNumber`] function. pub fn currentBlockNumber( &self, ) -> alloy_contract::SolCallBuilder { self.call_builder(¤tBlockNumberCall {}) } + ///Creates a new call builder for the [`currentEpoch`] function. + pub fn currentEpoch(&self) -> alloy_contract::SolCallBuilder { + self.call_builder(¤tEpochCall {}) + } ///Creates a new call builder for the [`disablePermissionedProverMode`] function. pub fn disablePermissionedProverMode( &self, ) -> alloy_contract::SolCallBuilder { self.call_builder(&disablePermissionedProverModeCall {}) } + ///Creates a new call builder for the [`epochFromBlockNumber`] function. + pub fn epochFromBlockNumber( + &self, + blockNum: u64, + blocksPerEpoch: u64, + ) -> alloy_contract::SolCallBuilder { + self.call_builder(&epochFromBlockNumberCall { + blockNum, + blocksPerEpoch, + }) + } ///Creates a new call builder for the [`finalizedState`] function. pub fn finalizedState( &self, @@ -9353,14 +10482,23 @@ pub mod LightClient { _genesisStakeTableState: ::RustType, _stateHistoryRetentionPeriod: u32, owner: alloy::sol_types::private::Address, + blocksPerEpoch: u64, ) -> alloy_contract::SolCallBuilder { self.call_builder(&initializeCall { _genesis, _genesisStakeTableState, _stateHistoryRetentionPeriod, owner, + blocksPerEpoch, }) } + ///Creates a new call builder for the [`isLastBlockInEpoch`] function. + pub fn isLastBlockInEpoch( + &self, + blockHeight: u64, + ) -> alloy_contract::SolCallBuilder { + self.call_builder(&isLastBlockInEpochCall { blockHeight }) + } ///Creates a new call builder for the [`isPermissionedProverEnabled`] function. pub fn isPermissionedProverEnabled( &self, @@ -9382,9 +10520,14 @@ pub mod LightClient { pub fn newFinalizedState( &self, newState: ::RustType, + nextStakeTable: ::RustType, proof: ::RustType, ) -> alloy_contract::SolCallBuilder { - self.call_builder(&newFinalizedStateCall { newState, proof }) + self.call_builder(&newFinalizedStateCall { + newState, + nextStakeTable, + proof, + }) } ///Creates a new call builder for the [`owner`] function. pub fn owner(&self) -> alloy_contract::SolCallBuilder { @@ -9457,6 +10600,12 @@ pub mod LightClient { data, }) } + ///Creates a new call builder for the [`votingStakeTableState`] function. + pub fn votingStakeTableState( + &self, + ) -> alloy_contract::SolCallBuilder { + self.call_builder(&votingStakeTableStateCall {}) + } } /// Event filters. #[automatically_derived] @@ -9479,6 +10628,10 @@ pub mod LightClient { pub fn Initialized_filter(&self) -> alloy_contract::Event { self.event_filter::() } + ///Creates a new event filter for the [`NewEpoch`] event. + pub fn NewEpoch_filter(&self) -> alloy_contract::Event { + self.event_filter::() + } ///Creates a new event filter for the [`NewState`] event. pub fn NewState_filter(&self) -> alloy_contract::Event { self.event_filter::() diff --git a/contract-bindings-alloy/src/lightclientarbitrum.rs b/contract-bindings-alloy/src/lightclientarbitrum.rs index 1edab7451d..af4f10cbdc 100644 --- a/contract-bindings-alloy/src/lightclientarbitrum.rs +++ b/contract-bindings-alloy/src/lightclientarbitrum.rs @@ -1902,6 +1902,7 @@ interface LightClientArbitrum { error InvalidInitialization(); error InvalidMaxStateHistory(); error InvalidProof(); + error MissingLastBlockInEpochUpdate(); error NoChangeRequired(); error NotInitializing(); error OutdatedState(); @@ -1913,6 +1914,7 @@ interface LightClientArbitrum { error WrongStakeTableUsed(); event Initialized(uint64 version); + event NewEpoch(uint64 epoch); event NewState(uint64 indexed viewNum, uint64 indexed blockHeight, BN254.ScalarField blockCommRoot); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); event PermissionedProverNotRequired(); @@ -1921,18 +1923,22 @@ interface LightClientArbitrum { event Upgraded(address indexed implementation); function UPGRADE_INTERFACE_VERSION() external view returns (string memory); + function _blocksPerEpoch() external view returns (uint64); function currentBlockNumber() external view returns (uint256); + function currentEpoch() external view returns (uint64); function disablePermissionedProverMode() external; + function epochFromBlockNumber(uint64 blockNum, uint64 blocksPerEpoch) external pure returns (uint64); function finalizedState() external view returns (uint64 viewNum, uint64 blockHeight, BN254.ScalarField blockCommRoot); function genesisStakeTableState() external view returns (uint256 threshold, BN254.ScalarField blsKeyComm, BN254.ScalarField schnorrKeyComm, BN254.ScalarField amountComm); function genesisState() external view returns (uint64 viewNum, uint64 blockHeight, BN254.ScalarField blockCommRoot); function getHotShotCommitment(uint256 hotShotBlockHeight) external view returns (BN254.ScalarField hotShotBlockCommRoot, uint64 hotshotBlockHeight); function getStateHistoryCount() external view returns (uint256); function getVersion() external pure returns (uint8 majorVersion, uint8 minorVersion, uint8 patchVersion); - function initialize(LightClient.LightClientState memory _genesis, LightClient.StakeTableState memory _genesisStakeTableState, uint32 _stateHistoryRetentionPeriod, address owner) external; + function initialize(LightClient.LightClientState memory _genesis, LightClient.StakeTableState memory _genesisStakeTableState, uint32 _stateHistoryRetentionPeriod, address owner, uint64 blocksPerEpoch) external; + function isLastBlockInEpoch(uint64 blockHeight) external view returns (bool); function isPermissionedProverEnabled() external view returns (bool); function lagOverEscapeHatchThreshold(uint256 blockNumber, uint256 blockThreshold) external view returns (bool); - function newFinalizedState(LightClient.LightClientState memory newState, IPlonkVerifier.PlonkProof memory proof) external; + function newFinalizedState(LightClient.LightClientState memory newState, LightClient.StakeTableState memory nextStakeTable, IPlonkVerifier.PlonkProof memory proof) external; function owner() external view returns (address); function permissionedProver() external view returns (address); function proxiableUUID() external view returns (bytes32); @@ -1944,6 +1950,7 @@ interface LightClientArbitrum { function stateHistoryRetentionPeriod() external view returns (uint32); function transferOwnership(address newOwner) external; function upgradeToAndCall(address newImplementation, bytes memory data) external payable; + function votingStakeTableState() external view returns (uint256 threshold, BN254.ScalarField blsKeyComm, BN254.ScalarField schnorrKeyComm, BN254.ScalarField amountComm); } ``` @@ -1963,6 +1970,19 @@ interface LightClientArbitrum { ], "stateMutability": "view" }, + { + "type": "function", + "name": "_blocksPerEpoch", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint64", + "internalType": "uint64" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "currentBlockNumber", @@ -1976,6 +1996,19 @@ interface LightClientArbitrum { ], "stateMutability": "view" }, + { + "type": "function", + "name": "currentEpoch", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint64", + "internalType": "uint64" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "disablePermissionedProverMode", @@ -1983,6 +2016,30 @@ interface LightClientArbitrum { "outputs": [], "stateMutability": "nonpayable" }, + { + "type": "function", + "name": "epochFromBlockNumber", + "inputs": [ + { + "name": "blockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "blocksPerEpoch", + "type": "uint64", + "internalType": "uint64" + } + ], + "outputs": [ + { + "name": "", + "type": "uint64", + "internalType": "uint64" + } + ], + "stateMutability": "pure" + }, { "type": "function", "name": "finalizedState", @@ -2179,11 +2236,35 @@ interface LightClientArbitrum { "name": "owner", "type": "address", "internalType": "address" + }, + { + "name": "blocksPerEpoch", + "type": "uint64", + "internalType": "uint64" } ], "outputs": [], "stateMutability": "nonpayable" }, + { + "type": "function", + "name": "isLastBlockInEpoch", + "inputs": [ + { + "name": "blockHeight", + "type": "uint64", + "internalType": "uint64" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "isPermissionedProverEnabled", @@ -2247,6 +2328,33 @@ interface LightClientArbitrum { } ] }, + { + "name": "nextStakeTable", + "type": "tuple", + "internalType": "struct LightClient.StakeTableState", + "components": [ + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "blsKeyComm", + "type": "uint256", + "internalType": "BN254.ScalarField" + }, + { + "name": "schnorrKeyComm", + "type": "uint256", + "internalType": "BN254.ScalarField" + }, + { + "name": "amountComm", + "type": "uint256", + "internalType": "BN254.ScalarField" + } + ] + }, { "name": "proof", "type": "tuple", @@ -2692,6 +2800,34 @@ interface LightClientArbitrum { "outputs": [], "stateMutability": "payable" }, + { + "type": "function", + "name": "votingStakeTableState", + "inputs": [], + "outputs": [ + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "blsKeyComm", + "type": "uint256", + "internalType": "BN254.ScalarField" + }, + { + "name": "schnorrKeyComm", + "type": "uint256", + "internalType": "BN254.ScalarField" + }, + { + "name": "amountComm", + "type": "uint256", + "internalType": "BN254.ScalarField" + } + ], + "stateMutability": "view" + }, { "type": "event", "name": "Initialized", @@ -2705,6 +2841,19 @@ interface LightClientArbitrum { ], "anonymous": false }, + { + "type": "event", + "name": "NewEpoch", + "inputs": [ + { + "name": "epoch", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, { "type": "event", "name": "NewState", @@ -2861,6 +3010,11 @@ interface LightClientArbitrum { "name": "InvalidProof", "inputs": [] }, + { + "type": "error", + "name": "MissingLastBlockInEpochUpdate", + "inputs": [] + }, { "type": "error", "name": "NoChangeRequired", @@ -2939,22 +3093,22 @@ pub mod LightClientArbitrum { /// The creation / init bytecode of the contract. /// /// ```text - ///0x60a06040523060805234801562000014575f80fd5b506200001f62000025565b620000d9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000765760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6080516129dd620001005f395f81816111090152818161113201526112af01526129dd5ff3fe608060405260043610610147575f3560e01c8063826e41fc116100b3578063ad3cb1cc1161006d578063ad3cb1cc14610470578063c23b9e9e146104ad578063d24d933d146104e5578063e030330114610514578063f2fde38b14610533578063f9e50d1914610552575f80fd5b8063826e41fc1461033a5780638584d23f146103655780638da5cb5b146103a157806396c1ca61146103dd5780639baa3cc9146103fc5780639fdb54a71461041b575f80fd5b8063378ec23b11610104578063378ec23b14610288578063426d3194146102aa5780634f1ef286146102eb57806352d1902d146102fe57806369cc6a0414610312578063715018a614610326575f80fd5b8063013fa5fc1461014b57806302b592f31461016c5780630d8e6e2c146101c95780632063d4f7146101f45780632f79889d14610213578063313df7b114610251575b5f80fd5b348015610156575f80fd5b5061016a610165366004611f92565b610566565b005b348015610177575f80fd5b5061018b610186366004611fab565b610619565b6040516101c094939291906001600160401b039485168152928416602084015292166040820152606081019190915260800190565b60405180910390f35b3480156101d4575f80fd5b5060408051600181525f60208201819052918101919091526060016101c0565b3480156101ff575f80fd5b5061016a61020e3660046120f6565b610662565b34801561021e575f80fd5b5060085461023990600160c01b90046001600160401b031681565b6040516001600160401b0390911681526020016101c0565b34801561025c575f80fd5b50600854610270906001600160a01b031681565b6040516001600160a01b0390911681526020016101c0565b348015610293575f80fd5b5061029c6107bd565b6040519081526020016101c0565b3480156102b5575f80fd5b505f546001546002546003546102cb9392919084565b6040805194855260208501939093529183015260608201526080016101c0565b61016a6102f93660046122a7565b610824565b348015610309575f80fd5b5061029c610843565b34801561031d575f80fd5b5061016a61085e565b348015610331575f80fd5b5061016a6108cc565b348015610345575f80fd5b506008546001600160a01b031615155b60405190151581526020016101c0565b348015610370575f80fd5b5061038461037f366004611fab565b6108dd565b604080519283526001600160401b039091166020830152016101c0565b3480156103ac575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610270565b3480156103e8575f80fd5b5061016a6103f7366004612359565b610a08565b348015610407575f80fd5b5061016a610416366004612372565b610a91565b348015610426575f80fd5b5060065460075461044a916001600160401b0380821692600160401b909204169083565b604080516001600160401b039485168152939092166020840152908201526060016101c0565b34801561047b575f80fd5b506104a0604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101c0919061243d565b3480156104b8575f80fd5b506008546104d090600160a01b900463ffffffff1681565b60405163ffffffff90911681526020016101c0565b3480156104f0575f80fd5b5060045460055461044a916001600160401b0380821692600160401b909204169083565b34801561051f575f80fd5b5061035561052e36600461246f565b610bb3565b34801561053e575f80fd5b5061016a61054d366004611f92565b610d14565b34801561055d575f80fd5b5060095461029c565b61056e610d56565b6001600160a01b0381166105955760405163e6c4247b60e01b815260040160405180910390fd5b6008546001600160a01b03908116908216036105c45760405163a863aec960e01b815260040160405180910390fd5b600880546001600160a01b0319166001600160a01b0383169081179091556040519081527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b60098181548110610628575f80fd5b5f918252602090912060029091020180546001909101546001600160401b038083169350600160401b8304811692600160801b9004169084565b6008546001600160a01b03161515801561068757506008546001600160a01b03163314155b156106a5576040516301474c8f60e71b815260040160405180910390fd5b60065482516001600160401b0391821691161115806106de575060065460208301516001600160401b03600160401b9092048216911611155b156106fc5760405163051c46ef60e01b815260040160405180910390fd5b6107098260400151610db1565b6107138282610e21565b81516006805460208501516001600160401b03908116600160401b026001600160801b0319909216931692909217919091179055604082015160075561076161075a6107bd565b4284610f15565b81602001516001600160401b0316825f01516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae684604001516040516107b191815260200190565b60405180910390a35050565b5f60646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061081f919061248f565b905090565b61082c6110fe565b610835826111a2565b61083f82826111e3565b5050565b5f61084c6112a4565b505f805160206129b183398151915290565b610866610d56565b6008546001600160a01b0316156108b157600880546001600160a01b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c02450905f90a1565b60405163a863aec960e01b815260040160405180910390fd5b565b6108d4610d56565b6108ca5f6112ed565b600980545f918291906108f16001836124ba565b81548110610901576109016124cd565b5f918252602090912060029091020154600160801b90046001600160401b0316841061094057604051631856a49960e21b815260040160405180910390fd5b600854600160c01b90046001600160401b03165b81811015610a01578460098281548110610970576109706124cd565b5f918252602090912060029091020154600160801b90046001600160401b031611156109f957600981815481106109a9576109a96124cd565b905f5260205f20906002020160010154600982815481106109cc576109cc6124cd565b905f5260205f2090600202015f0160109054906101000a90046001600160401b0316935093505050915091565b600101610954565b5050915091565b610a10610d56565b610e108163ffffffff161080610a2f57506301e133808163ffffffff16115b80610a4d575060085463ffffffff600160a01b909104811690821611155b15610a6b576040516307a5077760e51b815260040160405180910390fd5b6008805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610ad55750825b90505f826001600160401b03166001148015610af05750303b155b905081158015610afe575080155b15610b1c5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610b4657845460ff60401b1916600160401b1785555b610b4f8661135d565b610b5761136e565b610b62898989611376565b8315610ba857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b6009545f90610bc06107bd565b841180610bcb575080155b80610c155750600854600980549091600160c01b90046001600160401b0316908110610bf957610bf96124cd565b5f9182526020909120600290910201546001600160401b031684105b15610c335760405163b0b4387760e01b815260040160405180910390fd5b5f8080610c416001856124ba565b90505b81610cdd57600854600160c01b90046001600160401b03168110610cdd578660098281548110610c7657610c766124cd565b5f9182526020909120600290910201546001600160401b031611610ccb576001915060098181548110610cab57610cab6124cd565b5f9182526020909120600290910201546001600160401b03169250610cdd565b80610cd5816124e1565b915050610c44565b81610cfb5760405163b0b4387760e01b815260040160405180910390fd5b85610d0684896124ba565b119450505050505b92915050565b610d1c610d56565b6001600160a01b038116610d4a57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b610d53816112ed565b50565b33610d887f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146108ca5760405163118cdaa760e01b8152336004820152602401610d41565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181108061083f5760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401610d41565b5f610e2a6114a2565b9050610e34611cf3565b83516001600160401b0390811682526020850151168160016020020152604084810151828201526001546060830152600254608083015260035460a08301525f5460c08301525163ce537a7760e01b8152735fbdb2315678afecb367f032d93f642f64180aa39063ce537a7790610eb3908590859088906004016126fc565b602060405180830381865af4158015610ece573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ef2919061292a565b610f0f576040516309bde33960e01b815260040160405180910390fd5b50505050565b60095415801590610f8a575060085460098054600160a01b830463ffffffff1692600160c01b90046001600160401b0316908110610f5557610f556124cd565b5f918252602090912060029091020154610f7f90600160401b90046001600160401b031684612949565b6001600160401b0316115b1561101d57600854600980549091600160c01b90046001600160401b0316908110610fb757610fb76124cd565b5f9182526020822060029091020180546001600160c01b03191681556001015560088054600160c01b90046001600160401b0316906018610ff783612970565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516080810182526001600160401b03948516815292841660208085019182528301518516848301908152929091015160608401908152600980546001810182555f91909152935160029094027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af81018054935194518716600160801b0267ffffffffffffffff60801b19958816600160401b026001600160801b03199095169690971695909517929092179290921693909317909155517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b090910155565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061118457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166111785f805160206129b1833981519152546001600160a01b031690565b6001600160a01b031614155b156108ca5760405163703e46dd60e11b815260040160405180910390fd5b6111aa610d56565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d9060200161060e565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561123d575060408051601f3d908101601f1916820190925261123a9181019061248f565b60015b61126557604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610d41565b5f805160206129b1833981519152811461129557604051632a87526960e21b815260048101829052602401610d41565b61129f8383611ad1565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108ca5760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b611365611b26565b610d5381611b6f565b6108ca611b26565b82516001600160401b031615158061139a575060208301516001600160401b031615155b806113a757506020820151155b806113b457506040820151155b806113c157506060820151155b806113cb57508151155b806113dd5750610e108163ffffffff16105b806113f157506301e133808163ffffffff16115b1561140f576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b03908116600160401b026001600160801b0319938416919095169081178517909355604096870151600581905586515f5590860151600155958501516002556060909401516003556006805490941617179091556007919091556008805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b6114aa611d11565b621000008152600760208201527f23783d0e9777b7af65fbf849da7edb75e74b1eaf503e025d7f2f7f80991befa26040820151527f2a4e2fe8adfa53f468525582d5184c4c70bbdb946c21f216418a9879705e54a76020604083015101527f0624b2c1e77f24afceaf39451743b9fa80d5853fca7ba00389c675650774009b6060820151527f250d7719e94ca2df00dfe327938f5a8d4d837779b99837ca777a53d39127b1796020606083015101527f0dc09515152eaea66d0db2f571cc995e369d26fe647394f10db5398c917519dc6080820151527f1273144d6cec2c4a68b24a149379c0f5592bb7fbddbe32fa171919950ca404cb6020608083015101527f119521bb68caec216e2f05eeb466fb3abfe1f39baf7fe7cb392ea057b6a2d9bf60a0820151527f2d52adeaba8045e53ab526fe9982d0ea452def6b3ea0253d27a19ef3b46e8428602060a083015101527f16c3b5b217d302975a920d13374524d7a52e4a50fd7fb930842271ebf4a84efd60c0820151527f200788916b907b196972bde304318e885a2521514b2db5e4a11899c51204f089602060c083015101527f1127581afe753defca9aef12e7332db9978a200b1699ce3888c0f3aea6111dc360e0820151527f0881e13f00723be1a04872ed02b2d078c31e80feaf27724e262ce97c2cb0bb1d602060e083015101527f1482a3a6bb91d6483d153683e2404f2f5546e0e895530fdf132091498406e3de610100820151527efa52db3d52d905ead1248102f3a80a43a90d8400c68f60a62c543c417b2f4b602061010083015101527f0a57dadd4a55199525ac6ac6fabc87a4cccfdc98142bcef9dbf47de00ecc5164610120820151527f18d95abd9b8e12c36936aa218cfff582548a6bbff25c338c2006eaeb1fe5b696602061012083015101527f2bc40e91dd169b8bc143a02952a1b6c6e627bfeb7a2bbe5078e14123f3c54c1c610140820151527f108d65a20c579b6d9883275eb6889fc3f5fc79735ca9f611a13b67daa2fbc8d0602061014083015101527f21bc1f86d0608e5f0626b467ee6f8282b619223f60a7acb0fc63ba7bdaf783be610160820151527f05ef3282f8eef01515fb9a8a7d6ca06b8b007d1d512403efb268fb03ce5f09e9602061016083015101527f2cab66c1cb5a83869e73ac34fbe467486999babd541d9010ee9a804806eee4ef610180820151527f2db1982419c5a4a17593acff9535fa967683d75c8aec01319b64b84aada2ad84602061018083015101527f2c38667c6c7eb868bdd30c34dd3f4b84d9b9b1a27d7867b364c8b7831423e9086101a0820151527f2b2cb4044dd51165c48138219d51cf8d1689f91ed3eeefead6e055eb488a2ce260206101a083015101527f2d48e54703011df2c74a14dafde3af4fd83ec71875d8ddc3554658640cc955016101c0820151527f243a99d80d32eb5408b59d5b08302bede070d3fb0a8efe2f2262f865bffb4d0d60206101c083015101527f0455d2325bf6269a66f07d838f55f36947a3cd9b87edd8480bced95cbb45cc116101e0820151527f0f66d9085a6ed60b838179987e240992bff4c0516ccf6ccde4a1ca94ce8b986460206101e083015101527f2bac0d23c8585d1487ec611b5effc97e5852fea43a7cba36ccdd2c207931f394610200820151527f1860b54e01a06aea5adb4b13bf5baebab92b736807a3a89ff2040992b06ee6ec602061020083015101527f0c0bfa1c2fc6f8ed01233d5168db1e1dfe725504f032f669f50a92ae77c72906610220820151527f0d741e124c7d1069b8a400cbcdcfd90128a533901ad4de1e037fe72984dc34cf602061022083015101527f01cfed30085c9efce04668205794aa39b1a8ee591234b4c77a22f8c26d899e05610240820151527f2ab68ac82d36cedb647d14a5b0035e8c9a0be84780b7bae1133a27a880966ed1602061024083015101527f072e1d50f8b5cf8d574b3847276477d95bbd5116351000841f728da44f4043b5610260820151527f23f8ea6eacd0876d57220f57eabacbe76a2323411663731a251d5dca36f1b59f602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b611ada82611b77565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611b1e5761129f8282611bda565b61083f611c4c565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166108ca57604051631afcd79f60e31b815260040160405180910390fd5b610d1c611b26565b806001600160a01b03163b5f03611bac57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610d41565b5f805160206129b183398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b031684604051611bf69190612995565b5f60405180830381855af49150503d805f8114611c2e576040519150601f19603f3d011682016040523d82523d5f602084013e611c33565b606091505b5091509150611c43858383611c6b565b95945050505050565b34156108ca5760405163b398979f60e01b815260040160405180910390fd5b606082611c8057611c7b82611cca565b611cc3565b8151158015611c9757506001600160a01b0384163b155b15611cc057604051639996b31560e01b81526001600160a01b0385166004820152602401610d41565b50805b9392505050565b805115611cda5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6040518060e001604052806007906020820280368337509192915050565b604051806102c001604052805f81526020015f8152602001611d4460405180604001604052805f81526020015f81525090565b8152602001611d6460405180604001604052805f81526020015f81525090565b8152602001611d8460405180604001604052805f81526020015f81525090565b8152602001611da460405180604001604052805f81526020015f81525090565b8152602001611dc460405180604001604052805f81526020015f81525090565b8152602001611de460405180604001604052805f81526020015f81525090565b8152602001611e0460405180604001604052805f81526020015f81525090565b8152602001611e2460405180604001604052805f81526020015f81525090565b8152602001611e4460405180604001604052805f81526020015f81525090565b8152602001611e6460405180604001604052805f81526020015f81525090565b8152602001611e8460405180604001604052805f81526020015f81525090565b8152602001611ea460405180604001604052805f81526020015f81525090565b8152602001611ec460405180604001604052805f81526020015f81525090565b8152602001611ee460405180604001604052805f81526020015f81525090565b8152602001611f0460405180604001604052805f81526020015f81525090565b8152602001611f2460405180604001604052805f81526020015f81525090565b8152602001611f4460405180604001604052805f81526020015f81525090565b8152602001611f6460405180604001604052805f81526020015f81525090565b81525f6020820181905260409091015290565b80356001600160a01b0381168114611f8d575f80fd5b919050565b5f60208284031215611fa2575f80fd5b611cc382611f77565b5f60208284031215611fbb575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b6040516102e081016001600160401b0381118282101715611ff957611ff9611fc2565b60405290565b604051601f8201601f191681016001600160401b038111828210171561202757612027611fc2565b604052919050565b80356001600160401b0381168114611f8d575f80fd5b5f60608284031215612055575f80fd5b604051606081018181106001600160401b038211171561207757612077611fc2565b6040529050806120868361202f565b81526120946020840161202f565b6020820152604083013560408201525092915050565b5f604082840312156120ba575f80fd5b604051604081018181106001600160401b03821117156120dc576120dc611fc2565b604052823581526020928301359281019290925250919050565b5f808284036104e0811215612109575f80fd5b6121138585612045565b925061048080605f1983011215612128575f80fd5b612130611fd6565b915061213f86606087016120aa565b825261214e8660a087016120aa565b60208301526121608660e087016120aa565b6040830152610120612174878288016120aa565b6060840152610160612188888289016120aa565b60808501526101a061219c89828a016120aa565b60a08601526101e06121b08a828b016120aa565b60c08701526102206121c48b828c016120aa565b60e08801526102606121d88c828d016120aa565b6101008901526102a06121ed8d828e016120aa565b878a01526121ff8d6102e08e016120aa565b6101408a01526122138d6103208e016120aa565b868a01526122258d6103608e016120aa565b6101808a01526103a08c0135948901949094526103c08b01356101c08901526103e08b0135928801929092526104008a01356102008801526104208a013590870152610440890135610240870152610460890135908601529287013561028085015250506104a0850135908201526104c0909301356102c08401525092909150565b5f80604083850312156122b8575f80fd5b6122c183611f77565b91506020808401356001600160401b03808211156122dd575f80fd5b818601915086601f8301126122f0575f80fd5b81358181111561230257612302611fc2565b612314601f8201601f19168501611fff565b91508082528784828501011115612329575f80fd5b80848401858401375f848284010152508093505050509250929050565b803563ffffffff81168114611f8d575f80fd5b5f60208284031215612369575f80fd5b611cc382612346565b5f805f80848603610120811215612387575f80fd5b6123918787612045565b94506080605f19820112156123a4575f80fd5b50604051608081018181106001600160401b03821117156123c7576123c7611fc2565b8060405250606086013581526080860135602082015260a0860135604082015260c086013560608201528093505061240160e08601612346565b91506124106101008601611f77565b905092959194509250565b5f5b8381101561243557818101518382015260200161241d565b50505f910152565b602081525f825180602084015261245b81604085016020870161241b565b601f01601f19169190910160400192915050565b5f8060408385031215612480575f80fd5b50508035926020909101359150565b5f6020828403121561249f575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610d0e57610d0e6124a6565b634e487b7160e01b5f52603260045260245ffd5b5f816124ef576124ef6124a6565b505f190190565b805f5b6007811015610f0f5781518452602093840193909101906001016124f9565b61252d82825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e08401525060808101516101006125908185018380518252602090810151910152565b60a083015191506101406125b08186018480518252602090810151910152565b60c084015192506101806125d08187018580518252602090810151910152565b60e085015193506101c06125f08188018680518252602090810151910152565b928501519350610200926126108785018680518252602090810151910152565b61012086015194506102406126318189018780518252602090810151910152565b928601519450610280926126518885018780518252602090810151910152565b61016087015195506102c0612672818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b5f610a60820190508451825260208501516020830152604085015161272e604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a085015161010061277b8185018380518252602090810151910152565b60c0870151915061014061279b8186018480518252602090810151910152565b60e088015192506101806127bb8187018580518252602090810151910152565b9188015192506101c0916127db8684018580518252602090810151910152565b61012089015193506102006127fc8188018680518252602090810151910152565b9189015193506102409161281c8784018680518252602090810151910152565b6101608a0151945061028061283d8189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e08301526129146105008301856124f6565b6129226105e0830184612518565b949350505050565b5f6020828403121561293a575f80fd5b81518015158114611cc3575f80fd5b6001600160401b03828116828216039080821115612969576129696124a6565b5092915050565b5f6001600160401b0380831681810361298b5761298b6124a6565b6001019392505050565b5f82516129a681846020870161241b565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a + ///0x60a06040523060805234801562000014575f80fd5b506200001f62000025565b620000d9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000765760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051612ecb620001005f395f81816110fd0152818161112601526112a30152612ecb5ff3fe6080604052600436106101ba575f3560e01c8063811f853f116100f2578063a1be8d5211610092578063d24d933d11610062578063d24d933d146105eb578063e03033011461061a578063f2fde38b14610639578063f9e50d1914610658575f80fd5b8063a1be8d5214610539578063ad3cb1cc14610558578063b2424e3f14610595578063c23b9e9e146105b3575f80fd5b80638da5cb5b116100cd5780638da5cb5b1461046a57806390c14390146104a657806396c1ca61146104c55780639fdb54a7146104e4575f80fd5b8063811f853f146103e4578063826e41fc146104035780638584d23f1461042e575f80fd5b8063426d31941161015d57806369cc6a041161013857806369cc6a0414610389578063715018a61461039d578063757c37ad146103b157806376671808146103d0575f80fd5b8063426d3194146103405780634f1ef2861461036257806352d1902d14610375575f80fd5b80630d8e6e2c116101985780630d8e6e2c1461027e5780632f79889d146102a9578063313df7b1146102e7578063378ec23b1461031e575f80fd5b8063013fa5fc146101be57806302b592f3146101df5780630625e19b1461023c575b5f80fd5b3480156101c9575f80fd5b506101dd6101d836600461237d565b61066c565b005b3480156101ea575f80fd5b506101fe6101f9366004612396565b61071f565b60405161023394939291906001600160401b039485168152928416602084015292166040820152606081019190915260800190565b60405180910390f35b348015610247575f80fd5b5060055460065460075460085461025e9392919084565b604080519485526020850193909352918301526060820152608001610233565b348015610289575f80fd5b5060408051600181525f6020820181905291810191909152606001610233565b3480156102b4575f80fd5b50600d546102cf90600160c01b90046001600160401b031681565b6040516001600160401b039091168152602001610233565b3480156102f2575f80fd5b50600d54610306906001600160a01b031681565b6040516001600160a01b039091168152602001610233565b348015610329575f80fd5b50610332610768565b604051908152602001610233565b34801561034b575f80fd5b5060015460025460035460045461025e9392919084565b6101dd61037036600461241a565b6107cf565b348015610380575f80fd5b506103326107ee565b348015610394575f80fd5b506101dd610809565b3480156103a8575f80fd5b506101dd610877565b3480156103bc575f80fd5b506101dd6103cb3660046125e3565b610888565b3480156103db575f80fd5b506102cf610b5a565b3480156103ef575f80fd5b506101dd6103fe3660046127bc565b610b7f565b34801561040e575f80fd5b50600d546001600160a01b031615155b6040519015158152602001610233565b348015610439575f80fd5b5061044d610448366004612396565b610ca3565b604080519283526001600160401b03909116602083015201610233565b348015610475575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610306565b3480156104b1575f80fd5b506102cf6104c0366004612822565b610dce565b3480156104d0575f80fd5b506101dd6104df366004612853565b610e2b565b3480156104ef575f80fd5b50600b54600c54610513916001600160401b0380821692600160401b909204169083565b604080516001600160401b03948516815293909216602084015290820152606001610233565b348015610544575f80fd5b5061041e61055336600461286c565b610eb4565b348015610563575f80fd5b50610588604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161023391906128a7565b3480156105a0575f80fd5b505f546102cf906001600160401b031681565b3480156105be575f80fd5b50600d546105d690600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610233565b3480156105f6575f80fd5b50600954600a54610513916001600160401b0380821692600160401b909204169083565b348015610625575f80fd5b5061041e6106343660046128d9565b610ef6565b348015610644575f80fd5b506101dd61065336600461237d565b611055565b348015610663575f80fd5b50600e54610332565b610674611097565b6001600160a01b03811661069b5760405163e6c4247b60e01b815260040160405180910390fd5b600d546001600160a01b03908116908216036106ca5760405163a863aec960e01b815260040160405180910390fd5b600d80546001600160a01b0319166001600160a01b0383169081179091556040519081527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b600e818154811061072e575f80fd5b5f918252602090912060029091020180546001909101546001600160401b038083169350600160401b8304811692600160801b9004169084565b5f60646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ca91906128f9565b905090565b6107d76110f2565b6107e082611196565b6107ea82826111d7565b5050565b5f6107f7611298565b505f80516020612e9f83398151915290565b610811611097565b600d546001600160a01b03161561085c57600d80546001600160a01b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c02450905f90a1565b60405163a863aec960e01b815260040160405180910390fd5b565b61087f611097565b6108755f6112e1565b600d546001600160a01b0316151580156108ad5750600d546001600160a01b03163314155b156108cb576040516301474c8f60e71b815260040160405180910390fd5b600b5483516001600160401b0391821691161115806109045750600b5460208401516001600160401b03600160401b9092048216911611155b156109225760405163051c46ef60e01b815260040160405180910390fd5b61092f8360400151611351565b5f610938610b5a565b60208501515f80549293509161095791906001600160401b0316610dce565b9050610964826001612924565b6001600160401b0316816001600160401b031614801561099d5750600b5461099b90600160401b90046001600160401b0316610eb4565b155b80156109b157505f826001600160401b0316115b156109cf57604051637150de4560e01b815260040160405180910390fd5b6109da826002612924565b6001600160401b0316816001600160401b031610610a0b57604051637150de4560e01b815260040160405180910390fd5b610a188460200151611351565b610a258460400151611351565b610a328460600151611351565b610a3d8585856113c1565b8451600b805460208801516001600160401b03818116600160401b026001600160801b03199093169416939093171790556040860151600c55610a7f90610eb4565b15610ae95783516005556020840151600655604084015160075560608401516008557f31eabd9099fdb25dacddd206abff87311e553441fc9d0fcdef201062d7e7071b610acd826001612924565b6040516001600160401b03909116815260200160405180910390a15b610afb610af4610768565b4287611519565b84602001516001600160401b0316855f01516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae68760400151604051610b4b91815260200190565b60405180910390a35050505050565b600b545f805490916107ca916001600160401b03600160401b90920482169116610dce565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610bc35750825b90505f826001600160401b03166001148015610bde5750303b155b905081158015610bec575080155b15610c0a5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610c3457845460ff60401b1916600160401b1785555b610c3d87611702565b610c45611713565b610c518a8a8a8961171b565b8315610c9757845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b600e80545f91829190610cb760018361294b565b81548110610cc757610cc761295e565b5f918252602090912060029091020154600160801b90046001600160401b03168410610d0657604051631856a49960e21b815260040160405180910390fd5b600d54600160c01b90046001600160401b03165b81811015610dc75784600e8281548110610d3657610d3661295e565b5f918252602090912060029091020154600160801b90046001600160401b03161115610dbf57600e8181548110610d6f57610d6f61295e565b905f5260205f20906002020160010154600e8281548110610d9257610d9261295e565b905f5260205f2090600202015f0160109054906101000a90046001600160401b0316935093505050915091565b600101610d1a565b5050915091565b5f816001600160401b03165f03610de657505f610e25565b610df08284612986565b6001600160401b03165f03610e1057610e0982846129ab565b9050610e25565b610e1a82846129ab565b610e09906001612924565b92915050565b610e33611097565b610e108163ffffffff161080610e5257506301e133808163ffffffff16115b80610e705750600d5463ffffffff600160a01b909104811690821611155b15610e8e576040516307a5077760e51b815260040160405180910390fd5b600d805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b5f816001600160401b03165f03610ecc57505f919050565b5f54610ee1906001600160401b031683612986565b6001600160401b03161592915050565b919050565b600e545f90610f03610768565b841180610f0e575080155b80610f585750600d54600e80549091600160c01b90046001600160401b0316908110610f3c57610f3c61295e565b5f9182526020909120600290910201546001600160401b031684105b15610f765760405163b0b4387760e01b815260040160405180910390fd5b5f8080610f8460018561294b565b90505b8161102057600d54600160c01b90046001600160401b031681106110205786600e8281548110610fb957610fb961295e565b5f9182526020909120600290910201546001600160401b03161161100e5760019150600e8181548110610fee57610fee61295e565b5f9182526020909120600290910201546001600160401b03169250611020565b80611018816129d0565b915050610f87565b8161103e5760405163b0b4387760e01b815260040160405180910390fd5b85611049848961294b565b11979650505050505050565b61105d611097565b6001600160a01b03811661108b57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b611094816112e1565b50565b336110c97f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146108755760405163118cdaa760e01b8152336004820152602401611082565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061117857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661116c5f80516020612e9f833981519152546001600160a01b031690565b6001600160a01b031614155b156108755760405163703e46dd60e11b815260040160405180910390fd5b61119e611097565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d90602001610714565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611231575060408051601f3d908101601f1916820190925261122e918101906128f9565b60015b61125957604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611082565b5f80516020612e9f833981519152811461128957604051632a87526960e21b815260048101829052602401611082565b6112938383611895565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108755760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110806107ea5760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401611082565b5f6113ca6118ea565b90506113d46120e2565b84516001600160401b0390811682526020808701805190921690830152604080870151908301526006546060830152600754608083015260085460a083015260055460c08301525161142590610eb4565b1561145757602084015160e082015260408401516101008201526060840151610120820152835161014082015261147b565b60065460e08201526007546101008201526008546101208201526005546101408201525b60405163fc8660c760e01b8152735fbdb2315678afecb367f032d93f642f64180aa39063fc8660c7906114b690859085908890600401612bf1565b602060405180830381865af41580156114d1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114f59190612e1f565b611512576040516309bde33960e01b815260040160405180910390fd5b5050505050565b600e541580159061158e5750600d54600e8054600160a01b830463ffffffff1692600160c01b90046001600160401b03169081106115595761155961295e565b5f91825260209091206002909102015461158390600160401b90046001600160401b031684612e3e565b6001600160401b0316115b1561162157600d54600e80549091600160c01b90046001600160401b03169081106115bb576115bb61295e565b5f9182526020822060029091020180546001600160c01b031916815560010155600d8054600160c01b90046001600160401b03169060186115fb83612e5e565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516080810182526001600160401b03948516815292841660208085019182528301518516848301908152929091015160608401908152600e80546001810182555f91909152935160029094027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd81018054935194518716600160801b0267ffffffffffffffff60801b19958816600160401b026001600160801b03199095169690971695909517929092179290921693909317909155517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe90910155565b61170a611f15565b61109481611f5e565b610875611f15565b83516001600160401b031615158061173f575060208401516001600160401b031615155b8061174c57506020830151155b8061175957506040830151155b8061176657506060830151155b8061177057508251155b806117825750610e108263ffffffff16105b8061179657506301e133808263ffffffff16115b806117a857506001600160401b038116155b156117c6576040516350dd03f760e11b815260040160405180910390fd5b8351600980546020808801516001600160401b03908116600160401b026001600160801b03199384169582169586178117909455604098890151600a819055600b8054909416909517909317909155600c92909255845160018190559185015160028190559585015160038190556060909501516004819055600592909255600695909555600793909355600892909255600d805463ffffffff909216600160a01b0263ffffffff60a01b199092169190911790555f80549190921667ffffffffffffffff1991909116179055565b61189e82611f66565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156118e2576112938282611fc9565b6107ea61203b565b6118f2612101565b621000008152600b60208201527f26867ee58aaf860fc9e0e3a78666ffc51f3ba1ad8ae001c196830c55b5af0b8c6040820151527f091230adb753f82815151277060cc56b546bb2e950a0de19ed061ec68c071a906020604083015101527f02a509a06d8c56f83f204688ff6e42eac6e3cbdd063b0971a3af953e81badbb66060820151527f06f43ed2b9cece35d1201abc13ffdaea35560cf0f1446277138ce812b9ad9f396020606083015101527f1a588c99ad88f789c87722b061bb5535daa0abcc1dc6d176d7fea51e5d80b9266080820151527f2062b995e61a6ab8aab6cd6e7520b879d84f965ab1f094c104f0c1213b28038b6020608083015101527f21a2fd766a0cebecfdbfdfe56139a1bbd9aec15e2e35be8ef01934a0ec43868560a0820151527f20fe500ac7d1aa7820db8c6f7f9d509e3b2e88731e3a12dd65f06f43ca930da0602060a083015101527f0ab53d1285c7f4819b3ff6e1ddada6bf2515d34bbaf61186c6a04be47dfd65a360c0820151527f0b80a9878082cdfdd9fcc16bb33fa424c0ad66b81949bf642153d3c7ad082f22602060c083015101527f1b900f8e5f8e8064a5888a1bd796b54a2652fc02034fe4b6e6fc8d6650f7453b60e0820151527ecca258a8832c64d1f8e1721a78fc25b13d29adbb81e35a79fc2f49f8902786602060e083015101527f0d1d3348d642e6f2e9739d735d8c723676dbaefdcbb4e96641defa353d26ebb3610100820151527f14fe9d6a335104e7491ca6d5086113e6b0f52946960d726664667bd58539d41e602061010083015101527f1da94364440c4e3fb8af2d363cdefa4edda437579e1b056a16a5e9a11dffa2ab610120820151527f0a077bd307ed31222db55cb0128bafce5e22557b57f5ac915359c50296cb5c77602061012083015101527f28ff80b133d989235c7129dea54469b780ac4717449290067e7c9a7d5be7dbd5610140820151527f1c0fc22eef23b50a2ddc553f9fc1b61fd8c57a58ca321a829c7ec255f757b3a6602061014083015101527e3c4e21e5dfba62a5b1702fb0ef234bfe95a77701a456882350526d140243f5610160820151527f06012db82876ba33e6e8f80a51013662e56c4abc86a7d85c272e19a6d7f57d0b602061016083015101527f16d5247dbdeae1df70093e5ee77272959661e0fbabda431777fa729f5b532f44610180820151527e8d9ee00f799cf00608b082d03b9de5a42b8126c35fbfbd1e602108df10e0e3602061018083015101527f2f526c6981643ff6f6e9d2b5a921e06cf95f274629b5a145bd552b7fda6a87006101a0820151527f2fe7108fd4e24231f3dadb6e09072e106fca0694fe39dff96557a88221a89a5060206101a083015101527f26a3568598a6981e6325f4816736e381087b5b0e4b27ef364d8ae1e29fe9df996101c0820151527f1db81cdf82a9ec99f3c9716df22d38317e6bb84fc57d2f0e7b2bc8a0569f7cc460206101c083015101527e99888088e11de6ed086c99b9bba986d908df5b0c5007680d97567d485719946101e0820151527f1f91576eadffff932b6e54bab022f93f6fec3e5b7674d0006bc5f2223527a34860206101e083015101527e68b3c117ee7e84d6b670b6af20197759ec80d34f3c594328663031e9cd7e02610200820151527f1c3832e24877346680e7047bae2cfcd51fafe3e7caf199e9dfc8e8f10c2b6943602061020083015101527f164cdd9ad5d4e96e109073e8e735cd4ac64aba6ddaa244da6701369c8cba5daf610220820151527f16c41e647f1ab0d45c891544299e4ef9c004d8bc0a3bf096dc38ce8ed90c0d67602061022083015101527f134ba7a9567ba20e1f35959ee8c2cd688d3a962bb1797e8ab8e511768de0ce83610240820151527f02e4d286c9435f7bd94c1a2c78b99966d06faca1ae45de78149950a4fefcd6e7602061024083015101527f039a0b2d920f29e35cb2a9e1ec6cc22ac1d482af45e47399724a0745d542e839610260820151527f15ac2658bfdd2227aebf8e20935935a648819e1dcea807da1c838abfa7896c63602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661087557604051631afcd79f60e31b815260040160405180910390fd5b61105d611f15565b806001600160a01b03163b5f03611f9b57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611082565b5f80516020612e9f83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b031684604051611fe59190612e83565b5f60405180830381855af49150503d805f811461201d576040519150601f19603f3d011682016040523d82523d5f602084013e612022565b606091505b509150915061203285838361205a565b95945050505050565b34156108755760405163b398979f60e01b815260040160405180910390fd5b60608261206f5761206a826120b9565b6120b2565b815115801561208657506001600160a01b0384163b155b156120af57604051639996b31560e01b81526001600160a01b0385166004820152602401611082565b50805b9392505050565b8051156120c95780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b604051806101600160405280600b906020820280368337509192915050565b604051806102c001604052805f81526020015f815260200161213460405180604001604052805f81526020015f81525090565b815260200161215460405180604001604052805f81526020015f81525090565b815260200161217460405180604001604052805f81526020015f81525090565b815260200161219460405180604001604052805f81526020015f81525090565b81526020016121b460405180604001604052805f81526020015f81525090565b81526020016121d460405180604001604052805f81526020015f81525090565b81526020016121f460405180604001604052805f81526020015f81525090565b815260200161221460405180604001604052805f81526020015f81525090565b815260200161223460405180604001604052805f81526020015f81525090565b815260200161225460405180604001604052805f81526020015f81525090565b815260200161227460405180604001604052805f81526020015f81525090565b815260200161229460405180604001604052805f81526020015f81525090565b81526020016122b460405180604001604052805f81526020015f81525090565b81526020016122d460405180604001604052805f81526020015f81525090565b81526020016122f460405180604001604052805f81526020015f81525090565b815260200161231460405180604001604052805f81526020015f81525090565b815260200161233460405180604001604052805f81526020015f81525090565b815260200161235460405180604001604052805f81526020015f81525090565b81525f6020820181905260409091015290565b80356001600160a01b0381168114610ef1575f80fd5b5f6020828403121561238d575f80fd5b6120b282612367565b5f602082840312156123a6575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b6040516102e081016001600160401b03811182821017156123e4576123e46123ad565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612412576124126123ad565b604052919050565b5f806040838503121561242b575f80fd5b61243483612367565b91506020808401356001600160401b0380821115612450575f80fd5b818601915086601f830112612463575f80fd5b813581811115612475576124756123ad565b612487601f8201601f191685016123ea565b9150808252878482850101111561249c575f80fd5b80848401858401375f848284010152508093505050509250929050565b80356001600160401b0381168114610ef1575f80fd5b5f606082840312156124df575f80fd5b604051606081018181106001600160401b0382111715612501576125016123ad565b604052905080612510836124b9565b815261251e602084016124b9565b6020820152604083013560408201525092915050565b5f60808284031215612544575f80fd5b604051608081018181106001600160401b0382111715612566576125666123ad565b8060405250809150823581526020830135602082015260408301356040820152606083013560608201525092915050565b5f604082840312156125a7575f80fd5b604051604081018181106001600160401b03821117156125c9576125c96123ad565b604052823581526020928301359281019290925250919050565b5f805f8385036105608112156125f7575f80fd5b61260186866124cf565b93506126108660608701612534565b92506104808060df1983011215612625575f80fd5b61262d6123c1565b915061263c8760e08801612597565b825261012061264d88828901612597565b602084015261016061266189828a01612597565b60408501526101a06126758a828b01612597565b60608601526101e06126898b828c01612597565b608087015261022061269d8c828d01612597565b60a08801526102606126b18d828e01612597565b60c08901526102a06126c58e828f01612597565b60e08a01526126d88e6102e08f01612597565b6101008a01526126ec8e6103208f01612597565b878a01526126fe8e6103608f01612597565b6101408a01526127128e6103a08f01612597565b868a01526127248e6103e08f01612597565b6101808a01526104208d0135858a01526104408d01356101c08a01526104608d0135848a0152878d01356102008a01526104a08d0135838a01526104c08d01356102408a01526104e08d0135828a01526105008d01356102808a01526105208d0135818a015250505050505050506105408501356102c0820152809150509250925092565b803563ffffffff81168114610ef1575f80fd5b5f805f805f61014086880312156127d1575f80fd5b6127db87876124cf565b94506127ea8760608801612534565b93506127f860e087016127a9565b92506128076101008701612367565b915061281661012087016124b9565b90509295509295909350565b5f8060408385031215612833575f80fd5b61283c836124b9565b915061284a602084016124b9565b90509250929050565b5f60208284031215612863575f80fd5b6120b2826127a9565b5f6020828403121561287c575f80fd5b6120b2826124b9565b5f5b8381101561289f578181015183820152602001612887565b50505f910152565b602081525f82518060208401526128c5816040850160208701612885565b601f01601f19169190910160400192915050565b5f80604083850312156128ea575f80fd5b50508035926020909101359150565b5f60208284031215612909575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111561294457612944612910565b5092915050565b81810381811115610e2557610e25612910565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f6001600160401b038084168061299f5761299f612972565b92169190910692915050565b5f6001600160401b03808416806129c4576129c4612972565b92169190910492915050565b5f816129de576129de612910565b505f190190565b805f5b600b811015612a075781518452602093840193909101906001016129e8565b50505050565b612a2282825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e0840152506080810151610100612a858185018380518252602090810151910152565b60a08301519150610140612aa58186018480518252602090810151910152565b60c08401519250610180612ac58187018580518252602090810151910152565b60e085015193506101c0612ae58188018680518252602090810151910152565b92850151935061020092612b058785018680518252602090810151910152565b6101208601519450610240612b268189018780518252602090810151910152565b92860151945061028092612b468885018780518252602090810151910152565b61016087015195506102c0612b67818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b5f610ae08201905084518252602085015160208301526040850151612c23604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a0850151610100612c708185018380518252602090810151910152565b60c08701519150610140612c908186018480518252602090810151910152565b60e08801519250610180612cb08187018580518252602090810151910152565b9188015192506101c091612cd08684018580518252602090810151910152565b6101208901519350610200612cf18188018680518252602090810151910152565b91890151935061024091612d118784018680518252602090810151910152565b6101608a01519450610280612d328189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e0830152612e096105008301856129e5565b612e17610660830184612a0d565b949350505050565b5f60208284031215612e2f575f80fd5b815180151581146120b2575f80fd5b6001600160401b0382811682821603908082111561294457612944612910565b5f6001600160401b03808316818103612e7957612e79612910565b6001019392505050565b5f8251612e94818460208701612885565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a /// ``` #[rustfmt::skip] #[allow(clippy::all)] pub static BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( - b"`\xA0`@R0`\x80R4\x80\x15b\0\0\x14W_\x80\xFD[Pb\0\0\x1Fb\0\0%V[b\0\0\xD9V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15b\0\0vW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80T`\x01`\x01`@\x1B\x03\x90\x81\x16\x14b\0\0\xD6W\x80T`\x01`\x01`@\x1B\x03\x19\x16`\x01`\x01`@\x1B\x03\x90\x81\x17\x82U`@Q\x90\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PV[`\x80Qa)\xDDb\0\x01\0_9_\x81\x81a\x11\t\x01R\x81\x81a\x112\x01Ra\x12\xAF\x01Ra)\xDD_\xF3\xFE`\x80`@R`\x046\x10a\x01GW_5`\xE0\x1C\x80c\x82nA\xFC\x11a\0\xB3W\x80c\xAD<\xB1\xCC\x11a\0mW\x80c\xAD<\xB1\xCC\x14a\x04pW\x80c\xC2;\x9E\x9E\x14a\x04\xADW\x80c\xD2M\x93=\x14a\x04\xE5W\x80c\xE003\x01\x14a\x05\x14W\x80c\xF2\xFD\xE3\x8B\x14a\x053W\x80c\xF9\xE5\r\x19\x14a\x05RW_\x80\xFD[\x80c\x82nA\xFC\x14a\x03:W\x80c\x85\x84\xD2?\x14a\x03eW\x80c\x8D\xA5\xCB[\x14a\x03\xA1W\x80c\x96\xC1\xCAa\x14a\x03\xDDW\x80c\x9B\xAA<\xC9\x14a\x03\xFCW\x80c\x9F\xDBT\xA7\x14a\x04\x1BW_\x80\xFD[\x80c7\x8E\xC2;\x11a\x01\x04W\x80c7\x8E\xC2;\x14a\x02\x88W\x80cBm1\x94\x14a\x02\xAAW\x80cO\x1E\xF2\x86\x14a\x02\xEBW\x80cR\xD1\x90-\x14a\x02\xFEW\x80ci\xCCj\x04\x14a\x03\x12W\x80cqP\x18\xA6\x14a\x03&W_\x80\xFD[\x80c\x01?\xA5\xFC\x14a\x01KW\x80c\x02\xB5\x92\xF3\x14a\x01lW\x80c\r\x8En,\x14a\x01\xC9W\x80c c\xD4\xF7\x14a\x01\xF4W\x80c/y\x88\x9D\x14a\x02\x13W\x80c1=\xF7\xB1\x14a\x02QW[_\x80\xFD[4\x80\x15a\x01VW_\x80\xFD[Pa\x01ja\x01e6`\x04a\x1F\x92V[a\x05fV[\0[4\x80\x15a\x01wW_\x80\xFD[Pa\x01\x8Ba\x01\x866`\x04a\x1F\xABV[a\x06\x19V[`@Qa\x01\xC0\x94\x93\x92\x91\x90`\x01`\x01`@\x1B\x03\x94\x85\x16\x81R\x92\x84\x16` \x84\x01R\x92\x16`@\x82\x01R``\x81\x01\x91\x90\x91R`\x80\x01\x90V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xD4W_\x80\xFD[P`@\x80Q`\x01\x81R_` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01a\x01\xC0V[4\x80\x15a\x01\xFFW_\x80\xFD[Pa\x01ja\x02\x0E6`\x04a \xF6V[a\x06bV[4\x80\x15a\x02\x1EW_\x80\xFD[P`\x08Ta\x029\x90`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x81V[`@Q`\x01`\x01`@\x1B\x03\x90\x91\x16\x81R` \x01a\x01\xC0V[4\x80\x15a\x02\\W_\x80\xFD[P`\x08Ta\x02p\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x01\xC0V[4\x80\x15a\x02\x93W_\x80\xFD[Pa\x02\x9Ca\x07\xBDV[`@Q\x90\x81R` \x01a\x01\xC0V[4\x80\x15a\x02\xB5W_\x80\xFD[P_T`\x01T`\x02T`\x03Ta\x02\xCB\x93\x92\x91\x90\x84V[`@\x80Q\x94\x85R` \x85\x01\x93\x90\x93R\x91\x83\x01R``\x82\x01R`\x80\x01a\x01\xC0V[a\x01ja\x02\xF96`\x04a\"\xA7V[a\x08$V[4\x80\x15a\x03\tW_\x80\xFD[Pa\x02\x9Ca\x08CV[4\x80\x15a\x03\x1DW_\x80\xFD[Pa\x01ja\x08^V[4\x80\x15a\x031W_\x80\xFD[Pa\x01ja\x08\xCCV[4\x80\x15a\x03EW_\x80\xFD[P`\x08T`\x01`\x01`\xA0\x1B\x03\x16\x15\x15[`@Q\x90\x15\x15\x81R` \x01a\x01\xC0V[4\x80\x15a\x03pW_\x80\xFD[Pa\x03\x84a\x03\x7F6`\x04a\x1F\xABV[a\x08\xDDV[`@\x80Q\x92\x83R`\x01`\x01`@\x1B\x03\x90\x91\x16` \x83\x01R\x01a\x01\xC0V[4\x80\x15a\x03\xACW_\x80\xFD[P\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16a\x02pV[4\x80\x15a\x03\xE8W_\x80\xFD[Pa\x01ja\x03\xF76`\x04a#YV[a\n\x08V[4\x80\x15a\x04\x07W_\x80\xFD[Pa\x01ja\x04\x166`\x04a#rV[a\n\x91V[4\x80\x15a\x04&W_\x80\xFD[P`\x06T`\x07Ta\x04J\x91`\x01`\x01`@\x1B\x03\x80\x82\x16\x92`\x01`@\x1B\x90\x92\x04\x16\x90\x83V[`@\x80Q`\x01`\x01`@\x1B\x03\x94\x85\x16\x81R\x93\x90\x92\x16` \x84\x01R\x90\x82\x01R``\x01a\x01\xC0V[4\x80\x15a\x04{W_\x80\xFD[Pa\x04\xA0`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\x01\xC0\x91\x90a$=V[4\x80\x15a\x04\xB8W_\x80\xFD[P`\x08Ta\x04\xD0\x90`\x01`\xA0\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81V[`@Qc\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01a\x01\xC0V[4\x80\x15a\x04\xF0W_\x80\xFD[P`\x04T`\x05Ta\x04J\x91`\x01`\x01`@\x1B\x03\x80\x82\x16\x92`\x01`@\x1B\x90\x92\x04\x16\x90\x83V[4\x80\x15a\x05\x1FW_\x80\xFD[Pa\x03Ua\x05.6`\x04a$oV[a\x0B\xB3V[4\x80\x15a\x05>W_\x80\xFD[Pa\x01ja\x05M6`\x04a\x1F\x92V[a\r\x14V[4\x80\x15a\x05]W_\x80\xFD[P`\tTa\x02\x9CV[a\x05na\rVV[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x05\x95W`@Qc\xE6\xC4${`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x08T`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x90\x82\x16\x03a\x05\xC4W`@Qc\xA8c\xAE\xC9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x08\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x81\x17\x90\x91U`@Q\x90\x81R\x7F\x80\x17\xBB\x88\x7F\xDF\x8F\xCAC\x14\xA9\xD4\x0Fns\xB3\xB8\x10\x02\xD6~\\\xFA\x85\xD8\x81s\xAFj\xA4`r\x90` \x01[`@Q\x80\x91\x03\x90\xA1PV[`\t\x81\x81T\x81\x10a\x06(W_\x80\xFD[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01\x80T`\x01\x90\x91\x01T`\x01`\x01`@\x1B\x03\x80\x83\x16\x93P`\x01`@\x1B\x83\x04\x81\x16\x92`\x01`\x80\x1B\x90\x04\x16\x90\x84V[`\x08T`\x01`\x01`\xA0\x1B\x03\x16\x15\x15\x80\x15a\x06\x87WP`\x08T`\x01`\x01`\xA0\x1B\x03\x163\x14\x15[\x15a\x06\xA5W`@Qc\x01GL\x8F`\xE7\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x06T\x82Q`\x01`\x01`@\x1B\x03\x91\x82\x16\x91\x16\x11\x15\x80a\x06\xDEWP`\x06T` \x83\x01Q`\x01`\x01`@\x1B\x03`\x01`@\x1B\x90\x92\x04\x82\x16\x91\x16\x11\x15[\x15a\x06\xFCW`@Qc\x05\x1CF\xEF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x07\t\x82`@\x01Qa\r\xB1V[a\x07\x13\x82\x82a\x0E!V[\x81Q`\x06\x80T` \x85\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x92\x16\x93\x16\x92\x90\x92\x17\x91\x90\x91\x17\x90U`@\x82\x01Q`\x07Ua\x07aa\x07Za\x07\xBDV[B\x84a\x0F\x15V[\x81` \x01Q`\x01`\x01`@\x1B\x03\x16\x82_\x01Q`\x01`\x01`@\x1B\x03\x16\x7F\xA0Jw9$PZA\x85d67%\xF5h2\xF5w.k\x8D\r\xBDn\xFC\xE7$\xDF\xE8\x03\xDA\xE6\x84`@\x01Q`@Qa\x07\xB1\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA3PPV[_`d`\x01`\x01`\xA0\x1B\x03\x16c\xA3\xB1\xB3\x1D`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07\xFBW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x08\x1F\x91\x90a$\x8FV[\x90P\x90V[a\x08,a\x10\xFEV[a\x085\x82a\x11\xA2V[a\x08?\x82\x82a\x11\xE3V[PPV[_a\x08La\x12\xA4V[P_\x80Q` a)\xB1\x839\x81Q\x91R\x90V[a\x08fa\rVV[`\x08T`\x01`\x01`\xA0\x1B\x03\x16\x15a\x08\xB1W`\x08\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16\x90U`@Q\x7F\x9A_W\xDE\x85m\xD6h\xC5M\xD9^\\U\xDF\x93C!q\xCB\xCAI\xA8wmV \xEAY\xC0$P\x90_\x90\xA1V[`@Qc\xA8c\xAE\xC9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a\x08\xD4a\rVV[a\x08\xCA_a\x12\xEDV[`\t\x80T_\x91\x82\x91\x90a\x08\xF1`\x01\x83a$\xBAV[\x81T\x81\x10a\t\x01Wa\t\x01a$\xCDV[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x80\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x84\x10a\t@W`@Qc\x18V\xA4\x99`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x08T`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16[\x81\x81\x10\x15a\n\x01W\x84`\t\x82\x81T\x81\x10a\tpWa\tpa$\xCDV[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x80\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x11\x15a\t\xF9W`\t\x81\x81T\x81\x10a\t\xA9Wa\t\xA9a$\xCDV[\x90_R` _ \x90`\x02\x02\x01`\x01\x01T`\t\x82\x81T\x81\x10a\t\xCCWa\t\xCCa$\xCDV[\x90_R` _ \x90`\x02\x02\x01_\x01`\x10\x90T\x90a\x01\0\n\x90\x04`\x01`\x01`@\x1B\x03\x16\x93P\x93PPP\x91P\x91V[`\x01\x01a\tTV[PP\x91P\x91V[a\n\x10a\rVV[a\x0E\x10\x81c\xFF\xFF\xFF\xFF\x16\x10\x80a\n/WPc\x01\xE13\x80\x81c\xFF\xFF\xFF\xFF\x16\x11[\x80a\nMWP`\x08Tc\xFF\xFF\xFF\xFF`\x01`\xA0\x1B\x90\x91\x04\x81\x16\x90\x82\x16\x11\x15[\x15a\nkW`@Qc\x07\xA5\x07w`\xE5\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x08\x80Tc\xFF\xFF\xFF\xFF\x90\x92\x16`\x01`\xA0\x1B\x02c\xFF\xFF\xFF\xFF`\xA0\x1B\x19\x90\x92\x16\x91\x90\x91\x17\x90UV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16_\x81\x15\x80\x15a\n\xD5WP\x82[\x90P_\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\n\xF0WP0;\x15[\x90P\x81\x15\x80\x15a\n\xFEWP\x80\x15[\x15a\x0B\x1CW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\x0BFW\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\x0BO\x86a\x13]V[a\x0BWa\x13nV[a\x0Bb\x89\x89\x89a\x13vV[\x83\x15a\x0B\xA8W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPPPV[`\tT_\x90a\x0B\xC0a\x07\xBDV[\x84\x11\x80a\x0B\xCBWP\x80\x15[\x80a\x0C\x15WP`\x08T`\t\x80T\x90\x91`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x0B\xF9Wa\x0B\xF9a$\xCDV[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x84\x10[\x15a\x0C3W`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_\x80\x80a\x0CA`\x01\x85a$\xBAV[\x90P[\x81a\x0C\xDDW`\x08T`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x81\x10a\x0C\xDDW\x86`\t\x82\x81T\x81\x10a\x0CvWa\x0Cva$\xCDV[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x11a\x0C\xCBW`\x01\x91P`\t\x81\x81T\x81\x10a\x0C\xABWa\x0C\xABa$\xCDV[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x92Pa\x0C\xDDV[\x80a\x0C\xD5\x81a$\xE1V[\x91PPa\x0CDV[\x81a\x0C\xFBW`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x85a\r\x06\x84\x89a$\xBAV[\x11\x94PPPPP[\x92\x91PPV[a\r\x1Ca\rVV[`\x01`\x01`\xA0\x1B\x03\x81\x16a\rJW`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R_`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[a\rS\x81a\x12\xEDV[PV[3a\r\x88\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\x08\xCAW`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R3`\x04\x82\x01R`$\x01a\rAV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x81\x10\x80a\x08?W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01a\rAV[_a\x0E*a\x14\xA2V[\x90Pa\x0E4a\x1C\xF3V[\x83Q`\x01`\x01`@\x1B\x03\x90\x81\x16\x82R` \x85\x01Q\x16\x81`\x01` \x02\x01R`@\x84\x81\x01Q\x82\x82\x01R`\x01T``\x83\x01R`\x02T`\x80\x83\x01R`\x03T`\xA0\x83\x01R_T`\xC0\x83\x01RQc\xCESzw`\xE0\x1B\x81Rs_\xBD\xB21Vx\xAF\xEC\xB3g\xF02\xD9?d/d\x18\n\xA3\x90c\xCESzw\x90a\x0E\xB3\x90\x85\x90\x85\x90\x88\x90`\x04\x01a&\xFCV[` `@Q\x80\x83\x03\x81\x86Z\xF4\x15\x80\x15a\x0E\xCEW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0E\xF2\x91\x90a)*V[a\x0F\x0FW`@Qc\t\xBD\xE39`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPV[`\tT\x15\x80\x15\x90a\x0F\x8AWP`\x08T`\t\x80T`\x01`\xA0\x1B\x83\x04c\xFF\xFF\xFF\xFF\x16\x92`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x0FUWa\x0FUa$\xCDV[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01Ta\x0F\x7F\x90`\x01`@\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x84a)IV[`\x01`\x01`@\x1B\x03\x16\x11[\x15a\x10\x1DW`\x08T`\t\x80T\x90\x91`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x0F\xB7Wa\x0F\xB7a$\xCDV[_\x91\x82R` \x82 `\x02\x90\x91\x02\x01\x80T`\x01`\x01`\xC0\x1B\x03\x19\x16\x81U`\x01\x01U`\x08\x80T`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90`\x18a\x0F\xF7\x83a)pV[\x91\x90a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UPP[`@\x80Q`\x80\x81\x01\x82R`\x01`\x01`@\x1B\x03\x94\x85\x16\x81R\x92\x84\x16` \x80\x85\x01\x91\x82R\x83\x01Q\x85\x16\x84\x83\x01\x90\x81R\x92\x90\x91\x01Q``\x84\x01\x90\x81R`\t\x80T`\x01\x81\x01\x82U_\x91\x90\x91R\x93Q`\x02\x90\x94\x02\x7Fn\x15@\x17\x1Bl\x0C\x96\x0Bq\xA7\x02\r\x9F`\x07\x7Fj\xF91\xA8\xBB\xF5\x90\xDA\x02#\xDA\xCFu\xC7\xAF\x81\x01\x80T\x93Q\x94Q\x87\x16`\x01`\x80\x1B\x02g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`\x80\x1B\x19\x95\x88\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x95\x16\x96\x90\x97\x16\x95\x90\x95\x17\x92\x90\x92\x17\x92\x90\x92\x16\x93\x90\x93\x17\x90\x91UQ\x7Fn\x15@\x17\x1Bl\x0C\x96\x0Bq\xA7\x02\r\x9F`\x07\x7Fj\xF91\xA8\xBB\xF5\x90\xDA\x02#\xDA\xCFu\xC7\xB0\x90\x91\x01UV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a\x11\x84WP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a\x11x_\x80Q` a)\xB1\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x08\xCAW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x11\xAAa\rVV[`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x81R\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x90` \x01a\x06\x0EV[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x12=WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x12:\x91\x81\x01\x90a$\x8FV[`\x01[a\x12eW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\rAV[_\x80Q` a)\xB1\x839\x81Q\x91R\x81\x14a\x12\x95W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\rAV[a\x12\x9F\x83\x83a\x1A\xD1V[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\x08\xCAW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T`\x01`\x01`\xA0\x1B\x03\x19\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90_\x90\xA3PPPV[a\x13ea\x1B&V[a\rS\x81a\x1BoV[a\x08\xCAa\x1B&V[\x82Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80a\x13\x9AWP` \x83\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80a\x13\xA7WP` \x82\x01Q\x15[\x80a\x13\xB4WP`@\x82\x01Q\x15[\x80a\x13\xC1WP``\x82\x01Q\x15[\x80a\x13\xCBWP\x81Q\x15[\x80a\x13\xDDWPa\x0E\x10\x81c\xFF\xFF\xFF\xFF\x16\x10[\x80a\x13\xF1WPc\x01\xE13\x80\x81c\xFF\xFF\xFF\xFF\x16\x11[\x15a\x14\x0FW`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x82Q`\x04\x80T` \x80\x87\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x93\x84\x16\x91\x90\x95\x16\x90\x81\x17\x85\x17\x90\x93U`@\x96\x87\x01Q`\x05\x81\x90U\x86Q_U\x90\x86\x01Q`\x01U\x95\x85\x01Q`\x02U``\x90\x94\x01Q`\x03U`\x06\x80T\x90\x94\x16\x17\x17\x90\x91U`\x07\x91\x90\x91U`\x08\x80Tc\xFF\xFF\xFF\xFF\x90\x92\x16`\x01`\xA0\x1B\x02c\xFF\xFF\xFF\xFF`\xA0\x1B\x19\x90\x92\x16\x91\x90\x91\x17\x90UV[a\x14\xAAa\x1D\x11V[b\x10\0\0\x81R`\x07` \x82\x01R\x7F#x=\x0E\x97w\xB7\xAFe\xFB\xF8I\xDA~\xDBu\xE7K\x1E\xAFP>\x02]\x7F/\x7F\x80\x99\x1B\xEF\xA2`@\x82\x01QR\x7F*N/\xE8\xAD\xFAS\xF4hRU\x82\xD5\x18LLp\xBB\xDB\x94l!\xF2\x16A\x8A\x98yp^T\xA7` `@\x83\x01Q\x01R\x7F\x06$\xB2\xC1\xE7\x7F$\xAF\xCE\xAF9E\x17C\xB9\xFA\x80\xD5\x85?\xCA{\xA0\x03\x89\xC6ue\x07t\0\x9B``\x82\x01QR\x7F%\rw\x19\xE9L\xA2\xDF\0\xDF\xE3'\x93\x8FZ\x8DM\x83wy\xB9\x987\xCAwzS\xD3\x91'\xB1y` ``\x83\x01Q\x01R\x7F\r\xC0\x95\x15\x15.\xAE\xA6m\r\xB2\xF5q\xCC\x99^6\x9D&\xFEds\x94\xF1\r\xB59\x8C\x91u\x19\xDC`\x80\x82\x01QR\x7F\x12s\x14Ml\xEC,Jh\xB2J\x14\x93y\xC0\xF5Y+\xB7\xFB\xDD\xBE2\xFA\x17\x19\x19\x95\x0C\xA4\x04\xCB` `\x80\x83\x01Q\x01R\x7F\x11\x95!\xBBh\xCA\xEC!n/\x05\xEE\xB4f\xFB:\xBF\xE1\xF3\x9B\xAF\x7F\xE7\xCB9.\xA0W\xB6\xA2\xD9\xBF`\xA0\x82\x01QR\x7F-R\xAD\xEA\xBA\x80E\xE5:\xB5&\xFE\x99\x82\xD0\xEAE-\xEFk>\xA0%='\xA1\x9E\xF3\xB4n\x84(` `\xA0\x83\x01Q\x01R\x7F\x16\xC3\xB5\xB2\x17\xD3\x02\x97Z\x92\r\x137E$\xD7\xA5.JP\xFD\x7F\xB90\x84\"q\xEB\xF4\xA8N\xFD`\xC0\x82\x01QR\x7F \x07\x88\x91k\x90{\x19ir\xBD\xE3\x041\x8E\x88Z%!QK-\xB5\xE4\xA1\x18\x99\xC5\x12\x04\xF0\x89` `\xC0\x83\x01Q\x01R\x7F\x11'X\x1A\xFEu=\xEF\xCA\x9A\xEF\x12\xE73-\xB9\x97\x8A \x0B\x16\x99\xCE8\x88\xC0\xF3\xAE\xA6\x11\x1D\xC3`\xE0\x82\x01QR\x7F\x08\x81\xE1?\0r;\xE1\xA0Hr\xED\x02\xB2\xD0x\xC3\x1E\x80\xFE\xAF'rN&,\xE9|,\xB0\xBB\x1D` `\xE0\x83\x01Q\x01R\x7F\x14\x82\xA3\xA6\xBB\x91\xD6H=\x156\x83\xE2@O/UF\xE0\xE8\x95S\x0F\xDF\x13 \x91I\x84\x06\xE3\xDEa\x01\0\x82\x01QR~\xFAR\xDB=R\xD9\x05\xEA\xD1$\x81\x02\xF3\xA8\nC\xA9\r\x84\0\xC6\x8F`\xA6,T\xC7\x18u\xD8\xDD\xC3UFXd\x0C\xC9U\x01a\x01\xC0\x82\x01QR\x7F$:\x99\xD8\r2\xEBT\x08\xB5\x9D[\x080+\xED\xE0p\xD3\xFB\n\x8E\xFE/\"b\xF8e\xBF\xFBM\r` a\x01\xC0\x83\x01Q\x01R\x7F\x04U\xD22[\xF6&\x9Af\xF0}\x83\x8FU\xF3iG\xA3\xCD\x9B\x87\xED\xD8H\x0B\xCE\xD9\\\xBBE\xCC\x11a\x01\xE0\x82\x01QR\x7F\x0Ff\xD9\x08Zn\xD6\x0B\x83\x81y\x98~$\t\x92\xBF\xF4\xC0Ql\xCFl\xCD\xE4\xA1\xCA\x94\xCE\x8B\x98d` a\x01\xE0\x83\x01Q\x01R\x7F+\xAC\r#\xC8X]\x14\x87\xECa\x1B^\xFF\xC9~XR\xFE\xA4:|\xBA6\xCC\xDD, y1\xF3\x94a\x02\0\x82\x01QR\x7F\x18`\xB5N\x01\xA0j\xEAZ\xDBK\x13\xBF[\xAE\xBA\xB9+sh\x07\xA3\xA8\x9F\xF2\x04\t\x92\xB0n\xE6\xEC` a\x02\0\x83\x01Q\x01R\x7F\x0C\x0B\xFA\x1C/\xC6\xF8\xED\x01#=Qh\xDB\x1E\x1D\xFErU\x04\xF02\xF6i\xF5\n\x92\xAEw\xC7)\x06a\x02 \x82\x01QR\x7F\rt\x1E\x12L}\x10i\xB8\xA4\0\xCB\xCD\xCF\xD9\x01(\xA53\x90\x1A\xD4\xDE\x1E\x03\x7F\xE7)\x84\xDC4\xCF` a\x02 \x83\x01Q\x01R\x7F\x01\xCF\xED0\x08\\\x9E\xFC\xE0Fh W\x94\xAA9\xB1\xA8\xEEY\x124\xB4\xC7z\"\xF8\xC2m\x89\x9E\x05a\x02@\x82\x01QR\x7F*\xB6\x8A\xC8-6\xCE\xDBd}\x14\xA5\xB0\x03^\x8C\x9A\x0B\xE8G\x80\xB7\xBA\xE1\x13:'\xA8\x80\x96n\xD1` a\x02@\x83\x01Q\x01R\x7F\x07.\x1DP\xF8\xB5\xCF\x8DWK8G'dw\xD9[\xBDQ\x165\x10\0\x84\x1Fr\x8D\xA4O@C\xB5a\x02`\x82\x01QR\x7F#\xF8\xEAn\xAC\xD0\x87mW\"\x0FW\xEA\xBA\xCB\xE7j##A\x16cs\x1A%\x1D]\xCA6\xF1\xB5\x9F` a\x02`\x83\x01Q\x01R\x7F\xB0\x83\x88\x93\xEC\x1F#~\x8B\x072;\x07DY\x9FN\x97\xB5\x98\xB3\xB5\x89\xBC\xC2\xBC7\xB8\xD5\xC4\x18\x01a\x02\x80\x82\x01R\x7F\xC1\x83\x93\xC0\xFA0\xFEN\x8B\x03\x8E5z\xD8Q\xEA\xE8\xDE\x91\x07XN\xFF\xE7\xC7\xF1\xF6Q\xB2\x01\x0E&a\x02\xA0\x82\x01R\x90V[a\x1A\xDA\x82a\x1BwV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90_\x90\xA2\x80Q\x15a\x1B\x1EWa\x12\x9F\x82\x82a\x1B\xDAV[a\x08?a\x1CLV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a\x08\xCAW`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\r\x1Ca\x1B&V[\x80`\x01`\x01`\xA0\x1B\x03\x16;_\x03a\x1B\xACW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\rAV[_\x80Q` a)\xB1\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[``_\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x1B\xF6\x91\x90a)\x95V[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a\x1C.W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a\x1C3V[``\x91P[P\x91P\x91Pa\x1CC\x85\x83\x83a\x1CkV[\x95\x94PPPPPV[4\x15a\x08\xCAW`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a\x1C\x80Wa\x1C{\x82a\x1C\xCAV[a\x1C\xC3V[\x81Q\x15\x80\x15a\x1C\x97WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x1C\xC0W`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\rAV[P\x80[\x93\x92PPPV[\x80Q\x15a\x1C\xDAW\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Q\x80`\xE0\x01`@R\x80`\x07\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80a\x02\xC0\x01`@R\x80_\x81R` \x01_\x81R` \x01a\x1DD`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1Dd`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1D\x84`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1D\xA4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1D\xC4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1D\xE4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1E\x04`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1E$`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1ED`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1Ed`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1E\x84`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1E\xA4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1E\xC4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1E\xE4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1F\x04`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1F$`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1FD`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1Fd`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R_` \x82\x01\x81\x90R`@\x90\x91\x01R\x90V[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x1F\x8DW_\x80\xFD[\x91\x90PV[_` \x82\x84\x03\x12\x15a\x1F\xA2W_\x80\xFD[a\x1C\xC3\x82a\x1FwV[_` \x82\x84\x03\x12\x15a\x1F\xBBW_\x80\xFD[P5\x91\x90PV[cNH{q`\xE0\x1B_R`A`\x04R`$_\xFD[`@Qa\x02\xE0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x1F\xF9Wa\x1F\xF9a\x1F\xC2V[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a 'Wa 'a\x1F\xC2V[`@R\x91\x90PV[\x805`\x01`\x01`@\x1B\x03\x81\x16\x81\x14a\x1F\x8DW_\x80\xFD[_``\x82\x84\x03\x12\x15a UW_\x80\xFD[`@Q``\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a wWa wa\x1F\xC2V[`@R\x90P\x80a \x86\x83a /V[\x81Ra \x94` \x84\x01a /V[` \x82\x01R`@\x83\x015`@\x82\x01RP\x92\x91PPV[_`@\x82\x84\x03\x12\x15a \xBAW_\x80\xFD[`@Q`@\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a \xDCWa \xDCa\x1F\xC2V[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[_\x80\x82\x84\x03a\x04\xE0\x81\x12\x15a!\tW_\x80\xFD[a!\x13\x85\x85a EV[\x92Pa\x04\x80\x80`_\x19\x83\x01\x12\x15a!(W_\x80\xFD[a!0a\x1F\xD6V[\x91Pa!?\x86``\x87\x01a \xAAV[\x82Ra!N\x86`\xA0\x87\x01a \xAAV[` \x83\x01Ra!`\x86`\xE0\x87\x01a \xAAV[`@\x83\x01Ra\x01 a!t\x87\x82\x88\x01a \xAAV[``\x84\x01Ra\x01`a!\x88\x88\x82\x89\x01a \xAAV[`\x80\x85\x01Ra\x01\xA0a!\x9C\x89\x82\x8A\x01a \xAAV[`\xA0\x86\x01Ra\x01\xE0a!\xB0\x8A\x82\x8B\x01a \xAAV[`\xC0\x87\x01Ra\x02 a!\xC4\x8B\x82\x8C\x01a \xAAV[`\xE0\x88\x01Ra\x02`a!\xD8\x8C\x82\x8D\x01a \xAAV[a\x01\0\x89\x01Ra\x02\xA0a!\xED\x8D\x82\x8E\x01a \xAAV[\x87\x8A\x01Ra!\xFF\x8Da\x02\xE0\x8E\x01a \xAAV[a\x01@\x8A\x01Ra\"\x13\x8Da\x03 \x8E\x01a \xAAV[\x86\x8A\x01Ra\"%\x8Da\x03`\x8E\x01a \xAAV[a\x01\x80\x8A\x01Ra\x03\xA0\x8C\x015\x94\x89\x01\x94\x90\x94Ra\x03\xC0\x8B\x015a\x01\xC0\x89\x01Ra\x03\xE0\x8B\x015\x92\x88\x01\x92\x90\x92Ra\x04\0\x8A\x015a\x02\0\x88\x01Ra\x04 \x8A\x015\x90\x87\x01Ra\x04@\x89\x015a\x02@\x87\x01Ra\x04`\x89\x015\x90\x86\x01R\x92\x87\x015a\x02\x80\x85\x01RPPa\x04\xA0\x85\x015\x90\x82\x01Ra\x04\xC0\x90\x93\x015a\x02\xC0\x84\x01RP\x92\x90\x91PV[_\x80`@\x83\x85\x03\x12\x15a\"\xB8W_\x80\xFD[a\"\xC1\x83a\x1FwV[\x91P` \x80\x84\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\"\xDDW_\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12a\"\xF0W_\x80\xFD[\x815\x81\x81\x11\x15a#\x02Wa#\x02a\x1F\xC2V[a#\x14`\x1F\x82\x01`\x1F\x19\x16\x85\x01a\x1F\xFFV[\x91P\x80\x82R\x87\x84\x82\x85\x01\x01\x11\x15a#)W_\x80\xFD[\x80\x84\x84\x01\x85\x84\x017_\x84\x82\x84\x01\x01RP\x80\x93PPPP\x92P\x92\x90PV[\x805c\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x1F\x8DW_\x80\xFD[_` \x82\x84\x03\x12\x15a#iW_\x80\xFD[a\x1C\xC3\x82a#FV[_\x80_\x80\x84\x86\x03a\x01 \x81\x12\x15a#\x87W_\x80\xFD[a#\x91\x87\x87a EV[\x94P`\x80`_\x19\x82\x01\x12\x15a#\xA4W_\x80\xFD[P`@Q`\x80\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a#\xC7Wa#\xC7a\x1F\xC2V[\x80`@RP``\x86\x015\x81R`\x80\x86\x015` \x82\x01R`\xA0\x86\x015`@\x82\x01R`\xC0\x86\x015``\x82\x01R\x80\x93PPa$\x01`\xE0\x86\x01a#FV[\x91Pa$\x10a\x01\0\x86\x01a\x1FwV[\x90P\x92\x95\x91\x94P\x92PV[_[\x83\x81\x10\x15a$5W\x81\x81\x01Q\x83\x82\x01R` \x01a$\x1DV[PP_\x91\x01RV[` \x81R_\x82Q\x80` \x84\x01Ra$[\x81`@\x85\x01` \x87\x01a$\x1BV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15a$\x80W_\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[_` \x82\x84\x03\x12\x15a$\x9FW_\x80\xFD[PQ\x91\x90PV[cNH{q`\xE0\x1B_R`\x11`\x04R`$_\xFD[\x81\x81\x03\x81\x81\x11\x15a\r\x0EWa\r\x0Ea$\xA6V[cNH{q`\xE0\x1B_R`2`\x04R`$_\xFD[_\x81a$\xEFWa$\xEFa$\xA6V[P_\x19\x01\x90V[\x80_[`\x07\x81\x10\x15a\x0F\x0FW\x81Q\x84R` \x93\x84\x01\x93\x90\x91\x01\x90`\x01\x01a$\xF9V[a%-\x82\x82Q\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[` \x81\x81\x01Q\x80Q`@\x85\x01R\x90\x81\x01Q``\x84\x01RP`@\x81\x01Q\x80Q`\x80\x84\x01R` \x81\x01Q`\xA0\x84\x01RP``\x81\x01Q\x80Q`\xC0\x84\x01R` \x81\x01Q`\xE0\x84\x01RP`\x80\x81\x01Qa\x01\0a%\x90\x81\x85\x01\x83\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xA0\x83\x01Q\x91Pa\x01@a%\xB0\x81\x86\x01\x84\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xC0\x84\x01Q\x92Pa\x01\x80a%\xD0\x81\x87\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xE0\x85\x01Q\x93Pa\x01\xC0a%\xF0\x81\x88\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x85\x01Q\x93Pa\x02\0\x92a&\x10\x87\x85\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01 \x86\x01Q\x94Pa\x02@a&1\x81\x89\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x86\x01Q\x94Pa\x02\x80\x92a&Q\x88\x85\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01`\x87\x01Q\x95Pa\x02\xC0a&r\x81\x8A\x01\x88\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x87\x01Q\x80Qa\x03\0\x8A\x01R` \x01Qa\x03 \x89\x01Ra\x01\xA0\x87\x01Qa\x03@\x89\x01R\x90\x86\x01Qa\x03`\x88\x01Ra\x01\xE0\x86\x01Qa\x03\x80\x88\x01R\x92\x85\x01Qa\x03\xA0\x87\x01Ra\x02 \x85\x01Qa\x03\xC0\x87\x01R\x91\x84\x01Qa\x03\xE0\x86\x01Ra\x02`\x84\x01Qa\x04\0\x86\x01R\x83\x01Qa\x04 \x85\x01Ra\x02\xA0\x83\x01Qa\x04@\x85\x01R\x90\x91\x01Qa\x04`\x90\x92\x01\x91\x90\x91RPV[_a\n`\x82\x01\x90P\x84Q\x82R` \x85\x01Q` \x83\x01R`@\x85\x01Qa'.`@\x84\x01\x82\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[P``\x85\x01Q\x80Q`\x80\x84\x01R` \x81\x01Q`\xA0\x84\x01RP`\x80\x85\x01Q\x80Q`\xC0\x84\x01R` \x81\x01Q`\xE0\x84\x01RP`\xA0\x85\x01Qa\x01\0a'{\x81\x85\x01\x83\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xC0\x87\x01Q\x91Pa\x01@a'\x9B\x81\x86\x01\x84\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xE0\x88\x01Q\x92Pa\x01\x80a'\xBB\x81\x87\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x88\x01Q\x92Pa\x01\xC0\x91a'\xDB\x86\x84\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01 \x89\x01Q\x93Pa\x02\0a'\xFC\x81\x88\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x89\x01Q\x93Pa\x02@\x91a(\x1C\x87\x84\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01`\x8A\x01Q\x94Pa\x02\x80a(=\x81\x89\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x8A\x01Q\x80Qa\x02\xC0\x89\x01R` \x90\x81\x01Qa\x02\xE0\x89\x01Ra\x01\xA0\x8B\x01Q\x80Qa\x03\0\x8A\x01R\x81\x01Qa\x03 \x89\x01R\x93\x8A\x01Q\x80Qa\x03@\x89\x01R\x84\x01Qa\x03`\x88\x01Ra\x01\xE0\x8A\x01Q\x80Qa\x03\x80\x89\x01R\x84\x01Qa\x03\xA0\x88\x01R\x89\x01Q\x80Qa\x03\xC0\x88\x01R\x83\x01Qa\x03\xE0\x87\x01Ra\x02 \x89\x01Q\x80Qa\x04\0\x88\x01R\x83\x01Qa\x04 \x87\x01R\x90\x88\x01Q\x80Qa\x04@\x87\x01R\x82\x01Qa\x04`\x86\x01Ra\x02`\x88\x01Q\x80Qa\x04\x80\x87\x01R\x90\x91\x01Qa\x04\xA0\x85\x01R\x86\x01Qa\x04\xC0\x84\x01RPa\x02\xA0\x85\x01Qa\x04\xE0\x83\x01Ra)\x14a\x05\0\x83\x01\x85a$\xF6V[a)\"a\x05\xE0\x83\x01\x84a%\x18V[\x94\x93PPPPV[_` \x82\x84\x03\x12\x15a):W_\x80\xFD[\x81Q\x80\x15\x15\x81\x14a\x1C\xC3W_\x80\xFD[`\x01`\x01`@\x1B\x03\x82\x81\x16\x82\x82\x16\x03\x90\x80\x82\x11\x15a)iWa)ia$\xA6V[P\x92\x91PPV[_`\x01`\x01`@\x1B\x03\x80\x83\x16\x81\x81\x03a)\x8BWa)\x8Ba$\xA6V[`\x01\x01\x93\x92PPPV[_\x82Qa)\xA6\x81\x84` \x87\x01a$\x1BV[\x91\x90\x91\x01\x92\x91PPV\xFE6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\xA1dsolcC\0\x08\x17\0\n", + b"`\xA0`@R0`\x80R4\x80\x15b\0\0\x14W_\x80\xFD[Pb\0\0\x1Fb\0\0%V[b\0\0\xD9V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15b\0\0vW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80T`\x01`\x01`@\x1B\x03\x90\x81\x16\x14b\0\0\xD6W\x80T`\x01`\x01`@\x1B\x03\x19\x16`\x01`\x01`@\x1B\x03\x90\x81\x17\x82U`@Q\x90\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PV[`\x80Qa.\xCBb\0\x01\0_9_\x81\x81a\x10\xFD\x01R\x81\x81a\x11&\x01Ra\x12\xA3\x01Ra.\xCB_\xF3\xFE`\x80`@R`\x046\x10a\x01\xBAW_5`\xE0\x1C\x80c\x81\x1F\x85?\x11a\0\xF2W\x80c\xA1\xBE\x8DR\x11a\0\x92W\x80c\xD2M\x93=\x11a\0bW\x80c\xD2M\x93=\x14a\x05\xEBW\x80c\xE003\x01\x14a\x06\x1AW\x80c\xF2\xFD\xE3\x8B\x14a\x069W\x80c\xF9\xE5\r\x19\x14a\x06XW_\x80\xFD[\x80c\xA1\xBE\x8DR\x14a\x059W\x80c\xAD<\xB1\xCC\x14a\x05XW\x80c\xB2BN?\x14a\x05\x95W\x80c\xC2;\x9E\x9E\x14a\x05\xB3W_\x80\xFD[\x80c\x8D\xA5\xCB[\x11a\0\xCDW\x80c\x8D\xA5\xCB[\x14a\x04jW\x80c\x90\xC1C\x90\x14a\x04\xA6W\x80c\x96\xC1\xCAa\x14a\x04\xC5W\x80c\x9F\xDBT\xA7\x14a\x04\xE4W_\x80\xFD[\x80c\x81\x1F\x85?\x14a\x03\xE4W\x80c\x82nA\xFC\x14a\x04\x03W\x80c\x85\x84\xD2?\x14a\x04.W_\x80\xFD[\x80cBm1\x94\x11a\x01]W\x80ci\xCCj\x04\x11a\x018W\x80ci\xCCj\x04\x14a\x03\x89W\x80cqP\x18\xA6\x14a\x03\x9DW\x80cu|7\xAD\x14a\x03\xB1W\x80cvg\x18\x08\x14a\x03\xD0W_\x80\xFD[\x80cBm1\x94\x14a\x03@W\x80cO\x1E\xF2\x86\x14a\x03bW\x80cR\xD1\x90-\x14a\x03uW_\x80\xFD[\x80c\r\x8En,\x11a\x01\x98W\x80c\r\x8En,\x14a\x02~W\x80c/y\x88\x9D\x14a\x02\xA9W\x80c1=\xF7\xB1\x14a\x02\xE7W\x80c7\x8E\xC2;\x14a\x03\x1EW_\x80\xFD[\x80c\x01?\xA5\xFC\x14a\x01\xBEW\x80c\x02\xB5\x92\xF3\x14a\x01\xDFW\x80c\x06%\xE1\x9B\x14a\x02=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\xCA\x91\x90a(\xF9V[\x90P\x90V[a\x07\xD7a\x10\xF2V[a\x07\xE0\x82a\x11\x96V[a\x07\xEA\x82\x82a\x11\xD7V[PPV[_a\x07\xF7a\x12\x98V[P_\x80Q` a.\x9F\x839\x81Q\x91R\x90V[a\x08\x11a\x10\x97V[`\rT`\x01`\x01`\xA0\x1B\x03\x16\x15a\x08\\W`\r\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16\x90U`@Q\x7F\x9A_W\xDE\x85m\xD6h\xC5M\xD9^\\U\xDF\x93C!q\xCB\xCAI\xA8wmV \xEAY\xC0$P\x90_\x90\xA1V[`@Qc\xA8c\xAE\xC9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a\x08\x7Fa\x10\x97V[a\x08u_a\x12\xE1V[`\rT`\x01`\x01`\xA0\x1B\x03\x16\x15\x15\x80\x15a\x08\xADWP`\rT`\x01`\x01`\xA0\x1B\x03\x163\x14\x15[\x15a\x08\xCBW`@Qc\x01GL\x8F`\xE7\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x0BT\x83Q`\x01`\x01`@\x1B\x03\x91\x82\x16\x91\x16\x11\x15\x80a\t\x04WP`\x0BT` \x84\x01Q`\x01`\x01`@\x1B\x03`\x01`@\x1B\x90\x92\x04\x82\x16\x91\x16\x11\x15[\x15a\t\"W`@Qc\x05\x1CF\xEF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\t/\x83`@\x01Qa\x13QV[_a\t8a\x0BZV[` \x85\x01Q_\x80T\x92\x93P\x91a\tW\x91\x90`\x01`\x01`@\x1B\x03\x16a\r\xCEV[\x90Pa\td\x82`\x01a)$V[`\x01`\x01`@\x1B\x03\x16\x81`\x01`\x01`@\x1B\x03\x16\x14\x80\x15a\t\x9DWP`\x0BTa\t\x9B\x90`\x01`@\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16a\x0E\xB4V[\x15[\x80\x15a\t\xB1WP_\x82`\x01`\x01`@\x1B\x03\x16\x11[\x15a\t\xCFW`@QcqP\xDEE`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\t\xDA\x82`\x02a)$V[`\x01`\x01`@\x1B\x03\x16\x81`\x01`\x01`@\x1B\x03\x16\x10a\n\x0BW`@QcqP\xDEE`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\n\x18\x84` \x01Qa\x13QV[a\n%\x84`@\x01Qa\x13QV[a\n2\x84``\x01Qa\x13QV[a\n=\x85\x85\x85a\x13\xC1V[\x84Q`\x0B\x80T` \x88\x01Q`\x01`\x01`@\x1B\x03\x81\x81\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x93\x16\x94\x16\x93\x90\x93\x17\x17\x90U`@\x86\x01Q`\x0CUa\n\x7F\x90a\x0E\xB4V[\x15a\n\xE9W\x83Q`\x05U` \x84\x01Q`\x06U`@\x84\x01Q`\x07U``\x84\x01Q`\x08U\x7F1\xEA\xBD\x90\x99\xFD\xB2]\xAC\xDD\xD2\x06\xAB\xFF\x871\x1EU4A\xFC\x9D\x0F\xCD\xEF \x10b\xD7\xE7\x07\x1Ba\n\xCD\x82`\x01a)$V[`@Q`\x01`\x01`@\x1B\x03\x90\x91\x16\x81R` \x01`@Q\x80\x91\x03\x90\xA1[a\n\xFBa\n\xF4a\x07hV[B\x87a\x15\x19V[\x84` \x01Q`\x01`\x01`@\x1B\x03\x16\x85_\x01Q`\x01`\x01`@\x1B\x03\x16\x7F\xA0Jw9$PZA\x85d67%\xF5h2\xF5w.k\x8D\r\xBDn\xFC\xE7$\xDF\xE8\x03\xDA\xE6\x87`@\x01Q`@Qa\x0BK\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA3PPPPPV[`\x0BT_\x80T\x90\x91a\x07\xCA\x91`\x01`\x01`@\x1B\x03`\x01`@\x1B\x90\x92\x04\x82\x16\x91\x16a\r\xCEV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16_\x81\x15\x80\x15a\x0B\xC3WP\x82[\x90P_\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\x0B\xDEWP0;\x15[\x90P\x81\x15\x80\x15a\x0B\xECWP\x80\x15[\x15a\x0C\nW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\x0C4W\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\x0C=\x87a\x17\x02V[a\x0CEa\x17\x13V[a\x0CQ\x8A\x8A\x8A\x89a\x17\x1BV[\x83\x15a\x0C\x97W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPPPPV[`\x0E\x80T_\x91\x82\x91\x90a\x0C\xB7`\x01\x83a)KV[\x81T\x81\x10a\x0C\xC7Wa\x0C\xC7a)^V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x80\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x84\x10a\r\x06W`@Qc\x18V\xA4\x99`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\rT`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16[\x81\x81\x10\x15a\r\xC7W\x84`\x0E\x82\x81T\x81\x10a\r6Wa\r6a)^V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x80\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x11\x15a\r\xBFW`\x0E\x81\x81T\x81\x10a\roWa\roa)^V[\x90_R` _ \x90`\x02\x02\x01`\x01\x01T`\x0E\x82\x81T\x81\x10a\r\x92Wa\r\x92a)^V[\x90_R` _ \x90`\x02\x02\x01_\x01`\x10\x90T\x90a\x01\0\n\x90\x04`\x01`\x01`@\x1B\x03\x16\x93P\x93PPP\x91P\x91V[`\x01\x01a\r\x1AV[PP\x91P\x91V[_\x81`\x01`\x01`@\x1B\x03\x16_\x03a\r\xE6WP_a\x0E%V[a\r\xF0\x82\x84a)\x86V[`\x01`\x01`@\x1B\x03\x16_\x03a\x0E\x10Wa\x0E\t\x82\x84a)\xABV[\x90Pa\x0E%V[a\x0E\x1A\x82\x84a)\xABV[a\x0E\t\x90`\x01a)$V[\x92\x91PPV[a\x0E3a\x10\x97V[a\x0E\x10\x81c\xFF\xFF\xFF\xFF\x16\x10\x80a\x0ERWPc\x01\xE13\x80\x81c\xFF\xFF\xFF\xFF\x16\x11[\x80a\x0EpWP`\rTc\xFF\xFF\xFF\xFF`\x01`\xA0\x1B\x90\x91\x04\x81\x16\x90\x82\x16\x11\x15[\x15a\x0E\x8EW`@Qc\x07\xA5\x07w`\xE5\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\r\x80Tc\xFF\xFF\xFF\xFF\x90\x92\x16`\x01`\xA0\x1B\x02c\xFF\xFF\xFF\xFF`\xA0\x1B\x19\x90\x92\x16\x91\x90\x91\x17\x90UV[_\x81`\x01`\x01`@\x1B\x03\x16_\x03a\x0E\xCCWP_\x91\x90PV[_Ta\x0E\xE1\x90`\x01`\x01`@\x1B\x03\x16\x83a)\x86V[`\x01`\x01`@\x1B\x03\x16\x15\x92\x91PPV[\x91\x90PV[`\x0ET_\x90a\x0F\x03a\x07hV[\x84\x11\x80a\x0F\x0EWP\x80\x15[\x80a\x0FXWP`\rT`\x0E\x80T\x90\x91`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x0FW`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x85a\x10I\x84\x89a)KV[\x11\x97\x96PPPPPPPV[a\x10]a\x10\x97V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x10\x8BW`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R_`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[a\x10\x94\x81a\x12\xE1V[PV[3a\x10\xC9\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\x08uW`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R3`\x04\x82\x01R`$\x01a\x10\x82V[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a\x11xWP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a\x11l_\x80Q` a.\x9F\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x08uW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x11\x9Ea\x10\x97V[`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x81R\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x90` \x01a\x07\x14V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x121WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x12.\x91\x81\x01\x90a(\xF9V[`\x01[a\x12YW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x10\x82V[_\x80Q` a.\x9F\x839\x81Q\x91R\x81\x14a\x12\x89W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x10\x82V[a\x12\x93\x83\x83a\x18\x95V[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\x08uW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T`\x01`\x01`\xA0\x1B\x03\x19\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90_\x90\xA3PPPV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x81\x10\x80a\x07\xEAW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01a\x10\x82V[_a\x13\xCAa\x18\xEAV[\x90Pa\x13\xD4a \xE2V[\x84Q`\x01`\x01`@\x1B\x03\x90\x81\x16\x82R` \x80\x87\x01\x80Q\x90\x92\x16\x90\x83\x01R`@\x80\x87\x01Q\x90\x83\x01R`\x06T``\x83\x01R`\x07T`\x80\x83\x01R`\x08T`\xA0\x83\x01R`\x05T`\xC0\x83\x01RQa\x14%\x90a\x0E\xB4V[\x15a\x14WW` \x84\x01Q`\xE0\x82\x01R`@\x84\x01Qa\x01\0\x82\x01R``\x84\x01Qa\x01 \x82\x01R\x83Qa\x01@\x82\x01Ra\x14{V[`\x06T`\xE0\x82\x01R`\x07Ta\x01\0\x82\x01R`\x08Ta\x01 \x82\x01R`\x05Ta\x01@\x82\x01R[`@Qc\xFC\x86`\xC7`\xE0\x1B\x81Rs_\xBD\xB21Vx\xAF\xEC\xB3g\xF02\xD9?d/d\x18\n\xA3\x90c\xFC\x86`\xC7\x90a\x14\xB6\x90\x85\x90\x85\x90\x88\x90`\x04\x01a+\xF1V[` `@Q\x80\x83\x03\x81\x86Z\xF4\x15\x80\x15a\x14\xD1W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x14\xF5\x91\x90a.\x1FV[a\x15\x12W`@Qc\t\xBD\xE39`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPPV[`\x0ET\x15\x80\x15\x90a\x15\x8EWP`\rT`\x0E\x80T`\x01`\xA0\x1B\x83\x04c\xFF\xFF\xFF\xFF\x16\x92`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x15YWa\x15Ya)^V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01Ta\x15\x83\x90`\x01`@\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x84a.>V[`\x01`\x01`@\x1B\x03\x16\x11[\x15a\x16!W`\rT`\x0E\x80T\x90\x91`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x15\xBBWa\x15\xBBa)^V[_\x91\x82R` \x82 `\x02\x90\x91\x02\x01\x80T`\x01`\x01`\xC0\x1B\x03\x19\x16\x81U`\x01\x01U`\r\x80T`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90`\x18a\x15\xFB\x83a.^V[\x91\x90a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UPP[`@\x80Q`\x80\x81\x01\x82R`\x01`\x01`@\x1B\x03\x94\x85\x16\x81R\x92\x84\x16` \x80\x85\x01\x91\x82R\x83\x01Q\x85\x16\x84\x83\x01\x90\x81R\x92\x90\x91\x01Q``\x84\x01\x90\x81R`\x0E\x80T`\x01\x81\x01\x82U_\x91\x90\x91R\x93Q`\x02\x90\x94\x02\x7F\xBB{JEM\xC3I9#H/\x07\x82#)\xED\x19\xE8$N\xFFX,\xC2\x04\xF8UL6 \xC3\xFD\x81\x01\x80T\x93Q\x94Q\x87\x16`\x01`\x80\x1B\x02g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`\x80\x1B\x19\x95\x88\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x95\x16\x96\x90\x97\x16\x95\x90\x95\x17\x92\x90\x92\x17\x92\x90\x92\x16\x93\x90\x93\x17\x90\x91UQ\x7F\xBB{JEM\xC3I9#H/\x07\x82#)\xED\x19\xE8$N\xFFX,\xC2\x04\xF8UL6 \xC3\xFE\x90\x91\x01UV[a\x17\na\x1F\x15V[a\x10\x94\x81a\x1F^V[a\x08ua\x1F\x15V[\x83Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80a\x17?WP` \x84\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80a\x17LWP` \x83\x01Q\x15[\x80a\x17YWP`@\x83\x01Q\x15[\x80a\x17fWP``\x83\x01Q\x15[\x80a\x17pWP\x82Q\x15[\x80a\x17\x82WPa\x0E\x10\x82c\xFF\xFF\xFF\xFF\x16\x10[\x80a\x17\x96WPc\x01\xE13\x80\x82c\xFF\xFF\xFF\xFF\x16\x11[\x80a\x17\xA8WP`\x01`\x01`@\x1B\x03\x81\x16\x15[\x15a\x17\xC6W`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x83Q`\t\x80T` \x80\x88\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x93\x84\x16\x95\x82\x16\x95\x86\x17\x81\x17\x90\x94U`@\x98\x89\x01Q`\n\x81\x90U`\x0B\x80T\x90\x94\x16\x90\x95\x17\x90\x93\x17\x90\x91U`\x0C\x92\x90\x92U\x84Q`\x01\x81\x90U\x91\x85\x01Q`\x02\x81\x90U\x95\x85\x01Q`\x03\x81\x90U``\x90\x95\x01Q`\x04\x81\x90U`\x05\x92\x90\x92U`\x06\x95\x90\x95U`\x07\x93\x90\x93U`\x08\x92\x90\x92U`\r\x80Tc\xFF\xFF\xFF\xFF\x90\x92\x16`\x01`\xA0\x1B\x02c\xFF\xFF\xFF\xFF`\xA0\x1B\x19\x90\x92\x16\x91\x90\x91\x17\x90U_\x80T\x91\x90\x92\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x91\x90\x91\x16\x17\x90UV[a\x18\x9E\x82a\x1FfV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90_\x90\xA2\x80Q\x15a\x18\xE2Wa\x12\x93\x82\x82a\x1F\xC9V[a\x07\xEAa ;V[a\x18\xF2a!\x01V[b\x10\0\0\x81R`\x0B` \x82\x01R\x7F&\x86~\xE5\x8A\xAF\x86\x0F\xC9\xE0\xE3\xA7\x86f\xFF\xC5\x1F;\xA1\xAD\x8A\xE0\x01\xC1\x96\x83\x0CU\xB5\xAF\x0B\x8C`@\x82\x01QR\x7F\t\x120\xAD\xB7S\xF8(\x15\x15\x12w\x06\x0C\xC5kTk\xB2\xE9P\xA0\xDE\x19\xED\x06\x1E\xC6\x8C\x07\x1A\x90` `@\x83\x01Q\x01R\x7F\x02\xA5\t\xA0m\x8CV\xF8? F\x88\xFFnB\xEA\xC6\xE3\xCB\xDD\x06;\tq\xA3\xAF\x95>\x81\xBA\xDB\xB6``\x82\x01QR\x7F\x06\xF4>\xD2\xB9\xCE\xCE5\xD1 \x1A\xBC\x13\xFF\xDA\xEA5V\x0C\xF0\xF1Dbw\x13\x8C\xE8\x12\xB9\xAD\x9F9` ``\x83\x01Q\x01R\x7F\x1AX\x8C\x99\xAD\x88\xF7\x89\xC8w\"\xB0a\xBBU5\xDA\xA0\xAB\xCC\x1D\xC6\xD1v\xD7\xFE\xA5\x1E]\x80\xB9&`\x80\x82\x01QR\x7F b\xB9\x95\xE6\x1Aj\xB8\xAA\xB6\xCDnu \xB8y\xD8O\x96Z\xB1\xF0\x94\xC1\x04\xF0\xC1!;(\x03\x8B` `\x80\x83\x01Q\x01R\x7F!\xA2\xFDvj\x0C\xEB\xEC\xFD\xBF\xDF\xE5a9\xA1\xBB\xD9\xAE\xC1^.5\xBE\x8E\xF0\x194\xA0\xECC\x86\x85`\xA0\x82\x01QR\x7F \xFEP\n\xC7\xD1\xAAx \xDB\x8Co\x7F\x9DP\x9E;.\x88s\x1E:\x12\xDDe\xF0oC\xCA\x93\r\xA0` `\xA0\x83\x01Q\x01R\x7F\n\xB5=\x12\x85\xC7\xF4\x81\x9B?\xF6\xE1\xDD\xAD\xA6\xBF%\x15\xD3K\xBA\xF6\x11\x86\xC6\xA0K\xE4}\xFDe\xA3`\xC0\x82\x01QR\x7F\x0B\x80\xA9\x87\x80\x82\xCD\xFD\xD9\xFC\xC1k\xB3?\xA4$\xC0\xADf\xB8\x19I\xBFd!S\xD3\xC7\xAD\x08/\"` `\xC0\x83\x01Q\x01R\x7F\x1B\x90\x0F\x8E_\x8E\x80d\xA5\x88\x8A\x1B\xD7\x96\xB5J&R\xFC\x02\x03O\xE4\xB6\xE6\xFC\x8DfP\xF7E;`\xE0\x82\x01QR~\xCC\xA2X\xA8\x83,d\xD1\xF8\xE1r\x1Ax\xFC%\xB1=)\xAD\xBB\x81\xE3Zy\xFC/I\xF8\x90'\x86` `\xE0\x83\x01Q\x01R\x7F\r\x1D3H\xD6B\xE6\xF2\xE9s\x9Ds]\x8Cr6v\xDB\xAE\xFD\xCB\xB4\xE9fA\xDE\xFA5=&\xEB\xB3a\x01\0\x82\x01QR\x7F\x14\xFE\x9Dj3Q\x04\xE7I\x1C\xA6\xD5\x08a\x13\xE6\xB0\xF5)F\x96\rrfdf{\xD5\x859\xD4\x1E` a\x01\0\x83\x01Q\x01R\x7F\x1D\xA9CdD\x0CN?\xB8\xAF-6<\xDE\xFAN\xDD\xA47W\x9E\x1B\x05j\x16\xA5\xE9\xA1\x1D\xFF\xA2\xABa\x01 \x82\x01QR\x7F\n\x07{\xD3\x07\xED1\"-\xB5\\\xB0\x12\x8B\xAF\xCE^\"U{W\xF5\xAC\x91SY\xC5\x02\x96\xCB\\w` a\x01 \x83\x01Q\x01R\x7F(\xFF\x80\xB13\xD9\x89#\\q)\xDE\xA5Di\xB7\x80\xACG\x17D\x92\x90\x06~|\x9A}[\xE7\xDB\xD5a\x01@\x82\x01QR\x7F\x1C\x0F\xC2.\xEF#\xB5\n-\xDCU?\x9F\xC1\xB6\x1F\xD8\xC5zX\xCA2\x1A\x82\x9C~\xC2U\xF7W\xB3\xA6` a\x01@\x83\x01Q\x01R~^\xE7rr\x95\x96a\xE0\xFB\xAB\xDAC\x17w\xFAr\x9F[S/Da\x01\x80\x82\x01QR~\x8D\x9E\xE0\x0Fy\x9C\xF0\x06\x08\xB0\x82\xD0;\x9D\xE5\xA4+\x81&\xC3_\xBF\xBD\x1E`!\x08\xDF\x10\xE0\xE3` a\x01\x80\x83\x01Q\x01R\x7F/Rli\x81d?\xF6\xF6\xE9\xD2\xB5\xA9!\xE0l\xF9_'F)\xB5\xA1E\xBDU+\x7F\xDAj\x87\0a\x01\xA0\x82\x01QR\x7F/\xE7\x10\x8F\xD4\xE2B1\xF3\xDA\xDBn\t\x07.\x10o\xCA\x06\x94\xFE9\xDF\xF9eW\xA8\x82!\xA8\x9AP` a\x01\xA0\x83\x01Q\x01R\x7F&\xA3V\x85\x98\xA6\x98\x1Ec%\xF4\x81g6\xE3\x81\x08{[\x0EK'\xEF6M\x8A\xE1\xE2\x9F\xE9\xDF\x99a\x01\xC0\x82\x01QR\x7F\x1D\xB8\x1C\xDF\x82\xA9\xEC\x99\xF3\xC9qm\xF2-81~k\xB8O\xC5}/\x0E{+\xC8\xA0V\x9F|\xC4` a\x01\xC0\x83\x01Q\x01R~\x99\x88\x80\x88\xE1\x1D\xE6\xED\x08l\x99\xB9\xBB\xA9\x86\xD9\x08\xDF[\x0CP\x07h\r\x97V}HW\x19\x94a\x01\xE0\x82\x01QR\x7F\x1F\x91Wn\xAD\xFF\xFF\x93+nT\xBA\xB0\"\xF9?o\xEC>[vt\xD0\0k\xC5\xF2\"5'\xA3H` a\x01\xE0\x83\x01Q\x01R~h\xB3\xC1\x17\xEE~\x84\xD6\xB6p\xB6\xAF \x19wY\xEC\x80\xD3O#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a\x08uW`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x10]a\x1F\x15V[\x80`\x01`\x01`\xA0\x1B\x03\x16;_\x03a\x1F\x9BW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x10\x82V[_\x80Q` a.\x9F\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[``_\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x1F\xE5\x91\x90a.\x83V[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a \x1DW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a \"V[``\x91P[P\x91P\x91Pa 2\x85\x83\x83a ZV[\x95\x94PPPPPV[4\x15a\x08uW`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a oWa j\x82a \xB9V[a \xB2V[\x81Q\x15\x80\x15a \x86WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a \xAFW`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x10\x82V[P\x80[\x93\x92PPPV[\x80Q\x15a \xC9W\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Q\x80a\x01`\x01`@R\x80`\x0B\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80a\x02\xC0\x01`@R\x80_\x81R` \x01_\x81R` \x01a!4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a!T`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a!t`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a!\x94`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a!\xB4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a!\xD4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a!\xF4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"\x14`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"T`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"t`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"\x94`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"\xB4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"\xD4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"\xF4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a#\x14`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a#4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a#T`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R_` \x82\x01\x81\x90R`@\x90\x91\x01R\x90V[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x0E\xF1W_\x80\xFD[_` \x82\x84\x03\x12\x15a#\x8DW_\x80\xFD[a \xB2\x82a#gV[_` \x82\x84\x03\x12\x15a#\xA6W_\x80\xFD[P5\x91\x90PV[cNH{q`\xE0\x1B_R`A`\x04R`$_\xFD[`@Qa\x02\xE0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a#\xE4Wa#\xE4a#\xADV[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a$\x12Wa$\x12a#\xADV[`@R\x91\x90PV[_\x80`@\x83\x85\x03\x12\x15a$+W_\x80\xFD[a$4\x83a#gV[\x91P` \x80\x84\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a$PW_\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12a$cW_\x80\xFD[\x815\x81\x81\x11\x15a$uWa$ua#\xADV[a$\x87`\x1F\x82\x01`\x1F\x19\x16\x85\x01a#\xEAV[\x91P\x80\x82R\x87\x84\x82\x85\x01\x01\x11\x15a$\x9CW_\x80\xFD[\x80\x84\x84\x01\x85\x84\x017_\x84\x82\x84\x01\x01RP\x80\x93PPPP\x92P\x92\x90PV[\x805`\x01`\x01`@\x1B\x03\x81\x16\x81\x14a\x0E\xF1W_\x80\xFD[_``\x82\x84\x03\x12\x15a$\xDFW_\x80\xFD[`@Q``\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a%\x01Wa%\x01a#\xADV[`@R\x90P\x80a%\x10\x83a$\xB9V[\x81Ra%\x1E` \x84\x01a$\xB9V[` \x82\x01R`@\x83\x015`@\x82\x01RP\x92\x91PPV[_`\x80\x82\x84\x03\x12\x15a%DW_\x80\xFD[`@Q`\x80\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a%fWa%fa#\xADV[\x80`@RP\x80\x91P\x825\x81R` \x83\x015` \x82\x01R`@\x83\x015`@\x82\x01R``\x83\x015``\x82\x01RP\x92\x91PPV[_`@\x82\x84\x03\x12\x15a%\xA7W_\x80\xFD[`@Q`@\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a%\xC9Wa%\xC9a#\xADV[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[_\x80_\x83\x85\x03a\x05`\x81\x12\x15a%\xF7W_\x80\xFD[a&\x01\x86\x86a$\xCFV[\x93Pa&\x10\x86``\x87\x01a%4V[\x92Pa\x04\x80\x80`\xDF\x19\x83\x01\x12\x15a&%W_\x80\xFD[a&-a#\xC1V[\x91Pa&<\x87`\xE0\x88\x01a%\x97V[\x82Ra\x01 a&M\x88\x82\x89\x01a%\x97V[` \x84\x01Ra\x01`a&a\x89\x82\x8A\x01a%\x97V[`@\x85\x01Ra\x01\xA0a&u\x8A\x82\x8B\x01a%\x97V[``\x86\x01Ra\x01\xE0a&\x89\x8B\x82\x8C\x01a%\x97V[`\x80\x87\x01Ra\x02 a&\x9D\x8C\x82\x8D\x01a%\x97V[`\xA0\x88\x01Ra\x02`a&\xB1\x8D\x82\x8E\x01a%\x97V[`\xC0\x89\x01Ra\x02\xA0a&\xC5\x8E\x82\x8F\x01a%\x97V[`\xE0\x8A\x01Ra&\xD8\x8Ea\x02\xE0\x8F\x01a%\x97V[a\x01\0\x8A\x01Ra&\xEC\x8Ea\x03 \x8F\x01a%\x97V[\x87\x8A\x01Ra&\xFE\x8Ea\x03`\x8F\x01a%\x97V[a\x01@\x8A\x01Ra'\x12\x8Ea\x03\xA0\x8F\x01a%\x97V[\x86\x8A\x01Ra'$\x8Ea\x03\xE0\x8F\x01a%\x97V[a\x01\x80\x8A\x01Ra\x04 \x8D\x015\x85\x8A\x01Ra\x04@\x8D\x015a\x01\xC0\x8A\x01Ra\x04`\x8D\x015\x84\x8A\x01R\x87\x8D\x015a\x02\0\x8A\x01Ra\x04\xA0\x8D\x015\x83\x8A\x01Ra\x04\xC0\x8D\x015a\x02@\x8A\x01Ra\x04\xE0\x8D\x015\x82\x8A\x01Ra\x05\0\x8D\x015a\x02\x80\x8A\x01Ra\x05 \x8D\x015\x81\x8A\x01RPPPPPPPPa\x05@\x85\x015a\x02\xC0\x82\x01R\x80\x91PP\x92P\x92P\x92V[\x805c\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x0E\xF1W_\x80\xFD[_\x80_\x80_a\x01@\x86\x88\x03\x12\x15a'\xD1W_\x80\xFD[a'\xDB\x87\x87a$\xCFV[\x94Pa'\xEA\x87``\x88\x01a%4V[\x93Pa'\xF8`\xE0\x87\x01a'\xA9V[\x92Pa(\x07a\x01\0\x87\x01a#gV[\x91Pa(\x16a\x01 \x87\x01a$\xB9V[\x90P\x92\x95P\x92\x95\x90\x93PV[_\x80`@\x83\x85\x03\x12\x15a(3W_\x80\xFD[a(<\x83a$\xB9V[\x91Pa(J` \x84\x01a$\xB9V[\x90P\x92P\x92\x90PV[_` \x82\x84\x03\x12\x15a(cW_\x80\xFD[a \xB2\x82a'\xA9V[_` \x82\x84\x03\x12\x15a(|W_\x80\xFD[a \xB2\x82a$\xB9V[_[\x83\x81\x10\x15a(\x9FW\x81\x81\x01Q\x83\x82\x01R` \x01a(\x87V[PP_\x91\x01RV[` \x81R_\x82Q\x80` \x84\x01Ra(\xC5\x81`@\x85\x01` \x87\x01a(\x85V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15a(\xEAW_\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[_` \x82\x84\x03\x12\x15a)\tW_\x80\xFD[PQ\x91\x90PV[cNH{q`\xE0\x1B_R`\x11`\x04R`$_\xFD[`\x01`\x01`@\x1B\x03\x81\x81\x16\x83\x82\x16\x01\x90\x80\x82\x11\x15a)DWa)Da)\x10V[P\x92\x91PPV[\x81\x81\x03\x81\x81\x11\x15a\x0E%Wa\x0E%a)\x10V[cNH{q`\xE0\x1B_R`2`\x04R`$_\xFD[cNH{q`\xE0\x1B_R`\x12`\x04R`$_\xFD[_`\x01`\x01`@\x1B\x03\x80\x84\x16\x80a)\x9FWa)\x9Fa)rV[\x92\x16\x91\x90\x91\x06\x92\x91PPV[_`\x01`\x01`@\x1B\x03\x80\x84\x16\x80a)\xC4Wa)\xC4a)rV[\x92\x16\x91\x90\x91\x04\x92\x91PPV[_\x81a)\xDEWa)\xDEa)\x10V[P_\x19\x01\x90V[\x80_[`\x0B\x81\x10\x15a*\x07W\x81Q\x84R` \x93\x84\x01\x93\x90\x91\x01\x90`\x01\x01a)\xE8V[PPPPV[a*\"\x82\x82Q\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[` \x81\x81\x01Q\x80Q`@\x85\x01R\x90\x81\x01Q``\x84\x01RP`@\x81\x01Q\x80Q`\x80\x84\x01R` \x81\x01Q`\xA0\x84\x01RP``\x81\x01Q\x80Q`\xC0\x84\x01R` \x81\x01Q`\xE0\x84\x01RP`\x80\x81\x01Qa\x01\0a*\x85\x81\x85\x01\x83\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xA0\x83\x01Q\x91Pa\x01@a*\xA5\x81\x86\x01\x84\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xC0\x84\x01Q\x92Pa\x01\x80a*\xC5\x81\x87\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xE0\x85\x01Q\x93Pa\x01\xC0a*\xE5\x81\x88\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x85\x01Q\x93Pa\x02\0\x92a+\x05\x87\x85\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01 \x86\x01Q\x94Pa\x02@a+&\x81\x89\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x86\x01Q\x94Pa\x02\x80\x92a+F\x88\x85\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01`\x87\x01Q\x95Pa\x02\xC0a+g\x81\x8A\x01\x88\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x87\x01Q\x80Qa\x03\0\x8A\x01R` \x01Qa\x03 \x89\x01Ra\x01\xA0\x87\x01Qa\x03@\x89\x01R\x90\x86\x01Qa\x03`\x88\x01Ra\x01\xE0\x86\x01Qa\x03\x80\x88\x01R\x92\x85\x01Qa\x03\xA0\x87\x01Ra\x02 \x85\x01Qa\x03\xC0\x87\x01R\x91\x84\x01Qa\x03\xE0\x86\x01Ra\x02`\x84\x01Qa\x04\0\x86\x01R\x83\x01Qa\x04 \x85\x01Ra\x02\xA0\x83\x01Qa\x04@\x85\x01R\x90\x91\x01Qa\x04`\x90\x92\x01\x91\x90\x91RPV[_a\n\xE0\x82\x01\x90P\x84Q\x82R` \x85\x01Q` \x83\x01R`@\x85\x01Qa,#`@\x84\x01\x82\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[P``\x85\x01Q\x80Q`\x80\x84\x01R` \x81\x01Q`\xA0\x84\x01RP`\x80\x85\x01Q\x80Q`\xC0\x84\x01R` \x81\x01Q`\xE0\x84\x01RP`\xA0\x85\x01Qa\x01\0a,p\x81\x85\x01\x83\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xC0\x87\x01Q\x91Pa\x01@a,\x90\x81\x86\x01\x84\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xE0\x88\x01Q\x92Pa\x01\x80a,\xB0\x81\x87\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x88\x01Q\x92Pa\x01\xC0\x91a,\xD0\x86\x84\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01 \x89\x01Q\x93Pa\x02\0a,\xF1\x81\x88\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x89\x01Q\x93Pa\x02@\x91a-\x11\x87\x84\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01`\x8A\x01Q\x94Pa\x02\x80a-2\x81\x89\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x8A\x01Q\x80Qa\x02\xC0\x89\x01R` \x90\x81\x01Qa\x02\xE0\x89\x01Ra\x01\xA0\x8B\x01Q\x80Qa\x03\0\x8A\x01R\x81\x01Qa\x03 \x89\x01R\x93\x8A\x01Q\x80Qa\x03@\x89\x01R\x84\x01Qa\x03`\x88\x01Ra\x01\xE0\x8A\x01Q\x80Qa\x03\x80\x89\x01R\x84\x01Qa\x03\xA0\x88\x01R\x89\x01Q\x80Qa\x03\xC0\x88\x01R\x83\x01Qa\x03\xE0\x87\x01Ra\x02 \x89\x01Q\x80Qa\x04\0\x88\x01R\x83\x01Qa\x04 \x87\x01R\x90\x88\x01Q\x80Qa\x04@\x87\x01R\x82\x01Qa\x04`\x86\x01Ra\x02`\x88\x01Q\x80Qa\x04\x80\x87\x01R\x90\x91\x01Qa\x04\xA0\x85\x01R\x86\x01Qa\x04\xC0\x84\x01RPa\x02\xA0\x85\x01Qa\x04\xE0\x83\x01Ra.\ta\x05\0\x83\x01\x85a)\xE5V[a.\x17a\x06`\x83\x01\x84a*\rV[\x94\x93PPPPV[_` \x82\x84\x03\x12\x15a./W_\x80\xFD[\x81Q\x80\x15\x15\x81\x14a \xB2W_\x80\xFD[`\x01`\x01`@\x1B\x03\x82\x81\x16\x82\x82\x16\x03\x90\x80\x82\x11\x15a)DWa)Da)\x10V[_`\x01`\x01`@\x1B\x03\x80\x83\x16\x81\x81\x03a.yWa.ya)\x10V[`\x01\x01\x93\x92PPPV[_\x82Qa.\x94\x81\x84` \x87\x01a(\x85V[\x91\x90\x91\x01\x92\x91PPV\xFE6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\xA1dsolcC\0\x08\x17\0\n", ); /// The runtime bytecode of the contract, as deployed on the network. /// /// ```text - ///0x608060405260043610610147575f3560e01c8063826e41fc116100b3578063ad3cb1cc1161006d578063ad3cb1cc14610470578063c23b9e9e146104ad578063d24d933d146104e5578063e030330114610514578063f2fde38b14610533578063f9e50d1914610552575f80fd5b8063826e41fc1461033a5780638584d23f146103655780638da5cb5b146103a157806396c1ca61146103dd5780639baa3cc9146103fc5780639fdb54a71461041b575f80fd5b8063378ec23b11610104578063378ec23b14610288578063426d3194146102aa5780634f1ef286146102eb57806352d1902d146102fe57806369cc6a0414610312578063715018a614610326575f80fd5b8063013fa5fc1461014b57806302b592f31461016c5780630d8e6e2c146101c95780632063d4f7146101f45780632f79889d14610213578063313df7b114610251575b5f80fd5b348015610156575f80fd5b5061016a610165366004611f92565b610566565b005b348015610177575f80fd5b5061018b610186366004611fab565b610619565b6040516101c094939291906001600160401b039485168152928416602084015292166040820152606081019190915260800190565b60405180910390f35b3480156101d4575f80fd5b5060408051600181525f60208201819052918101919091526060016101c0565b3480156101ff575f80fd5b5061016a61020e3660046120f6565b610662565b34801561021e575f80fd5b5060085461023990600160c01b90046001600160401b031681565b6040516001600160401b0390911681526020016101c0565b34801561025c575f80fd5b50600854610270906001600160a01b031681565b6040516001600160a01b0390911681526020016101c0565b348015610293575f80fd5b5061029c6107bd565b6040519081526020016101c0565b3480156102b5575f80fd5b505f546001546002546003546102cb9392919084565b6040805194855260208501939093529183015260608201526080016101c0565b61016a6102f93660046122a7565b610824565b348015610309575f80fd5b5061029c610843565b34801561031d575f80fd5b5061016a61085e565b348015610331575f80fd5b5061016a6108cc565b348015610345575f80fd5b506008546001600160a01b031615155b60405190151581526020016101c0565b348015610370575f80fd5b5061038461037f366004611fab565b6108dd565b604080519283526001600160401b039091166020830152016101c0565b3480156103ac575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610270565b3480156103e8575f80fd5b5061016a6103f7366004612359565b610a08565b348015610407575f80fd5b5061016a610416366004612372565b610a91565b348015610426575f80fd5b5060065460075461044a916001600160401b0380821692600160401b909204169083565b604080516001600160401b039485168152939092166020840152908201526060016101c0565b34801561047b575f80fd5b506104a0604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101c0919061243d565b3480156104b8575f80fd5b506008546104d090600160a01b900463ffffffff1681565b60405163ffffffff90911681526020016101c0565b3480156104f0575f80fd5b5060045460055461044a916001600160401b0380821692600160401b909204169083565b34801561051f575f80fd5b5061035561052e36600461246f565b610bb3565b34801561053e575f80fd5b5061016a61054d366004611f92565b610d14565b34801561055d575f80fd5b5060095461029c565b61056e610d56565b6001600160a01b0381166105955760405163e6c4247b60e01b815260040160405180910390fd5b6008546001600160a01b03908116908216036105c45760405163a863aec960e01b815260040160405180910390fd5b600880546001600160a01b0319166001600160a01b0383169081179091556040519081527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b60098181548110610628575f80fd5b5f918252602090912060029091020180546001909101546001600160401b038083169350600160401b8304811692600160801b9004169084565b6008546001600160a01b03161515801561068757506008546001600160a01b03163314155b156106a5576040516301474c8f60e71b815260040160405180910390fd5b60065482516001600160401b0391821691161115806106de575060065460208301516001600160401b03600160401b9092048216911611155b156106fc5760405163051c46ef60e01b815260040160405180910390fd5b6107098260400151610db1565b6107138282610e21565b81516006805460208501516001600160401b03908116600160401b026001600160801b0319909216931692909217919091179055604082015160075561076161075a6107bd565b4284610f15565b81602001516001600160401b0316825f01516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae684604001516040516107b191815260200190565b60405180910390a35050565b5f60646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061081f919061248f565b905090565b61082c6110fe565b610835826111a2565b61083f82826111e3565b5050565b5f61084c6112a4565b505f805160206129b183398151915290565b610866610d56565b6008546001600160a01b0316156108b157600880546001600160a01b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c02450905f90a1565b60405163a863aec960e01b815260040160405180910390fd5b565b6108d4610d56565b6108ca5f6112ed565b600980545f918291906108f16001836124ba565b81548110610901576109016124cd565b5f918252602090912060029091020154600160801b90046001600160401b0316841061094057604051631856a49960e21b815260040160405180910390fd5b600854600160c01b90046001600160401b03165b81811015610a01578460098281548110610970576109706124cd565b5f918252602090912060029091020154600160801b90046001600160401b031611156109f957600981815481106109a9576109a96124cd565b905f5260205f20906002020160010154600982815481106109cc576109cc6124cd565b905f5260205f2090600202015f0160109054906101000a90046001600160401b0316935093505050915091565b600101610954565b5050915091565b610a10610d56565b610e108163ffffffff161080610a2f57506301e133808163ffffffff16115b80610a4d575060085463ffffffff600160a01b909104811690821611155b15610a6b576040516307a5077760e51b815260040160405180910390fd5b6008805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610ad55750825b90505f826001600160401b03166001148015610af05750303b155b905081158015610afe575080155b15610b1c5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610b4657845460ff60401b1916600160401b1785555b610b4f8661135d565b610b5761136e565b610b62898989611376565b8315610ba857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b6009545f90610bc06107bd565b841180610bcb575080155b80610c155750600854600980549091600160c01b90046001600160401b0316908110610bf957610bf96124cd565b5f9182526020909120600290910201546001600160401b031684105b15610c335760405163b0b4387760e01b815260040160405180910390fd5b5f8080610c416001856124ba565b90505b81610cdd57600854600160c01b90046001600160401b03168110610cdd578660098281548110610c7657610c766124cd565b5f9182526020909120600290910201546001600160401b031611610ccb576001915060098181548110610cab57610cab6124cd565b5f9182526020909120600290910201546001600160401b03169250610cdd565b80610cd5816124e1565b915050610c44565b81610cfb5760405163b0b4387760e01b815260040160405180910390fd5b85610d0684896124ba565b119450505050505b92915050565b610d1c610d56565b6001600160a01b038116610d4a57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b610d53816112ed565b50565b33610d887f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146108ca5760405163118cdaa760e01b8152336004820152602401610d41565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181108061083f5760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401610d41565b5f610e2a6114a2565b9050610e34611cf3565b83516001600160401b0390811682526020850151168160016020020152604084810151828201526001546060830152600254608083015260035460a08301525f5460c08301525163ce537a7760e01b8152735fbdb2315678afecb367f032d93f642f64180aa39063ce537a7790610eb3908590859088906004016126fc565b602060405180830381865af4158015610ece573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ef2919061292a565b610f0f576040516309bde33960e01b815260040160405180910390fd5b50505050565b60095415801590610f8a575060085460098054600160a01b830463ffffffff1692600160c01b90046001600160401b0316908110610f5557610f556124cd565b5f918252602090912060029091020154610f7f90600160401b90046001600160401b031684612949565b6001600160401b0316115b1561101d57600854600980549091600160c01b90046001600160401b0316908110610fb757610fb76124cd565b5f9182526020822060029091020180546001600160c01b03191681556001015560088054600160c01b90046001600160401b0316906018610ff783612970565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516080810182526001600160401b03948516815292841660208085019182528301518516848301908152929091015160608401908152600980546001810182555f91909152935160029094027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af81018054935194518716600160801b0267ffffffffffffffff60801b19958816600160401b026001600160801b03199095169690971695909517929092179290921693909317909155517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b090910155565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061118457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166111785f805160206129b1833981519152546001600160a01b031690565b6001600160a01b031614155b156108ca5760405163703e46dd60e11b815260040160405180910390fd5b6111aa610d56565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d9060200161060e565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561123d575060408051601f3d908101601f1916820190925261123a9181019061248f565b60015b61126557604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610d41565b5f805160206129b1833981519152811461129557604051632a87526960e21b815260048101829052602401610d41565b61129f8383611ad1565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108ca5760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b611365611b26565b610d5381611b6f565b6108ca611b26565b82516001600160401b031615158061139a575060208301516001600160401b031615155b806113a757506020820151155b806113b457506040820151155b806113c157506060820151155b806113cb57508151155b806113dd5750610e108163ffffffff16105b806113f157506301e133808163ffffffff16115b1561140f576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b03908116600160401b026001600160801b0319938416919095169081178517909355604096870151600581905586515f5590860151600155958501516002556060909401516003556006805490941617179091556007919091556008805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b6114aa611d11565b621000008152600760208201527f23783d0e9777b7af65fbf849da7edb75e74b1eaf503e025d7f2f7f80991befa26040820151527f2a4e2fe8adfa53f468525582d5184c4c70bbdb946c21f216418a9879705e54a76020604083015101527f0624b2c1e77f24afceaf39451743b9fa80d5853fca7ba00389c675650774009b6060820151527f250d7719e94ca2df00dfe327938f5a8d4d837779b99837ca777a53d39127b1796020606083015101527f0dc09515152eaea66d0db2f571cc995e369d26fe647394f10db5398c917519dc6080820151527f1273144d6cec2c4a68b24a149379c0f5592bb7fbddbe32fa171919950ca404cb6020608083015101527f119521bb68caec216e2f05eeb466fb3abfe1f39baf7fe7cb392ea057b6a2d9bf60a0820151527f2d52adeaba8045e53ab526fe9982d0ea452def6b3ea0253d27a19ef3b46e8428602060a083015101527f16c3b5b217d302975a920d13374524d7a52e4a50fd7fb930842271ebf4a84efd60c0820151527f200788916b907b196972bde304318e885a2521514b2db5e4a11899c51204f089602060c083015101527f1127581afe753defca9aef12e7332db9978a200b1699ce3888c0f3aea6111dc360e0820151527f0881e13f00723be1a04872ed02b2d078c31e80feaf27724e262ce97c2cb0bb1d602060e083015101527f1482a3a6bb91d6483d153683e2404f2f5546e0e895530fdf132091498406e3de610100820151527efa52db3d52d905ead1248102f3a80a43a90d8400c68f60a62c543c417b2f4b602061010083015101527f0a57dadd4a55199525ac6ac6fabc87a4cccfdc98142bcef9dbf47de00ecc5164610120820151527f18d95abd9b8e12c36936aa218cfff582548a6bbff25c338c2006eaeb1fe5b696602061012083015101527f2bc40e91dd169b8bc143a02952a1b6c6e627bfeb7a2bbe5078e14123f3c54c1c610140820151527f108d65a20c579b6d9883275eb6889fc3f5fc79735ca9f611a13b67daa2fbc8d0602061014083015101527f21bc1f86d0608e5f0626b467ee6f8282b619223f60a7acb0fc63ba7bdaf783be610160820151527f05ef3282f8eef01515fb9a8a7d6ca06b8b007d1d512403efb268fb03ce5f09e9602061016083015101527f2cab66c1cb5a83869e73ac34fbe467486999babd541d9010ee9a804806eee4ef610180820151527f2db1982419c5a4a17593acff9535fa967683d75c8aec01319b64b84aada2ad84602061018083015101527f2c38667c6c7eb868bdd30c34dd3f4b84d9b9b1a27d7867b364c8b7831423e9086101a0820151527f2b2cb4044dd51165c48138219d51cf8d1689f91ed3eeefead6e055eb488a2ce260206101a083015101527f2d48e54703011df2c74a14dafde3af4fd83ec71875d8ddc3554658640cc955016101c0820151527f243a99d80d32eb5408b59d5b08302bede070d3fb0a8efe2f2262f865bffb4d0d60206101c083015101527f0455d2325bf6269a66f07d838f55f36947a3cd9b87edd8480bced95cbb45cc116101e0820151527f0f66d9085a6ed60b838179987e240992bff4c0516ccf6ccde4a1ca94ce8b986460206101e083015101527f2bac0d23c8585d1487ec611b5effc97e5852fea43a7cba36ccdd2c207931f394610200820151527f1860b54e01a06aea5adb4b13bf5baebab92b736807a3a89ff2040992b06ee6ec602061020083015101527f0c0bfa1c2fc6f8ed01233d5168db1e1dfe725504f032f669f50a92ae77c72906610220820151527f0d741e124c7d1069b8a400cbcdcfd90128a533901ad4de1e037fe72984dc34cf602061022083015101527f01cfed30085c9efce04668205794aa39b1a8ee591234b4c77a22f8c26d899e05610240820151527f2ab68ac82d36cedb647d14a5b0035e8c9a0be84780b7bae1133a27a880966ed1602061024083015101527f072e1d50f8b5cf8d574b3847276477d95bbd5116351000841f728da44f4043b5610260820151527f23f8ea6eacd0876d57220f57eabacbe76a2323411663731a251d5dca36f1b59f602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b611ada82611b77565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611b1e5761129f8282611bda565b61083f611c4c565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166108ca57604051631afcd79f60e31b815260040160405180910390fd5b610d1c611b26565b806001600160a01b03163b5f03611bac57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610d41565b5f805160206129b183398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b031684604051611bf69190612995565b5f60405180830381855af49150503d805f8114611c2e576040519150601f19603f3d011682016040523d82523d5f602084013e611c33565b606091505b5091509150611c43858383611c6b565b95945050505050565b34156108ca5760405163b398979f60e01b815260040160405180910390fd5b606082611c8057611c7b82611cca565b611cc3565b8151158015611c9757506001600160a01b0384163b155b15611cc057604051639996b31560e01b81526001600160a01b0385166004820152602401610d41565b50805b9392505050565b805115611cda5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6040518060e001604052806007906020820280368337509192915050565b604051806102c001604052805f81526020015f8152602001611d4460405180604001604052805f81526020015f81525090565b8152602001611d6460405180604001604052805f81526020015f81525090565b8152602001611d8460405180604001604052805f81526020015f81525090565b8152602001611da460405180604001604052805f81526020015f81525090565b8152602001611dc460405180604001604052805f81526020015f81525090565b8152602001611de460405180604001604052805f81526020015f81525090565b8152602001611e0460405180604001604052805f81526020015f81525090565b8152602001611e2460405180604001604052805f81526020015f81525090565b8152602001611e4460405180604001604052805f81526020015f81525090565b8152602001611e6460405180604001604052805f81526020015f81525090565b8152602001611e8460405180604001604052805f81526020015f81525090565b8152602001611ea460405180604001604052805f81526020015f81525090565b8152602001611ec460405180604001604052805f81526020015f81525090565b8152602001611ee460405180604001604052805f81526020015f81525090565b8152602001611f0460405180604001604052805f81526020015f81525090565b8152602001611f2460405180604001604052805f81526020015f81525090565b8152602001611f4460405180604001604052805f81526020015f81525090565b8152602001611f6460405180604001604052805f81526020015f81525090565b81525f6020820181905260409091015290565b80356001600160a01b0381168114611f8d575f80fd5b919050565b5f60208284031215611fa2575f80fd5b611cc382611f77565b5f60208284031215611fbb575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b6040516102e081016001600160401b0381118282101715611ff957611ff9611fc2565b60405290565b604051601f8201601f191681016001600160401b038111828210171561202757612027611fc2565b604052919050565b80356001600160401b0381168114611f8d575f80fd5b5f60608284031215612055575f80fd5b604051606081018181106001600160401b038211171561207757612077611fc2565b6040529050806120868361202f565b81526120946020840161202f565b6020820152604083013560408201525092915050565b5f604082840312156120ba575f80fd5b604051604081018181106001600160401b03821117156120dc576120dc611fc2565b604052823581526020928301359281019290925250919050565b5f808284036104e0811215612109575f80fd5b6121138585612045565b925061048080605f1983011215612128575f80fd5b612130611fd6565b915061213f86606087016120aa565b825261214e8660a087016120aa565b60208301526121608660e087016120aa565b6040830152610120612174878288016120aa565b6060840152610160612188888289016120aa565b60808501526101a061219c89828a016120aa565b60a08601526101e06121b08a828b016120aa565b60c08701526102206121c48b828c016120aa565b60e08801526102606121d88c828d016120aa565b6101008901526102a06121ed8d828e016120aa565b878a01526121ff8d6102e08e016120aa565b6101408a01526122138d6103208e016120aa565b868a01526122258d6103608e016120aa565b6101808a01526103a08c0135948901949094526103c08b01356101c08901526103e08b0135928801929092526104008a01356102008801526104208a013590870152610440890135610240870152610460890135908601529287013561028085015250506104a0850135908201526104c0909301356102c08401525092909150565b5f80604083850312156122b8575f80fd5b6122c183611f77565b91506020808401356001600160401b03808211156122dd575f80fd5b818601915086601f8301126122f0575f80fd5b81358181111561230257612302611fc2565b612314601f8201601f19168501611fff565b91508082528784828501011115612329575f80fd5b80848401858401375f848284010152508093505050509250929050565b803563ffffffff81168114611f8d575f80fd5b5f60208284031215612369575f80fd5b611cc382612346565b5f805f80848603610120811215612387575f80fd5b6123918787612045565b94506080605f19820112156123a4575f80fd5b50604051608081018181106001600160401b03821117156123c7576123c7611fc2565b8060405250606086013581526080860135602082015260a0860135604082015260c086013560608201528093505061240160e08601612346565b91506124106101008601611f77565b905092959194509250565b5f5b8381101561243557818101518382015260200161241d565b50505f910152565b602081525f825180602084015261245b81604085016020870161241b565b601f01601f19169190910160400192915050565b5f8060408385031215612480575f80fd5b50508035926020909101359150565b5f6020828403121561249f575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610d0e57610d0e6124a6565b634e487b7160e01b5f52603260045260245ffd5b5f816124ef576124ef6124a6565b505f190190565b805f5b6007811015610f0f5781518452602093840193909101906001016124f9565b61252d82825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e08401525060808101516101006125908185018380518252602090810151910152565b60a083015191506101406125b08186018480518252602090810151910152565b60c084015192506101806125d08187018580518252602090810151910152565b60e085015193506101c06125f08188018680518252602090810151910152565b928501519350610200926126108785018680518252602090810151910152565b61012086015194506102406126318189018780518252602090810151910152565b928601519450610280926126518885018780518252602090810151910152565b61016087015195506102c0612672818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b5f610a60820190508451825260208501516020830152604085015161272e604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a085015161010061277b8185018380518252602090810151910152565b60c0870151915061014061279b8186018480518252602090810151910152565b60e088015192506101806127bb8187018580518252602090810151910152565b9188015192506101c0916127db8684018580518252602090810151910152565b61012089015193506102006127fc8188018680518252602090810151910152565b9189015193506102409161281c8784018680518252602090810151910152565b6101608a0151945061028061283d8189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e08301526129146105008301856124f6565b6129226105e0830184612518565b949350505050565b5f6020828403121561293a575f80fd5b81518015158114611cc3575f80fd5b6001600160401b03828116828216039080821115612969576129696124a6565b5092915050565b5f6001600160401b0380831681810361298b5761298b6124a6565b6001019392505050565b5f82516129a681846020870161241b565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a + ///0x6080604052600436106101ba575f3560e01c8063811f853f116100f2578063a1be8d5211610092578063d24d933d11610062578063d24d933d146105eb578063e03033011461061a578063f2fde38b14610639578063f9e50d1914610658575f80fd5b8063a1be8d5214610539578063ad3cb1cc14610558578063b2424e3f14610595578063c23b9e9e146105b3575f80fd5b80638da5cb5b116100cd5780638da5cb5b1461046a57806390c14390146104a657806396c1ca61146104c55780639fdb54a7146104e4575f80fd5b8063811f853f146103e4578063826e41fc146104035780638584d23f1461042e575f80fd5b8063426d31941161015d57806369cc6a041161013857806369cc6a0414610389578063715018a61461039d578063757c37ad146103b157806376671808146103d0575f80fd5b8063426d3194146103405780634f1ef2861461036257806352d1902d14610375575f80fd5b80630d8e6e2c116101985780630d8e6e2c1461027e5780632f79889d146102a9578063313df7b1146102e7578063378ec23b1461031e575f80fd5b8063013fa5fc146101be57806302b592f3146101df5780630625e19b1461023c575b5f80fd5b3480156101c9575f80fd5b506101dd6101d836600461237d565b61066c565b005b3480156101ea575f80fd5b506101fe6101f9366004612396565b61071f565b60405161023394939291906001600160401b039485168152928416602084015292166040820152606081019190915260800190565b60405180910390f35b348015610247575f80fd5b5060055460065460075460085461025e9392919084565b604080519485526020850193909352918301526060820152608001610233565b348015610289575f80fd5b5060408051600181525f6020820181905291810191909152606001610233565b3480156102b4575f80fd5b50600d546102cf90600160c01b90046001600160401b031681565b6040516001600160401b039091168152602001610233565b3480156102f2575f80fd5b50600d54610306906001600160a01b031681565b6040516001600160a01b039091168152602001610233565b348015610329575f80fd5b50610332610768565b604051908152602001610233565b34801561034b575f80fd5b5060015460025460035460045461025e9392919084565b6101dd61037036600461241a565b6107cf565b348015610380575f80fd5b506103326107ee565b348015610394575f80fd5b506101dd610809565b3480156103a8575f80fd5b506101dd610877565b3480156103bc575f80fd5b506101dd6103cb3660046125e3565b610888565b3480156103db575f80fd5b506102cf610b5a565b3480156103ef575f80fd5b506101dd6103fe3660046127bc565b610b7f565b34801561040e575f80fd5b50600d546001600160a01b031615155b6040519015158152602001610233565b348015610439575f80fd5b5061044d610448366004612396565b610ca3565b604080519283526001600160401b03909116602083015201610233565b348015610475575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610306565b3480156104b1575f80fd5b506102cf6104c0366004612822565b610dce565b3480156104d0575f80fd5b506101dd6104df366004612853565b610e2b565b3480156104ef575f80fd5b50600b54600c54610513916001600160401b0380821692600160401b909204169083565b604080516001600160401b03948516815293909216602084015290820152606001610233565b348015610544575f80fd5b5061041e61055336600461286c565b610eb4565b348015610563575f80fd5b50610588604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161023391906128a7565b3480156105a0575f80fd5b505f546102cf906001600160401b031681565b3480156105be575f80fd5b50600d546105d690600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610233565b3480156105f6575f80fd5b50600954600a54610513916001600160401b0380821692600160401b909204169083565b348015610625575f80fd5b5061041e6106343660046128d9565b610ef6565b348015610644575f80fd5b506101dd61065336600461237d565b611055565b348015610663575f80fd5b50600e54610332565b610674611097565b6001600160a01b03811661069b5760405163e6c4247b60e01b815260040160405180910390fd5b600d546001600160a01b03908116908216036106ca5760405163a863aec960e01b815260040160405180910390fd5b600d80546001600160a01b0319166001600160a01b0383169081179091556040519081527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b600e818154811061072e575f80fd5b5f918252602090912060029091020180546001909101546001600160401b038083169350600160401b8304811692600160801b9004169084565b5f60646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ca91906128f9565b905090565b6107d76110f2565b6107e082611196565b6107ea82826111d7565b5050565b5f6107f7611298565b505f80516020612e9f83398151915290565b610811611097565b600d546001600160a01b03161561085c57600d80546001600160a01b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c02450905f90a1565b60405163a863aec960e01b815260040160405180910390fd5b565b61087f611097565b6108755f6112e1565b600d546001600160a01b0316151580156108ad5750600d546001600160a01b03163314155b156108cb576040516301474c8f60e71b815260040160405180910390fd5b600b5483516001600160401b0391821691161115806109045750600b5460208401516001600160401b03600160401b9092048216911611155b156109225760405163051c46ef60e01b815260040160405180910390fd5b61092f8360400151611351565b5f610938610b5a565b60208501515f80549293509161095791906001600160401b0316610dce565b9050610964826001612924565b6001600160401b0316816001600160401b031614801561099d5750600b5461099b90600160401b90046001600160401b0316610eb4565b155b80156109b157505f826001600160401b0316115b156109cf57604051637150de4560e01b815260040160405180910390fd5b6109da826002612924565b6001600160401b0316816001600160401b031610610a0b57604051637150de4560e01b815260040160405180910390fd5b610a188460200151611351565b610a258460400151611351565b610a328460600151611351565b610a3d8585856113c1565b8451600b805460208801516001600160401b03818116600160401b026001600160801b03199093169416939093171790556040860151600c55610a7f90610eb4565b15610ae95783516005556020840151600655604084015160075560608401516008557f31eabd9099fdb25dacddd206abff87311e553441fc9d0fcdef201062d7e7071b610acd826001612924565b6040516001600160401b03909116815260200160405180910390a15b610afb610af4610768565b4287611519565b84602001516001600160401b0316855f01516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae68760400151604051610b4b91815260200190565b60405180910390a35050505050565b600b545f805490916107ca916001600160401b03600160401b90920482169116610dce565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610bc35750825b90505f826001600160401b03166001148015610bde5750303b155b905081158015610bec575080155b15610c0a5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610c3457845460ff60401b1916600160401b1785555b610c3d87611702565b610c45611713565b610c518a8a8a8961171b565b8315610c9757845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b600e80545f91829190610cb760018361294b565b81548110610cc757610cc761295e565b5f918252602090912060029091020154600160801b90046001600160401b03168410610d0657604051631856a49960e21b815260040160405180910390fd5b600d54600160c01b90046001600160401b03165b81811015610dc75784600e8281548110610d3657610d3661295e565b5f918252602090912060029091020154600160801b90046001600160401b03161115610dbf57600e8181548110610d6f57610d6f61295e565b905f5260205f20906002020160010154600e8281548110610d9257610d9261295e565b905f5260205f2090600202015f0160109054906101000a90046001600160401b0316935093505050915091565b600101610d1a565b5050915091565b5f816001600160401b03165f03610de657505f610e25565b610df08284612986565b6001600160401b03165f03610e1057610e0982846129ab565b9050610e25565b610e1a82846129ab565b610e09906001612924565b92915050565b610e33611097565b610e108163ffffffff161080610e5257506301e133808163ffffffff16115b80610e705750600d5463ffffffff600160a01b909104811690821611155b15610e8e576040516307a5077760e51b815260040160405180910390fd5b600d805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b5f816001600160401b03165f03610ecc57505f919050565b5f54610ee1906001600160401b031683612986565b6001600160401b03161592915050565b919050565b600e545f90610f03610768565b841180610f0e575080155b80610f585750600d54600e80549091600160c01b90046001600160401b0316908110610f3c57610f3c61295e565b5f9182526020909120600290910201546001600160401b031684105b15610f765760405163b0b4387760e01b815260040160405180910390fd5b5f8080610f8460018561294b565b90505b8161102057600d54600160c01b90046001600160401b031681106110205786600e8281548110610fb957610fb961295e565b5f9182526020909120600290910201546001600160401b03161161100e5760019150600e8181548110610fee57610fee61295e565b5f9182526020909120600290910201546001600160401b03169250611020565b80611018816129d0565b915050610f87565b8161103e5760405163b0b4387760e01b815260040160405180910390fd5b85611049848961294b565b11979650505050505050565b61105d611097565b6001600160a01b03811661108b57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b611094816112e1565b50565b336110c97f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146108755760405163118cdaa760e01b8152336004820152602401611082565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061117857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661116c5f80516020612e9f833981519152546001600160a01b031690565b6001600160a01b031614155b156108755760405163703e46dd60e11b815260040160405180910390fd5b61119e611097565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d90602001610714565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611231575060408051601f3d908101601f1916820190925261122e918101906128f9565b60015b61125957604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611082565b5f80516020612e9f833981519152811461128957604051632a87526960e21b815260048101829052602401611082565b6112938383611895565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108755760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110806107ea5760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401611082565b5f6113ca6118ea565b90506113d46120e2565b84516001600160401b0390811682526020808701805190921690830152604080870151908301526006546060830152600754608083015260085460a083015260055460c08301525161142590610eb4565b1561145757602084015160e082015260408401516101008201526060840151610120820152835161014082015261147b565b60065460e08201526007546101008201526008546101208201526005546101408201525b60405163fc8660c760e01b8152735fbdb2315678afecb367f032d93f642f64180aa39063fc8660c7906114b690859085908890600401612bf1565b602060405180830381865af41580156114d1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114f59190612e1f565b611512576040516309bde33960e01b815260040160405180910390fd5b5050505050565b600e541580159061158e5750600d54600e8054600160a01b830463ffffffff1692600160c01b90046001600160401b03169081106115595761155961295e565b5f91825260209091206002909102015461158390600160401b90046001600160401b031684612e3e565b6001600160401b0316115b1561162157600d54600e80549091600160c01b90046001600160401b03169081106115bb576115bb61295e565b5f9182526020822060029091020180546001600160c01b031916815560010155600d8054600160c01b90046001600160401b03169060186115fb83612e5e565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516080810182526001600160401b03948516815292841660208085019182528301518516848301908152929091015160608401908152600e80546001810182555f91909152935160029094027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd81018054935194518716600160801b0267ffffffffffffffff60801b19958816600160401b026001600160801b03199095169690971695909517929092179290921693909317909155517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe90910155565b61170a611f15565b61109481611f5e565b610875611f15565b83516001600160401b031615158061173f575060208401516001600160401b031615155b8061174c57506020830151155b8061175957506040830151155b8061176657506060830151155b8061177057508251155b806117825750610e108263ffffffff16105b8061179657506301e133808263ffffffff16115b806117a857506001600160401b038116155b156117c6576040516350dd03f760e11b815260040160405180910390fd5b8351600980546020808801516001600160401b03908116600160401b026001600160801b03199384169582169586178117909455604098890151600a819055600b8054909416909517909317909155600c92909255845160018190559185015160028190559585015160038190556060909501516004819055600592909255600695909555600793909355600892909255600d805463ffffffff909216600160a01b0263ffffffff60a01b199092169190911790555f80549190921667ffffffffffffffff1991909116179055565b61189e82611f66565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156118e2576112938282611fc9565b6107ea61203b565b6118f2612101565b621000008152600b60208201527f26867ee58aaf860fc9e0e3a78666ffc51f3ba1ad8ae001c196830c55b5af0b8c6040820151527f091230adb753f82815151277060cc56b546bb2e950a0de19ed061ec68c071a906020604083015101527f02a509a06d8c56f83f204688ff6e42eac6e3cbdd063b0971a3af953e81badbb66060820151527f06f43ed2b9cece35d1201abc13ffdaea35560cf0f1446277138ce812b9ad9f396020606083015101527f1a588c99ad88f789c87722b061bb5535daa0abcc1dc6d176d7fea51e5d80b9266080820151527f2062b995e61a6ab8aab6cd6e7520b879d84f965ab1f094c104f0c1213b28038b6020608083015101527f21a2fd766a0cebecfdbfdfe56139a1bbd9aec15e2e35be8ef01934a0ec43868560a0820151527f20fe500ac7d1aa7820db8c6f7f9d509e3b2e88731e3a12dd65f06f43ca930da0602060a083015101527f0ab53d1285c7f4819b3ff6e1ddada6bf2515d34bbaf61186c6a04be47dfd65a360c0820151527f0b80a9878082cdfdd9fcc16bb33fa424c0ad66b81949bf642153d3c7ad082f22602060c083015101527f1b900f8e5f8e8064a5888a1bd796b54a2652fc02034fe4b6e6fc8d6650f7453b60e0820151527ecca258a8832c64d1f8e1721a78fc25b13d29adbb81e35a79fc2f49f8902786602060e083015101527f0d1d3348d642e6f2e9739d735d8c723676dbaefdcbb4e96641defa353d26ebb3610100820151527f14fe9d6a335104e7491ca6d5086113e6b0f52946960d726664667bd58539d41e602061010083015101527f1da94364440c4e3fb8af2d363cdefa4edda437579e1b056a16a5e9a11dffa2ab610120820151527f0a077bd307ed31222db55cb0128bafce5e22557b57f5ac915359c50296cb5c77602061012083015101527f28ff80b133d989235c7129dea54469b780ac4717449290067e7c9a7d5be7dbd5610140820151527f1c0fc22eef23b50a2ddc553f9fc1b61fd8c57a58ca321a829c7ec255f757b3a6602061014083015101527e3c4e21e5dfba62a5b1702fb0ef234bfe95a77701a456882350526d140243f5610160820151527f06012db82876ba33e6e8f80a51013662e56c4abc86a7d85c272e19a6d7f57d0b602061016083015101527f16d5247dbdeae1df70093e5ee77272959661e0fbabda431777fa729f5b532f44610180820151527e8d9ee00f799cf00608b082d03b9de5a42b8126c35fbfbd1e602108df10e0e3602061018083015101527f2f526c6981643ff6f6e9d2b5a921e06cf95f274629b5a145bd552b7fda6a87006101a0820151527f2fe7108fd4e24231f3dadb6e09072e106fca0694fe39dff96557a88221a89a5060206101a083015101527f26a3568598a6981e6325f4816736e381087b5b0e4b27ef364d8ae1e29fe9df996101c0820151527f1db81cdf82a9ec99f3c9716df22d38317e6bb84fc57d2f0e7b2bc8a0569f7cc460206101c083015101527e99888088e11de6ed086c99b9bba986d908df5b0c5007680d97567d485719946101e0820151527f1f91576eadffff932b6e54bab022f93f6fec3e5b7674d0006bc5f2223527a34860206101e083015101527e68b3c117ee7e84d6b670b6af20197759ec80d34f3c594328663031e9cd7e02610200820151527f1c3832e24877346680e7047bae2cfcd51fafe3e7caf199e9dfc8e8f10c2b6943602061020083015101527f164cdd9ad5d4e96e109073e8e735cd4ac64aba6ddaa244da6701369c8cba5daf610220820151527f16c41e647f1ab0d45c891544299e4ef9c004d8bc0a3bf096dc38ce8ed90c0d67602061022083015101527f134ba7a9567ba20e1f35959ee8c2cd688d3a962bb1797e8ab8e511768de0ce83610240820151527f02e4d286c9435f7bd94c1a2c78b99966d06faca1ae45de78149950a4fefcd6e7602061024083015101527f039a0b2d920f29e35cb2a9e1ec6cc22ac1d482af45e47399724a0745d542e839610260820151527f15ac2658bfdd2227aebf8e20935935a648819e1dcea807da1c838abfa7896c63602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661087557604051631afcd79f60e31b815260040160405180910390fd5b61105d611f15565b806001600160a01b03163b5f03611f9b57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611082565b5f80516020612e9f83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b031684604051611fe59190612e83565b5f60405180830381855af49150503d805f811461201d576040519150601f19603f3d011682016040523d82523d5f602084013e612022565b606091505b509150915061203285838361205a565b95945050505050565b34156108755760405163b398979f60e01b815260040160405180910390fd5b60608261206f5761206a826120b9565b6120b2565b815115801561208657506001600160a01b0384163b155b156120af57604051639996b31560e01b81526001600160a01b0385166004820152602401611082565b50805b9392505050565b8051156120c95780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b604051806101600160405280600b906020820280368337509192915050565b604051806102c001604052805f81526020015f815260200161213460405180604001604052805f81526020015f81525090565b815260200161215460405180604001604052805f81526020015f81525090565b815260200161217460405180604001604052805f81526020015f81525090565b815260200161219460405180604001604052805f81526020015f81525090565b81526020016121b460405180604001604052805f81526020015f81525090565b81526020016121d460405180604001604052805f81526020015f81525090565b81526020016121f460405180604001604052805f81526020015f81525090565b815260200161221460405180604001604052805f81526020015f81525090565b815260200161223460405180604001604052805f81526020015f81525090565b815260200161225460405180604001604052805f81526020015f81525090565b815260200161227460405180604001604052805f81526020015f81525090565b815260200161229460405180604001604052805f81526020015f81525090565b81526020016122b460405180604001604052805f81526020015f81525090565b81526020016122d460405180604001604052805f81526020015f81525090565b81526020016122f460405180604001604052805f81526020015f81525090565b815260200161231460405180604001604052805f81526020015f81525090565b815260200161233460405180604001604052805f81526020015f81525090565b815260200161235460405180604001604052805f81526020015f81525090565b81525f6020820181905260409091015290565b80356001600160a01b0381168114610ef1575f80fd5b5f6020828403121561238d575f80fd5b6120b282612367565b5f602082840312156123a6575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b6040516102e081016001600160401b03811182821017156123e4576123e46123ad565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612412576124126123ad565b604052919050565b5f806040838503121561242b575f80fd5b61243483612367565b91506020808401356001600160401b0380821115612450575f80fd5b818601915086601f830112612463575f80fd5b813581811115612475576124756123ad565b612487601f8201601f191685016123ea565b9150808252878482850101111561249c575f80fd5b80848401858401375f848284010152508093505050509250929050565b80356001600160401b0381168114610ef1575f80fd5b5f606082840312156124df575f80fd5b604051606081018181106001600160401b0382111715612501576125016123ad565b604052905080612510836124b9565b815261251e602084016124b9565b6020820152604083013560408201525092915050565b5f60808284031215612544575f80fd5b604051608081018181106001600160401b0382111715612566576125666123ad565b8060405250809150823581526020830135602082015260408301356040820152606083013560608201525092915050565b5f604082840312156125a7575f80fd5b604051604081018181106001600160401b03821117156125c9576125c96123ad565b604052823581526020928301359281019290925250919050565b5f805f8385036105608112156125f7575f80fd5b61260186866124cf565b93506126108660608701612534565b92506104808060df1983011215612625575f80fd5b61262d6123c1565b915061263c8760e08801612597565b825261012061264d88828901612597565b602084015261016061266189828a01612597565b60408501526101a06126758a828b01612597565b60608601526101e06126898b828c01612597565b608087015261022061269d8c828d01612597565b60a08801526102606126b18d828e01612597565b60c08901526102a06126c58e828f01612597565b60e08a01526126d88e6102e08f01612597565b6101008a01526126ec8e6103208f01612597565b878a01526126fe8e6103608f01612597565b6101408a01526127128e6103a08f01612597565b868a01526127248e6103e08f01612597565b6101808a01526104208d0135858a01526104408d01356101c08a01526104608d0135848a0152878d01356102008a01526104a08d0135838a01526104c08d01356102408a01526104e08d0135828a01526105008d01356102808a01526105208d0135818a015250505050505050506105408501356102c0820152809150509250925092565b803563ffffffff81168114610ef1575f80fd5b5f805f805f61014086880312156127d1575f80fd5b6127db87876124cf565b94506127ea8760608801612534565b93506127f860e087016127a9565b92506128076101008701612367565b915061281661012087016124b9565b90509295509295909350565b5f8060408385031215612833575f80fd5b61283c836124b9565b915061284a602084016124b9565b90509250929050565b5f60208284031215612863575f80fd5b6120b2826127a9565b5f6020828403121561287c575f80fd5b6120b2826124b9565b5f5b8381101561289f578181015183820152602001612887565b50505f910152565b602081525f82518060208401526128c5816040850160208701612885565b601f01601f19169190910160400192915050565b5f80604083850312156128ea575f80fd5b50508035926020909101359150565b5f60208284031215612909575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111561294457612944612910565b5092915050565b81810381811115610e2557610e25612910565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f6001600160401b038084168061299f5761299f612972565b92169190910692915050565b5f6001600160401b03808416806129c4576129c4612972565b92169190910492915050565b5f816129de576129de612910565b505f190190565b805f5b600b811015612a075781518452602093840193909101906001016129e8565b50505050565b612a2282825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e0840152506080810151610100612a858185018380518252602090810151910152565b60a08301519150610140612aa58186018480518252602090810151910152565b60c08401519250610180612ac58187018580518252602090810151910152565b60e085015193506101c0612ae58188018680518252602090810151910152565b92850151935061020092612b058785018680518252602090810151910152565b6101208601519450610240612b268189018780518252602090810151910152565b92860151945061028092612b468885018780518252602090810151910152565b61016087015195506102c0612b67818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b5f610ae08201905084518252602085015160208301526040850151612c23604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a0850151610100612c708185018380518252602090810151910152565b60c08701519150610140612c908186018480518252602090810151910152565b60e08801519250610180612cb08187018580518252602090810151910152565b9188015192506101c091612cd08684018580518252602090810151910152565b6101208901519350610200612cf18188018680518252602090810151910152565b91890151935061024091612d118784018680518252602090810151910152565b6101608a01519450610280612d328189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e0830152612e096105008301856129e5565b612e17610660830184612a0d565b949350505050565b5f60208284031215612e2f575f80fd5b815180151581146120b2575f80fd5b6001600160401b0382811682821603908082111561294457612944612910565b5f6001600160401b03808316818103612e7957612e79612910565b6001019392505050565b5f8251612e94818460208701612885565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a /// ``` #[rustfmt::skip] #[allow(clippy::all)] pub static DEPLOYED_BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( - b"`\x80`@R`\x046\x10a\x01GW_5`\xE0\x1C\x80c\x82nA\xFC\x11a\0\xB3W\x80c\xAD<\xB1\xCC\x11a\0mW\x80c\xAD<\xB1\xCC\x14a\x04pW\x80c\xC2;\x9E\x9E\x14a\x04\xADW\x80c\xD2M\x93=\x14a\x04\xE5W\x80c\xE003\x01\x14a\x05\x14W\x80c\xF2\xFD\xE3\x8B\x14a\x053W\x80c\xF9\xE5\r\x19\x14a\x05RW_\x80\xFD[\x80c\x82nA\xFC\x14a\x03:W\x80c\x85\x84\xD2?\x14a\x03eW\x80c\x8D\xA5\xCB[\x14a\x03\xA1W\x80c\x96\xC1\xCAa\x14a\x03\xDDW\x80c\x9B\xAA<\xC9\x14a\x03\xFCW\x80c\x9F\xDBT\xA7\x14a\x04\x1BW_\x80\xFD[\x80c7\x8E\xC2;\x11a\x01\x04W\x80c7\x8E\xC2;\x14a\x02\x88W\x80cBm1\x94\x14a\x02\xAAW\x80cO\x1E\xF2\x86\x14a\x02\xEBW\x80cR\xD1\x90-\x14a\x02\xFEW\x80ci\xCCj\x04\x14a\x03\x12W\x80cqP\x18\xA6\x14a\x03&W_\x80\xFD[\x80c\x01?\xA5\xFC\x14a\x01KW\x80c\x02\xB5\x92\xF3\x14a\x01lW\x80c\r\x8En,\x14a\x01\xC9W\x80c c\xD4\xF7\x14a\x01\xF4W\x80c/y\x88\x9D\x14a\x02\x13W\x80c1=\xF7\xB1\x14a\x02QW[_\x80\xFD[4\x80\x15a\x01VW_\x80\xFD[Pa\x01ja\x01e6`\x04a\x1F\x92V[a\x05fV[\0[4\x80\x15a\x01wW_\x80\xFD[Pa\x01\x8Ba\x01\x866`\x04a\x1F\xABV[a\x06\x19V[`@Qa\x01\xC0\x94\x93\x92\x91\x90`\x01`\x01`@\x1B\x03\x94\x85\x16\x81R\x92\x84\x16` \x84\x01R\x92\x16`@\x82\x01R``\x81\x01\x91\x90\x91R`\x80\x01\x90V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x01\xD4W_\x80\xFD[P`@\x80Q`\x01\x81R_` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01a\x01\xC0V[4\x80\x15a\x01\xFFW_\x80\xFD[Pa\x01ja\x02\x0E6`\x04a \xF6V[a\x06bV[4\x80\x15a\x02\x1EW_\x80\xFD[P`\x08Ta\x029\x90`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x81V[`@Q`\x01`\x01`@\x1B\x03\x90\x91\x16\x81R` \x01a\x01\xC0V[4\x80\x15a\x02\\W_\x80\xFD[P`\x08Ta\x02p\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x01\xC0V[4\x80\x15a\x02\x93W_\x80\xFD[Pa\x02\x9Ca\x07\xBDV[`@Q\x90\x81R` \x01a\x01\xC0V[4\x80\x15a\x02\xB5W_\x80\xFD[P_T`\x01T`\x02T`\x03Ta\x02\xCB\x93\x92\x91\x90\x84V[`@\x80Q\x94\x85R` \x85\x01\x93\x90\x93R\x91\x83\x01R``\x82\x01R`\x80\x01a\x01\xC0V[a\x01ja\x02\xF96`\x04a\"\xA7V[a\x08$V[4\x80\x15a\x03\tW_\x80\xFD[Pa\x02\x9Ca\x08CV[4\x80\x15a\x03\x1DW_\x80\xFD[Pa\x01ja\x08^V[4\x80\x15a\x031W_\x80\xFD[Pa\x01ja\x08\xCCV[4\x80\x15a\x03EW_\x80\xFD[P`\x08T`\x01`\x01`\xA0\x1B\x03\x16\x15\x15[`@Q\x90\x15\x15\x81R` \x01a\x01\xC0V[4\x80\x15a\x03pW_\x80\xFD[Pa\x03\x84a\x03\x7F6`\x04a\x1F\xABV[a\x08\xDDV[`@\x80Q\x92\x83R`\x01`\x01`@\x1B\x03\x90\x91\x16` \x83\x01R\x01a\x01\xC0V[4\x80\x15a\x03\xACW_\x80\xFD[P\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16a\x02pV[4\x80\x15a\x03\xE8W_\x80\xFD[Pa\x01ja\x03\xF76`\x04a#YV[a\n\x08V[4\x80\x15a\x04\x07W_\x80\xFD[Pa\x01ja\x04\x166`\x04a#rV[a\n\x91V[4\x80\x15a\x04&W_\x80\xFD[P`\x06T`\x07Ta\x04J\x91`\x01`\x01`@\x1B\x03\x80\x82\x16\x92`\x01`@\x1B\x90\x92\x04\x16\x90\x83V[`@\x80Q`\x01`\x01`@\x1B\x03\x94\x85\x16\x81R\x93\x90\x92\x16` \x84\x01R\x90\x82\x01R``\x01a\x01\xC0V[4\x80\x15a\x04{W_\x80\xFD[Pa\x04\xA0`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\x01\xC0\x91\x90a$=V[4\x80\x15a\x04\xB8W_\x80\xFD[P`\x08Ta\x04\xD0\x90`\x01`\xA0\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81V[`@Qc\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01a\x01\xC0V[4\x80\x15a\x04\xF0W_\x80\xFD[P`\x04T`\x05Ta\x04J\x91`\x01`\x01`@\x1B\x03\x80\x82\x16\x92`\x01`@\x1B\x90\x92\x04\x16\x90\x83V[4\x80\x15a\x05\x1FW_\x80\xFD[Pa\x03Ua\x05.6`\x04a$oV[a\x0B\xB3V[4\x80\x15a\x05>W_\x80\xFD[Pa\x01ja\x05M6`\x04a\x1F\x92V[a\r\x14V[4\x80\x15a\x05]W_\x80\xFD[P`\tTa\x02\x9CV[a\x05na\rVV[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x05\x95W`@Qc\xE6\xC4${`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x08T`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x90\x82\x16\x03a\x05\xC4W`@Qc\xA8c\xAE\xC9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x08\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x81\x17\x90\x91U`@Q\x90\x81R\x7F\x80\x17\xBB\x88\x7F\xDF\x8F\xCAC\x14\xA9\xD4\x0Fns\xB3\xB8\x10\x02\xD6~\\\xFA\x85\xD8\x81s\xAFj\xA4`r\x90` \x01[`@Q\x80\x91\x03\x90\xA1PV[`\t\x81\x81T\x81\x10a\x06(W_\x80\xFD[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01\x80T`\x01\x90\x91\x01T`\x01`\x01`@\x1B\x03\x80\x83\x16\x93P`\x01`@\x1B\x83\x04\x81\x16\x92`\x01`\x80\x1B\x90\x04\x16\x90\x84V[`\x08T`\x01`\x01`\xA0\x1B\x03\x16\x15\x15\x80\x15a\x06\x87WP`\x08T`\x01`\x01`\xA0\x1B\x03\x163\x14\x15[\x15a\x06\xA5W`@Qc\x01GL\x8F`\xE7\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x06T\x82Q`\x01`\x01`@\x1B\x03\x91\x82\x16\x91\x16\x11\x15\x80a\x06\xDEWP`\x06T` \x83\x01Q`\x01`\x01`@\x1B\x03`\x01`@\x1B\x90\x92\x04\x82\x16\x91\x16\x11\x15[\x15a\x06\xFCW`@Qc\x05\x1CF\xEF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x07\t\x82`@\x01Qa\r\xB1V[a\x07\x13\x82\x82a\x0E!V[\x81Q`\x06\x80T` \x85\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x92\x16\x93\x16\x92\x90\x92\x17\x91\x90\x91\x17\x90U`@\x82\x01Q`\x07Ua\x07aa\x07Za\x07\xBDV[B\x84a\x0F\x15V[\x81` \x01Q`\x01`\x01`@\x1B\x03\x16\x82_\x01Q`\x01`\x01`@\x1B\x03\x16\x7F\xA0Jw9$PZA\x85d67%\xF5h2\xF5w.k\x8D\r\xBDn\xFC\xE7$\xDF\xE8\x03\xDA\xE6\x84`@\x01Q`@Qa\x07\xB1\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA3PPV[_`d`\x01`\x01`\xA0\x1B\x03\x16c\xA3\xB1\xB3\x1D`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x15\x80\x15a\x07\xFBW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x08\x1F\x91\x90a$\x8FV[\x90P\x90V[a\x08,a\x10\xFEV[a\x085\x82a\x11\xA2V[a\x08?\x82\x82a\x11\xE3V[PPV[_a\x08La\x12\xA4V[P_\x80Q` a)\xB1\x839\x81Q\x91R\x90V[a\x08fa\rVV[`\x08T`\x01`\x01`\xA0\x1B\x03\x16\x15a\x08\xB1W`\x08\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16\x90U`@Q\x7F\x9A_W\xDE\x85m\xD6h\xC5M\xD9^\\U\xDF\x93C!q\xCB\xCAI\xA8wmV \xEAY\xC0$P\x90_\x90\xA1V[`@Qc\xA8c\xAE\xC9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a\x08\xD4a\rVV[a\x08\xCA_a\x12\xEDV[`\t\x80T_\x91\x82\x91\x90a\x08\xF1`\x01\x83a$\xBAV[\x81T\x81\x10a\t\x01Wa\t\x01a$\xCDV[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x80\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x84\x10a\t@W`@Qc\x18V\xA4\x99`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x08T`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16[\x81\x81\x10\x15a\n\x01W\x84`\t\x82\x81T\x81\x10a\tpWa\tpa$\xCDV[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x80\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x11\x15a\t\xF9W`\t\x81\x81T\x81\x10a\t\xA9Wa\t\xA9a$\xCDV[\x90_R` _ \x90`\x02\x02\x01`\x01\x01T`\t\x82\x81T\x81\x10a\t\xCCWa\t\xCCa$\xCDV[\x90_R` _ \x90`\x02\x02\x01_\x01`\x10\x90T\x90a\x01\0\n\x90\x04`\x01`\x01`@\x1B\x03\x16\x93P\x93PPP\x91P\x91V[`\x01\x01a\tTV[PP\x91P\x91V[a\n\x10a\rVV[a\x0E\x10\x81c\xFF\xFF\xFF\xFF\x16\x10\x80a\n/WPc\x01\xE13\x80\x81c\xFF\xFF\xFF\xFF\x16\x11[\x80a\nMWP`\x08Tc\xFF\xFF\xFF\xFF`\x01`\xA0\x1B\x90\x91\x04\x81\x16\x90\x82\x16\x11\x15[\x15a\nkW`@Qc\x07\xA5\x07w`\xE5\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x08\x80Tc\xFF\xFF\xFF\xFF\x90\x92\x16`\x01`\xA0\x1B\x02c\xFF\xFF\xFF\xFF`\xA0\x1B\x19\x90\x92\x16\x91\x90\x91\x17\x90UV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16_\x81\x15\x80\x15a\n\xD5WP\x82[\x90P_\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\n\xF0WP0;\x15[\x90P\x81\x15\x80\x15a\n\xFEWP\x80\x15[\x15a\x0B\x1CW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\x0BFW\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\x0BO\x86a\x13]V[a\x0BWa\x13nV[a\x0Bb\x89\x89\x89a\x13vV[\x83\x15a\x0B\xA8W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPPPV[`\tT_\x90a\x0B\xC0a\x07\xBDV[\x84\x11\x80a\x0B\xCBWP\x80\x15[\x80a\x0C\x15WP`\x08T`\t\x80T\x90\x91`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x0B\xF9Wa\x0B\xF9a$\xCDV[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x84\x10[\x15a\x0C3W`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_\x80\x80a\x0CA`\x01\x85a$\xBAV[\x90P[\x81a\x0C\xDDW`\x08T`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x81\x10a\x0C\xDDW\x86`\t\x82\x81T\x81\x10a\x0CvWa\x0Cva$\xCDV[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x11a\x0C\xCBW`\x01\x91P`\t\x81\x81T\x81\x10a\x0C\xABWa\x0C\xABa$\xCDV[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x92Pa\x0C\xDDV[\x80a\x0C\xD5\x81a$\xE1V[\x91PPa\x0CDV[\x81a\x0C\xFBW`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x85a\r\x06\x84\x89a$\xBAV[\x11\x94PPPPP[\x92\x91PPV[a\r\x1Ca\rVV[`\x01`\x01`\xA0\x1B\x03\x81\x16a\rJW`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R_`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[a\rS\x81a\x12\xEDV[PV[3a\r\x88\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\x08\xCAW`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R3`\x04\x82\x01R`$\x01a\rAV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x81\x10\x80a\x08?W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01a\rAV[_a\x0E*a\x14\xA2V[\x90Pa\x0E4a\x1C\xF3V[\x83Q`\x01`\x01`@\x1B\x03\x90\x81\x16\x82R` \x85\x01Q\x16\x81`\x01` \x02\x01R`@\x84\x81\x01Q\x82\x82\x01R`\x01T``\x83\x01R`\x02T`\x80\x83\x01R`\x03T`\xA0\x83\x01R_T`\xC0\x83\x01RQc\xCESzw`\xE0\x1B\x81Rs_\xBD\xB21Vx\xAF\xEC\xB3g\xF02\xD9?d/d\x18\n\xA3\x90c\xCESzw\x90a\x0E\xB3\x90\x85\x90\x85\x90\x88\x90`\x04\x01a&\xFCV[` `@Q\x80\x83\x03\x81\x86Z\xF4\x15\x80\x15a\x0E\xCEW=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0E\xF2\x91\x90a)*V[a\x0F\x0FW`@Qc\t\xBD\xE39`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPV[`\tT\x15\x80\x15\x90a\x0F\x8AWP`\x08T`\t\x80T`\x01`\xA0\x1B\x83\x04c\xFF\xFF\xFF\xFF\x16\x92`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x0FUWa\x0FUa$\xCDV[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01Ta\x0F\x7F\x90`\x01`@\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x84a)IV[`\x01`\x01`@\x1B\x03\x16\x11[\x15a\x10\x1DW`\x08T`\t\x80T\x90\x91`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x0F\xB7Wa\x0F\xB7a$\xCDV[_\x91\x82R` \x82 `\x02\x90\x91\x02\x01\x80T`\x01`\x01`\xC0\x1B\x03\x19\x16\x81U`\x01\x01U`\x08\x80T`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90`\x18a\x0F\xF7\x83a)pV[\x91\x90a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UPP[`@\x80Q`\x80\x81\x01\x82R`\x01`\x01`@\x1B\x03\x94\x85\x16\x81R\x92\x84\x16` \x80\x85\x01\x91\x82R\x83\x01Q\x85\x16\x84\x83\x01\x90\x81R\x92\x90\x91\x01Q``\x84\x01\x90\x81R`\t\x80T`\x01\x81\x01\x82U_\x91\x90\x91R\x93Q`\x02\x90\x94\x02\x7Fn\x15@\x17\x1Bl\x0C\x96\x0Bq\xA7\x02\r\x9F`\x07\x7Fj\xF91\xA8\xBB\xF5\x90\xDA\x02#\xDA\xCFu\xC7\xAF\x81\x01\x80T\x93Q\x94Q\x87\x16`\x01`\x80\x1B\x02g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`\x80\x1B\x19\x95\x88\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x95\x16\x96\x90\x97\x16\x95\x90\x95\x17\x92\x90\x92\x17\x92\x90\x92\x16\x93\x90\x93\x17\x90\x91UQ\x7Fn\x15@\x17\x1Bl\x0C\x96\x0Bq\xA7\x02\r\x9F`\x07\x7Fj\xF91\xA8\xBB\xF5\x90\xDA\x02#\xDA\xCFu\xC7\xB0\x90\x91\x01UV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a\x11\x84WP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a\x11x_\x80Q` a)\xB1\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x08\xCAW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x11\xAAa\rVV[`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x81R\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x90` \x01a\x06\x0EV[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x12=WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x12:\x91\x81\x01\x90a$\x8FV[`\x01[a\x12eW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\rAV[_\x80Q` a)\xB1\x839\x81Q\x91R\x81\x14a\x12\x95W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\rAV[a\x12\x9F\x83\x83a\x1A\xD1V[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\x08\xCAW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T`\x01`\x01`\xA0\x1B\x03\x19\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90_\x90\xA3PPPV[a\x13ea\x1B&V[a\rS\x81a\x1BoV[a\x08\xCAa\x1B&V[\x82Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80a\x13\x9AWP` \x83\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80a\x13\xA7WP` \x82\x01Q\x15[\x80a\x13\xB4WP`@\x82\x01Q\x15[\x80a\x13\xC1WP``\x82\x01Q\x15[\x80a\x13\xCBWP\x81Q\x15[\x80a\x13\xDDWPa\x0E\x10\x81c\xFF\xFF\xFF\xFF\x16\x10[\x80a\x13\xF1WPc\x01\xE13\x80\x81c\xFF\xFF\xFF\xFF\x16\x11[\x15a\x14\x0FW`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x82Q`\x04\x80T` \x80\x87\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x93\x84\x16\x91\x90\x95\x16\x90\x81\x17\x85\x17\x90\x93U`@\x96\x87\x01Q`\x05\x81\x90U\x86Q_U\x90\x86\x01Q`\x01U\x95\x85\x01Q`\x02U``\x90\x94\x01Q`\x03U`\x06\x80T\x90\x94\x16\x17\x17\x90\x91U`\x07\x91\x90\x91U`\x08\x80Tc\xFF\xFF\xFF\xFF\x90\x92\x16`\x01`\xA0\x1B\x02c\xFF\xFF\xFF\xFF`\xA0\x1B\x19\x90\x92\x16\x91\x90\x91\x17\x90UV[a\x14\xAAa\x1D\x11V[b\x10\0\0\x81R`\x07` \x82\x01R\x7F#x=\x0E\x97w\xB7\xAFe\xFB\xF8I\xDA~\xDBu\xE7K\x1E\xAFP>\x02]\x7F/\x7F\x80\x99\x1B\xEF\xA2`@\x82\x01QR\x7F*N/\xE8\xAD\xFAS\xF4hRU\x82\xD5\x18LLp\xBB\xDB\x94l!\xF2\x16A\x8A\x98yp^T\xA7` `@\x83\x01Q\x01R\x7F\x06$\xB2\xC1\xE7\x7F$\xAF\xCE\xAF9E\x17C\xB9\xFA\x80\xD5\x85?\xCA{\xA0\x03\x89\xC6ue\x07t\0\x9B``\x82\x01QR\x7F%\rw\x19\xE9L\xA2\xDF\0\xDF\xE3'\x93\x8FZ\x8DM\x83wy\xB9\x987\xCAwzS\xD3\x91'\xB1y` ``\x83\x01Q\x01R\x7F\r\xC0\x95\x15\x15.\xAE\xA6m\r\xB2\xF5q\xCC\x99^6\x9D&\xFEds\x94\xF1\r\xB59\x8C\x91u\x19\xDC`\x80\x82\x01QR\x7F\x12s\x14Ml\xEC,Jh\xB2J\x14\x93y\xC0\xF5Y+\xB7\xFB\xDD\xBE2\xFA\x17\x19\x19\x95\x0C\xA4\x04\xCB` `\x80\x83\x01Q\x01R\x7F\x11\x95!\xBBh\xCA\xEC!n/\x05\xEE\xB4f\xFB:\xBF\xE1\xF3\x9B\xAF\x7F\xE7\xCB9.\xA0W\xB6\xA2\xD9\xBF`\xA0\x82\x01QR\x7F-R\xAD\xEA\xBA\x80E\xE5:\xB5&\xFE\x99\x82\xD0\xEAE-\xEFk>\xA0%='\xA1\x9E\xF3\xB4n\x84(` `\xA0\x83\x01Q\x01R\x7F\x16\xC3\xB5\xB2\x17\xD3\x02\x97Z\x92\r\x137E$\xD7\xA5.JP\xFD\x7F\xB90\x84\"q\xEB\xF4\xA8N\xFD`\xC0\x82\x01QR\x7F \x07\x88\x91k\x90{\x19ir\xBD\xE3\x041\x8E\x88Z%!QK-\xB5\xE4\xA1\x18\x99\xC5\x12\x04\xF0\x89` `\xC0\x83\x01Q\x01R\x7F\x11'X\x1A\xFEu=\xEF\xCA\x9A\xEF\x12\xE73-\xB9\x97\x8A \x0B\x16\x99\xCE8\x88\xC0\xF3\xAE\xA6\x11\x1D\xC3`\xE0\x82\x01QR\x7F\x08\x81\xE1?\0r;\xE1\xA0Hr\xED\x02\xB2\xD0x\xC3\x1E\x80\xFE\xAF'rN&,\xE9|,\xB0\xBB\x1D` `\xE0\x83\x01Q\x01R\x7F\x14\x82\xA3\xA6\xBB\x91\xD6H=\x156\x83\xE2@O/UF\xE0\xE8\x95S\x0F\xDF\x13 \x91I\x84\x06\xE3\xDEa\x01\0\x82\x01QR~\xFAR\xDB=R\xD9\x05\xEA\xD1$\x81\x02\xF3\xA8\nC\xA9\r\x84\0\xC6\x8F`\xA6,T\xC7\x18u\xD8\xDD\xC3UFXd\x0C\xC9U\x01a\x01\xC0\x82\x01QR\x7F$:\x99\xD8\r2\xEBT\x08\xB5\x9D[\x080+\xED\xE0p\xD3\xFB\n\x8E\xFE/\"b\xF8e\xBF\xFBM\r` a\x01\xC0\x83\x01Q\x01R\x7F\x04U\xD22[\xF6&\x9Af\xF0}\x83\x8FU\xF3iG\xA3\xCD\x9B\x87\xED\xD8H\x0B\xCE\xD9\\\xBBE\xCC\x11a\x01\xE0\x82\x01QR\x7F\x0Ff\xD9\x08Zn\xD6\x0B\x83\x81y\x98~$\t\x92\xBF\xF4\xC0Ql\xCFl\xCD\xE4\xA1\xCA\x94\xCE\x8B\x98d` a\x01\xE0\x83\x01Q\x01R\x7F+\xAC\r#\xC8X]\x14\x87\xECa\x1B^\xFF\xC9~XR\xFE\xA4:|\xBA6\xCC\xDD, y1\xF3\x94a\x02\0\x82\x01QR\x7F\x18`\xB5N\x01\xA0j\xEAZ\xDBK\x13\xBF[\xAE\xBA\xB9+sh\x07\xA3\xA8\x9F\xF2\x04\t\x92\xB0n\xE6\xEC` a\x02\0\x83\x01Q\x01R\x7F\x0C\x0B\xFA\x1C/\xC6\xF8\xED\x01#=Qh\xDB\x1E\x1D\xFErU\x04\xF02\xF6i\xF5\n\x92\xAEw\xC7)\x06a\x02 \x82\x01QR\x7F\rt\x1E\x12L}\x10i\xB8\xA4\0\xCB\xCD\xCF\xD9\x01(\xA53\x90\x1A\xD4\xDE\x1E\x03\x7F\xE7)\x84\xDC4\xCF` a\x02 \x83\x01Q\x01R\x7F\x01\xCF\xED0\x08\\\x9E\xFC\xE0Fh W\x94\xAA9\xB1\xA8\xEEY\x124\xB4\xC7z\"\xF8\xC2m\x89\x9E\x05a\x02@\x82\x01QR\x7F*\xB6\x8A\xC8-6\xCE\xDBd}\x14\xA5\xB0\x03^\x8C\x9A\x0B\xE8G\x80\xB7\xBA\xE1\x13:'\xA8\x80\x96n\xD1` a\x02@\x83\x01Q\x01R\x7F\x07.\x1DP\xF8\xB5\xCF\x8DWK8G'dw\xD9[\xBDQ\x165\x10\0\x84\x1Fr\x8D\xA4O@C\xB5a\x02`\x82\x01QR\x7F#\xF8\xEAn\xAC\xD0\x87mW\"\x0FW\xEA\xBA\xCB\xE7j##A\x16cs\x1A%\x1D]\xCA6\xF1\xB5\x9F` a\x02`\x83\x01Q\x01R\x7F\xB0\x83\x88\x93\xEC\x1F#~\x8B\x072;\x07DY\x9FN\x97\xB5\x98\xB3\xB5\x89\xBC\xC2\xBC7\xB8\xD5\xC4\x18\x01a\x02\x80\x82\x01R\x7F\xC1\x83\x93\xC0\xFA0\xFEN\x8B\x03\x8E5z\xD8Q\xEA\xE8\xDE\x91\x07XN\xFF\xE7\xC7\xF1\xF6Q\xB2\x01\x0E&a\x02\xA0\x82\x01R\x90V[a\x1A\xDA\x82a\x1BwV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90_\x90\xA2\x80Q\x15a\x1B\x1EWa\x12\x9F\x82\x82a\x1B\xDAV[a\x08?a\x1CLV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a\x08\xCAW`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\r\x1Ca\x1B&V[\x80`\x01`\x01`\xA0\x1B\x03\x16;_\x03a\x1B\xACW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\rAV[_\x80Q` a)\xB1\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[``_\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x1B\xF6\x91\x90a)\x95V[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a\x1C.W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a\x1C3V[``\x91P[P\x91P\x91Pa\x1CC\x85\x83\x83a\x1CkV[\x95\x94PPPPPV[4\x15a\x08\xCAW`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a\x1C\x80Wa\x1C{\x82a\x1C\xCAV[a\x1C\xC3V[\x81Q\x15\x80\x15a\x1C\x97WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x1C\xC0W`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\rAV[P\x80[\x93\x92PPPV[\x80Q\x15a\x1C\xDAW\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Q\x80`\xE0\x01`@R\x80`\x07\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80a\x02\xC0\x01`@R\x80_\x81R` \x01_\x81R` \x01a\x1DD`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1Dd`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1D\x84`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1D\xA4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1D\xC4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1D\xE4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1E\x04`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1E$`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1ED`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1Ed`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1E\x84`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1E\xA4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1E\xC4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1E\xE4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1F\x04`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1F$`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1FD`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1Fd`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R_` \x82\x01\x81\x90R`@\x90\x91\x01R\x90V[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x1F\x8DW_\x80\xFD[\x91\x90PV[_` \x82\x84\x03\x12\x15a\x1F\xA2W_\x80\xFD[a\x1C\xC3\x82a\x1FwV[_` \x82\x84\x03\x12\x15a\x1F\xBBW_\x80\xFD[P5\x91\x90PV[cNH{q`\xE0\x1B_R`A`\x04R`$_\xFD[`@Qa\x02\xE0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\x1F\xF9Wa\x1F\xF9a\x1F\xC2V[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a 'Wa 'a\x1F\xC2V[`@R\x91\x90PV[\x805`\x01`\x01`@\x1B\x03\x81\x16\x81\x14a\x1F\x8DW_\x80\xFD[_``\x82\x84\x03\x12\x15a UW_\x80\xFD[`@Q``\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a wWa wa\x1F\xC2V[`@R\x90P\x80a \x86\x83a /V[\x81Ra \x94` \x84\x01a /V[` \x82\x01R`@\x83\x015`@\x82\x01RP\x92\x91PPV[_`@\x82\x84\x03\x12\x15a \xBAW_\x80\xFD[`@Q`@\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a \xDCWa \xDCa\x1F\xC2V[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[_\x80\x82\x84\x03a\x04\xE0\x81\x12\x15a!\tW_\x80\xFD[a!\x13\x85\x85a EV[\x92Pa\x04\x80\x80`_\x19\x83\x01\x12\x15a!(W_\x80\xFD[a!0a\x1F\xD6V[\x91Pa!?\x86``\x87\x01a \xAAV[\x82Ra!N\x86`\xA0\x87\x01a \xAAV[` \x83\x01Ra!`\x86`\xE0\x87\x01a \xAAV[`@\x83\x01Ra\x01 a!t\x87\x82\x88\x01a \xAAV[``\x84\x01Ra\x01`a!\x88\x88\x82\x89\x01a \xAAV[`\x80\x85\x01Ra\x01\xA0a!\x9C\x89\x82\x8A\x01a \xAAV[`\xA0\x86\x01Ra\x01\xE0a!\xB0\x8A\x82\x8B\x01a \xAAV[`\xC0\x87\x01Ra\x02 a!\xC4\x8B\x82\x8C\x01a \xAAV[`\xE0\x88\x01Ra\x02`a!\xD8\x8C\x82\x8D\x01a \xAAV[a\x01\0\x89\x01Ra\x02\xA0a!\xED\x8D\x82\x8E\x01a \xAAV[\x87\x8A\x01Ra!\xFF\x8Da\x02\xE0\x8E\x01a \xAAV[a\x01@\x8A\x01Ra\"\x13\x8Da\x03 \x8E\x01a \xAAV[\x86\x8A\x01Ra\"%\x8Da\x03`\x8E\x01a \xAAV[a\x01\x80\x8A\x01Ra\x03\xA0\x8C\x015\x94\x89\x01\x94\x90\x94Ra\x03\xC0\x8B\x015a\x01\xC0\x89\x01Ra\x03\xE0\x8B\x015\x92\x88\x01\x92\x90\x92Ra\x04\0\x8A\x015a\x02\0\x88\x01Ra\x04 \x8A\x015\x90\x87\x01Ra\x04@\x89\x015a\x02@\x87\x01Ra\x04`\x89\x015\x90\x86\x01R\x92\x87\x015a\x02\x80\x85\x01RPPa\x04\xA0\x85\x015\x90\x82\x01Ra\x04\xC0\x90\x93\x015a\x02\xC0\x84\x01RP\x92\x90\x91PV[_\x80`@\x83\x85\x03\x12\x15a\"\xB8W_\x80\xFD[a\"\xC1\x83a\x1FwV[\x91P` \x80\x84\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a\"\xDDW_\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12a\"\xF0W_\x80\xFD[\x815\x81\x81\x11\x15a#\x02Wa#\x02a\x1F\xC2V[a#\x14`\x1F\x82\x01`\x1F\x19\x16\x85\x01a\x1F\xFFV[\x91P\x80\x82R\x87\x84\x82\x85\x01\x01\x11\x15a#)W_\x80\xFD[\x80\x84\x84\x01\x85\x84\x017_\x84\x82\x84\x01\x01RP\x80\x93PPPP\x92P\x92\x90PV[\x805c\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x1F\x8DW_\x80\xFD[_` \x82\x84\x03\x12\x15a#iW_\x80\xFD[a\x1C\xC3\x82a#FV[_\x80_\x80\x84\x86\x03a\x01 \x81\x12\x15a#\x87W_\x80\xFD[a#\x91\x87\x87a EV[\x94P`\x80`_\x19\x82\x01\x12\x15a#\xA4W_\x80\xFD[P`@Q`\x80\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a#\xC7Wa#\xC7a\x1F\xC2V[\x80`@RP``\x86\x015\x81R`\x80\x86\x015` \x82\x01R`\xA0\x86\x015`@\x82\x01R`\xC0\x86\x015``\x82\x01R\x80\x93PPa$\x01`\xE0\x86\x01a#FV[\x91Pa$\x10a\x01\0\x86\x01a\x1FwV[\x90P\x92\x95\x91\x94P\x92PV[_[\x83\x81\x10\x15a$5W\x81\x81\x01Q\x83\x82\x01R` \x01a$\x1DV[PP_\x91\x01RV[` \x81R_\x82Q\x80` \x84\x01Ra$[\x81`@\x85\x01` \x87\x01a$\x1BV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15a$\x80W_\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[_` \x82\x84\x03\x12\x15a$\x9FW_\x80\xFD[PQ\x91\x90PV[cNH{q`\xE0\x1B_R`\x11`\x04R`$_\xFD[\x81\x81\x03\x81\x81\x11\x15a\r\x0EWa\r\x0Ea$\xA6V[cNH{q`\xE0\x1B_R`2`\x04R`$_\xFD[_\x81a$\xEFWa$\xEFa$\xA6V[P_\x19\x01\x90V[\x80_[`\x07\x81\x10\x15a\x0F\x0FW\x81Q\x84R` \x93\x84\x01\x93\x90\x91\x01\x90`\x01\x01a$\xF9V[a%-\x82\x82Q\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[` \x81\x81\x01Q\x80Q`@\x85\x01R\x90\x81\x01Q``\x84\x01RP`@\x81\x01Q\x80Q`\x80\x84\x01R` \x81\x01Q`\xA0\x84\x01RP``\x81\x01Q\x80Q`\xC0\x84\x01R` \x81\x01Q`\xE0\x84\x01RP`\x80\x81\x01Qa\x01\0a%\x90\x81\x85\x01\x83\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xA0\x83\x01Q\x91Pa\x01@a%\xB0\x81\x86\x01\x84\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xC0\x84\x01Q\x92Pa\x01\x80a%\xD0\x81\x87\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xE0\x85\x01Q\x93Pa\x01\xC0a%\xF0\x81\x88\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x85\x01Q\x93Pa\x02\0\x92a&\x10\x87\x85\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01 \x86\x01Q\x94Pa\x02@a&1\x81\x89\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x86\x01Q\x94Pa\x02\x80\x92a&Q\x88\x85\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01`\x87\x01Q\x95Pa\x02\xC0a&r\x81\x8A\x01\x88\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x87\x01Q\x80Qa\x03\0\x8A\x01R` \x01Qa\x03 \x89\x01Ra\x01\xA0\x87\x01Qa\x03@\x89\x01R\x90\x86\x01Qa\x03`\x88\x01Ra\x01\xE0\x86\x01Qa\x03\x80\x88\x01R\x92\x85\x01Qa\x03\xA0\x87\x01Ra\x02 \x85\x01Qa\x03\xC0\x87\x01R\x91\x84\x01Qa\x03\xE0\x86\x01Ra\x02`\x84\x01Qa\x04\0\x86\x01R\x83\x01Qa\x04 \x85\x01Ra\x02\xA0\x83\x01Qa\x04@\x85\x01R\x90\x91\x01Qa\x04`\x90\x92\x01\x91\x90\x91RPV[_a\n`\x82\x01\x90P\x84Q\x82R` \x85\x01Q` \x83\x01R`@\x85\x01Qa'.`@\x84\x01\x82\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[P``\x85\x01Q\x80Q`\x80\x84\x01R` \x81\x01Q`\xA0\x84\x01RP`\x80\x85\x01Q\x80Q`\xC0\x84\x01R` \x81\x01Q`\xE0\x84\x01RP`\xA0\x85\x01Qa\x01\0a'{\x81\x85\x01\x83\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xC0\x87\x01Q\x91Pa\x01@a'\x9B\x81\x86\x01\x84\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xE0\x88\x01Q\x92Pa\x01\x80a'\xBB\x81\x87\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x88\x01Q\x92Pa\x01\xC0\x91a'\xDB\x86\x84\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01 \x89\x01Q\x93Pa\x02\0a'\xFC\x81\x88\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x89\x01Q\x93Pa\x02@\x91a(\x1C\x87\x84\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01`\x8A\x01Q\x94Pa\x02\x80a(=\x81\x89\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x8A\x01Q\x80Qa\x02\xC0\x89\x01R` \x90\x81\x01Qa\x02\xE0\x89\x01Ra\x01\xA0\x8B\x01Q\x80Qa\x03\0\x8A\x01R\x81\x01Qa\x03 \x89\x01R\x93\x8A\x01Q\x80Qa\x03@\x89\x01R\x84\x01Qa\x03`\x88\x01Ra\x01\xE0\x8A\x01Q\x80Qa\x03\x80\x89\x01R\x84\x01Qa\x03\xA0\x88\x01R\x89\x01Q\x80Qa\x03\xC0\x88\x01R\x83\x01Qa\x03\xE0\x87\x01Ra\x02 \x89\x01Q\x80Qa\x04\0\x88\x01R\x83\x01Qa\x04 \x87\x01R\x90\x88\x01Q\x80Qa\x04@\x87\x01R\x82\x01Qa\x04`\x86\x01Ra\x02`\x88\x01Q\x80Qa\x04\x80\x87\x01R\x90\x91\x01Qa\x04\xA0\x85\x01R\x86\x01Qa\x04\xC0\x84\x01RPa\x02\xA0\x85\x01Qa\x04\xE0\x83\x01Ra)\x14a\x05\0\x83\x01\x85a$\xF6V[a)\"a\x05\xE0\x83\x01\x84a%\x18V[\x94\x93PPPPV[_` \x82\x84\x03\x12\x15a):W_\x80\xFD[\x81Q\x80\x15\x15\x81\x14a\x1C\xC3W_\x80\xFD[`\x01`\x01`@\x1B\x03\x82\x81\x16\x82\x82\x16\x03\x90\x80\x82\x11\x15a)iWa)ia$\xA6V[P\x92\x91PPV[_`\x01`\x01`@\x1B\x03\x80\x83\x16\x81\x81\x03a)\x8BWa)\x8Ba$\xA6V[`\x01\x01\x93\x92PPPV[_\x82Qa)\xA6\x81\x84` \x87\x01a$\x1BV[\x91\x90\x91\x01\x92\x91PPV\xFE6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\xA1dsolcC\0\x08\x17\0\n", + b"`\x80`@R`\x046\x10a\x01\xBAW_5`\xE0\x1C\x80c\x81\x1F\x85?\x11a\0\xF2W\x80c\xA1\xBE\x8DR\x11a\0\x92W\x80c\xD2M\x93=\x11a\0bW\x80c\xD2M\x93=\x14a\x05\xEBW\x80c\xE003\x01\x14a\x06\x1AW\x80c\xF2\xFD\xE3\x8B\x14a\x069W\x80c\xF9\xE5\r\x19\x14a\x06XW_\x80\xFD[\x80c\xA1\xBE\x8DR\x14a\x059W\x80c\xAD<\xB1\xCC\x14a\x05XW\x80c\xB2BN?\x14a\x05\x95W\x80c\xC2;\x9E\x9E\x14a\x05\xB3W_\x80\xFD[\x80c\x8D\xA5\xCB[\x11a\0\xCDW\x80c\x8D\xA5\xCB[\x14a\x04jW\x80c\x90\xC1C\x90\x14a\x04\xA6W\x80c\x96\xC1\xCAa\x14a\x04\xC5W\x80c\x9F\xDBT\xA7\x14a\x04\xE4W_\x80\xFD[\x80c\x81\x1F\x85?\x14a\x03\xE4W\x80c\x82nA\xFC\x14a\x04\x03W\x80c\x85\x84\xD2?\x14a\x04.W_\x80\xFD[\x80cBm1\x94\x11a\x01]W\x80ci\xCCj\x04\x11a\x018W\x80ci\xCCj\x04\x14a\x03\x89W\x80cqP\x18\xA6\x14a\x03\x9DW\x80cu|7\xAD\x14a\x03\xB1W\x80cvg\x18\x08\x14a\x03\xD0W_\x80\xFD[\x80cBm1\x94\x14a\x03@W\x80cO\x1E\xF2\x86\x14a\x03bW\x80cR\xD1\x90-\x14a\x03uW_\x80\xFD[\x80c\r\x8En,\x11a\x01\x98W\x80c\r\x8En,\x14a\x02~W\x80c/y\x88\x9D\x14a\x02\xA9W\x80c1=\xF7\xB1\x14a\x02\xE7W\x80c7\x8E\xC2;\x14a\x03\x1EW_\x80\xFD[\x80c\x01?\xA5\xFC\x14a\x01\xBEW\x80c\x02\xB5\x92\xF3\x14a\x01\xDFW\x80c\x06%\xE1\x9B\x14a\x02=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x07\xCA\x91\x90a(\xF9V[\x90P\x90V[a\x07\xD7a\x10\xF2V[a\x07\xE0\x82a\x11\x96V[a\x07\xEA\x82\x82a\x11\xD7V[PPV[_a\x07\xF7a\x12\x98V[P_\x80Q` a.\x9F\x839\x81Q\x91R\x90V[a\x08\x11a\x10\x97V[`\rT`\x01`\x01`\xA0\x1B\x03\x16\x15a\x08\\W`\r\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16\x90U`@Q\x7F\x9A_W\xDE\x85m\xD6h\xC5M\xD9^\\U\xDF\x93C!q\xCB\xCAI\xA8wmV \xEAY\xC0$P\x90_\x90\xA1V[`@Qc\xA8c\xAE\xC9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a\x08\x7Fa\x10\x97V[a\x08u_a\x12\xE1V[`\rT`\x01`\x01`\xA0\x1B\x03\x16\x15\x15\x80\x15a\x08\xADWP`\rT`\x01`\x01`\xA0\x1B\x03\x163\x14\x15[\x15a\x08\xCBW`@Qc\x01GL\x8F`\xE7\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x0BT\x83Q`\x01`\x01`@\x1B\x03\x91\x82\x16\x91\x16\x11\x15\x80a\t\x04WP`\x0BT` \x84\x01Q`\x01`\x01`@\x1B\x03`\x01`@\x1B\x90\x92\x04\x82\x16\x91\x16\x11\x15[\x15a\t\"W`@Qc\x05\x1CF\xEF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\t/\x83`@\x01Qa\x13QV[_a\t8a\x0BZV[` \x85\x01Q_\x80T\x92\x93P\x91a\tW\x91\x90`\x01`\x01`@\x1B\x03\x16a\r\xCEV[\x90Pa\td\x82`\x01a)$V[`\x01`\x01`@\x1B\x03\x16\x81`\x01`\x01`@\x1B\x03\x16\x14\x80\x15a\t\x9DWP`\x0BTa\t\x9B\x90`\x01`@\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16a\x0E\xB4V[\x15[\x80\x15a\t\xB1WP_\x82`\x01`\x01`@\x1B\x03\x16\x11[\x15a\t\xCFW`@QcqP\xDEE`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\t\xDA\x82`\x02a)$V[`\x01`\x01`@\x1B\x03\x16\x81`\x01`\x01`@\x1B\x03\x16\x10a\n\x0BW`@QcqP\xDEE`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\n\x18\x84` \x01Qa\x13QV[a\n%\x84`@\x01Qa\x13QV[a\n2\x84``\x01Qa\x13QV[a\n=\x85\x85\x85a\x13\xC1V[\x84Q`\x0B\x80T` \x88\x01Q`\x01`\x01`@\x1B\x03\x81\x81\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x93\x16\x94\x16\x93\x90\x93\x17\x17\x90U`@\x86\x01Q`\x0CUa\n\x7F\x90a\x0E\xB4V[\x15a\n\xE9W\x83Q`\x05U` \x84\x01Q`\x06U`@\x84\x01Q`\x07U``\x84\x01Q`\x08U\x7F1\xEA\xBD\x90\x99\xFD\xB2]\xAC\xDD\xD2\x06\xAB\xFF\x871\x1EU4A\xFC\x9D\x0F\xCD\xEF \x10b\xD7\xE7\x07\x1Ba\n\xCD\x82`\x01a)$V[`@Q`\x01`\x01`@\x1B\x03\x90\x91\x16\x81R` \x01`@Q\x80\x91\x03\x90\xA1[a\n\xFBa\n\xF4a\x07hV[B\x87a\x15\x19V[\x84` \x01Q`\x01`\x01`@\x1B\x03\x16\x85_\x01Q`\x01`\x01`@\x1B\x03\x16\x7F\xA0Jw9$PZA\x85d67%\xF5h2\xF5w.k\x8D\r\xBDn\xFC\xE7$\xDF\xE8\x03\xDA\xE6\x87`@\x01Q`@Qa\x0BK\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA3PPPPPV[`\x0BT_\x80T\x90\x91a\x07\xCA\x91`\x01`\x01`@\x1B\x03`\x01`@\x1B\x90\x92\x04\x82\x16\x91\x16a\r\xCEV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16_\x81\x15\x80\x15a\x0B\xC3WP\x82[\x90P_\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\x0B\xDEWP0;\x15[\x90P\x81\x15\x80\x15a\x0B\xECWP\x80\x15[\x15a\x0C\nW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\x0C4W\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\x0C=\x87a\x17\x02V[a\x0CEa\x17\x13V[a\x0CQ\x8A\x8A\x8A\x89a\x17\x1BV[\x83\x15a\x0C\x97W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPPPPV[`\x0E\x80T_\x91\x82\x91\x90a\x0C\xB7`\x01\x83a)KV[\x81T\x81\x10a\x0C\xC7Wa\x0C\xC7a)^V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x80\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x84\x10a\r\x06W`@Qc\x18V\xA4\x99`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\rT`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16[\x81\x81\x10\x15a\r\xC7W\x84`\x0E\x82\x81T\x81\x10a\r6Wa\r6a)^V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x80\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x11\x15a\r\xBFW`\x0E\x81\x81T\x81\x10a\roWa\roa)^V[\x90_R` _ \x90`\x02\x02\x01`\x01\x01T`\x0E\x82\x81T\x81\x10a\r\x92Wa\r\x92a)^V[\x90_R` _ \x90`\x02\x02\x01_\x01`\x10\x90T\x90a\x01\0\n\x90\x04`\x01`\x01`@\x1B\x03\x16\x93P\x93PPP\x91P\x91V[`\x01\x01a\r\x1AV[PP\x91P\x91V[_\x81`\x01`\x01`@\x1B\x03\x16_\x03a\r\xE6WP_a\x0E%V[a\r\xF0\x82\x84a)\x86V[`\x01`\x01`@\x1B\x03\x16_\x03a\x0E\x10Wa\x0E\t\x82\x84a)\xABV[\x90Pa\x0E%V[a\x0E\x1A\x82\x84a)\xABV[a\x0E\t\x90`\x01a)$V[\x92\x91PPV[a\x0E3a\x10\x97V[a\x0E\x10\x81c\xFF\xFF\xFF\xFF\x16\x10\x80a\x0ERWPc\x01\xE13\x80\x81c\xFF\xFF\xFF\xFF\x16\x11[\x80a\x0EpWP`\rTc\xFF\xFF\xFF\xFF`\x01`\xA0\x1B\x90\x91\x04\x81\x16\x90\x82\x16\x11\x15[\x15a\x0E\x8EW`@Qc\x07\xA5\x07w`\xE5\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\r\x80Tc\xFF\xFF\xFF\xFF\x90\x92\x16`\x01`\xA0\x1B\x02c\xFF\xFF\xFF\xFF`\xA0\x1B\x19\x90\x92\x16\x91\x90\x91\x17\x90UV[_\x81`\x01`\x01`@\x1B\x03\x16_\x03a\x0E\xCCWP_\x91\x90PV[_Ta\x0E\xE1\x90`\x01`\x01`@\x1B\x03\x16\x83a)\x86V[`\x01`\x01`@\x1B\x03\x16\x15\x92\x91PPV[\x91\x90PV[`\x0ET_\x90a\x0F\x03a\x07hV[\x84\x11\x80a\x0F\x0EWP\x80\x15[\x80a\x0FXWP`\rT`\x0E\x80T\x90\x91`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x0FW`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x85a\x10I\x84\x89a)KV[\x11\x97\x96PPPPPPPV[a\x10]a\x10\x97V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x10\x8BW`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R_`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[a\x10\x94\x81a\x12\xE1V[PV[3a\x10\xC9\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\x08uW`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R3`\x04\x82\x01R`$\x01a\x10\x82V[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a\x11xWP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a\x11l_\x80Q` a.\x9F\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\x08uW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x11\x9Ea\x10\x97V[`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x81R\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x90` \x01a\x07\x14V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x121WP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x12.\x91\x81\x01\x90a(\xF9V[`\x01[a\x12YW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x10\x82V[_\x80Q` a.\x9F\x839\x81Q\x91R\x81\x14a\x12\x89W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x10\x82V[a\x12\x93\x83\x83a\x18\x95V[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\x08uW`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T`\x01`\x01`\xA0\x1B\x03\x19\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90_\x90\xA3PPPV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x81\x10\x80a\x07\xEAW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01a\x10\x82V[_a\x13\xCAa\x18\xEAV[\x90Pa\x13\xD4a \xE2V[\x84Q`\x01`\x01`@\x1B\x03\x90\x81\x16\x82R` \x80\x87\x01\x80Q\x90\x92\x16\x90\x83\x01R`@\x80\x87\x01Q\x90\x83\x01R`\x06T``\x83\x01R`\x07T`\x80\x83\x01R`\x08T`\xA0\x83\x01R`\x05T`\xC0\x83\x01RQa\x14%\x90a\x0E\xB4V[\x15a\x14WW` \x84\x01Q`\xE0\x82\x01R`@\x84\x01Qa\x01\0\x82\x01R``\x84\x01Qa\x01 \x82\x01R\x83Qa\x01@\x82\x01Ra\x14{V[`\x06T`\xE0\x82\x01R`\x07Ta\x01\0\x82\x01R`\x08Ta\x01 \x82\x01R`\x05Ta\x01@\x82\x01R[`@Qc\xFC\x86`\xC7`\xE0\x1B\x81Rs_\xBD\xB21Vx\xAF\xEC\xB3g\xF02\xD9?d/d\x18\n\xA3\x90c\xFC\x86`\xC7\x90a\x14\xB6\x90\x85\x90\x85\x90\x88\x90`\x04\x01a+\xF1V[` `@Q\x80\x83\x03\x81\x86Z\xF4\x15\x80\x15a\x14\xD1W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x14\xF5\x91\x90a.\x1FV[a\x15\x12W`@Qc\t\xBD\xE39`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPPV[`\x0ET\x15\x80\x15\x90a\x15\x8EWP`\rT`\x0E\x80T`\x01`\xA0\x1B\x83\x04c\xFF\xFF\xFF\xFF\x16\x92`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x15YWa\x15Ya)^V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01Ta\x15\x83\x90`\x01`@\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x84a.>V[`\x01`\x01`@\x1B\x03\x16\x11[\x15a\x16!W`\rT`\x0E\x80T\x90\x91`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x15\xBBWa\x15\xBBa)^V[_\x91\x82R` \x82 `\x02\x90\x91\x02\x01\x80T`\x01`\x01`\xC0\x1B\x03\x19\x16\x81U`\x01\x01U`\r\x80T`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90`\x18a\x15\xFB\x83a.^V[\x91\x90a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UPP[`@\x80Q`\x80\x81\x01\x82R`\x01`\x01`@\x1B\x03\x94\x85\x16\x81R\x92\x84\x16` \x80\x85\x01\x91\x82R\x83\x01Q\x85\x16\x84\x83\x01\x90\x81R\x92\x90\x91\x01Q``\x84\x01\x90\x81R`\x0E\x80T`\x01\x81\x01\x82U_\x91\x90\x91R\x93Q`\x02\x90\x94\x02\x7F\xBB{JEM\xC3I9#H/\x07\x82#)\xED\x19\xE8$N\xFFX,\xC2\x04\xF8UL6 \xC3\xFD\x81\x01\x80T\x93Q\x94Q\x87\x16`\x01`\x80\x1B\x02g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`\x80\x1B\x19\x95\x88\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x95\x16\x96\x90\x97\x16\x95\x90\x95\x17\x92\x90\x92\x17\x92\x90\x92\x16\x93\x90\x93\x17\x90\x91UQ\x7F\xBB{JEM\xC3I9#H/\x07\x82#)\xED\x19\xE8$N\xFFX,\xC2\x04\xF8UL6 \xC3\xFE\x90\x91\x01UV[a\x17\na\x1F\x15V[a\x10\x94\x81a\x1F^V[a\x08ua\x1F\x15V[\x83Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80a\x17?WP` \x84\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80a\x17LWP` \x83\x01Q\x15[\x80a\x17YWP`@\x83\x01Q\x15[\x80a\x17fWP``\x83\x01Q\x15[\x80a\x17pWP\x82Q\x15[\x80a\x17\x82WPa\x0E\x10\x82c\xFF\xFF\xFF\xFF\x16\x10[\x80a\x17\x96WPc\x01\xE13\x80\x82c\xFF\xFF\xFF\xFF\x16\x11[\x80a\x17\xA8WP`\x01`\x01`@\x1B\x03\x81\x16\x15[\x15a\x17\xC6W`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x83Q`\t\x80T` \x80\x88\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x93\x84\x16\x95\x82\x16\x95\x86\x17\x81\x17\x90\x94U`@\x98\x89\x01Q`\n\x81\x90U`\x0B\x80T\x90\x94\x16\x90\x95\x17\x90\x93\x17\x90\x91U`\x0C\x92\x90\x92U\x84Q`\x01\x81\x90U\x91\x85\x01Q`\x02\x81\x90U\x95\x85\x01Q`\x03\x81\x90U``\x90\x95\x01Q`\x04\x81\x90U`\x05\x92\x90\x92U`\x06\x95\x90\x95U`\x07\x93\x90\x93U`\x08\x92\x90\x92U`\r\x80Tc\xFF\xFF\xFF\xFF\x90\x92\x16`\x01`\xA0\x1B\x02c\xFF\xFF\xFF\xFF`\xA0\x1B\x19\x90\x92\x16\x91\x90\x91\x17\x90U_\x80T\x91\x90\x92\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x91\x90\x91\x16\x17\x90UV[a\x18\x9E\x82a\x1FfV[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90_\x90\xA2\x80Q\x15a\x18\xE2Wa\x12\x93\x82\x82a\x1F\xC9V[a\x07\xEAa ;V[a\x18\xF2a!\x01V[b\x10\0\0\x81R`\x0B` \x82\x01R\x7F&\x86~\xE5\x8A\xAF\x86\x0F\xC9\xE0\xE3\xA7\x86f\xFF\xC5\x1F;\xA1\xAD\x8A\xE0\x01\xC1\x96\x83\x0CU\xB5\xAF\x0B\x8C`@\x82\x01QR\x7F\t\x120\xAD\xB7S\xF8(\x15\x15\x12w\x06\x0C\xC5kTk\xB2\xE9P\xA0\xDE\x19\xED\x06\x1E\xC6\x8C\x07\x1A\x90` `@\x83\x01Q\x01R\x7F\x02\xA5\t\xA0m\x8CV\xF8? F\x88\xFFnB\xEA\xC6\xE3\xCB\xDD\x06;\tq\xA3\xAF\x95>\x81\xBA\xDB\xB6``\x82\x01QR\x7F\x06\xF4>\xD2\xB9\xCE\xCE5\xD1 \x1A\xBC\x13\xFF\xDA\xEA5V\x0C\xF0\xF1Dbw\x13\x8C\xE8\x12\xB9\xAD\x9F9` ``\x83\x01Q\x01R\x7F\x1AX\x8C\x99\xAD\x88\xF7\x89\xC8w\"\xB0a\xBBU5\xDA\xA0\xAB\xCC\x1D\xC6\xD1v\xD7\xFE\xA5\x1E]\x80\xB9&`\x80\x82\x01QR\x7F b\xB9\x95\xE6\x1Aj\xB8\xAA\xB6\xCDnu \xB8y\xD8O\x96Z\xB1\xF0\x94\xC1\x04\xF0\xC1!;(\x03\x8B` `\x80\x83\x01Q\x01R\x7F!\xA2\xFDvj\x0C\xEB\xEC\xFD\xBF\xDF\xE5a9\xA1\xBB\xD9\xAE\xC1^.5\xBE\x8E\xF0\x194\xA0\xECC\x86\x85`\xA0\x82\x01QR\x7F \xFEP\n\xC7\xD1\xAAx \xDB\x8Co\x7F\x9DP\x9E;.\x88s\x1E:\x12\xDDe\xF0oC\xCA\x93\r\xA0` `\xA0\x83\x01Q\x01R\x7F\n\xB5=\x12\x85\xC7\xF4\x81\x9B?\xF6\xE1\xDD\xAD\xA6\xBF%\x15\xD3K\xBA\xF6\x11\x86\xC6\xA0K\xE4}\xFDe\xA3`\xC0\x82\x01QR\x7F\x0B\x80\xA9\x87\x80\x82\xCD\xFD\xD9\xFC\xC1k\xB3?\xA4$\xC0\xADf\xB8\x19I\xBFd!S\xD3\xC7\xAD\x08/\"` `\xC0\x83\x01Q\x01R\x7F\x1B\x90\x0F\x8E_\x8E\x80d\xA5\x88\x8A\x1B\xD7\x96\xB5J&R\xFC\x02\x03O\xE4\xB6\xE6\xFC\x8DfP\xF7E;`\xE0\x82\x01QR~\xCC\xA2X\xA8\x83,d\xD1\xF8\xE1r\x1Ax\xFC%\xB1=)\xAD\xBB\x81\xE3Zy\xFC/I\xF8\x90'\x86` `\xE0\x83\x01Q\x01R\x7F\r\x1D3H\xD6B\xE6\xF2\xE9s\x9Ds]\x8Cr6v\xDB\xAE\xFD\xCB\xB4\xE9fA\xDE\xFA5=&\xEB\xB3a\x01\0\x82\x01QR\x7F\x14\xFE\x9Dj3Q\x04\xE7I\x1C\xA6\xD5\x08a\x13\xE6\xB0\xF5)F\x96\rrfdf{\xD5\x859\xD4\x1E` a\x01\0\x83\x01Q\x01R\x7F\x1D\xA9CdD\x0CN?\xB8\xAF-6<\xDE\xFAN\xDD\xA47W\x9E\x1B\x05j\x16\xA5\xE9\xA1\x1D\xFF\xA2\xABa\x01 \x82\x01QR\x7F\n\x07{\xD3\x07\xED1\"-\xB5\\\xB0\x12\x8B\xAF\xCE^\"U{W\xF5\xAC\x91SY\xC5\x02\x96\xCB\\w` a\x01 \x83\x01Q\x01R\x7F(\xFF\x80\xB13\xD9\x89#\\q)\xDE\xA5Di\xB7\x80\xACG\x17D\x92\x90\x06~|\x9A}[\xE7\xDB\xD5a\x01@\x82\x01QR\x7F\x1C\x0F\xC2.\xEF#\xB5\n-\xDCU?\x9F\xC1\xB6\x1F\xD8\xC5zX\xCA2\x1A\x82\x9C~\xC2U\xF7W\xB3\xA6` a\x01@\x83\x01Q\x01R~^\xE7rr\x95\x96a\xE0\xFB\xAB\xDAC\x17w\xFAr\x9F[S/Da\x01\x80\x82\x01QR~\x8D\x9E\xE0\x0Fy\x9C\xF0\x06\x08\xB0\x82\xD0;\x9D\xE5\xA4+\x81&\xC3_\xBF\xBD\x1E`!\x08\xDF\x10\xE0\xE3` a\x01\x80\x83\x01Q\x01R\x7F/Rli\x81d?\xF6\xF6\xE9\xD2\xB5\xA9!\xE0l\xF9_'F)\xB5\xA1E\xBDU+\x7F\xDAj\x87\0a\x01\xA0\x82\x01QR\x7F/\xE7\x10\x8F\xD4\xE2B1\xF3\xDA\xDBn\t\x07.\x10o\xCA\x06\x94\xFE9\xDF\xF9eW\xA8\x82!\xA8\x9AP` a\x01\xA0\x83\x01Q\x01R\x7F&\xA3V\x85\x98\xA6\x98\x1Ec%\xF4\x81g6\xE3\x81\x08{[\x0EK'\xEF6M\x8A\xE1\xE2\x9F\xE9\xDF\x99a\x01\xC0\x82\x01QR\x7F\x1D\xB8\x1C\xDF\x82\xA9\xEC\x99\xF3\xC9qm\xF2-81~k\xB8O\xC5}/\x0E{+\xC8\xA0V\x9F|\xC4` a\x01\xC0\x83\x01Q\x01R~\x99\x88\x80\x88\xE1\x1D\xE6\xED\x08l\x99\xB9\xBB\xA9\x86\xD9\x08\xDF[\x0CP\x07h\r\x97V}HW\x19\x94a\x01\xE0\x82\x01QR\x7F\x1F\x91Wn\xAD\xFF\xFF\x93+nT\xBA\xB0\"\xF9?o\xEC>[vt\xD0\0k\xC5\xF2\"5'\xA3H` a\x01\xE0\x83\x01Q\x01R~h\xB3\xC1\x17\xEE~\x84\xD6\xB6p\xB6\xAF \x19wY\xEC\x80\xD3O#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a\x08uW`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x10]a\x1F\x15V[\x80`\x01`\x01`\xA0\x1B\x03\x16;_\x03a\x1F\x9BW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x10\x82V[_\x80Q` a.\x9F\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[``_\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x1F\xE5\x91\x90a.\x83V[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a \x1DW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a \"V[``\x91P[P\x91P\x91Pa 2\x85\x83\x83a ZV[\x95\x94PPPPPV[4\x15a\x08uW`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a oWa j\x82a \xB9V[a \xB2V[\x81Q\x15\x80\x15a \x86WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a \xAFW`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x10\x82V[P\x80[\x93\x92PPPV[\x80Q\x15a \xC9W\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`@Q\x80a\x01`\x01`@R\x80`\x0B\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80a\x02\xC0\x01`@R\x80_\x81R` \x01_\x81R` \x01a!4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a!T`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a!t`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a!\x94`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a!\xB4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a!\xD4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a!\xF4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"\x14`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"T`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"t`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"\x94`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"\xB4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"\xD4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\"\xF4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a#\x14`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a#4`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a#T`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R_` \x82\x01\x81\x90R`@\x90\x91\x01R\x90V[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x0E\xF1W_\x80\xFD[_` \x82\x84\x03\x12\x15a#\x8DW_\x80\xFD[a \xB2\x82a#gV[_` \x82\x84\x03\x12\x15a#\xA6W_\x80\xFD[P5\x91\x90PV[cNH{q`\xE0\x1B_R`A`\x04R`$_\xFD[`@Qa\x02\xE0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a#\xE4Wa#\xE4a#\xADV[`@R\x90V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a$\x12Wa$\x12a#\xADV[`@R\x91\x90PV[_\x80`@\x83\x85\x03\x12\x15a$+W_\x80\xFD[a$4\x83a#gV[\x91P` \x80\x84\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a$PW_\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12a$cW_\x80\xFD[\x815\x81\x81\x11\x15a$uWa$ua#\xADV[a$\x87`\x1F\x82\x01`\x1F\x19\x16\x85\x01a#\xEAV[\x91P\x80\x82R\x87\x84\x82\x85\x01\x01\x11\x15a$\x9CW_\x80\xFD[\x80\x84\x84\x01\x85\x84\x017_\x84\x82\x84\x01\x01RP\x80\x93PPPP\x92P\x92\x90PV[\x805`\x01`\x01`@\x1B\x03\x81\x16\x81\x14a\x0E\xF1W_\x80\xFD[_``\x82\x84\x03\x12\x15a$\xDFW_\x80\xFD[`@Q``\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a%\x01Wa%\x01a#\xADV[`@R\x90P\x80a%\x10\x83a$\xB9V[\x81Ra%\x1E` \x84\x01a$\xB9V[` \x82\x01R`@\x83\x015`@\x82\x01RP\x92\x91PPV[_`\x80\x82\x84\x03\x12\x15a%DW_\x80\xFD[`@Q`\x80\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a%fWa%fa#\xADV[\x80`@RP\x80\x91P\x825\x81R` \x83\x015` \x82\x01R`@\x83\x015`@\x82\x01R``\x83\x015``\x82\x01RP\x92\x91PPV[_`@\x82\x84\x03\x12\x15a%\xA7W_\x80\xFD[`@Q`@\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a%\xC9Wa%\xC9a#\xADV[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[_\x80_\x83\x85\x03a\x05`\x81\x12\x15a%\xF7W_\x80\xFD[a&\x01\x86\x86a$\xCFV[\x93Pa&\x10\x86``\x87\x01a%4V[\x92Pa\x04\x80\x80`\xDF\x19\x83\x01\x12\x15a&%W_\x80\xFD[a&-a#\xC1V[\x91Pa&<\x87`\xE0\x88\x01a%\x97V[\x82Ra\x01 a&M\x88\x82\x89\x01a%\x97V[` \x84\x01Ra\x01`a&a\x89\x82\x8A\x01a%\x97V[`@\x85\x01Ra\x01\xA0a&u\x8A\x82\x8B\x01a%\x97V[``\x86\x01Ra\x01\xE0a&\x89\x8B\x82\x8C\x01a%\x97V[`\x80\x87\x01Ra\x02 a&\x9D\x8C\x82\x8D\x01a%\x97V[`\xA0\x88\x01Ra\x02`a&\xB1\x8D\x82\x8E\x01a%\x97V[`\xC0\x89\x01Ra\x02\xA0a&\xC5\x8E\x82\x8F\x01a%\x97V[`\xE0\x8A\x01Ra&\xD8\x8Ea\x02\xE0\x8F\x01a%\x97V[a\x01\0\x8A\x01Ra&\xEC\x8Ea\x03 \x8F\x01a%\x97V[\x87\x8A\x01Ra&\xFE\x8Ea\x03`\x8F\x01a%\x97V[a\x01@\x8A\x01Ra'\x12\x8Ea\x03\xA0\x8F\x01a%\x97V[\x86\x8A\x01Ra'$\x8Ea\x03\xE0\x8F\x01a%\x97V[a\x01\x80\x8A\x01Ra\x04 \x8D\x015\x85\x8A\x01Ra\x04@\x8D\x015a\x01\xC0\x8A\x01Ra\x04`\x8D\x015\x84\x8A\x01R\x87\x8D\x015a\x02\0\x8A\x01Ra\x04\xA0\x8D\x015\x83\x8A\x01Ra\x04\xC0\x8D\x015a\x02@\x8A\x01Ra\x04\xE0\x8D\x015\x82\x8A\x01Ra\x05\0\x8D\x015a\x02\x80\x8A\x01Ra\x05 \x8D\x015\x81\x8A\x01RPPPPPPPPa\x05@\x85\x015a\x02\xC0\x82\x01R\x80\x91PP\x92P\x92P\x92V[\x805c\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x0E\xF1W_\x80\xFD[_\x80_\x80_a\x01@\x86\x88\x03\x12\x15a'\xD1W_\x80\xFD[a'\xDB\x87\x87a$\xCFV[\x94Pa'\xEA\x87``\x88\x01a%4V[\x93Pa'\xF8`\xE0\x87\x01a'\xA9V[\x92Pa(\x07a\x01\0\x87\x01a#gV[\x91Pa(\x16a\x01 \x87\x01a$\xB9V[\x90P\x92\x95P\x92\x95\x90\x93PV[_\x80`@\x83\x85\x03\x12\x15a(3W_\x80\xFD[a(<\x83a$\xB9V[\x91Pa(J` \x84\x01a$\xB9V[\x90P\x92P\x92\x90PV[_` \x82\x84\x03\x12\x15a(cW_\x80\xFD[a \xB2\x82a'\xA9V[_` \x82\x84\x03\x12\x15a(|W_\x80\xFD[a \xB2\x82a$\xB9V[_[\x83\x81\x10\x15a(\x9FW\x81\x81\x01Q\x83\x82\x01R` \x01a(\x87V[PP_\x91\x01RV[` \x81R_\x82Q\x80` \x84\x01Ra(\xC5\x81`@\x85\x01` \x87\x01a(\x85V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[_\x80`@\x83\x85\x03\x12\x15a(\xEAW_\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[_` \x82\x84\x03\x12\x15a)\tW_\x80\xFD[PQ\x91\x90PV[cNH{q`\xE0\x1B_R`\x11`\x04R`$_\xFD[`\x01`\x01`@\x1B\x03\x81\x81\x16\x83\x82\x16\x01\x90\x80\x82\x11\x15a)DWa)Da)\x10V[P\x92\x91PPV[\x81\x81\x03\x81\x81\x11\x15a\x0E%Wa\x0E%a)\x10V[cNH{q`\xE0\x1B_R`2`\x04R`$_\xFD[cNH{q`\xE0\x1B_R`\x12`\x04R`$_\xFD[_`\x01`\x01`@\x1B\x03\x80\x84\x16\x80a)\x9FWa)\x9Fa)rV[\x92\x16\x91\x90\x91\x06\x92\x91PPV[_`\x01`\x01`@\x1B\x03\x80\x84\x16\x80a)\xC4Wa)\xC4a)rV[\x92\x16\x91\x90\x91\x04\x92\x91PPV[_\x81a)\xDEWa)\xDEa)\x10V[P_\x19\x01\x90V[\x80_[`\x0B\x81\x10\x15a*\x07W\x81Q\x84R` \x93\x84\x01\x93\x90\x91\x01\x90`\x01\x01a)\xE8V[PPPPV[a*\"\x82\x82Q\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[` \x81\x81\x01Q\x80Q`@\x85\x01R\x90\x81\x01Q``\x84\x01RP`@\x81\x01Q\x80Q`\x80\x84\x01R` \x81\x01Q`\xA0\x84\x01RP``\x81\x01Q\x80Q`\xC0\x84\x01R` \x81\x01Q`\xE0\x84\x01RP`\x80\x81\x01Qa\x01\0a*\x85\x81\x85\x01\x83\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xA0\x83\x01Q\x91Pa\x01@a*\xA5\x81\x86\x01\x84\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xC0\x84\x01Q\x92Pa\x01\x80a*\xC5\x81\x87\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xE0\x85\x01Q\x93Pa\x01\xC0a*\xE5\x81\x88\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x85\x01Q\x93Pa\x02\0\x92a+\x05\x87\x85\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01 \x86\x01Q\x94Pa\x02@a+&\x81\x89\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x86\x01Q\x94Pa\x02\x80\x92a+F\x88\x85\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01`\x87\x01Q\x95Pa\x02\xC0a+g\x81\x8A\x01\x88\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x87\x01Q\x80Qa\x03\0\x8A\x01R` \x01Qa\x03 \x89\x01Ra\x01\xA0\x87\x01Qa\x03@\x89\x01R\x90\x86\x01Qa\x03`\x88\x01Ra\x01\xE0\x86\x01Qa\x03\x80\x88\x01R\x92\x85\x01Qa\x03\xA0\x87\x01Ra\x02 \x85\x01Qa\x03\xC0\x87\x01R\x91\x84\x01Qa\x03\xE0\x86\x01Ra\x02`\x84\x01Qa\x04\0\x86\x01R\x83\x01Qa\x04 \x85\x01Ra\x02\xA0\x83\x01Qa\x04@\x85\x01R\x90\x91\x01Qa\x04`\x90\x92\x01\x91\x90\x91RPV[_a\n\xE0\x82\x01\x90P\x84Q\x82R` \x85\x01Q` \x83\x01R`@\x85\x01Qa,#`@\x84\x01\x82\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[P``\x85\x01Q\x80Q`\x80\x84\x01R` \x81\x01Q`\xA0\x84\x01RP`\x80\x85\x01Q\x80Q`\xC0\x84\x01R` \x81\x01Q`\xE0\x84\x01RP`\xA0\x85\x01Qa\x01\0a,p\x81\x85\x01\x83\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xC0\x87\x01Q\x91Pa\x01@a,\x90\x81\x86\x01\x84\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xE0\x88\x01Q\x92Pa\x01\x80a,\xB0\x81\x87\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x88\x01Q\x92Pa\x01\xC0\x91a,\xD0\x86\x84\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01 \x89\x01Q\x93Pa\x02\0a,\xF1\x81\x88\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x89\x01Q\x93Pa\x02@\x91a-\x11\x87\x84\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01`\x8A\x01Q\x94Pa\x02\x80a-2\x81\x89\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x8A\x01Q\x80Qa\x02\xC0\x89\x01R` \x90\x81\x01Qa\x02\xE0\x89\x01Ra\x01\xA0\x8B\x01Q\x80Qa\x03\0\x8A\x01R\x81\x01Qa\x03 \x89\x01R\x93\x8A\x01Q\x80Qa\x03@\x89\x01R\x84\x01Qa\x03`\x88\x01Ra\x01\xE0\x8A\x01Q\x80Qa\x03\x80\x89\x01R\x84\x01Qa\x03\xA0\x88\x01R\x89\x01Q\x80Qa\x03\xC0\x88\x01R\x83\x01Qa\x03\xE0\x87\x01Ra\x02 \x89\x01Q\x80Qa\x04\0\x88\x01R\x83\x01Qa\x04 \x87\x01R\x90\x88\x01Q\x80Qa\x04@\x87\x01R\x82\x01Qa\x04`\x86\x01Ra\x02`\x88\x01Q\x80Qa\x04\x80\x87\x01R\x90\x91\x01Qa\x04\xA0\x85\x01R\x86\x01Qa\x04\xC0\x84\x01RPa\x02\xA0\x85\x01Qa\x04\xE0\x83\x01Ra.\ta\x05\0\x83\x01\x85a)\xE5V[a.\x17a\x06`\x83\x01\x84a*\rV[\x94\x93PPPPV[_` \x82\x84\x03\x12\x15a./W_\x80\xFD[\x81Q\x80\x15\x15\x81\x14a \xB2W_\x80\xFD[`\x01`\x01`@\x1B\x03\x82\x81\x16\x82\x82\x16\x03\x90\x80\x82\x11\x15a)DWa)Da)\x10V[_`\x01`\x01`@\x1B\x03\x80\x83\x16\x81\x81\x03a.yWa.ya)\x10V[`\x01\x01\x93\x92PPPV[_\x82Qa.\x94\x81\x84` \x87\x01a(\x85V[\x91\x90\x91\x01\x92\x91PPV\xFE6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\xA1dsolcC\0\x08\x17\0\n", ); /**Custom error with signature `AddressEmptyCode(address)` and selector `0x9996b315`. ```solidity @@ -3630,6 +3784,66 @@ pub mod LightClientArbitrum { } } }; + /**Custom error with signature `MissingLastBlockInEpochUpdate()` and selector `0x7150de45`. + ```solidity + error MissingLastBlockInEpochUpdate(); + ```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct MissingLastBlockInEpochUpdate {} + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: MissingLastBlockInEpochUpdate) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for MissingLastBlockInEpochUpdate { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for MissingLastBlockInEpochUpdate { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "MissingLastBlockInEpochUpdate()"; + const SELECTOR: [u8; 4] = [113u8, 80u8, 222u8, 69u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + } + }; /**Custom error with signature `NoChangeRequired()` and selector `0xa863aec9`. ```solidity error NoChangeRequired(); @@ -4286,9 +4500,9 @@ pub mod LightClientArbitrum { } } }; - /**Event with signature `NewState(uint64,uint64,uint256)` and selector `0xa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6`. + /**Event with signature `NewEpoch(uint64)` and selector `0x31eabd9099fdb25dacddd206abff87311e553441fc9d0fcdef201062d7e7071b`. ```solidity - event NewState(uint64 indexed viewNum, uint64 indexed blockHeight, BN254.ScalarField blockCommRoot); + event NewEpoch(uint64 epoch); ```*/ #[allow( non_camel_case_types, @@ -4297,13 +4511,9 @@ pub mod LightClientArbitrum { clippy::style )] #[derive(Clone)] - pub struct NewState { - #[allow(missing_docs)] - pub viewNum: u64, - #[allow(missing_docs)] - pub blockHeight: u64, + pub struct NewEpoch { #[allow(missing_docs)] - pub blockCommRoot: ::RustType, + pub epoch: u64, } #[allow( non_camel_case_types, @@ -4314,20 +4524,16 @@ pub mod LightClientArbitrum { const _: () = { use alloy::sol_types as alloy_sol_types; #[automatically_derived] - impl alloy_sol_types::SolEvent for NewState { - type DataTuple<'a> = (BN254::ScalarField,); + impl alloy_sol_types::SolEvent for NewEpoch { + type DataTuple<'a> = (alloy::sol_types::sol_data::Uint<64>,); type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - type TopicList = ( - alloy_sol_types::sol_data::FixedBytes<32>, - alloy::sol_types::sol_data::Uint<64>, - alloy::sol_types::sol_data::Uint<64>, - ); - const SIGNATURE: &'static str = "NewState(uint64,uint64,uint256)"; + type TopicList = (alloy_sol_types::sol_data::FixedBytes<32>,); + const SIGNATURE: &'static str = "NewEpoch(uint64)"; const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ - 160u8, 74u8, 119u8, 57u8, 36u8, 80u8, 90u8, 65u8, 133u8, 100u8, 54u8, 55u8, - 37u8, 245u8, 104u8, 50u8, 245u8, 119u8, 46u8, 107u8, 141u8, 13u8, 189u8, 110u8, - 252u8, 231u8, 36u8, 223u8, 232u8, 3u8, 218u8, 230u8, + 49u8, 234u8, 189u8, 144u8, 153u8, 253u8, 178u8, 93u8, 172u8, 221u8, 210u8, 6u8, + 171u8, 255u8, 135u8, 49u8, 30u8, 85u8, 52u8, 65u8, 252u8, 157u8, 15u8, 205u8, + 239u8, 32u8, 16u8, 98u8, 215u8, 231u8, 7u8, 27u8, ]); const ANONYMOUS: bool = false; #[allow(unused_variables)] @@ -4336,11 +4542,7 @@ pub mod LightClientArbitrum { topics: ::RustType, data: as alloy_sol_types::SolType>::RustType, ) -> Self { - Self { - viewNum: topics.1, - blockHeight: topics.2, - blockCommRoot: data.0, - } + Self { epoch: data.0 } } #[inline] fn check_signature( @@ -4357,17 +4559,15 @@ pub mod LightClientArbitrum { } #[inline] fn tokenize_body(&self) -> Self::DataToken<'_> { - (::tokenize( - &self.blockCommRoot, - ),) + ( + as alloy_sol_types::SolType>::tokenize( + &self.epoch, + ), + ) } #[inline] fn topics(&self) -> ::RustType { - ( - Self::SIGNATURE_HASH.into(), - self.viewNum.clone(), - self.blockHeight.clone(), - ) + (Self::SIGNATURE_HASH.into(),) } #[inline] fn encode_topics_raw( @@ -4378,17 +4578,11 @@ pub mod LightClientArbitrum { return Err(alloy_sol_types::Error::Overrun); } out[0usize] = alloy_sol_types::abi::token::WordToken(Self::SIGNATURE_HASH); - out[1usize] = as alloy_sol_types::EventTopic>::encode_topic(&self.viewNum); - out[2usize] = as alloy_sol_types::EventTopic>::encode_topic(&self.blockHeight); Ok(()) } } #[automatically_derived] - impl alloy_sol_types::private::IntoLogData for NewState { + impl alloy_sol_types::private::IntoLogData for NewEpoch { fn to_log_data(&self) -> alloy_sol_types::private::LogData { From::from(self) } @@ -4397,16 +4591,16 @@ pub mod LightClientArbitrum { } } #[automatically_derived] - impl From<&NewState> for alloy_sol_types::private::LogData { + impl From<&NewEpoch> for alloy_sol_types::private::LogData { #[inline] - fn from(this: &NewState) -> alloy_sol_types::private::LogData { + fn from(this: &NewEpoch) -> alloy_sol_types::private::LogData { alloy_sol_types::SolEvent::encode_log_data(this) } } }; - /**Event with signature `OwnershipTransferred(address,address)` and selector `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0`. + /**Event with signature `NewState(uint64,uint64,uint256)` and selector `0xa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6`. ```solidity - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + event NewState(uint64 indexed viewNum, uint64 indexed blockHeight, BN254.ScalarField blockCommRoot); ```*/ #[allow( non_camel_case_types, @@ -4415,11 +4609,13 @@ pub mod LightClientArbitrum { clippy::style )] #[derive(Clone)] - pub struct OwnershipTransferred { + pub struct NewState { #[allow(missing_docs)] - pub previousOwner: alloy::sol_types::private::Address, + pub viewNum: u64, #[allow(missing_docs)] - pub newOwner: alloy::sol_types::private::Address, + pub blockHeight: u64, + #[allow(missing_docs)] + pub blockCommRoot: ::RustType, } #[allow( non_camel_case_types, @@ -4430,15 +4626,131 @@ pub mod LightClientArbitrum { const _: () = { use alloy::sol_types as alloy_sol_types; #[automatically_derived] - impl alloy_sol_types::SolEvent for OwnershipTransferred { - type DataTuple<'a> = (); + impl alloy_sol_types::SolEvent for NewState { + type DataTuple<'a> = (BN254::ScalarField,); type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; type TopicList = ( alloy_sol_types::sol_data::FixedBytes<32>, - alloy::sol_types::sol_data::Address, - alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Uint<64>, + alloy::sol_types::sol_data::Uint<64>, ); - const SIGNATURE: &'static str = "OwnershipTransferred(address,address)"; + const SIGNATURE: &'static str = "NewState(uint64,uint64,uint256)"; + const SIGNATURE_HASH: alloy_sol_types::private::B256 = + alloy_sol_types::private::B256::new([ + 160u8, 74u8, 119u8, 57u8, 36u8, 80u8, 90u8, 65u8, 133u8, 100u8, 54u8, 55u8, + 37u8, 245u8, 104u8, 50u8, 245u8, 119u8, 46u8, 107u8, 141u8, 13u8, 189u8, 110u8, + 252u8, 231u8, 36u8, 223u8, 232u8, 3u8, 218u8, 230u8, + ]); + const ANONYMOUS: bool = false; + #[allow(unused_variables)] + #[inline] + fn new( + topics: ::RustType, + data: as alloy_sol_types::SolType>::RustType, + ) -> Self { + Self { + viewNum: topics.1, + blockHeight: topics.2, + blockCommRoot: data.0, + } + } + #[inline] + fn check_signature( + topics: &::RustType, + ) -> alloy_sol_types::Result<()> { + if topics.0 != Self::SIGNATURE_HASH { + return Err(alloy_sol_types::Error::invalid_event_signature_hash( + Self::SIGNATURE, + topics.0, + Self::SIGNATURE_HASH, + )); + } + Ok(()) + } + #[inline] + fn tokenize_body(&self) -> Self::DataToken<'_> { + (::tokenize( + &self.blockCommRoot, + ),) + } + #[inline] + fn topics(&self) -> ::RustType { + ( + Self::SIGNATURE_HASH.into(), + self.viewNum.clone(), + self.blockHeight.clone(), + ) + } + #[inline] + fn encode_topics_raw( + &self, + out: &mut [alloy_sol_types::abi::token::WordToken], + ) -> alloy_sol_types::Result<()> { + if out.len() < ::COUNT { + return Err(alloy_sol_types::Error::Overrun); + } + out[0usize] = alloy_sol_types::abi::token::WordToken(Self::SIGNATURE_HASH); + out[1usize] = as alloy_sol_types::EventTopic>::encode_topic(&self.viewNum); + out[2usize] = as alloy_sol_types::EventTopic>::encode_topic(&self.blockHeight); + Ok(()) + } + } + #[automatically_derived] + impl alloy_sol_types::private::IntoLogData for NewState { + fn to_log_data(&self) -> alloy_sol_types::private::LogData { + From::from(self) + } + fn into_log_data(self) -> alloy_sol_types::private::LogData { + From::from(&self) + } + } + #[automatically_derived] + impl From<&NewState> for alloy_sol_types::private::LogData { + #[inline] + fn from(this: &NewState) -> alloy_sol_types::private::LogData { + alloy_sol_types::SolEvent::encode_log_data(this) + } + } + }; + /**Event with signature `OwnershipTransferred(address,address)` and selector `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0`. + ```solidity + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + ```*/ + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + #[derive(Clone)] + pub struct OwnershipTransferred { + #[allow(missing_docs)] + pub previousOwner: alloy::sol_types::private::Address, + #[allow(missing_docs)] + pub newOwner: alloy::sol_types::private::Address, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::SolEvent for OwnershipTransferred { + type DataTuple<'a> = (); + type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + type TopicList = ( + alloy_sol_types::sol_data::FixedBytes<32>, + alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Address, + ); + const SIGNATURE: &'static str = "OwnershipTransferred(address,address)"; const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ 139u8, 224u8, 7u8, 156u8, 83u8, 22u8, 89u8, 20u8, 19u8, 68u8, 205u8, 31u8, @@ -5020,6 +5332,116 @@ pub mod LightClientArbitrum { } } }; + /**Function with signature `_blocksPerEpoch()` and selector `0xb2424e3f`. + ```solidity + function _blocksPerEpoch() external view returns (uint64); + ```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct _blocksPerEpochCall {} + ///Container type for the return parameters of the [`_blocksPerEpoch()`](_blocksPerEpochCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct _blocksPerEpochReturn { + pub _0: u64, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From<_blocksPerEpochCall> for UnderlyingRustTuple<'_> { + fn from(value: _blocksPerEpochCall) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for _blocksPerEpochCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<64>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (u64,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From<_blocksPerEpochReturn> for UnderlyingRustTuple<'_> { + fn from(value: _blocksPerEpochReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for _blocksPerEpochReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for _blocksPerEpochCall { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = _blocksPerEpochReturn; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<64>,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "_blocksPerEpoch()"; + const SELECTOR: [u8; 4] = [178u8, 66u8, 78u8, 63u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn abi_decode_returns( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence( + data, validate, + ) + .map(Into::into) + } + } + }; /**Function with signature `currentBlockNumber()` and selector `0x378ec23b`. ```solidity function currentBlockNumber() external view returns (uint256); @@ -5130,6 +5552,116 @@ pub mod LightClientArbitrum { } } }; + /**Function with signature `currentEpoch()` and selector `0x76671808`. + ```solidity + function currentEpoch() external view returns (uint64); + ```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct currentEpochCall {} + ///Container type for the return parameters of the [`currentEpoch()`](currentEpochCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct currentEpochReturn { + pub _0: u64, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: currentEpochCall) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for currentEpochCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<64>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (u64,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: currentEpochReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for currentEpochReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for currentEpochCall { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = currentEpochReturn; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<64>,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "currentEpoch()"; + const SELECTOR: [u8; 4] = [118u8, 103u8, 24u8, 8u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn abi_decode_returns( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence( + data, validate, + ) + .map(Into::into) + } + } + }; /**Function with signature `disablePermissionedProverMode()` and selector `0x69cc6a04`. ```solidity function disablePermissionedProverMode() external; @@ -5208,14 +5740,136 @@ pub mod LightClientArbitrum { } } #[automatically_derived] - impl alloy_sol_types::SolCall for disablePermissionedProverModeCall { - type Parameters<'a> = (); + impl alloy_sol_types::SolCall for disablePermissionedProverModeCall { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = disablePermissionedProverModeReturn; + type ReturnTuple<'a> = (); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "disablePermissionedProverMode()"; + const SELECTOR: [u8; 4] = [105u8, 204u8, 106u8, 4u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn abi_decode_returns( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence( + data, validate, + ) + .map(Into::into) + } + } + }; + /**Function with signature `epochFromBlockNumber(uint64,uint64)` and selector `0x90c14390`. + ```solidity + function epochFromBlockNumber(uint64 blockNum, uint64 blocksPerEpoch) external pure returns (uint64); + ```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct epochFromBlockNumberCall { + pub blockNum: u64, + pub blocksPerEpoch: u64, + } + ///Container type for the return parameters of the [`epochFromBlockNumber(uint64,uint64)`](epochFromBlockNumberCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct epochFromBlockNumberReturn { + pub _0: u64, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<64>, + alloy::sol_types::sol_data::Uint<64>, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (u64, u64); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: epochFromBlockNumberCall) -> Self { + (value.blockNum, value.blocksPerEpoch) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for epochFromBlockNumberCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + blockNum: tuple.0, + blocksPerEpoch: tuple.1, + } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<64>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (u64,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: epochFromBlockNumberReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for epochFromBlockNumberReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for epochFromBlockNumberCall { + type Parameters<'a> = ( + alloy::sol_types::sol_data::Uint<64>, + alloy::sol_types::sol_data::Uint<64>, + ); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = disablePermissionedProverModeReturn; - type ReturnTuple<'a> = (); + type Return = epochFromBlockNumberReturn; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<64>,); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "disablePermissionedProverMode()"; - const SELECTOR: [u8; 4] = [105u8, 204u8, 106u8, 4u8]; + const SIGNATURE: &'static str = "epochFromBlockNumber(uint64,uint64)"; + const SELECTOR: [u8; 4] = [144u8, 193u8, 67u8, 144u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -5224,7 +5878,14 @@ pub mod LightClientArbitrum { } #[inline] fn tokenize(&self) -> Self::Token<'_> { - () + ( + as alloy_sol_types::SolType>::tokenize( + &self.blockNum, + ), + as alloy_sol_types::SolType>::tokenize( + &self.blocksPerEpoch, + ), + ) } #[inline] fn abi_decode_returns( @@ -5992,9 +6653,9 @@ pub mod LightClientArbitrum { } } }; - /**Function with signature `initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address)` and selector `0x9baa3cc9`. + /**Function with signature `initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address,uint64)` and selector `0x811f853f`. ```solidity - function initialize(LightClient.LightClientState memory _genesis, LightClient.StakeTableState memory _genesisStakeTableState, uint32 _stateHistoryRetentionPeriod, address owner) external; + function initialize(LightClient.LightClientState memory _genesis, LightClient.StakeTableState memory _genesisStakeTableState, uint32 _stateHistoryRetentionPeriod, address owner, uint64 blocksPerEpoch) external; ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] @@ -6004,8 +6665,9 @@ pub mod LightClientArbitrum { ::RustType, pub _stateHistoryRetentionPeriod: u32, pub owner: alloy::sol_types::private::Address, + pub blocksPerEpoch: u64, } - ///Container type for the return parameters of the [`initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address)`](initializeCall) function. + ///Container type for the return parameters of the [`initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address,uint64)`](initializeCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] pub struct initializeReturn {} @@ -6024,6 +6686,7 @@ pub mod LightClientArbitrum { LightClient::StakeTableState, alloy::sol_types::sol_data::Uint<32>, alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Uint<64>, ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( @@ -6031,6 +6694,7 @@ pub mod LightClientArbitrum { ::RustType, u32, alloy::sol_types::private::Address, + u64, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -6050,6 +6714,7 @@ pub mod LightClientArbitrum { value._genesisStakeTableState, value._stateHistoryRetentionPeriod, value.owner, + value.blocksPerEpoch, ) } } @@ -6062,6 +6727,7 @@ pub mod LightClientArbitrum { _genesisStakeTableState: tuple.1, _stateHistoryRetentionPeriod: tuple.2, owner: tuple.3, + blocksPerEpoch: tuple.4, } } } @@ -6102,13 +6768,14 @@ pub mod LightClientArbitrum { LightClient::StakeTableState, alloy::sol_types::sol_data::Uint<32>, alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Uint<64>, ); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; type Return = initializeReturn; type ReturnTuple<'a> = (); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address)"; - const SELECTOR: [u8; 4] = [155u8, 170u8, 60u8, 201u8]; + const SIGNATURE: &'static str = "initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address,uint64)"; + const SELECTOR: [u8; 4] = [129u8, 31u8, 133u8, 63u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -6130,6 +6797,127 @@ pub mod LightClientArbitrum { ::tokenize( &self.owner, ), + as alloy_sol_types::SolType>::tokenize( + &self.blocksPerEpoch, + ), + ) + } + #[inline] + fn abi_decode_returns( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence( + data, validate, + ) + .map(Into::into) + } + } + }; + /**Function with signature `isLastBlockInEpoch(uint64)` and selector `0xa1be8d52`. + ```solidity + function isLastBlockInEpoch(uint64 blockHeight) external view returns (bool); + ```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct isLastBlockInEpochCall { + pub blockHeight: u64, + } + ///Container type for the return parameters of the [`isLastBlockInEpoch(uint64)`](isLastBlockInEpochCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct isLastBlockInEpochReturn { + pub _0: bool, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<64>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (u64,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: isLastBlockInEpochCall) -> Self { + (value.blockHeight,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for isLastBlockInEpochCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + blockHeight: tuple.0, + } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Bool,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (bool,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: isLastBlockInEpochReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for isLastBlockInEpochReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for isLastBlockInEpochCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Uint<64>,); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = isLastBlockInEpochReturn; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Bool,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "isLastBlockInEpoch(uint64)"; + const SELECTOR: [u8; 4] = [161u8, 190u8, 141u8, 82u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize( + &self.blockHeight, + ), ) } #[inline] @@ -6386,17 +7174,18 @@ pub mod LightClientArbitrum { } } }; - /**Function with signature `newFinalizedState((uint64,uint64,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0x2063d4f7`. + /**Function with signature `newFinalizedState((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0x757c37ad`. ```solidity - function newFinalizedState(LightClient.LightClientState memory newState, IPlonkVerifier.PlonkProof memory proof) external; + function newFinalizedState(LightClient.LightClientState memory newState, LightClient.StakeTableState memory nextStakeTable, IPlonkVerifier.PlonkProof memory proof) external; ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] pub struct newFinalizedStateCall { pub newState: ::RustType, + pub nextStakeTable: ::RustType, pub proof: ::RustType, } - ///Container type for the return parameters of the [`newFinalizedState((uint64,uint64,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))`](newFinalizedStateCall) function. + ///Container type for the return parameters of the [`newFinalizedState((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))`](newFinalizedStateCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] pub struct newFinalizedStateReturn {} @@ -6410,11 +7199,15 @@ pub mod LightClientArbitrum { use alloy::sol_types as alloy_sol_types; { #[doc(hidden)] - type UnderlyingSolTuple<'a> = - (LightClient::LightClientState, IPlonkVerifier::PlonkProof); + type UnderlyingSolTuple<'a> = ( + LightClient::LightClientState, + LightClient::StakeTableState, + IPlonkVerifier::PlonkProof, + ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( ::RustType, + ::RustType, ::RustType, ); #[cfg(test)] @@ -6430,7 +7223,7 @@ pub mod LightClientArbitrum { #[doc(hidden)] impl ::core::convert::From for UnderlyingRustTuple<'_> { fn from(value: newFinalizedStateCall) -> Self { - (value.newState, value.proof) + (value.newState, value.nextStakeTable, value.proof) } } #[automatically_derived] @@ -6439,7 +7232,8 @@ pub mod LightClientArbitrum { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { newState: tuple.0, - proof: tuple.1, + nextStakeTable: tuple.1, + proof: tuple.2, } } } @@ -6475,13 +7269,17 @@ pub mod LightClientArbitrum { } #[automatically_derived] impl alloy_sol_types::SolCall for newFinalizedStateCall { - type Parameters<'a> = (LightClient::LightClientState, IPlonkVerifier::PlonkProof); + type Parameters<'a> = ( + LightClient::LightClientState, + LightClient::StakeTableState, + IPlonkVerifier::PlonkProof, + ); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; type Return = newFinalizedStateReturn; type ReturnTuple<'a> = (); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "newFinalizedState((uint64,uint64,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))"; - const SELECTOR: [u8; 4] = [32u8, 99u8, 212u8, 247u8]; + const SIGNATURE: &'static str = "newFinalizedState((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))"; + const SELECTOR: [u8; 4] = [117u8, 124u8, 55u8, 173u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -6494,6 +7292,9 @@ pub mod LightClientArbitrum { ::tokenize( &self.newState, ), + ::tokenize( + &self.nextStakeTable, + ), ::tokenize(&self.proof), ) } @@ -7607,28 +8408,155 @@ pub mod LightClientArbitrum { } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: transferOwnershipReturn) -> Self { + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: transferOwnershipReturn) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for transferOwnershipReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for transferOwnershipCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Address,); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = transferOwnershipReturn; + type ReturnTuple<'a> = (); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "transferOwnership(address)"; + const SELECTOR: [u8; 4] = [242u8, 253u8, 227u8, 139u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + ::tokenize( + &self.newOwner, + ), + ) + } + #[inline] + fn abi_decode_returns( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence( + data, validate, + ) + .map(Into::into) + } + } + }; + /**Function with signature `upgradeToAndCall(address,bytes)` and selector `0x4f1ef286`. + ```solidity + function upgradeToAndCall(address newImplementation, bytes memory data) external payable; + ```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct upgradeToAndCallCall { + pub newImplementation: alloy::sol_types::private::Address, + pub data: alloy::sol_types::private::Bytes, + } + ///Container type for the return parameters of the [`upgradeToAndCall(address,bytes)`](upgradeToAndCallCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct upgradeToAndCallReturn {} + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Bytes, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::Address, + alloy::sol_types::private::Bytes, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: upgradeToAndCallCall) -> Self { + (value.newImplementation, value.data) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for upgradeToAndCallCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + newImplementation: tuple.0, + data: tuple.1, + } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: upgradeToAndCallReturn) -> Self { () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for transferOwnershipReturn { + impl ::core::convert::From> for upgradeToAndCallReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self {} } } } #[automatically_derived] - impl alloy_sol_types::SolCall for transferOwnershipCall { - type Parameters<'a> = (alloy::sol_types::sol_data::Address,); + impl alloy_sol_types::SolCall for upgradeToAndCallCall { + type Parameters<'a> = ( + alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Bytes, + ); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = transferOwnershipReturn; + type Return = upgradeToAndCallReturn; type ReturnTuple<'a> = (); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "transferOwnership(address)"; - const SELECTOR: [u8; 4] = [242u8, 253u8, 227u8, 139u8]; + const SIGNATURE: &'static str = "upgradeToAndCall(address,bytes)"; + const SELECTOR: [u8; 4] = [79u8, 30u8, 242u8, 134u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -7639,7 +8567,10 @@ pub mod LightClientArbitrum { fn tokenize(&self) -> Self::Token<'_> { ( ::tokenize( - &self.newOwner, + &self.newImplementation, + ), + ::tokenize( + &self.data, ), ) } @@ -7655,20 +8586,22 @@ pub mod LightClientArbitrum { } } }; - /**Function with signature `upgradeToAndCall(address,bytes)` and selector `0x4f1ef286`. + /**Function with signature `votingStakeTableState()` and selector `0x0625e19b`. ```solidity - function upgradeToAndCall(address newImplementation, bytes memory data) external payable; + function votingStakeTableState() external view returns (uint256 threshold, BN254.ScalarField blsKeyComm, BN254.ScalarField schnorrKeyComm, BN254.ScalarField amountComm); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct upgradeToAndCallCall { - pub newImplementation: alloy::sol_types::private::Address, - pub data: alloy::sol_types::private::Bytes, - } - ///Container type for the return parameters of the [`upgradeToAndCall(address,bytes)`](upgradeToAndCallCall) function. + pub struct votingStakeTableStateCall {} + ///Container type for the return parameters of the [`votingStakeTableState()`](votingStakeTableStateCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct upgradeToAndCallReturn {} + pub struct votingStakeTableStateReturn { + pub threshold: alloy::sol_types::private::primitives::aliases::U256, + pub blsKeyComm: ::RustType, + pub schnorrKeyComm: ::RustType, + pub amountComm: ::RustType, + } #[allow( non_camel_case_types, non_snake_case, @@ -7679,15 +8612,9 @@ pub mod LightClientArbitrum { use alloy::sol_types as alloy_sol_types; { #[doc(hidden)] - type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::Address, - alloy::sol_types::sol_data::Bytes, - ); + type UnderlyingSolTuple<'a> = (); #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::Address, - alloy::sol_types::private::Bytes, - ); + type UnderlyingRustTuple<'a> = (); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { @@ -7699,27 +8626,34 @@ pub mod LightClientArbitrum { } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: upgradeToAndCallCall) -> Self { - (value.newImplementation, value.data) + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: votingStakeTableStateCall) -> Self { + () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for upgradeToAndCallCall { + impl ::core::convert::From> for votingStakeTableStateCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - newImplementation: tuple.0, - data: tuple.1, - } + Self {} } } } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (); + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + BN254::ScalarField, + BN254::ScalarField, + BN254::ScalarField, + ); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ::RustType, + ::RustType, + ::RustType, + ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { @@ -7731,31 +8665,43 @@ pub mod LightClientArbitrum { } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: upgradeToAndCallReturn) -> Self { - () + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: votingStakeTableStateReturn) -> Self { + ( + value.threshold, + value.blsKeyComm, + value.schnorrKeyComm, + value.amountComm, + ) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for upgradeToAndCallReturn { + impl ::core::convert::From> for votingStakeTableStateReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self {} + Self { + threshold: tuple.0, + blsKeyComm: tuple.1, + schnorrKeyComm: tuple.2, + amountComm: tuple.3, + } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for upgradeToAndCallCall { - type Parameters<'a> = ( - alloy::sol_types::sol_data::Address, - alloy::sol_types::sol_data::Bytes, - ); + impl alloy_sol_types::SolCall for votingStakeTableStateCall { + type Parameters<'a> = (); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = upgradeToAndCallReturn; - type ReturnTuple<'a> = (); + type Return = votingStakeTableStateReturn; + type ReturnTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + BN254::ScalarField, + BN254::ScalarField, + BN254::ScalarField, + ); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "upgradeToAndCall(address,bytes)"; - const SELECTOR: [u8; 4] = [79u8, 30u8, 242u8, 134u8]; + const SIGNATURE: &'static str = "votingStakeTableState()"; + const SELECTOR: [u8; 4] = [6u8, 37u8, 225u8, 155u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -7764,14 +8710,7 @@ pub mod LightClientArbitrum { } #[inline] fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.newImplementation, - ), - ::tokenize( - &self.data, - ), - ) + () } #[inline] fn abi_decode_returns( @@ -7788,8 +8727,11 @@ pub mod LightClientArbitrum { ///Container for all the [`LightClientArbitrum`](self) function calls. pub enum LightClientArbitrumCalls { UPGRADE_INTERFACE_VERSION(UPGRADE_INTERFACE_VERSIONCall), + _blocksPerEpoch(_blocksPerEpochCall), currentBlockNumber(currentBlockNumberCall), + currentEpoch(currentEpochCall), disablePermissionedProverMode(disablePermissionedProverModeCall), + epochFromBlockNumber(epochFromBlockNumberCall), finalizedState(finalizedStateCall), genesisStakeTableState(genesisStakeTableStateCall), genesisState(genesisStateCall), @@ -7797,6 +8739,7 @@ pub mod LightClientArbitrum { getStateHistoryCount(getStateHistoryCountCall), getVersion(getVersionCall), initialize(initializeCall), + isLastBlockInEpoch(isLastBlockInEpochCall), isPermissionedProverEnabled(isPermissionedProverEnabledCall), lagOverEscapeHatchThreshold(lagOverEscapeHatchThresholdCall), newFinalizedState(newFinalizedStateCall), @@ -7811,6 +8754,7 @@ pub mod LightClientArbitrum { stateHistoryRetentionPeriod(stateHistoryRetentionPeriodCall), transferOwnership(transferOwnershipCall), upgradeToAndCall(upgradeToAndCallCall), + votingStakeTableState(votingStakeTableStateCall), } #[automatically_derived] impl LightClientArbitrumCalls { @@ -7823,8 +8767,8 @@ pub mod LightClientArbitrum { pub const SELECTORS: &'static [[u8; 4usize]] = &[ [1u8, 63u8, 165u8, 252u8], [2u8, 181u8, 146u8, 243u8], + [6u8, 37u8, 225u8, 155u8], [13u8, 142u8, 110u8, 44u8], - [32u8, 99u8, 212u8, 247u8], [47u8, 121u8, 136u8, 157u8], [49u8, 61u8, 247u8, 177u8], [55u8, 142u8, 194u8, 59u8], @@ -7833,13 +8777,18 @@ pub mod LightClientArbitrum { [82u8, 209u8, 144u8, 45u8], [105u8, 204u8, 106u8, 4u8], [113u8, 80u8, 24u8, 166u8], + [117u8, 124u8, 55u8, 173u8], + [118u8, 103u8, 24u8, 8u8], + [129u8, 31u8, 133u8, 63u8], [130u8, 110u8, 65u8, 252u8], [133u8, 132u8, 210u8, 63u8], [141u8, 165u8, 203u8, 91u8], + [144u8, 193u8, 67u8, 144u8], [150u8, 193u8, 202u8, 97u8], - [155u8, 170u8, 60u8, 201u8], [159u8, 219u8, 84u8, 167u8], + [161u8, 190u8, 141u8, 82u8], [173u8, 60u8, 177u8, 204u8], + [178u8, 66u8, 78u8, 63u8], [194u8, 59u8, 158u8, 158u8], [210u8, 77u8, 147u8, 61u8], [224u8, 48u8, 51u8, 1u8], @@ -7851,19 +8800,26 @@ pub mod LightClientArbitrum { impl alloy_sol_types::SolInterface for LightClientArbitrumCalls { const NAME: &'static str = "LightClientArbitrumCalls"; const MIN_DATA_LENGTH: usize = 0usize; - const COUNT: usize = 24usize; + const COUNT: usize = 29usize; #[inline] fn selector(&self) -> [u8; 4] { match self { Self::UPGRADE_INTERFACE_VERSION(_) => { ::SELECTOR } + Self::_blocksPerEpoch(_) => { + <_blocksPerEpochCall as alloy_sol_types::SolCall>::SELECTOR + } Self::currentBlockNumber(_) => { ::SELECTOR } + Self::currentEpoch(_) => ::SELECTOR, Self::disablePermissionedProverMode(_) => { ::SELECTOR } + Self::epochFromBlockNumber(_) => { + ::SELECTOR + } Self::finalizedState(_) => { ::SELECTOR } @@ -7879,6 +8835,9 @@ pub mod LightClientArbitrum { } Self::getVersion(_) => ::SELECTOR, Self::initialize(_) => ::SELECTOR, + Self::isLastBlockInEpoch(_) => { + ::SELECTOR + } Self::isPermissionedProverEnabled(_) => { ::SELECTOR } @@ -7917,6 +8876,9 @@ pub mod LightClientArbitrum { Self::upgradeToAndCall(_) => { ::SELECTOR } + Self::votingStakeTableState(_) => { + ::SELECTOR + } } } #[inline] @@ -7964,26 +8926,26 @@ pub mod LightClientArbitrum { stateHistoryCommitments }, { - fn getVersion( + fn votingStakeTableState( data: &[u8], validate: bool, ) -> alloy_sol_types::Result { - ::abi_decode_raw(data, validate) - .map(LightClientArbitrumCalls::getVersion) + ::abi_decode_raw( + data, validate, + ) + .map(LightClientArbitrumCalls::votingStakeTableState) } - getVersion + votingStakeTableState }, { - fn newFinalizedState( + fn getVersion( data: &[u8], validate: bool, ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, validate, - ) - .map(LightClientArbitrumCalls::newFinalizedState) + ::abi_decode_raw(data, validate) + .map(LightClientArbitrumCalls::getVersion) } - newFinalizedState + getVersion }, { fn stateHistoryFirstIndex( @@ -8082,6 +9044,40 @@ pub mod LightClientArbitrum { } renounceOwnership }, + { + fn newFinalizedState( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, validate, + ) + .map(LightClientArbitrumCalls::newFinalizedState) + } + newFinalizedState + }, + { + fn currentEpoch( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, validate, + ) + .map(LightClientArbitrumCalls::currentEpoch) + } + currentEpoch + }, + { + fn initialize( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + ::abi_decode_raw(data, validate) + .map(LightClientArbitrumCalls::initialize) + } + initialize + }, { fn isPermissionedProverEnabled( data: &[u8], @@ -8117,6 +9113,18 @@ pub mod LightClientArbitrum { } owner }, + { + fn epochFromBlockNumber( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, validate, + ) + .map(LightClientArbitrumCalls::epochFromBlockNumber) + } + epochFromBlockNumber + }, { fn setstateHistoryRetentionPeriod( data: &[u8], @@ -8133,26 +9141,28 @@ pub mod LightClientArbitrum { setstateHistoryRetentionPeriod }, { - fn initialize( + fn finalizedState( data: &[u8], validate: bool, ) -> alloy_sol_types::Result { - ::abi_decode_raw(data, validate) - .map(LightClientArbitrumCalls::initialize) + ::abi_decode_raw( + data, validate, + ) + .map(LightClientArbitrumCalls::finalizedState) } - initialize + finalizedState }, { - fn finalizedState( + fn isLastBlockInEpoch( data: &[u8], validate: bool, ) -> alloy_sol_types::Result { - ::abi_decode_raw( + ::abi_decode_raw( data, validate, ) - .map(LightClientArbitrumCalls::finalizedState) + .map(LightClientArbitrumCalls::isLastBlockInEpoch) } - finalizedState + isLastBlockInEpoch }, { fn UPGRADE_INTERFACE_VERSION( @@ -8166,6 +9176,18 @@ pub mod LightClientArbitrum { } UPGRADE_INTERFACE_VERSION }, + { + fn _blocksPerEpoch( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + <_blocksPerEpochCall as alloy_sol_types::SolCall>::abi_decode_raw( + data, validate, + ) + .map(LightClientArbitrumCalls::_blocksPerEpoch) + } + _blocksPerEpoch + }, { fn stateHistoryRetentionPeriod( data: &[u8], @@ -8245,16 +9267,31 @@ pub mod LightClientArbitrum { inner, ) } + Self::_blocksPerEpoch(inner) => { + <_blocksPerEpochCall as alloy_sol_types::SolCall>::abi_encoded_size( + inner, + ) + } Self::currentBlockNumber(inner) => { ::abi_encoded_size( inner, ) } + Self::currentEpoch(inner) => { + ::abi_encoded_size( + inner, + ) + } Self::disablePermissionedProverMode(inner) => { ::abi_encoded_size( inner, ) } + Self::epochFromBlockNumber(inner) => { + ::abi_encoded_size( + inner, + ) + } Self::finalizedState(inner) => { ::abi_encoded_size( inner, @@ -8286,6 +9323,11 @@ pub mod LightClientArbitrum { Self::initialize(inner) => { ::abi_encoded_size(inner) } + Self::isLastBlockInEpoch(inner) => { + ::abi_encoded_size( + inner, + ) + } Self::isPermissionedProverEnabled(inner) => { ::abi_encoded_size( inner, @@ -8354,6 +9396,11 @@ pub mod LightClientArbitrum { inner, ) } + Self::votingStakeTableState(inner) => { + ::abi_encoded_size( + inner, + ) + } } } #[inline] @@ -8364,14 +9411,25 @@ pub mod LightClientArbitrum { inner, out, ) } + Self::_blocksPerEpoch(inner) => { + <_blocksPerEpochCall as alloy_sol_types::SolCall>::abi_encode_raw(inner, out) + } Self::currentBlockNumber(inner) => { ::abi_encode_raw(inner, out) } + Self::currentEpoch(inner) => { + ::abi_encode_raw(inner, out) + } Self::disablePermissionedProverMode(inner) => { ::abi_encode_raw( inner, out, ) } + Self::epochFromBlockNumber(inner) => { + ::abi_encode_raw( + inner, out, + ) + } Self::finalizedState(inner) => { ::abi_encode_raw(inner, out) } @@ -8399,6 +9457,9 @@ pub mod LightClientArbitrum { Self::initialize(inner) => { ::abi_encode_raw(inner, out) } + Self::isLastBlockInEpoch(inner) => { + ::abi_encode_raw(inner, out) + } Self::isPermissionedProverEnabled(inner) => { ::abi_encode_raw( inner, out, @@ -8455,6 +9516,11 @@ pub mod LightClientArbitrum { Self::upgradeToAndCall(inner) => { ::abi_encode_raw(inner, out) } + Self::votingStakeTableState(inner) => { + ::abi_encode_raw( + inner, out, + ) + } } } } @@ -8471,6 +9537,7 @@ pub mod LightClientArbitrum { InvalidInitialization(InvalidInitialization), InvalidMaxStateHistory(InvalidMaxStateHistory), InvalidProof(InvalidProof), + MissingLastBlockInEpochUpdate(MissingLastBlockInEpochUpdate), NoChangeRequired(NoChangeRequired), NotInitializing(NotInitializing), OutdatedState(OutdatedState), @@ -8498,6 +9565,7 @@ pub mod LightClientArbitrum { [76u8, 156u8, 140u8, 227u8], [81u8, 97u8, 128u8, 137u8], [97u8, 90u8, 146u8, 100u8], + [113u8, 80u8, 222u8, 69u8], [153u8, 150u8, 179u8, 21u8], [161u8, 186u8, 7u8, 238u8], [163u8, 166u8, 71u8, 128u8], @@ -8516,7 +9584,7 @@ pub mod LightClientArbitrum { impl alloy_sol_types::SolInterface for LightClientArbitrumErrors { const NAME: &'static str = "LightClientArbitrumErrors"; const MIN_DATA_LENGTH: usize = 0usize; - const COUNT: usize = 20usize; + const COUNT: usize = 21usize; #[inline] fn selector(&self) -> [u8; 4] { match self { @@ -8547,6 +9615,9 @@ pub mod LightClientArbitrum { ::SELECTOR } Self::InvalidProof(_) => ::SELECTOR, + Self::MissingLastBlockInEpochUpdate(_) => { + ::SELECTOR + } Self::NoChangeRequired(_) => { ::SELECTOR } @@ -8689,6 +9760,21 @@ pub mod LightClientArbitrum { } InvalidHotShotBlockForCommitmentCheck }, + { + fn MissingLastBlockInEpochUpdate( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + validate, + ) + .map( + LightClientArbitrumErrors::MissingLastBlockInEpochUpdate, + ) + } + MissingLastBlockInEpochUpdate + }, { fn AddressEmptyCode( data: &[u8], @@ -8894,6 +9980,11 @@ pub mod LightClientArbitrum { Self::InvalidProof(inner) => { ::abi_encoded_size(inner) } + Self::MissingLastBlockInEpochUpdate(inner) => { + ::abi_encoded_size( + inner, + ) + } Self::NoChangeRequired(inner) => { ::abi_encoded_size( inner, @@ -9008,6 +10099,12 @@ pub mod LightClientArbitrum { out, ) } + Self::MissingLastBlockInEpochUpdate(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } Self::NoChangeRequired(inner) => { ::abi_encode_raw( inner, @@ -9068,6 +10165,7 @@ pub mod LightClientArbitrum { ///Container for all the [`LightClientArbitrum`](self) events. pub enum LightClientArbitrumEvents { Initialized(Initialized), + NewEpoch(NewEpoch), NewState(NewState), OwnershipTransferred(OwnershipTransferred), PermissionedProverNotRequired(PermissionedProverNotRequired), @@ -9084,6 +10182,11 @@ pub mod LightClientArbitrum { /// /// Prefer using `SolInterface` methods instead. pub const SELECTORS: &'static [[u8; 32usize]] = &[ + [ + 49u8, 234u8, 189u8, 144u8, 153u8, 253u8, 178u8, 93u8, 172u8, 221u8, 210u8, 6u8, + 171u8, 255u8, 135u8, 49u8, 30u8, 85u8, 52u8, 65u8, 252u8, 157u8, 15u8, 205u8, + 239u8, 32u8, 16u8, 98u8, 215u8, 231u8, 7u8, 27u8, + ], [ 128u8, 23u8, 187u8, 136u8, 127u8, 223u8, 143u8, 202u8, 67u8, 20u8, 169u8, 212u8, 15u8, 110u8, 115u8, 179u8, 184u8, 16u8, 2u8, 214u8, 126u8, 92u8, 250u8, 133u8, @@ -9124,7 +10227,7 @@ pub mod LightClientArbitrum { #[automatically_derived] impl alloy_sol_types::SolEventInterface for LightClientArbitrumEvents { const NAME: &'static str = "LightClientArbitrumEvents"; - const COUNT: usize = 7usize; + const COUNT: usize = 8usize; fn decode_raw_log( topics: &[alloy_sol_types::Word], data: &[u8], @@ -9137,6 +10240,10 @@ pub mod LightClientArbitrum { ) .map(Self::Initialized) } + Some(::SIGNATURE_HASH) => { + ::decode_raw_log(topics, data, validate) + .map(Self::NewEpoch) + } Some(::SIGNATURE_HASH) => { ::decode_raw_log(topics, data, validate) .map(Self::NewState) @@ -9186,6 +10293,7 @@ pub mod LightClientArbitrum { Self::Initialized(inner) => { alloy_sol_types::private::IntoLogData::to_log_data(inner) } + Self::NewEpoch(inner) => alloy_sol_types::private::IntoLogData::to_log_data(inner), Self::NewState(inner) => alloy_sol_types::private::IntoLogData::to_log_data(inner), Self::OwnershipTransferred(inner) => { alloy_sol_types::private::IntoLogData::to_log_data(inner) @@ -9205,6 +10313,9 @@ pub mod LightClientArbitrum { Self::Initialized(inner) => { alloy_sol_types::private::IntoLogData::into_log_data(inner) } + Self::NewEpoch(inner) => { + alloy_sol_types::private::IntoLogData::into_log_data(inner) + } Self::NewState(inner) => { alloy_sol_types::private::IntoLogData::into_log_data(inner) } @@ -9396,18 +10507,39 @@ pub mod LightClientArbitrum { ) -> alloy_contract::SolCallBuilder { self.call_builder(&UPGRADE_INTERFACE_VERSIONCall {}) } + ///Creates a new call builder for the [`_blocksPerEpoch`] function. + pub fn _blocksPerEpoch( + &self, + ) -> alloy_contract::SolCallBuilder { + self.call_builder(&_blocksPerEpochCall {}) + } ///Creates a new call builder for the [`currentBlockNumber`] function. pub fn currentBlockNumber( &self, ) -> alloy_contract::SolCallBuilder { self.call_builder(¤tBlockNumberCall {}) } + ///Creates a new call builder for the [`currentEpoch`] function. + pub fn currentEpoch(&self) -> alloy_contract::SolCallBuilder { + self.call_builder(¤tEpochCall {}) + } ///Creates a new call builder for the [`disablePermissionedProverMode`] function. pub fn disablePermissionedProverMode( &self, ) -> alloy_contract::SolCallBuilder { self.call_builder(&disablePermissionedProverModeCall {}) } + ///Creates a new call builder for the [`epochFromBlockNumber`] function. + pub fn epochFromBlockNumber( + &self, + blockNum: u64, + blocksPerEpoch: u64, + ) -> alloy_contract::SolCallBuilder { + self.call_builder(&epochFromBlockNumberCall { + blockNum, + blocksPerEpoch, + }) + } ///Creates a new call builder for the [`finalizedState`] function. pub fn finalizedState( &self, @@ -9448,14 +10580,23 @@ pub mod LightClientArbitrum { _genesisStakeTableState: ::RustType, _stateHistoryRetentionPeriod: u32, owner: alloy::sol_types::private::Address, + blocksPerEpoch: u64, ) -> alloy_contract::SolCallBuilder { self.call_builder(&initializeCall { _genesis, _genesisStakeTableState, _stateHistoryRetentionPeriod, owner, + blocksPerEpoch, }) } + ///Creates a new call builder for the [`isLastBlockInEpoch`] function. + pub fn isLastBlockInEpoch( + &self, + blockHeight: u64, + ) -> alloy_contract::SolCallBuilder { + self.call_builder(&isLastBlockInEpochCall { blockHeight }) + } ///Creates a new call builder for the [`isPermissionedProverEnabled`] function. pub fn isPermissionedProverEnabled( &self, @@ -9477,9 +10618,14 @@ pub mod LightClientArbitrum { pub fn newFinalizedState( &self, newState: ::RustType, + nextStakeTable: ::RustType, proof: ::RustType, ) -> alloy_contract::SolCallBuilder { - self.call_builder(&newFinalizedStateCall { newState, proof }) + self.call_builder(&newFinalizedStateCall { + newState, + nextStakeTable, + proof, + }) } ///Creates a new call builder for the [`owner`] function. pub fn owner(&self) -> alloy_contract::SolCallBuilder { @@ -9552,6 +10698,12 @@ pub mod LightClientArbitrum { data, }) } + ///Creates a new call builder for the [`votingStakeTableState`] function. + pub fn votingStakeTableState( + &self, + ) -> alloy_contract::SolCallBuilder { + self.call_builder(&votingStakeTableStateCall {}) + } } /// Event filters. #[automatically_derived] @@ -9574,6 +10726,10 @@ pub mod LightClientArbitrum { pub fn Initialized_filter(&self) -> alloy_contract::Event { self.event_filter::() } + ///Creates a new event filter for the [`NewEpoch`] event. + pub fn NewEpoch_filter(&self) -> alloy_contract::Event { + self.event_filter::() + } ///Creates a new event filter for the [`NewState`] event. pub fn NewState_filter(&self) -> alloy_contract::Event { self.event_filter::() diff --git a/contract-bindings-alloy/src/lightclientmock.rs b/contract-bindings-alloy/src/lightclientmock.rs index 6d30b708d7..e6bfe88735 100644 --- a/contract-bindings-alloy/src/lightclientmock.rs +++ b/contract-bindings-alloy/src/lightclientmock.rs @@ -2157,6 +2157,7 @@ interface LightClientMock { error InvalidInitialization(); error InvalidMaxStateHistory(); error InvalidProof(); + error MissingLastBlockInEpochUpdate(); error NoChangeRequired(); error NotInitializing(); error OutdatedState(); @@ -2168,6 +2169,7 @@ interface LightClientMock { error WrongStakeTableUsed(); event Initialized(uint64 version); + event NewEpoch(uint64 epoch); event NewState(uint64 indexed viewNum, uint64 indexed blockHeight, BN254.ScalarField blockCommRoot); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); event PermissionedProverNotRequired(); @@ -2175,25 +2177,30 @@ interface LightClientMock { event Upgrade(address implementation); event Upgraded(address indexed implementation); - constructor(LightClient.LightClientState genesis, LightClient.StakeTableState genesisStakeTableState, uint32 maxHistorySeconds); + constructor(LightClient.LightClientState genesis, LightClient.StakeTableState genesisStakeTableState, uint32 maxHistorySeconds, uint64 blocksPerEpoch); function UPGRADE_INTERFACE_VERSION() external view returns (string memory); + function _blocksPerEpoch() external view returns (uint64); function currentBlockNumber() external view returns (uint256); + function currentEpoch() external view returns (uint64); function disablePermissionedProverMode() external; + function epochFromBlockNumber(uint64 blockNum, uint64 blocksPerEpoch) external pure returns (uint64); function finalizedState() external view returns (uint64 viewNum, uint64 blockHeight, BN254.ScalarField blockCommRoot); function genesisStakeTableState() external view returns (uint256 threshold, BN254.ScalarField blsKeyComm, BN254.ScalarField schnorrKeyComm, BN254.ScalarField amountComm); function genesisState() external view returns (uint64 viewNum, uint64 blockHeight, BN254.ScalarField blockCommRoot); function getHotShotCommitment(uint256 hotShotBlockHeight) external view returns (BN254.ScalarField hotShotBlockCommRoot, uint64 hotshotBlockHeight); function getStateHistoryCount() external view returns (uint256); function getVersion() external pure returns (uint8 majorVersion, uint8 minorVersion, uint8 patchVersion); - function initialize(LightClient.LightClientState memory _genesis, LightClient.StakeTableState memory _genesisStakeTableState, uint32 _stateHistoryRetentionPeriod, address owner) external; + function initialize(LightClient.LightClientState memory _genesis, LightClient.StakeTableState memory _genesisStakeTableState, uint32 _stateHistoryRetentionPeriod, address owner, uint64 blocksPerEpoch) external; + function isLastBlockInEpoch(uint64 blockHeight) external view returns (bool); function isPermissionedProverEnabled() external view returns (bool); function lagOverEscapeHatchThreshold(uint256 blockNumber, uint256 threshold) external view returns (bool); - function newFinalizedState(LightClient.LightClientState memory newState, IPlonkVerifier.PlonkProof memory proof) external; + function newFinalizedState(LightClient.LightClientState memory newState, LightClient.StakeTableState memory nextStakeTable, IPlonkVerifier.PlonkProof memory proof) external; function owner() external view returns (address); function permissionedProver() external view returns (address); function proxiableUUID() external view returns (bytes32); function renounceOwnership() external; + function setBlocksPerEpoch(uint64 newBlocksPerEpoch) external; function setFinalizedState(LightClient.LightClientState memory state) external; function setHotShotDownSince(uint256 l1Height) external; function setHotShotUp() external; @@ -2205,6 +2212,7 @@ interface LightClientMock { function stateHistoryRetentionPeriod() external view returns (uint32); function transferOwnership(address newOwner) external; function upgradeToAndCall(address newImplementation, bytes memory data) external payable; + function votingStakeTableState() external view returns (uint256 threshold, BN254.ScalarField blsKeyComm, BN254.ScalarField schnorrKeyComm, BN254.ScalarField amountComm); } ``` @@ -2267,6 +2275,11 @@ interface LightClientMock { "name": "maxHistorySeconds", "type": "uint32", "internalType": "uint32" + }, + { + "name": "blocksPerEpoch", + "type": "uint64", + "internalType": "uint64" } ], "stateMutability": "nonpayable" @@ -2284,6 +2297,19 @@ interface LightClientMock { ], "stateMutability": "view" }, + { + "type": "function", + "name": "_blocksPerEpoch", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint64", + "internalType": "uint64" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "currentBlockNumber", @@ -2297,6 +2323,19 @@ interface LightClientMock { ], "stateMutability": "view" }, + { + "type": "function", + "name": "currentEpoch", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint64", + "internalType": "uint64" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "disablePermissionedProverMode", @@ -2304,6 +2343,30 @@ interface LightClientMock { "outputs": [], "stateMutability": "nonpayable" }, + { + "type": "function", + "name": "epochFromBlockNumber", + "inputs": [ + { + "name": "blockNum", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "blocksPerEpoch", + "type": "uint64", + "internalType": "uint64" + } + ], + "outputs": [ + { + "name": "", + "type": "uint64", + "internalType": "uint64" + } + ], + "stateMutability": "pure" + }, { "type": "function", "name": "finalizedState", @@ -2500,11 +2563,35 @@ interface LightClientMock { "name": "owner", "type": "address", "internalType": "address" + }, + { + "name": "blocksPerEpoch", + "type": "uint64", + "internalType": "uint64" } ], "outputs": [], "stateMutability": "nonpayable" }, + { + "type": "function", + "name": "isLastBlockInEpoch", + "inputs": [ + { + "name": "blockHeight", + "type": "uint64", + "internalType": "uint64" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "isPermissionedProverEnabled", @@ -2568,6 +2655,33 @@ interface LightClientMock { } ] }, + { + "name": "nextStakeTable", + "type": "tuple", + "internalType": "struct LightClient.StakeTableState", + "components": [ + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "blsKeyComm", + "type": "uint256", + "internalType": "BN254.ScalarField" + }, + { + "name": "schnorrKeyComm", + "type": "uint256", + "internalType": "BN254.ScalarField" + }, + { + "name": "amountComm", + "type": "uint256", + "internalType": "BN254.ScalarField" + } + ] + }, { "name": "proof", "type": "tuple", @@ -2896,6 +3010,19 @@ interface LightClientMock { "outputs": [], "stateMutability": "nonpayable" }, + { + "type": "function", + "name": "setBlocksPerEpoch", + "inputs": [ + { + "name": "newBlocksPerEpoch", + "type": "uint64", + "internalType": "uint64" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, { "type": "function", "name": "setFinalizedState", @@ -3098,6 +3225,34 @@ interface LightClientMock { "outputs": [], "stateMutability": "payable" }, + { + "type": "function", + "name": "votingStakeTableState", + "inputs": [], + "outputs": [ + { + "name": "threshold", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "blsKeyComm", + "type": "uint256", + "internalType": "BN254.ScalarField" + }, + { + "name": "schnorrKeyComm", + "type": "uint256", + "internalType": "BN254.ScalarField" + }, + { + "name": "amountComm", + "type": "uint256", + "internalType": "BN254.ScalarField" + } + ], + "stateMutability": "view" + }, { "type": "event", "name": "Initialized", @@ -3111,6 +3266,19 @@ interface LightClientMock { ], "anonymous": false }, + { + "type": "event", + "name": "NewEpoch", + "inputs": [ + { + "name": "epoch", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, { "type": "event", "name": "NewState", @@ -3267,6 +3435,11 @@ interface LightClientMock { "name": "InvalidProof", "inputs": [] }, + { + "type": "error", + "name": "MissingLastBlockInEpochUpdate", + "inputs": [] + }, { "type": "error", "name": "NoChangeRequired", @@ -3345,22 +3518,22 @@ pub mod LightClientMock { /// The creation / init bytecode of the contract. /// /// ```text - ///0x60a06040523060805234801562000014575f80fd5b506040516200306f3803806200306f8339810160408190526200003791620002d8565b6200004162000057565b6200004e8383836200010b565b5050506200038c565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000a85760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001085780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b82516001600160401b031615158062000130575060208301516001600160401b031615155b806200013e57506020820151155b806200014c57506040820151155b806200015a57506060820151155b806200016557508151155b80620001785750610e108163ffffffff16105b806200018d57506301e133808163ffffffff16115b15620001ac576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b0390811668010000000000000000026001600160801b0319938416919095169081178517909355604096870151600581905586515f5590860151600155958501516002556060909401516003556006805490941617179091556007919091556008805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b604051606081016001600160401b03811182821017156200027357634e487b7160e01b5f52604160045260245ffd5b60405290565b604051608081016001600160401b03811182821017156200027357634e487b7160e01b5f52604160045260245ffd5b80516001600160401b0381168114620002bf575f80fd5b919050565b805163ffffffff81168114620002bf575f80fd5b5f805f838503610100811215620002ed575f80fd5b6060811215620002fb575f80fd5b6200030562000244565b6200031086620002a8565b81526200032060208701620002a8565b60208201526040868101519082015293506080605f198201121562000343575f80fd5b506200034e62000279565b60608581015182526080860151602083015260a0860151604083015260c08601519082015291506200038360e08501620002c4565b90509250925092565b608051612cbc620003b35f395f818161113f0152818161116801526112e50152612cbc5ff3fe6080604052600436106101af575f3560e01c80638584d23f116100e7578063c23b9e9e11610087578063e030330111610062578063e030330114610614578063f2fde38b14610633578063f567616014610652578063f9e50d1914610671575f80fd5b8063c23b9e9e14610592578063c8e5e498146105ca578063d24d933d146105e5575f80fd5b80639baa3cc9116100c25780639baa3cc91461048a5780639fdb54a7146104a9578063ad3cb1cc146104fe578063b5adea3c1461053b575f80fd5b80638584d23f146103f35780638da5cb5b1461042f57806396c1ca611461046b575f80fd5b8063378ec23b1161015257806352d1902d1161012d57806352d1902d1461038c57806369cc6a04146103a0578063715018a6146103b4578063826e41fc146103c8575f80fd5b8063378ec23b1461031c578063426d3194146103385780634f1ef28614610379575f80fd5b80632063d4f71161018d5780632063d4f71461025c5780632d52aad61461027b5780632f79889d146102a7578063313df7b1146102e5575f80fd5b8063013fa5fc146101b357806302b592f3146101d45780630d8e6e2c14610231575b5f80fd5b3480156101be575f80fd5b506101d26101cd366004612168565b610685565b005b3480156101df575f80fd5b506101f36101ee366004612181565b610738565b60405161022894939291906001600160401b039485168152928416602084015292166040820152606081019190915260800190565b60405180910390f35b34801561023c575f80fd5b5060408051600181525f6020820181905291810191909152606001610228565b348015610267575f80fd5b506101d26102763660046122ee565b610781565b348015610286575f80fd5b506101d2610295366004612181565b600a805460ff19166001179055600b55565b3480156102b2575f80fd5b506008546102cd90600160c01b90046001600160401b031681565b6040516001600160401b039091168152602001610228565b3480156102f0575f80fd5b50600854610304906001600160a01b031681565b6040516001600160a01b039091168152602001610228565b348015610327575f80fd5b50435b604051908152602001610228565b348015610343575f80fd5b505f546001546002546003546103599392919084565b604080519485526020850193909352918301526060820152608001610228565b6101d261038736600461249f565b6108db565b348015610397575f80fd5b5061032a6108fa565b3480156103ab575f80fd5b506101d2610915565b3480156103bf575f80fd5b506101d2610983565b3480156103d3575f80fd5b506008546001600160a01b031615155b6040519015158152602001610228565b3480156103fe575f80fd5b5061041261040d366004612181565b610994565b604080519283526001600160401b03909116602083015201610228565b34801561043a575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610304565b348015610476575f80fd5b506101d2610485366004612551565b610abf565b348015610495575f80fd5b506101d26104a436600461256a565b610b48565b3480156104b4575f80fd5b506006546007546104d8916001600160401b0380821692600160401b909204169083565b604080516001600160401b03948516815293909216602084015290820152606001610228565b348015610509575f80fd5b5061052e604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516102289190612614565b348015610546575f80fd5b506101d2610555366004612646565b80516006805460208401516001600160401b03908116600160401b026001600160801b031990921693169290921791909117905560400151600755565b34801561059d575f80fd5b506008546105b590600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610228565b3480156105d5575f80fd5b506101d2600a805460ff19169055565b3480156105f0575f80fd5b506004546005546104d8916001600160401b0380821692600160401b909204169083565b34801561061f575f80fd5b506103e361062e366004612660565b610c6a565b34801561063e575f80fd5b506101d261064d366004612168565b610c9f565b34801561065d575f80fd5b506101d261066c366004612680565b610ce1565b34801561067c575f80fd5b5060095461032a565b61068d610d8c565b6001600160a01b0381166106b45760405163e6c4247b60e01b815260040160405180910390fd5b6008546001600160a01b03908116908216036106e35760405163a863aec960e01b815260040160405180910390fd5b600880546001600160a01b0319166001600160a01b0383169081179091556040519081527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b60098181548110610747575f80fd5b5f918252602090912060029091020180546001909101546001600160401b038083169350600160401b8304811692600160801b9004169084565b6008546001600160a01b0316151580156107a657506008546001600160a01b03163314155b156107c4576040516301474c8f60e71b815260040160405180910390fd5b60065482516001600160401b0391821691161115806107fd575060065460208301516001600160401b03600160401b9092048216911611155b1561081b5760405163051c46ef60e01b815260040160405180910390fd5b6108288260400151610de7565b6108328282610e57565b81516006805460208501516001600160401b03908116600160401b026001600160801b0319909216931692909217919091179055604082015160075561087f6108784390565b4284610f4b565b81602001516001600160401b0316825f01516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae684604001516040516108cf91815260200190565b60405180910390a35050565b6108e3611134565b6108ec826111d8565b6108f68282611219565b5050565b5f6109036112da565b505f80516020612c9083398151915290565b61091d610d8c565b6008546001600160a01b03161561096857600880546001600160a01b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c02450905f90a1565b60405163a863aec960e01b815260040160405180910390fd5b565b61098b610d8c565b6109815f611323565b600980545f918291906109a8600183612782565b815481106109b8576109b8612795565b5f918252602090912060029091020154600160801b90046001600160401b031684106109f757604051631856a49960e21b815260040160405180910390fd5b600854600160c01b90046001600160401b03165b81811015610ab8578460098281548110610a2757610a27612795565b5f918252602090912060029091020154600160801b90046001600160401b03161115610ab05760098181548110610a6057610a60612795565b905f5260205f2090600202016001015460098281548110610a8357610a83612795565b905f5260205f2090600202015f0160109054906101000a90046001600160401b0316935093505050915091565b600101610a0b565b5050915091565b610ac7610d8c565b610e108163ffffffff161080610ae657506301e133808163ffffffff16115b80610b04575060085463ffffffff600160a01b909104811690821611155b15610b22576040516307a5077760e51b815260040160405180910390fd5b6008805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610b8c5750825b90505f826001600160401b03166001148015610ba75750303b155b905081158015610bb5575080155b15610bd35760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610bfd57845460ff60401b1916600160401b1785555b610c0686611393565b610c0e6113a4565b610c198989896113ac565b8315610c5f57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b600a545f9060ff16610c8557610c8083836114d8565b610c96565b81600b5484610c949190612782565b115b90505b92915050565b610ca7610d8c565b6001600160a01b038116610cd557604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b610cde81611323565b50565b610cec60095f611e82565b5f5b81518110156108f6576009828281518110610d0b57610d0b612795565b6020908102919091018101518254600181810185555f94855293839020825160029092020180549383015160408401516001600160401b03908116600160801b0267ffffffffffffffff60801b19928216600160401b026001600160801b031990971691909416179490941793909316178255606001519082015501610cee565b33610dbe7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146109815760405163118cdaa760e01b8152336004820152602401610ccc565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110806108f65760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401610ccc565b5f610e60611630565b9050610e6a611ea0565b83516001600160401b0390811682526020850151168160016020020152604084810151828201526001546060830152600254608083015260035460a08301525f5460c08301525163ce537a7760e01b8152735fbdb2315678afecb367f032d93f642f64180aa39063ce537a7790610ee9908590859088906004016129af565b602060405180830381865af4158015610f04573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f289190612bdd565b610f45576040516309bde33960e01b815260040160405180910390fd5b50505050565b60095415801590610fc0575060085460098054600160a01b830463ffffffff1692600160c01b90046001600160401b0316908110610f8b57610f8b612795565b5f918252602090912060029091020154610fb590600160401b90046001600160401b031684612bfc565b6001600160401b0316115b1561105357600854600980549091600160c01b90046001600160401b0316908110610fed57610fed612795565b5f9182526020822060029091020180546001600160c01b03191681556001015560088054600160c01b90046001600160401b031690601861102d83612c23565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516080810182526001600160401b03948516815292841660208085019182528301518516848301908152929091015160608401908152600980546001810182555f91909152935160029094027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af81018054935194518716600160801b0267ffffffffffffffff60801b19958816600160401b026001600160801b03199095169690971695909517929092179290921693909317909155517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b090910155565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806111ba57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166111ae5f80516020612c90833981519152546001600160a01b031690565b6001600160a01b031614155b156109815760405163703e46dd60e11b815260040160405180910390fd5b6111e0610d8c565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d9060200161072d565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611273575060408051601f3d908101601f1916820190925261127091810190612c48565b60015b61129b57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610ccc565b5f80516020612c9083398151915281146112cb57604051632a87526960e21b815260048101829052602401610ccc565b6112d58383611c60565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109815760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b61139b611cb5565b610cde81611cfe565b610981611cb5565b82516001600160401b03161515806113d0575060208301516001600160401b031615155b806113dd57506020820151155b806113ea57506040820151155b806113f757506060820151155b8061140157508151155b806114135750610e108163ffffffff16105b8061142757506301e133808163ffffffff16115b15611445576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b03908116600160401b026001600160801b0319938416919095169081178517909355604096870151600581905586515f5590860151600155958501516002556060909401516003556006805490941617179091556007919091556008805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b6009545f90438411806114e9575080155b806115335750600854600980549091600160c01b90046001600160401b031690811061151757611517612795565b5f9182526020909120600290910201546001600160401b031684105b156115515760405163b0b4387760e01b815260040160405180910390fd5b5f808061155f600185612782565b90505b816115fb57600854600160c01b90046001600160401b031681106115fb57866009828154811061159457611594612795565b5f9182526020909120600290910201546001600160401b0316116115e95760019150600981815481106115c9576115c9612795565b5f9182526020909120600290910201546001600160401b031692506115fb565b806115f381612c5f565b915050611562565b816116195760405163b0b4387760e01b815260040160405180910390fd5b856116248489612782565b11979650505050505050565b611638611ebe565b620100008152600760208201527f1369aa78dc50135ad756d62c97a64a0edcd30066584168200d9d1facf82ca4f56040820151527f2cf23456d712b06f8e3aa5bf0acc3e46a3d094602a3a2b99d873bba05a4391476020604083015101527f08a35f379d2d2c490a51006697275e4db79b67b4a175c1477e262d29e25e42316060820151527f218828131bb7940ccc88c561b299755af4bf0b71ed930b129e8be0a1218139ea6020606083015101527f23a2172436c1145b36d5bc6d3b31fa1610c73a543ea443918aaa3ee175f9921b6080820151527f2502adf404d62877c310214ae9942e93c40b154d34c024bab48a3ca057e60a116020608083015101527f1bb88ada91ab7734882f7826b81275320081ac485f9cf8bfbc3ba54b6eb4dff360a0820151527f25c74a27e9a3b20114a3a91f31c20f01777e7ed913e0ef949f0285e2e7c2069b602060a083015101527f12b0ce76ac8b0dbd405ebc5dd0bae0f91aed50033c7ea36fc62aaba2b98333dc60c0820151527f185b42af49dd1cbe337a84f74b704172428e754a0bea024ab3eb2f996afb2c47602060c083015101527f21f53ad4538b45438bbf0521446070223920e3df6f9022a64cc16d7f94e85c0860e0820151527f2278ac3dedfdac7feb9725a022497175518eada52c8932fc40e6e75bea889fb8602060e083015101527f0876136f81c16298487bfb1be74d4a3487ec45645ab1d09dc2e5b865d62230df610100820151527f098c641c947ecd798dfd5e1b2fe428024cdf03061a53ff774ea8a9e3de9d3f2b602061010083015101527f15eaac2c6232d2268bf79dc47ed9666f992fb3d96ad23fb21690c21586c5472e610120820151527f0f10f1ffc54881287fda6f200bc85d8245b508d844a974098a41119867b325d0602061012083015101527f0895ceea40b085534e9739ca5442ba48b3a3592affde2b509df74521b47d8ab0610140820151527f2e12ec5800ac92fe2a8e7040bc5b435b9eb71e31380173fa7688bf81fcbba455602061014083015101527f2f5384eb5653e47576efe248e7903f463243414bfed5237dda750df3996bd918610160820151527f1c3cd6b11da8704cdc871ab4fa323d7ee57bd40ce165b49a56d5ef6489cd251a602061016083015101527f13579994957ce1554cc1e5b194fb63c9513707f627414f8442681ae736e36450610180820151527f26c9bdcd96d8e420b12974ade93ad9c312c4185213d2f6831a7c625a18890e95602061018083015101527f0cc70a1d542a9a1535ae5d9201696adc5c99c1bcebd9951dfa8afec79fa0b6446101a0820151527f10b043d9f1869181b96579d6616efc17a5df7b84c4d431d966c9094bf1e8815360206101a083015101527f198a65309d131a43b0ab1c47659d0336cfbf62b27f4727106b4fd971c73dd4036101c0820151527f23df99eac3c1947903b211b800efeb76f47d5e87b7414866543492e8c7798d1a60206101c083015101527f221cc5e47b81ce8dcfa72ef981916a8eddef12fcde59c56c62830c126ebef0de6101e0820151527f231f99340c35c9e09652a6df73c9cec5d88738cb71ff45716fdc9e9e45a4926e60206101e083015101527f2c9f1489fce0f263e03f3e97bf0a72273aafcca9325ff47786adb04a52a6d22c610200820151527f21f66e28f17e01e9fd593e16d022c4eca25bd5db96daec606d97b604cc414838602061020083015101527f2015745604a9571e226bd99043cfaf1f96267cc5de67f497563ff81100531d26610220820151527f206889ff4c58dd08ee1107191a2a5bc5dbae55c49d7d8397801799868d10f805602061022083015101527f21062ab8f8ecd8932b429a1eb8614b1e03db61bff6a5cd2d5d7ea193e90e9927610240820151527f217f9b27b934b88ffe555d682dfe6e8b6d503f86b14bbd96342bc48487a60b27602061024083015101527f1c9eda2d195cb731f903235ead6a4f7c66db49da713ecb27afee076f0eea7154610260820151527f2647c161c00b90258e1cefebb17481f8a5d91b5f9dca626e3e89a9215bcca16a602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b611c6982611d06565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611cad576112d58282611d69565b6108f6611ddb565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661098157604051631afcd79f60e31b815260040160405180910390fd5b610ca7611cb5565b806001600160a01b03163b5f03611d3b57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610ccc565b5f80516020612c9083398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b031684604051611d859190612c74565b5f60405180830381855af49150503d805f8114611dbd576040519150601f19603f3d011682016040523d82523d5f602084013e611dc2565b606091505b5091509150611dd2858383611dfa565b95945050505050565b34156109815760405163b398979f60e01b815260040160405180910390fd5b606082611e0f57611e0a82611e59565b611e52565b8151158015611e2657506001600160a01b0384163b155b15611e4f57604051639996b31560e01b81526001600160a01b0385166004820152602401610ccc565b50805b9392505050565b805115611e695780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080545f8255600202905f5260205f2090810190610cde9190612124565b6040518060e001604052806007906020820280368337509192915050565b604051806102c001604052805f81526020015f8152602001611ef160405180604001604052805f81526020015f81525090565b8152602001611f1160405180604001604052805f81526020015f81525090565b8152602001611f3160405180604001604052805f81526020015f81525090565b8152602001611f5160405180604001604052805f81526020015f81525090565b8152602001611f7160405180604001604052805f81526020015f81525090565b8152602001611f9160405180604001604052805f81526020015f81525090565b8152602001611fb160405180604001604052805f81526020015f81525090565b8152602001611fd160405180604001604052805f81526020015f81525090565b8152602001611ff160405180604001604052805f81526020015f81525090565b815260200161201160405180604001604052805f81526020015f81525090565b815260200161203160405180604001604052805f81526020015f81525090565b815260200161205160405180604001604052805f81526020015f81525090565b815260200161207160405180604001604052805f81526020015f81525090565b815260200161209160405180604001604052805f81526020015f81525090565b81526020016120b160405180604001604052805f81526020015f81525090565b81526020016120d160405180604001604052805f81526020015f81525090565b81526020016120f160405180604001604052805f81526020015f81525090565b815260200161211160405180604001604052805f81526020015f81525090565b81525f6020820181905260409091015290565b5b808211156121495780546001600160c01b03191681555f6001820155600201612125565b5090565b80356001600160a01b0381168114612163575f80fd5b919050565b5f60208284031215612178575f80fd5b610c968261214d565b5f60208284031215612191575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b6040516102e081016001600160401b03811182821017156121cf576121cf612198565b60405290565b604051608081016001600160401b03811182821017156121cf576121cf612198565b604051601f8201601f191681016001600160401b038111828210171561221f5761221f612198565b604052919050565b80356001600160401b0381168114612163575f80fd5b5f6060828403121561224d575f80fd5b604051606081018181106001600160401b038211171561226f5761226f612198565b60405290508061227e83612227565b815261228c60208401612227565b6020820152604083013560408201525092915050565b5f604082840312156122b2575f80fd5b604051604081018181106001600160401b03821117156122d4576122d4612198565b604052823581526020928301359281019290925250919050565b5f808284036104e0811215612301575f80fd5b61230b858561223d565b925061048080605f1983011215612320575f80fd5b6123286121ac565b915061233786606087016122a2565b82526123468660a087016122a2565b60208301526123588660e087016122a2565b604083015261012061236c878288016122a2565b6060840152610160612380888289016122a2565b60808501526101a061239489828a016122a2565b60a08601526101e06123a88a828b016122a2565b60c08701526102206123bc8b828c016122a2565b60e08801526102606123d08c828d016122a2565b6101008901526102a06123e58d828e016122a2565b878a01526123f78d6102e08e016122a2565b6101408a015261240b8d6103208e016122a2565b868a015261241d8d6103608e016122a2565b6101808a01526103a08c0135948901949094526103c08b01356101c08901526103e08b0135928801929092526104008a01356102008801526104208a013590870152610440890135610240870152610460890135908601529287013561028085015250506104a0850135908201526104c0909301356102c08401525092909150565b5f80604083850312156124b0575f80fd5b6124b98361214d565b91506020808401356001600160401b03808211156124d5575f80fd5b818601915086601f8301126124e8575f80fd5b8135818111156124fa576124fa612198565b61250c601f8201601f191685016121f7565b91508082528784828501011115612521575f80fd5b80848401858401375f848284010152508093505050509250929050565b803563ffffffff81168114612163575f80fd5b5f60208284031215612561575f80fd5b610c968261253e565b5f805f8084860361012081121561257f575f80fd5b612589878761223d565b94506080605f198201121561259c575f80fd5b506125a56121d5565b60608681013582526080870135602083015260a0870135604083015260c08701359082015292506125d860e0860161253e565b91506125e7610100860161214d565b905092959194509250565b5f5b8381101561260c5781810151838201526020016125f4565b50505f910152565b602081525f82518060208401526126328160408501602087016125f2565b601f01601f19169190910160400192915050565b5f60608284031215612656575f80fd5b610c96838361223d565b5f8060408385031215612671575f80fd5b50508035926020909101359150565b5f6020808385031215612691575f80fd5b82356001600160401b03808211156126a7575f80fd5b818501915085601f8301126126ba575f80fd5b8135818111156126cc576126cc612198565b6126da848260051b016121f7565b818152848101925060079190911b8301840190878211156126f9575f80fd5b928401925b818410156127635760808489031215612715575f80fd5b61271d6121d5565b61272685612227565b8152612733868601612227565b868201526040612744818701612227565b90820152606085810135908201528352608090930192918401916126fe565b979650505050505050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610c9957610c9961276e565b634e487b7160e01b5f52603260045260245ffd5b805f5b6007811015610f455781518452602093840193909101906001016127ac565b6127e082825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e08401525060808101516101006128438185018380518252602090810151910152565b60a083015191506101406128638186018480518252602090810151910152565b60c084015192506101806128838187018580518252602090810151910152565b60e085015193506101c06128a38188018680518252602090810151910152565b928501519350610200926128c38785018680518252602090810151910152565b61012086015194506102406128e48189018780518252602090810151910152565b928601519450610280926129048885018780518252602090810151910152565b61016087015195506102c0612925818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b5f610a6082019050845182526020850151602083015260408501516129e1604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a0850151610100612a2e8185018380518252602090810151910152565b60c08701519150610140612a4e8186018480518252602090810151910152565b60e08801519250610180612a6e8187018580518252602090810151910152565b9188015192506101c091612a8e8684018580518252602090810151910152565b6101208901519350610200612aaf8188018680518252602090810151910152565b91890151935061024091612acf8784018680518252602090810151910152565b6101608a01519450610280612af08189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e0830152612bc76105008301856127a9565b612bd56105e08301846127cb565b949350505050565b5f60208284031215612bed575f80fd5b81518015158114611e52575f80fd5b6001600160401b03828116828216039080821115612c1c57612c1c61276e565b5092915050565b5f6001600160401b03808316818103612c3e57612c3e61276e565b6001019392505050565b5f60208284031215612c58575f80fd5b5051919050565b5f81612c6d57612c6d61276e565b505f190190565b5f8251612c858184602087016125f2565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a + ///0x60a06040523060805234801562000014575f80fd5b50604051620035bf380380620035bf833981016040819052620000379162000328565b6200004162000059565b6200004f848484846200010d565b50505050620003f0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000aa5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146200010a5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b83516001600160401b031615158062000132575060208401516001600160401b031615155b806200014057506020830151155b806200014e57506040830151155b806200015c57506060830151155b806200016757508251155b806200017a5750610e108263ffffffff16105b806200018f57506301e133808263ffffffff16115b80620001a257506001600160401b038116155b15620001c1576040516350dd03f760e11b815260040160405180910390fd5b8351600980546020808801516001600160401b0390811668010000000000000000026001600160801b03199384169582169586178117909455604098890151600a819055600b8054909416909517909317909155600c92909255845160018190559185015160028190559585015160038190556060909501516004819055600592909255600695909555600793909355600892909255600d805463ffffffff909216600160a01b0263ffffffff60a01b199092169190911790555f8054919092166001600160401b031991909116179055565b604051606081016001600160401b0381118282101715620002c357634e487b7160e01b5f52604160045260245ffd5b60405290565b604051608081016001600160401b0381118282101715620002c357634e487b7160e01b5f52604160045260245ffd5b80516001600160401b03811681146200030f575f80fd5b919050565b805163ffffffff811681146200030f575f80fd5b5f805f808486036101208112156200033e575f80fd5b60608112156200034c575f80fd5b6200035662000294565b6200036187620002f8565b81526200037160208801620002f8565b60208201526040878101519082015294506080605f198201121562000394575f80fd5b506200039f620002c9565b60608681015182526080870151602083015260a0870151604083015260c0870151908201529250620003d460e0860162000314565b9150620003e56101008601620002f8565b905092959194509250565b6080516131a8620004175f395f818161113d0152818161116601526112e301526131a85ff3fe6080604052600436106101f1575f3560e01c8063826e41fc11610108578063b2424e3f1161009d578063d24d933d1161006d578063d24d933d146106f6578063e030330114610725578063f2fde38b14610744578063f567616014610763578063f9e50d1914610782575f80fd5b8063b2424e3f1461062e578063b5adea3c1461064c578063c23b9e9e146106a3578063c8e5e498146106db575f80fd5b806396c1ca61116100d857806396c1ca611461055e5780639fdb54a71461057d578063a1be8d52146105d2578063ad3cb1cc146105f1575f80fd5b8063826e41fc1461049c5780638584d23f146104c75780638da5cb5b1461050357806390c143901461053f575f80fd5b80633c23b6db1161018957806369cc6a041161015957806369cc6a0414610422578063715018a614610436578063757c37ad1461044a5780637667180814610469578063811f853f1461047d575f80fd5b80633c23b6db1461039d578063426d3194146103d95780634f1ef286146103fb57806352d1902d1461040e575f80fd5b80632d52aad6116101c45780632d52aad6146102e05780632f79889d1461030c578063313df7b11461034a578063378ec23b14610381575f80fd5b8063013fa5fc146101f557806302b592f3146102165780630625e19b146102735780630d8e6e2c146102b5575b5f80fd5b348015610200575f80fd5b5061021461020f366004612558565b610796565b005b348015610221575f80fd5b50610235610230366004612571565b610849565b60405161026a94939291906001600160401b039485168152928416602084015292166040820152606081019190915260800190565b60405180910390f35b34801561027e575f80fd5b506005546006546007546008546102959392919084565b60408051948552602085019390935291830152606082015260800161026a565b3480156102c0575f80fd5b5060408051600181525f602082018190529181019190915260600161026a565b3480156102eb575f80fd5b506102146102fa366004612571565b600f805460ff19166001179055601055565b348015610317575f80fd5b50600d5461033290600160c01b90046001600160401b031681565b6040516001600160401b03909116815260200161026a565b348015610355575f80fd5b50600d54610369906001600160a01b031681565b6040516001600160a01b03909116815260200161026a565b34801561038c575f80fd5b50435b60405190815260200161026a565b3480156103a8575f80fd5b506102146103b736600461259e565b5f805467ffffffffffffffff19166001600160401b0392909216919091179055565b3480156103e4575f80fd5b506001546002546003546004546102959392919084565b610214610409366004612646565b610892565b348015610419575f80fd5b5061038f6108b1565b34801561042d575f80fd5b506102146108cc565b348015610441575f80fd5b5061021461093a565b348015610455575f80fd5b506102146104643660046127d8565b61094b565b348015610474575f80fd5b50610332610c16565b348015610488575f80fd5b506102146104973660046129b1565b610c40565b3480156104a7575f80fd5b50600d546001600160a01b031615155b604051901515815260200161026a565b3480156104d2575f80fd5b506104e66104e1366004612571565b610d64565b604080519283526001600160401b0390911660208301520161026a565b34801561050e575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610369565b34801561054a575f80fd5b50610332610559366004612a17565b610e8f565b348015610569575f80fd5b50610214610578366004612a48565b610eec565b348015610588575f80fd5b50600b54600c546105ac916001600160401b0380821692600160401b909204169083565b604080516001600160401b0394851681529390921660208401529082015260600161026a565b3480156105dd575f80fd5b506104b76105ec36600461259e565b610f75565b3480156105fc575f80fd5b50610621604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161026a9190612a83565b348015610639575f80fd5b505f54610332906001600160401b031681565b348015610657575f80fd5b50610214610666366004612ab5565b8051600b805460208401516001600160401b03908116600160401b026001600160801b031990921693169290921791909117905560400151600c55565b3480156106ae575f80fd5b50600d546106c690600160a01b900463ffffffff1681565b60405163ffffffff909116815260200161026a565b3480156106e6575f80fd5b50610214600f805460ff19169055565b348015610701575f80fd5b50600954600a546105ac916001600160401b0380821692600160401b909204169083565b348015610730575f80fd5b506104b761073f366004612acf565b610fb7565b34801561074f575f80fd5b5061021461075e366004612558565b610fea565b34801561076e575f80fd5b5061021461077d366004612aef565b61102c565b34801561078d575f80fd5b50600e5461038f565b61079e6110d7565b6001600160a01b0381166107c55760405163e6c4247b60e01b815260040160405180910390fd5b600d546001600160a01b03908116908216036107f45760405163a863aec960e01b815260040160405180910390fd5b600d80546001600160a01b0319166001600160a01b0383169081179091556040519081527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b600e8181548110610858575f80fd5b5f918252602090912060029091020180546001909101546001600160401b038083169350600160401b8304811692600160801b9004169084565b61089a611132565b6108a3826111d6565b6108ad8282611217565b5050565b5f6108ba6112d8565b505f8051602061317c83398151915290565b6108d46110d7565b600d546001600160a01b03161561091f57600d80546001600160a01b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c02450905f90a1565b60405163a863aec960e01b815260040160405180910390fd5b565b6109426110d7565b6109385f611321565b600d546001600160a01b0316151580156109705750600d546001600160a01b03163314155b1561098e576040516301474c8f60e71b815260040160405180910390fd5b600b5483516001600160401b0391821691161115806109c75750600b5460208401516001600160401b03600160401b9092048216911611155b156109e55760405163051c46ef60e01b815260040160405180910390fd5b6109f28360400151611391565b5f6109fb610c16565b60208501515f805492935091610a1a91906001600160401b0316610e8f565b9050610a27826001612bf1565b6001600160401b0316816001600160401b0316148015610a605750600b54610a5e90600160401b90046001600160401b0316610f75565b155b8015610a7457505f826001600160401b0316115b15610a9257604051637150de4560e01b815260040160405180910390fd5b610a9d826002612bf1565b6001600160401b0316816001600160401b031610610ace57604051637150de4560e01b815260040160405180910390fd5b610adb8460200151611391565b610ae88460400151611391565b610af58460600151611391565b610b00858585611401565b8451600b805460208801516001600160401b03818116600160401b026001600160801b03199093169416939093171790556040860151600c55610b4290610f75565b15610bac5783516005556020840151600655604084015160075560608401516008557f31eabd9099fdb25dacddd206abff87311e553441fc9d0fcdef201062d7e7071b610b90826001612bf1565b6040516001600160401b03909116815260200160405180910390a15b610bb7434287611559565b84602001516001600160401b0316855f01516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae68760400151604051610c0791815260200190565b60405180910390a35050505050565b600b545f80549091610c3b916001600160401b03600160401b90920482169116610e8f565b905090565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610c845750825b90505f826001600160401b03166001148015610c9f5750303b155b905081158015610cad575080155b15610ccb5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610cf557845460ff60401b1916600160401b1785555b610cfe87611742565b610d06611753565b610d128a8a8a8961175b565b8315610d5857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b600e80545f91829190610d78600183612c11565b81548110610d8857610d88612c24565b5f918252602090912060029091020154600160801b90046001600160401b03168410610dc757604051631856a49960e21b815260040160405180910390fd5b600d54600160c01b90046001600160401b03165b81811015610e885784600e8281548110610df757610df7612c24565b5f918252602090912060029091020154600160801b90046001600160401b03161115610e8057600e8181548110610e3057610e30612c24565b905f5260205f20906002020160010154600e8281548110610e5357610e53612c24565b905f5260205f2090600202015f0160109054906101000a90046001600160401b0316935093505050915091565b600101610ddb565b5050915091565b5f816001600160401b03165f03610ea757505f610ee6565b610eb18284612c4c565b6001600160401b03165f03610ed157610eca8284612c71565b9050610ee6565b610edb8284612c71565b610eca906001612bf1565b92915050565b610ef46110d7565b610e108163ffffffff161080610f1357506301e133808163ffffffff16115b80610f315750600d5463ffffffff600160a01b909104811690821611155b15610f4f576040516307a5077760e51b815260040160405180910390fd5b600d805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b5f816001600160401b03165f03610f8d57505f919050565b5f54610fa2906001600160401b031683612c4c565b6001600160401b03161592915050565b919050565b600f545f9060ff16610fd257610fcd83836118d5565b610fe3565b8160105484610fe19190612c11565b115b9392505050565b610ff26110d7565b6001600160a01b03811661102057604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61102981611321565b50565b611037600e5f612276565b5f5b81518110156108ad57600e82828151811061105657611056612c24565b6020908102919091018101518254600181810185555f94855293839020825160029092020180549383015160408401516001600160401b03908116600160801b0267ffffffffffffffff60801b19928216600160401b026001600160801b031990971691909416179490941793909316178255606001519082015501611039565b336111097f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146109385760405163118cdaa760e01b8152336004820152602401611017565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806111b857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166111ac5f8051602061317c833981519152546001600160a01b031690565b6001600160a01b031614155b156109385760405163703e46dd60e11b815260040160405180910390fd5b6111de6110d7565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d9060200161083e565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611271575060408051601f3d908101601f1916820190925261126e91810190612c96565b60015b61129957604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611017565b5f8051602061317c83398151915281146112c957604051632a87526960e21b815260048101829052602401611017565b6112d38383611a2d565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109385760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110806108ad5760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401611017565b5f61140a611a82565b9050611414612294565b84516001600160401b0390811682526020808701805190921690830152604080870151908301526006546060830152600754608083015260085460a083015260055460c08301525161146590610f75565b1561149757602084015160e08201526040840151610100820152606084015161012082015283516101408201526114bb565b60065460e08201526007546101008201526008546101208201526005546101408201525b60405163fc8660c760e01b8152735fbdb2315678afecb367f032d93f642f64180aa39063fc8660c7906114f690859085908890600401612eb9565b602060405180830381865af4158015611511573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061153591906130e7565b611552576040516309bde33960e01b815260040160405180910390fd5b5050505050565b600e54158015906115ce5750600d54600e8054600160a01b830463ffffffff1692600160c01b90046001600160401b031690811061159957611599612c24565b5f9182526020909120600290910201546115c390600160401b90046001600160401b031684613106565b6001600160401b0316115b1561166157600d54600e80549091600160c01b90046001600160401b03169081106115fb576115fb612c24565b5f9182526020822060029091020180546001600160c01b031916815560010155600d8054600160c01b90046001600160401b031690601861163b83613126565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516080810182526001600160401b03948516815292841660208085019182528301518516848301908152929091015160608401908152600e80546001810182555f91909152935160029094027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd81018054935194518716600160801b0267ffffffffffffffff60801b19958816600160401b026001600160801b03199095169690971695909517929092179290921693909317909155517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe90910155565b61174a6120b1565b611029816120fa565b6109386120b1565b83516001600160401b031615158061177f575060208401516001600160401b031615155b8061178c57506020830151155b8061179957506040830151155b806117a657506060830151155b806117b057508251155b806117c25750610e108263ffffffff16105b806117d657506301e133808263ffffffff16115b806117e857506001600160401b038116155b15611806576040516350dd03f760e11b815260040160405180910390fd5b8351600980546020808801516001600160401b03908116600160401b026001600160801b03199384169582169586178117909455604098890151600a819055600b8054909416909517909317909155600c92909255845160018190559185015160028190559585015160038190556060909501516004819055600592909255600695909555600793909355600892909255600d805463ffffffff909216600160a01b0263ffffffff60a01b199092169190911790555f80549190921667ffffffffffffffff1991909116179055565b600e545f90438411806118e6575080155b806119305750600d54600e80549091600160c01b90046001600160401b031690811061191457611914612c24565b5f9182526020909120600290910201546001600160401b031684105b1561194e5760405163b0b4387760e01b815260040160405180910390fd5b5f808061195c600185612c11565b90505b816119f857600d54600160c01b90046001600160401b031681106119f85786600e828154811061199157611991612c24565b5f9182526020909120600290910201546001600160401b0316116119e65760019150600e81815481106119c6576119c6612c24565b5f9182526020909120600290910201546001600160401b031692506119f8565b806119f08161314b565b91505061195f565b81611a165760405163b0b4387760e01b815260040160405180910390fd5b85611a218489612c11565b11979650505050505050565b611a3682612102565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611a7a576112d38282612165565b6108ad6121d7565b611a8a6122b3565b620100008152600b60208201527f2faf5a113efd87d75818e63ff9a6170007f22c89bbc4a8bd0f2b48268757b0146040820151527f185aee05f8d3babfce67931f15db39e61f25f794a4134d7bee6e18c5ad1ec0576020604083015101527f0dccf5dcf667a37ca93b8d721091d8f3a8049b3d1e89a56d66e42751bbaf7b5e6060820151527f2cf10949fc5bfcecb3bc54dd4121e55807430f17f30498a7ea6a026070b191626020606083015101527f08d70e4e0184fe53bd566f0d7edc4cd7b0e339490973d0faec7dac2089f538e56080820151527ef665fe1fd110d37d1dea446e8400f06f06b9b58ab3df90fbae7c47ee5860416020608083015101527f087e14d71924ac0f2880adf0f106925e5a6fdd57d020bb3c8aa70fa9fc00ccf360a0820151527f01db7e3178b342f91d54fc972cee72569f429a393988ee43c289e2ed96077152602060a083015101527f196dd42d767201f7f196c42aaef485656046310f5083559592bd1313e16948b760c0820151527f17889680810aaabd1ff3ac4a6c5492100579e059170cd2b77e2b3da6d37cc246602060c083015101527f24935e7a77ac313fd3d60ff3f1a0a79ec32c7dc519b39da0acb2c49f367771cc60e0820151527f168e29425ef138cb6943c75352f33c190e5f1488eb54a9e11deb744da7fb6b2e602060e083015101527f1b58d558b5526453bd1028ca938c940bb89e723f7c35787c02f9f179ae9a0cea610100820151527f21afc121d91d9d1c17dafb9236bc9b872c5b43df064c0b1286012fb43a762324602061010083015101527f1047fc55794d1e597de155077611e3c789a0a2be02183821bba56cf61cc1b8ed610120820151527f174252324727c0d2ee5e50eb57a5231f67474ceed6932ad4ffe9bcf866aa3428602061012083015101527f28db289a4cfb73ba92961572f3185298ae366ed1a44971607bcbf801f120f561610140820151527f045cfe7ae2cd175508172e7d9c2e899bb1d216dfc31fe89fc6c917caaee877a2602061014083015101527f195f2eec8547727fc46ed01b79e8f666ded64ae54f57073874a5a2470380a785610160820151527f1527322e85da1aefbd839e65d11dc695aac16b0db6c62591d9813242d41cbe31602061016083015101527f10c8d7d7355f7e0f8c002f482cc3b98c90baa94261c59a17b424eecfe4e963b2610180820151527f2272e30178647167bbead3a2d7371988f2e198e65815029ded4c64bfc0850f1f602061018083015101527f15d56ea7ab2fa61265f551c2ae25389c8fe7bcb3bf6608082c36a201f225f77d6101a0820151527f0b58546887202e7273d3d0c55d65dd6132cac98ebf04efb1b52445c513c4a4df60206101a083015101527f050d6f43774e8dffaa868f2a7dc82f566c69d175d818d4517cc70ac5fcb2f1b16101c0820151527f2fff87bf605e998373bb64553f3a625dabcd12888692d678a8f44d136440c86360206101c083015101527f12d085608c602cfb5b8c03ec7bd13ac0ff9e64a9ac1e9aa746594a033e464bf26101e0820151527f18ac5a3536042eeb0b0c7c2f43f5e2ca3b2173daa4c2812ffca64787e8e956b260206101e083015101527f0f0f9891fc2b790e74dc253c8854df6392e010f4de6760b8423a3dd69bbe5dce610200820151527f16bed1d244a2fe3ab9a652c7feec5650161d8a75227dece7294f3c8fc542fd6c602061020083015101527f0fa36d00672fa6a1c44cd3c259212c1ada48c66bf7bb085f24471b15b17e6e51610220820151527f182088e56b64955232460891d2b279765325813aef1dae855e5f496c418afc41602061022083015101527f2baf5ae2dd832e1449facc611b6b80fd66d58c871d5827c5c8e2747064e29964610240820151527f29f543b543137e881804c989cd3b99934010002238e8ab3eec882e09d306681f602061024083015101527f2db0ddc7123b42f520e257466a0d92da8b564fe01ec665096c14119643012984610260820151527f1b7ab27a66966284d7fb29bce9d550eafba16c49fbc6267827cdfc8d0b16f94f602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661093857604051631afcd79f60e31b815260040160405180910390fd5b610ff26120b1565b806001600160a01b03163b5f0361213757604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611017565b5f8051602061317c83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516121819190613160565b5f60405180830381855af49150503d805f81146121b9576040519150601f19603f3d011682016040523d82523d5f602084013e6121be565b606091505b50915091506121ce8583836121f6565b95945050505050565b34156109385760405163b398979f60e01b815260040160405180910390fd5b60608261220657610fcd8261224d565b815115801561221d57506001600160a01b0384163b155b1561224657604051639996b31560e01b81526001600160a01b0385166004820152602401611017565b5092915050565b80511561225d5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080545f8255600202905f5260205f20908101906110299190612519565b604051806101600160405280600b906020820280368337509192915050565b604051806102c001604052805f81526020015f81526020016122e660405180604001604052805f81526020015f81525090565b815260200161230660405180604001604052805f81526020015f81525090565b815260200161232660405180604001604052805f81526020015f81525090565b815260200161234660405180604001604052805f81526020015f81525090565b815260200161236660405180604001604052805f81526020015f81525090565b815260200161238660405180604001604052805f81526020015f81525090565b81526020016123a660405180604001604052805f81526020015f81525090565b81526020016123c660405180604001604052805f81526020015f81525090565b81526020016123e660405180604001604052805f81526020015f81525090565b815260200161240660405180604001604052805f81526020015f81525090565b815260200161242660405180604001604052805f81526020015f81525090565b815260200161244660405180604001604052805f81526020015f81525090565b815260200161246660405180604001604052805f81526020015f81525090565b815260200161248660405180604001604052805f81526020015f81525090565b81526020016124a660405180604001604052805f81526020015f81525090565b81526020016124c660405180604001604052805f81526020015f81525090565b81526020016124e660405180604001604052805f81526020015f81525090565b815260200161250660405180604001604052805f81526020015f81525090565b81525f6020820181905260409091015290565b5b8082111561253e5780546001600160c01b03191681555f600182015560020161251a565b5090565b80356001600160a01b0381168114610fb2575f80fd5b5f60208284031215612568575f80fd5b610fe382612542565b5f60208284031215612581575f80fd5b5035919050565b80356001600160401b0381168114610fb2575f80fd5b5f602082840312156125ae575f80fd5b610fe382612588565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b03811182821017156125ed576125ed6125b7565b60405290565b6040516102e081016001600160401b03811182821017156125ed576125ed6125b7565b604051601f8201601f191681016001600160401b038111828210171561263e5761263e6125b7565b604052919050565b5f8060408385031215612657575f80fd5b61266083612542565b91506020808401356001600160401b038082111561267c575f80fd5b818601915086601f83011261268f575f80fd5b8135818111156126a1576126a16125b7565b6126b3601f8201601f19168501612616565b915080825287848285010111156126c8575f80fd5b80848401858401375f848284010152508093505050509250929050565b5f606082840312156126f5575f80fd5b604051606081018181106001600160401b0382111715612717576127176125b7565b60405290508061272683612588565b815261273460208401612588565b6020820152604083013560408201525092915050565b5f6080828403121561275a575f80fd5b6127626125cb565b90508135815260208201356020820152604082013560408201526060820135606082015292915050565b5f6040828403121561279c575f80fd5b604051604081018181106001600160401b03821117156127be576127be6125b7565b604052823581526020928301359281019290925250919050565b5f805f8385036105608112156127ec575f80fd5b6127f686866126e5565b9350612805866060870161274a565b92506104808060df198301121561281a575f80fd5b6128226125f3565b91506128318760e0880161278c565b82526101206128428882890161278c565b602084015261016061285689828a0161278c565b60408501526101a061286a8a828b0161278c565b60608601526101e061287e8b828c0161278c565b60808701526102206128928c828d0161278c565b60a08801526102606128a68d828e0161278c565b60c08901526102a06128ba8e828f0161278c565b60e08a01526128cd8e6102e08f0161278c565b6101008a01526128e18e6103208f0161278c565b878a01526128f38e6103608f0161278c565b6101408a01526129078e6103a08f0161278c565b868a01526129198e6103e08f0161278c565b6101808a01526104208d0135858a01526104408d01356101c08a01526104608d0135848a0152878d01356102008a01526104a08d0135838a01526104c08d01356102408a01526104e08d0135828a01526105008d01356102808a01526105208d0135818a015250505050505050506105408501356102c0820152809150509250925092565b803563ffffffff81168114610fb2575f80fd5b5f805f805f61014086880312156129c6575f80fd5b6129d087876126e5565b94506129df876060880161274a565b93506129ed60e0870161299e565b92506129fc6101008701612542565b9150612a0b6101208701612588565b90509295509295909350565b5f8060408385031215612a28575f80fd5b612a3183612588565b9150612a3f60208401612588565b90509250929050565b5f60208284031215612a58575f80fd5b610fe38261299e565b5f5b83811015612a7b578181015183820152602001612a63565b50505f910152565b602081525f8251806020840152612aa1816040850160208701612a61565b601f01601f19169190910160400192915050565b5f60608284031215612ac5575f80fd5b610fe383836126e5565b5f8060408385031215612ae0575f80fd5b50508035926020909101359150565b5f6020808385031215612b00575f80fd5b82356001600160401b0380821115612b16575f80fd5b818501915085601f830112612b29575f80fd5b813581811115612b3b57612b3b6125b7565b612b49848260051b01612616565b818152848101925060079190911b830184019087821115612b68575f80fd5b928401925b81841015612bd25760808489031215612b84575f80fd5b612b8c6125cb565b612b9585612588565b8152612ba2868601612588565b868201526040612bb3818701612588565b9082015260608581013590820152835260809093019291840191612b6d565b979650505050505050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111561224657612246612bdd565b81810381811115610ee657610ee6612bdd565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f6001600160401b0380841680612c6557612c65612c38565b92169190910692915050565b5f6001600160401b0380841680612c8a57612c8a612c38565b92169190910492915050565b5f60208284031215612ca6575f80fd5b5051919050565b805f5b600b811015612ccf578151845260209384019390910190600101612cb0565b50505050565b612cea82825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e0840152506080810151610100612d4d8185018380518252602090810151910152565b60a08301519150610140612d6d8186018480518252602090810151910152565b60c08401519250610180612d8d8187018580518252602090810151910152565b60e085015193506101c0612dad8188018680518252602090810151910152565b92850151935061020092612dcd8785018680518252602090810151910152565b6101208601519450610240612dee8189018780518252602090810151910152565b92860151945061028092612e0e8885018780518252602090810151910152565b61016087015195506102c0612e2f818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b5f610ae08201905084518252602085015160208301526040850151612eeb604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a0850151610100612f388185018380518252602090810151910152565b60c08701519150610140612f588186018480518252602090810151910152565b60e08801519250610180612f788187018580518252602090810151910152565b9188015192506101c091612f988684018580518252602090810151910152565b6101208901519350610200612fb98188018680518252602090810151910152565b91890151935061024091612fd98784018680518252602090810151910152565b6101608a01519450610280612ffa8189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e08301526130d1610500830185612cad565b6130df610660830184612cd5565b949350505050565b5f602082840312156130f7575f80fd5b81518015158114610fe3575f80fd5b6001600160401b0382811682821603908082111561224657612246612bdd565b5f6001600160401b0380831681810361314157613141612bdd565b6001019392505050565b5f8161315957613159612bdd565b505f190190565b5f8251613171818460208701612a61565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a /// ``` #[rustfmt::skip] #[allow(clippy::all)] pub static BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( - b"`\xA0`@R0`\x80R4\x80\x15b\0\0\x14W_\x80\xFD[P`@Qb\x000o8\x03\x80b\x000o\x839\x81\x01`@\x81\x90Rb\0\x007\x91b\0\x02\xD8V[b\0\0Ab\0\0WV[b\0\0N\x83\x83\x83b\0\x01\x0BV[PPPb\0\x03\x8CV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15b\0\0\xA8W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80T`\x01`\x01`@\x1B\x03\x90\x81\x16\x14b\0\x01\x08W\x80T`\x01`\x01`@\x1B\x03\x19\x16`\x01`\x01`@\x1B\x03\x90\x81\x17\x82U`@Q\x90\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PV[\x82Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80b\0\x010WP` \x83\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80b\0\x01>WP` \x82\x01Q\x15[\x80b\0\x01LWP`@\x82\x01Q\x15[\x80b\0\x01ZWP``\x82\x01Q\x15[\x80b\0\x01eWP\x81Q\x15[\x80b\0\x01xWPa\x0E\x10\x81c\xFF\xFF\xFF\xFF\x16\x10[\x80b\0\x01\x8DWPc\x01\xE13\x80\x81c\xFF\xFF\xFF\xFF\x16\x11[\x15b\0\x01\xACW`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x82Q`\x04\x80T` \x80\x87\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16h\x01\0\0\0\0\0\0\0\0\x02`\x01`\x01`\x80\x1B\x03\x19\x93\x84\x16\x91\x90\x95\x16\x90\x81\x17\x85\x17\x90\x93U`@\x96\x87\x01Q`\x05\x81\x90U\x86Q_U\x90\x86\x01Q`\x01U\x95\x85\x01Q`\x02U``\x90\x94\x01Q`\x03U`\x06\x80T\x90\x94\x16\x17\x17\x90\x91U`\x07\x91\x90\x91U`\x08\x80Tc\xFF\xFF\xFF\xFF\x90\x92\x16`\x01`\xA0\x1B\x02c\xFF\xFF\xFF\xFF`\xA0\x1B\x19\x90\x92\x16\x91\x90\x91\x17\x90UV[`@Q``\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15b\0\x02sWcNH{q`\xE0\x1B_R`A`\x04R`$_\xFD[`@R\x90V[`@Q`\x80\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15b\0\x02sWcNH{q`\xE0\x1B_R`A`\x04R`$_\xFD[\x80Q`\x01`\x01`@\x1B\x03\x81\x16\x81\x14b\0\x02\xBFW_\x80\xFD[\x91\x90PV[\x80Qc\xFF\xFF\xFF\xFF\x81\x16\x81\x14b\0\x02\xBFW_\x80\xFD[_\x80_\x83\x85\x03a\x01\0\x81\x12\x15b\0\x02\xEDW_\x80\xFD[``\x81\x12\x15b\0\x02\xFBW_\x80\xFD[b\0\x03\x05b\0\x02DV[b\0\x03\x10\x86b\0\x02\xA8V[\x81Rb\0\x03 ` \x87\x01b\0\x02\xA8V[` \x82\x01R`@\x86\x81\x01Q\x90\x82\x01R\x93P`\x80`_\x19\x82\x01\x12\x15b\0\x03CW_\x80\xFD[Pb\0\x03Nb\0\x02yV[``\x85\x81\x01Q\x82R`\x80\x86\x01Q` \x83\x01R`\xA0\x86\x01Q`@\x83\x01R`\xC0\x86\x01Q\x90\x82\x01R\x91Pb\0\x03\x83`\xE0\x85\x01b\0\x02\xC4V[\x90P\x92P\x92P\x92V[`\x80Qa,\xBCb\0\x03\xB3_9_\x81\x81a\x11?\x01R\x81\x81a\x11h\x01Ra\x12\xE5\x01Ra,\xBC_\xF3\xFE`\x80`@R`\x046\x10a\x01\xAFW_5`\xE0\x1C\x80c\x85\x84\xD2?\x11a\0\xE7W\x80c\xC2;\x9E\x9E\x11a\0\x87W\x80c\xE003\x01\x11a\0bW\x80c\xE003\x01\x14a\x06\x14W\x80c\xF2\xFD\xE3\x8B\x14a\x063W\x80c\xF5ga`\x14a\x06RW\x80c\xF9\xE5\r\x19\x14a\x06qW_\x80\xFD[\x80c\xC2;\x9E\x9E\x14a\x05\x92W\x80c\xC8\xE5\xE4\x98\x14a\x05\xCAW\x80c\xD2M\x93=\x14a\x05\xE5W_\x80\xFD[\x80c\x9B\xAA<\xC9\x11a\0\xC2W\x80c\x9B\xAA<\xC9\x14a\x04\x8AW\x80c\x9F\xDBT\xA7\x14a\x04\xA9W\x80c\xAD<\xB1\xCC\x14a\x04\xFEW\x80c\xB5\xAD\xEA<\x14a\x05;W_\x80\xFD[\x80c\x85\x84\xD2?\x14a\x03\xF3W\x80c\x8D\xA5\xCB[\x14a\x04/W\x80c\x96\xC1\xCAa\x14a\x04kW_\x80\xFD[\x80c7\x8E\xC2;\x11a\x01RW\x80cR\xD1\x90-\x11a\x01-W\x80cR\xD1\x90-\x14a\x03\x8CW\x80ci\xCCj\x04\x14a\x03\xA0W\x80cqP\x18\xA6\x14a\x03\xB4W\x80c\x82nA\xFC\x14a\x03\xC8W_\x80\xFD[\x80c7\x8E\xC2;\x14a\x03\x1CW\x80cBm1\x94\x14a\x038W\x80cO\x1E\xF2\x86\x14a\x03yW_\x80\xFD[\x80c c\xD4\xF7\x11a\x01\x8DW\x80c c\xD4\xF7\x14a\x02\\W\x80c-R\xAA\xD6\x14a\x02{W\x80c/y\x88\x9D\x14a\x02\xA7W\x80c1=\xF7\xB1\x14a\x02\xE5W_\x80\xFD[\x80c\x01?\xA5\xFC\x14a\x01\xB3W\x80c\x02\xB5\x92\xF3\x14a\x01\xD4W\x80c\r\x8En,\x14a\x021W[_\x80\xFD[4\x80\x15a\x01\xBEW_\x80\xFD[Pa\x01\xD2a\x01\xCD6`\x04a!hV[a\x06\x85V[\0[4\x80\x15a\x01\xDFW_\x80\xFD[Pa\x01\xF3a\x01\xEE6`\x04a!\x81V[a\x078V[`@Qa\x02(\x94\x93\x92\x91\x90`\x01`\x01`@\x1B\x03\x94\x85\x16\x81R\x92\x84\x16` \x84\x01R\x92\x16`@\x82\x01R``\x81\x01\x91\x90\x91R`\x80\x01\x90V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02W_\x80\xFD[Pa\x01\xD2a\x06M6`\x04a!hV[a\x0C\x9FV[4\x80\x15a\x06]W_\x80\xFD[Pa\x01\xD2a\x06l6`\x04a&\x80V[a\x0C\xE1V[4\x80\x15a\x06|W_\x80\xFD[P`\tTa\x03*V[a\x06\x8Da\r\x8CV[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x06\xB4W`@Qc\xE6\xC4${`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x08T`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x90\x82\x16\x03a\x06\xE3W`@Qc\xA8c\xAE\xC9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x08\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x81\x17\x90\x91U`@Q\x90\x81R\x7F\x80\x17\xBB\x88\x7F\xDF\x8F\xCAC\x14\xA9\xD4\x0Fns\xB3\xB8\x10\x02\xD6~\\\xFA\x85\xD8\x81s\xAFj\xA4`r\x90` \x01[`@Q\x80\x91\x03\x90\xA1PV[`\t\x81\x81T\x81\x10a\x07GW_\x80\xFD[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01\x80T`\x01\x90\x91\x01T`\x01`\x01`@\x1B\x03\x80\x83\x16\x93P`\x01`@\x1B\x83\x04\x81\x16\x92`\x01`\x80\x1B\x90\x04\x16\x90\x84V[`\x08T`\x01`\x01`\xA0\x1B\x03\x16\x15\x15\x80\x15a\x07\xA6WP`\x08T`\x01`\x01`\xA0\x1B\x03\x163\x14\x15[\x15a\x07\xC4W`@Qc\x01GL\x8F`\xE7\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x06T\x82Q`\x01`\x01`@\x1B\x03\x91\x82\x16\x91\x16\x11\x15\x80a\x07\xFDWP`\x06T` \x83\x01Q`\x01`\x01`@\x1B\x03`\x01`@\x1B\x90\x92\x04\x82\x16\x91\x16\x11\x15[\x15a\x08\x1BW`@Qc\x05\x1CF\xEF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x08(\x82`@\x01Qa\r\xE7V[a\x082\x82\x82a\x0EWV[\x81Q`\x06\x80T` \x85\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x92\x16\x93\x16\x92\x90\x92\x17\x91\x90\x91\x17\x90U`@\x82\x01Q`\x07Ua\x08\x7Fa\x08xC\x90V[B\x84a\x0FKV[\x81` \x01Q`\x01`\x01`@\x1B\x03\x16\x82_\x01Q`\x01`\x01`@\x1B\x03\x16\x7F\xA0Jw9$PZA\x85d67%\xF5h2\xF5w.k\x8D\r\xBDn\xFC\xE7$\xDF\xE8\x03\xDA\xE6\x84`@\x01Q`@Qa\x08\xCF\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA3PPV[a\x08\xE3a\x114V[a\x08\xEC\x82a\x11\xD8V[a\x08\xF6\x82\x82a\x12\x19V[PPV[_a\t\x03a\x12\xDAV[P_\x80Q` a,\x90\x839\x81Q\x91R\x90V[a\t\x1Da\r\x8CV[`\x08T`\x01`\x01`\xA0\x1B\x03\x16\x15a\thW`\x08\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16\x90U`@Q\x7F\x9A_W\xDE\x85m\xD6h\xC5M\xD9^\\U\xDF\x93C!q\xCB\xCAI\xA8wmV \xEAY\xC0$P\x90_\x90\xA1V[`@Qc\xA8c\xAE\xC9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a\t\x8Ba\r\x8CV[a\t\x81_a\x13#V[`\t\x80T_\x91\x82\x91\x90a\t\xA8`\x01\x83a'\x82V[\x81T\x81\x10a\t\xB8Wa\t\xB8a'\x95V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x80\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x84\x10a\t\xF7W`@Qc\x18V\xA4\x99`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x08T`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16[\x81\x81\x10\x15a\n\xB8W\x84`\t\x82\x81T\x81\x10a\n'Wa\n'a'\x95V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x80\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x11\x15a\n\xB0W`\t\x81\x81T\x81\x10a\n`Wa\n`a'\x95V[\x90_R` _ \x90`\x02\x02\x01`\x01\x01T`\t\x82\x81T\x81\x10a\n\x83Wa\n\x83a'\x95V[\x90_R` _ \x90`\x02\x02\x01_\x01`\x10\x90T\x90a\x01\0\n\x90\x04`\x01`\x01`@\x1B\x03\x16\x93P\x93PPP\x91P\x91V[`\x01\x01a\n\x0BV[PP\x91P\x91V[a\n\xC7a\r\x8CV[a\x0E\x10\x81c\xFF\xFF\xFF\xFF\x16\x10\x80a\n\xE6WPc\x01\xE13\x80\x81c\xFF\xFF\xFF\xFF\x16\x11[\x80a\x0B\x04WP`\x08Tc\xFF\xFF\xFF\xFF`\x01`\xA0\x1B\x90\x91\x04\x81\x16\x90\x82\x16\x11\x15[\x15a\x0B\"W`@Qc\x07\xA5\x07w`\xE5\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x08\x80Tc\xFF\xFF\xFF\xFF\x90\x92\x16`\x01`\xA0\x1B\x02c\xFF\xFF\xFF\xFF`\xA0\x1B\x19\x90\x92\x16\x91\x90\x91\x17\x90UV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16_\x81\x15\x80\x15a\x0B\x8CWP\x82[\x90P_\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\x0B\xA7WP0;\x15[\x90P\x81\x15\x80\x15a\x0B\xB5WP\x80\x15[\x15a\x0B\xD3W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\x0B\xFDW\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\x0C\x06\x86a\x13\x93V[a\x0C\x0Ea\x13\xA4V[a\x0C\x19\x89\x89\x89a\x13\xACV[\x83\x15a\x0C_W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPPPV[`\nT_\x90`\xFF\x16a\x0C\x85Wa\x0C\x80\x83\x83a\x14\xD8V[a\x0C\x96V[\x81`\x0BT\x84a\x0C\x94\x91\x90a'\x82V[\x11[\x90P[\x92\x91PPV[a\x0C\xA7a\r\x8CV[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x0C\xD5W`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R_`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[a\x0C\xDE\x81a\x13#V[PV[a\x0C\xEC`\t_a\x1E\x82V[_[\x81Q\x81\x10\x15a\x08\xF6W`\t\x82\x82\x81Q\x81\x10a\r\x0BWa\r\x0Ba'\x95V[` \x90\x81\x02\x91\x90\x91\x01\x81\x01Q\x82T`\x01\x81\x81\x01\x85U_\x94\x85R\x93\x83\x90 \x82Q`\x02\x90\x92\x02\x01\x80T\x93\x83\x01Q`@\x84\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16`\x01`\x80\x1B\x02g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`\x80\x1B\x19\x92\x82\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x97\x16\x91\x90\x94\x16\x17\x94\x90\x94\x17\x93\x90\x93\x16\x17\x82U``\x01Q\x90\x82\x01U\x01a\x0C\xEEV[3a\r\xBE\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\t\x81W`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R3`\x04\x82\x01R`$\x01a\x0C\xCCV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x81\x10\x80a\x08\xF6W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01a\x0C\xCCV[_a\x0E`a\x160V[\x90Pa\x0Eja\x1E\xA0V[\x83Q`\x01`\x01`@\x1B\x03\x90\x81\x16\x82R` \x85\x01Q\x16\x81`\x01` \x02\x01R`@\x84\x81\x01Q\x82\x82\x01R`\x01T``\x83\x01R`\x02T`\x80\x83\x01R`\x03T`\xA0\x83\x01R_T`\xC0\x83\x01RQc\xCESzw`\xE0\x1B\x81Rs_\xBD\xB21Vx\xAF\xEC\xB3g\xF02\xD9?d/d\x18\n\xA3\x90c\xCESzw\x90a\x0E\xE9\x90\x85\x90\x85\x90\x88\x90`\x04\x01a)\xAFV[` `@Q\x80\x83\x03\x81\x86Z\xF4\x15\x80\x15a\x0F\x04W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0F(\x91\x90a+\xDDV[a\x0FEW`@Qc\t\xBD\xE39`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPV[`\tT\x15\x80\x15\x90a\x0F\xC0WP`\x08T`\t\x80T`\x01`\xA0\x1B\x83\x04c\xFF\xFF\xFF\xFF\x16\x92`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x0F\x8BWa\x0F\x8Ba'\x95V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01Ta\x0F\xB5\x90`\x01`@\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x84a+\xFCV[`\x01`\x01`@\x1B\x03\x16\x11[\x15a\x10SW`\x08T`\t\x80T\x90\x91`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x0F\xEDWa\x0F\xEDa'\x95V[_\x91\x82R` \x82 `\x02\x90\x91\x02\x01\x80T`\x01`\x01`\xC0\x1B\x03\x19\x16\x81U`\x01\x01U`\x08\x80T`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90`\x18a\x10-\x83a,#V[\x91\x90a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UPP[`@\x80Q`\x80\x81\x01\x82R`\x01`\x01`@\x1B\x03\x94\x85\x16\x81R\x92\x84\x16` \x80\x85\x01\x91\x82R\x83\x01Q\x85\x16\x84\x83\x01\x90\x81R\x92\x90\x91\x01Q``\x84\x01\x90\x81R`\t\x80T`\x01\x81\x01\x82U_\x91\x90\x91R\x93Q`\x02\x90\x94\x02\x7Fn\x15@\x17\x1Bl\x0C\x96\x0Bq\xA7\x02\r\x9F`\x07\x7Fj\xF91\xA8\xBB\xF5\x90\xDA\x02#\xDA\xCFu\xC7\xAF\x81\x01\x80T\x93Q\x94Q\x87\x16`\x01`\x80\x1B\x02g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`\x80\x1B\x19\x95\x88\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x95\x16\x96\x90\x97\x16\x95\x90\x95\x17\x92\x90\x92\x17\x92\x90\x92\x16\x93\x90\x93\x17\x90\x91UQ\x7Fn\x15@\x17\x1Bl\x0C\x96\x0Bq\xA7\x02\r\x9F`\x07\x7Fj\xF91\xA8\xBB\xF5\x90\xDA\x02#\xDA\xCFu\xC7\xB0\x90\x91\x01UV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a\x11\xBAWP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a\x11\xAE_\x80Q` a,\x90\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\t\x81W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x11\xE0a\r\x8CV[`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x81R\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x90` \x01a\x07-V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x12sWP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x12p\x91\x81\x01\x90a,HV[`\x01[a\x12\x9BW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x0C\xCCV[_\x80Q` a,\x90\x839\x81Q\x91R\x81\x14a\x12\xCBW`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0C\xCCV[a\x12\xD5\x83\x83a\x1C`V[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\t\x81W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T`\x01`\x01`\xA0\x1B\x03\x19\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90_\x90\xA3PPPV[a\x13\x9Ba\x1C\xB5V[a\x0C\xDE\x81a\x1C\xFEV[a\t\x81a\x1C\xB5V[\x82Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80a\x13\xD0WP` \x83\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80a\x13\xDDWP` \x82\x01Q\x15[\x80a\x13\xEAWP`@\x82\x01Q\x15[\x80a\x13\xF7WP``\x82\x01Q\x15[\x80a\x14\x01WP\x81Q\x15[\x80a\x14\x13WPa\x0E\x10\x81c\xFF\xFF\xFF\xFF\x16\x10[\x80a\x14'WPc\x01\xE13\x80\x81c\xFF\xFF\xFF\xFF\x16\x11[\x15a\x14EW`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x82Q`\x04\x80T` \x80\x87\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x93\x84\x16\x91\x90\x95\x16\x90\x81\x17\x85\x17\x90\x93U`@\x96\x87\x01Q`\x05\x81\x90U\x86Q_U\x90\x86\x01Q`\x01U\x95\x85\x01Q`\x02U``\x90\x94\x01Q`\x03U`\x06\x80T\x90\x94\x16\x17\x17\x90\x91U`\x07\x91\x90\x91U`\x08\x80Tc\xFF\xFF\xFF\xFF\x90\x92\x16`\x01`\xA0\x1B\x02c\xFF\xFF\xFF\xFF`\xA0\x1B\x19\x90\x92\x16\x91\x90\x91\x17\x90UV[`\tT_\x90C\x84\x11\x80a\x14\xE9WP\x80\x15[\x80a\x153WP`\x08T`\t\x80T\x90\x91`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x15\x17Wa\x15\x17a'\x95V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x84\x10[\x15a\x15QW`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_\x80\x80a\x15_`\x01\x85a'\x82V[\x90P[\x81a\x15\xFBW`\x08T`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x81\x10a\x15\xFBW\x86`\t\x82\x81T\x81\x10a\x15\x94Wa\x15\x94a'\x95V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x11a\x15\xE9W`\x01\x91P`\t\x81\x81T\x81\x10a\x15\xC9Wa\x15\xC9a'\x95V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x92Pa\x15\xFBV[\x80a\x15\xF3\x81a,_V[\x91PPa\x15bV[\x81a\x16\x19W`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x85a\x16$\x84\x89a'\x82V[\x11\x97\x96PPPPPPPV[a\x168a\x1E\xBEV[b\x01\0\0\x81R`\x07` \x82\x01R\x7F\x13i\xAAx\xDCP\x13Z\xD7V\xD6,\x97\xA6J\x0E\xDC\xD3\0fXAh \r\x9D\x1F\xAC\xF8,\xA4\xF5`@\x82\x01QR\x7F,\xF24V\xD7\x12\xB0o\x8E:\xA5\xBF\n\xCC>F\xA3\xD0\x94`*:+\x99\xD8s\xBB\xA0ZC\x91G` `@\x83\x01Q\x01R\x7F\x08\xA3_7\x9D-,I\nQ\0f\x97'^M\xB7\x9Bg\xB4\xA1u\xC1G~&-)\xE2^B1``\x82\x01QR\x7F!\x88(\x13\x1B\xB7\x94\x0C\xCC\x88\xC5a\xB2\x99uZ\xF4\xBF\x0Bq\xED\x93\x0B\x12\x9E\x8B\xE0\xA1!\x819\xEA` ``\x83\x01Q\x01R\x7F#\xA2\x17$6\xC1\x14[6\xD5\xBCm;1\xFA\x16\x10\xC7:T>\xA4C\x91\x8A\xAA>\xE1u\xF9\x92\x1B`\x80\x82\x01QR\x7F%\x02\xAD\xF4\x04\xD6(w\xC3\x10!J\xE9\x94.\x93\xC4\x0B\x15M4\xC0$\xBA\xB4\x8A<\xA0W\xE6\n\x11` `\x80\x83\x01Q\x01R\x7F\x1B\xB8\x8A\xDA\x91\xABw4\x88/x&\xB8\x12u2\0\x81\xACH_\x9C\xF8\xBF\xBC;\xA5Kn\xB4\xDF\xF3`\xA0\x82\x01QR\x7F%\xC7J'\xE9\xA3\xB2\x01\x14\xA3\xA9\x1F1\xC2\x0F\x01w~~\xD9\x13\xE0\xEF\x94\x9F\x02\x85\xE2\xE7\xC2\x06\x9B` `\xA0\x83\x01Q\x01R\x7F\x12\xB0\xCEv\xAC\x8B\r\xBD@^\xBC]\xD0\xBA\xE0\xF9\x1A\xEDP\x03<~\xA3o\xC6*\xAB\xA2\xB9\x833\xDC`\xC0\x82\x01QR\x7F\x18[B\xAFI\xDD\x1C\xBE3z\x84\xF7KpArB\x8EuJ\x0B\xEA\x02J\xB3\xEB/\x99j\xFB,G` `\xC0\x83\x01Q\x01R\x7F!\xF5:\xD4S\x8BEC\x8B\xBF\x05!D`p\"9 \xE3\xDFo\x90\"\xA6L\xC1m\x7F\x94\xE8\\\x08`\xE0\x82\x01QR\x7F\"x\xAC=\xED\xFD\xAC\x7F\xEB\x97%\xA0\"IquQ\x8E\xAD\xA5,\x892\xFC@\xE6\xE7[\xEA\x88\x9F\xB8` `\xE0\x83\x01Q\x01R\x7F\x08v\x13o\x81\xC1b\x98H{\xFB\x1B\xE7MJ4\x87\xECEdZ\xB1\xD0\x9D\xC2\xE5\xB8e\xD6\"0\xDFa\x01\0\x82\x01QR\x7F\t\x8Cd\x1C\x94~\xCDy\x8D\xFD^\x1B/\xE4(\x02L\xDF\x03\x06\x1AS\xFFwN\xA8\xA9\xE3\xDE\x9D?+` a\x01\0\x83\x01Q\x01R\x7F\x15\xEA\xAC,b2\xD2&\x8B\xF7\x9D\xC4~\xD9fo\x99/\xB3\xD9j\xD2?\xB2\x16\x90\xC2\x15\x86\xC5G.a\x01 \x82\x01QR\x7F\x0F\x10\xF1\xFF\xC5H\x81(\x7F\xDAo \x0B\xC8]\x82E\xB5\x08\xD8D\xA9t\t\x8AA\x11\x98g\xB3%\xD0` a\x01 \x83\x01Q\x01R\x7F\x08\x95\xCE\xEA@\xB0\x85SN\x979\xCATB\xBAH\xB3\xA3Y*\xFF\xDE+P\x9D\xF7E!\xB4}\x8A\xB0a\x01@\x82\x01QR\x7F.\x12\xECX\0\xAC\x92\xFE*\x8Ep@\xBC[C[\x9E\xB7\x1E18\x01s\xFAv\x88\xBF\x81\xFC\xBB\xA4U` a\x01@\x83\x01Q\x01R\x7F/S\x84\xEBVS\xE4uv\xEF\xE2H\xE7\x90?F2CAK\xFE\xD5#}\xDAu\r\xF3\x99k\xD9\x18a\x01`\x82\x01QR\x7F\x1C<\xD6\xB1\x1D\xA8pL\xDC\x87\x1A\xB4\xFA2=~\xE5{\xD4\x0C\xE1e\xB4\x9AV\xD5\xEFd\x89\xCD%\x1A` a\x01`\x83\x01Q\x01R\x7F\x13W\x99\x94\x95|\xE1UL\xC1\xE5\xB1\x94\xFBc\xC9Q7\x07\xF6'AO\x84Bh\x1A\xE76\xE3dPa\x01\x80\x82\x01QR\x7F&\xC9\xBD\xCD\x96\xD8\xE4 \xB1)t\xAD\xE9:\xD9\xC3\x12\xC4\x18R\x13\xD2\xF6\x83\x1A|bZ\x18\x89\x0E\x95` a\x01\x80\x83\x01Q\x01R\x7F\x0C\xC7\n\x1DT*\x9A\x155\xAE]\x92\x01ij\xDC\\\x99\xC1\xBC\xEB\xD9\x95\x1D\xFA\x8A\xFE\xC7\x9F\xA0\xB6Da\x01\xA0\x82\x01QR\x7F\x10\xB0C\xD9\xF1\x86\x91\x81\xB9ey\xD6an\xFC\x17\xA5\xDF{\x84\xC4\xD41\xD9f\xC9\tK\xF1\xE8\x81S` a\x01\xA0\x83\x01Q\x01R\x7F\x19\x8Ae0\x9D\x13\x1AC\xB0\xAB\x1CGe\x9D\x036\xCF\xBFb\xB2\x7FG'\x10kO\xD9q\xC7=\xD4\x03a\x01\xC0\x82\x01QR\x7F#\xDF\x99\xEA\xC3\xC1\x94y\x03\xB2\x11\xB8\0\xEF\xEBv\xF4}^\x87\xB7AHfT4\x92\xE8\xC7y\x8D\x1A` a\x01\xC0\x83\x01Q\x01R\x7F\"\x1C\xC5\xE4{\x81\xCE\x8D\xCF\xA7.\xF9\x81\x91j\x8E\xDD\xEF\x12\xFC\xDEY\xC5lb\x83\x0C\x12n\xBE\xF0\xDEa\x01\xE0\x82\x01QR\x7F#\x1F\x994\x0C5\xC9\xE0\x96R\xA6\xDFs\xC9\xCE\xC5\xD8\x878\xCBq\xFFEqo\xDC\x9E\x9EE\xA4\x92n` a\x01\xE0\x83\x01Q\x01R\x7F,\x9F\x14\x89\xFC\xE0\xF2c\xE0?>\x97\xBF\nr':\xAF\xCC\xA92_\xF4w\x86\xAD\xB0JR\xA6\xD2,a\x02\0\x82\x01QR\x7F!\xF6n(\xF1~\x01\xE9\xFDY>\x16\xD0\"\xC4\xEC\xA2[\xD5\xDB\x96\xDA\xEC`m\x97\xB6\x04\xCCAH8` a\x02\0\x83\x01Q\x01R\x7F \x15tV\x04\xA9W\x1E\"k\xD9\x90C\xCF\xAF\x1F\x96&|\xC5\xDEg\xF4\x97V?\xF8\x11\0S\x1D&a\x02 \x82\x01QR\x7F h\x89\xFFLX\xDD\x08\xEE\x11\x07\x19\x1A*[\xC5\xDB\xAEU\xC4\x9D}\x83\x97\x80\x17\x99\x86\x8D\x10\xF8\x05` a\x02 \x83\x01Q\x01R\x7F!\x06*\xB8\xF8\xEC\xD8\x93+B\x9A\x1E\xB8aK\x1E\x03\xDBa\xBF\xF6\xA5\xCD-]~\xA1\x93\xE9\x0E\x99'a\x02@\x82\x01QR\x7F!\x7F\x9B'\xB94\xB8\x8F\xFEU]h-\xFEn\x8BmP?\x86\xB1K\xBD\x964+\xC4\x84\x87\xA6\x0B'` a\x02@\x83\x01Q\x01R\x7F\x1C\x9E\xDA-\x19\\\xB71\xF9\x03#^\xADjO|f\xDBI\xDAq>\xCB'\xAF\xEE\x07o\x0E\xEAqTa\x02`\x82\x01QR\x7F&G\xC1a\xC0\x0B\x90%\x8E\x1C\xEF\xEB\xB1t\x81\xF8\xA5\xD9\x1B_\x9D\xCAbn>\x89\xA9![\xCC\xA1j` a\x02`\x83\x01Q\x01R\x7F\xB0\x83\x88\x93\xEC\x1F#~\x8B\x072;\x07DY\x9FN\x97\xB5\x98\xB3\xB5\x89\xBC\xC2\xBC7\xB8\xD5\xC4\x18\x01a\x02\x80\x82\x01R\x7F\xC1\x83\x93\xC0\xFA0\xFEN\x8B\x03\x8E5z\xD8Q\xEA\xE8\xDE\x91\x07XN\xFF\xE7\xC7\xF1\xF6Q\xB2\x01\x0E&a\x02\xA0\x82\x01R\x90V[a\x1Ci\x82a\x1D\x06V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90_\x90\xA2\x80Q\x15a\x1C\xADWa\x12\xD5\x82\x82a\x1DiV[a\x08\xF6a\x1D\xDBV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a\t\x81W`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0C\xA7a\x1C\xB5V[\x80`\x01`\x01`\xA0\x1B\x03\x16;_\x03a\x1D;W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x0C\xCCV[_\x80Q` a,\x90\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[``_\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x1D\x85\x91\x90a,tV[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a\x1D\xBDW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a\x1D\xC2V[``\x91P[P\x91P\x91Pa\x1D\xD2\x85\x83\x83a\x1D\xFAV[\x95\x94PPPPPV[4\x15a\t\x81W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a\x1E\x0FWa\x1E\n\x82a\x1EYV[a\x1ERV[\x81Q\x15\x80\x15a\x1E&WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x1EOW`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x0C\xCCV[P\x80[\x93\x92PPPV[\x80Q\x15a\x1EiW\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80T_\x82U`\x02\x02\x90_R` _ \x90\x81\x01\x90a\x0C\xDE\x91\x90a!$V[`@Q\x80`\xE0\x01`@R\x80`\x07\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80a\x02\xC0\x01`@R\x80_\x81R` \x01_\x81R` \x01a\x1E\xF1`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1F\x11`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1F1`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1FQ`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1Fq`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1F\x91`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1F\xB1`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1F\xD1`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1F\xF1`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a \x11`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a 1`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a Q`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a q`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a \x91`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a \xB1`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a \xD1`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a \xF1`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a!\x11`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R_` \x82\x01\x81\x90R`@\x90\x91\x01R\x90V[[\x80\x82\x11\x15a!IW\x80T`\x01`\x01`\xC0\x1B\x03\x19\x16\x81U_`\x01\x82\x01U`\x02\x01a!%V[P\x90V[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a!cW_\x80\xFD[\x91\x90PV[_` \x82\x84\x03\x12\x15a!xW_\x80\xFD[a\x0C\x96\x82a!MV[_` \x82\x84\x03\x12\x15a!\x91W_\x80\xFD[P5\x91\x90PV[cNH{q`\xE0\x1B_R`A`\x04R`$_\xFD[`@Qa\x02\xE0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a!\xCFWa!\xCFa!\x98V[`@R\x90V[`@Q`\x80\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a!\xCFWa!\xCFa!\x98V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\"\x1FWa\"\x1Fa!\x98V[`@R\x91\x90PV[\x805`\x01`\x01`@\x1B\x03\x81\x16\x81\x14a!cW_\x80\xFD[_``\x82\x84\x03\x12\x15a\"MW_\x80\xFD[`@Q``\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a\"oWa\"oa!\x98V[`@R\x90P\x80a\"~\x83a\"'V[\x81Ra\"\x8C` \x84\x01a\"'V[` \x82\x01R`@\x83\x015`@\x82\x01RP\x92\x91PPV[_`@\x82\x84\x03\x12\x15a\"\xB2W_\x80\xFD[`@Q`@\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a\"\xD4Wa\"\xD4a!\x98V[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[_\x80\x82\x84\x03a\x04\xE0\x81\x12\x15a#\x01W_\x80\xFD[a#\x0B\x85\x85a\"=V[\x92Pa\x04\x80\x80`_\x19\x83\x01\x12\x15a# W_\x80\xFD[a#(a!\xACV[\x91Pa#7\x86``\x87\x01a\"\xA2V[\x82Ra#F\x86`\xA0\x87\x01a\"\xA2V[` \x83\x01Ra#X\x86`\xE0\x87\x01a\"\xA2V[`@\x83\x01Ra\x01 a#l\x87\x82\x88\x01a\"\xA2V[``\x84\x01Ra\x01`a#\x80\x88\x82\x89\x01a\"\xA2V[`\x80\x85\x01Ra\x01\xA0a#\x94\x89\x82\x8A\x01a\"\xA2V[`\xA0\x86\x01Ra\x01\xE0a#\xA8\x8A\x82\x8B\x01a\"\xA2V[`\xC0\x87\x01Ra\x02 a#\xBC\x8B\x82\x8C\x01a\"\xA2V[`\xE0\x88\x01Ra\x02`a#\xD0\x8C\x82\x8D\x01a\"\xA2V[a\x01\0\x89\x01Ra\x02\xA0a#\xE5\x8D\x82\x8E\x01a\"\xA2V[\x87\x8A\x01Ra#\xF7\x8Da\x02\xE0\x8E\x01a\"\xA2V[a\x01@\x8A\x01Ra$\x0B\x8Da\x03 \x8E\x01a\"\xA2V[\x86\x8A\x01Ra$\x1D\x8Da\x03`\x8E\x01a\"\xA2V[a\x01\x80\x8A\x01Ra\x03\xA0\x8C\x015\x94\x89\x01\x94\x90\x94Ra\x03\xC0\x8B\x015a\x01\xC0\x89\x01Ra\x03\xE0\x8B\x015\x92\x88\x01\x92\x90\x92Ra\x04\0\x8A\x015a\x02\0\x88\x01Ra\x04 \x8A\x015\x90\x87\x01Ra\x04@\x89\x015a\x02@\x87\x01Ra\x04`\x89\x015\x90\x86\x01R\x92\x87\x015a\x02\x80\x85\x01RPPa\x04\xA0\x85\x015\x90\x82\x01Ra\x04\xC0\x90\x93\x015a\x02\xC0\x84\x01RP\x92\x90\x91PV[_\x80`@\x83\x85\x03\x12\x15a$\xB0W_\x80\xFD[a$\xB9\x83a!MV[\x91P` \x80\x84\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a$\xD5W_\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12a$\xE8W_\x80\xFD[\x815\x81\x81\x11\x15a$\xFAWa$\xFAa!\x98V[a%\x0C`\x1F\x82\x01`\x1F\x19\x16\x85\x01a!\xF7V[\x91P\x80\x82R\x87\x84\x82\x85\x01\x01\x11\x15a%!W_\x80\xFD[\x80\x84\x84\x01\x85\x84\x017_\x84\x82\x84\x01\x01RP\x80\x93PPPP\x92P\x92\x90PV[\x805c\xFF\xFF\xFF\xFF\x81\x16\x81\x14a!cW_\x80\xFD[_` \x82\x84\x03\x12\x15a%aW_\x80\xFD[a\x0C\x96\x82a%>V[_\x80_\x80\x84\x86\x03a\x01 \x81\x12\x15a%\x7FW_\x80\xFD[a%\x89\x87\x87a\"=V[\x94P`\x80`_\x19\x82\x01\x12\x15a%\x9CW_\x80\xFD[Pa%\xA5a!\xD5V[``\x86\x81\x015\x82R`\x80\x87\x015` \x83\x01R`\xA0\x87\x015`@\x83\x01R`\xC0\x87\x015\x90\x82\x01R\x92Pa%\xD8`\xE0\x86\x01a%>V[\x91Pa%\xE7a\x01\0\x86\x01a!MV[\x90P\x92\x95\x91\x94P\x92PV[_[\x83\x81\x10\x15a&\x0CW\x81\x81\x01Q\x83\x82\x01R` \x01a%\xF4V[PP_\x91\x01RV[` \x81R_\x82Q\x80` \x84\x01Ra&2\x81`@\x85\x01` \x87\x01a%\xF2V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[_``\x82\x84\x03\x12\x15a&VW_\x80\xFD[a\x0C\x96\x83\x83a\"=V[_\x80`@\x83\x85\x03\x12\x15a&qW_\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[_` \x80\x83\x85\x03\x12\x15a&\x91W_\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a&\xA7W_\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a&\xBAW_\x80\xFD[\x815\x81\x81\x11\x15a&\xCCWa&\xCCa!\x98V[a&\xDA\x84\x82`\x05\x1B\x01a!\xF7V[\x81\x81R\x84\x81\x01\x92P`\x07\x91\x90\x91\x1B\x83\x01\x84\x01\x90\x87\x82\x11\x15a&\xF9W_\x80\xFD[\x92\x84\x01\x92[\x81\x84\x10\x15a'cW`\x80\x84\x89\x03\x12\x15a'\x15W_\x80\xFD[a'\x1Da!\xD5V[a'&\x85a\"'V[\x81Ra'3\x86\x86\x01a\"'V[\x86\x82\x01R`@a'D\x81\x87\x01a\"'V[\x90\x82\x01R``\x85\x81\x015\x90\x82\x01R\x83R`\x80\x90\x93\x01\x92\x91\x84\x01\x91a&\xFEV[\x97\x96PPPPPPPV[cNH{q`\xE0\x1B_R`\x11`\x04R`$_\xFD[\x81\x81\x03\x81\x81\x11\x15a\x0C\x99Wa\x0C\x99a'nV[cNH{q`\xE0\x1B_R`2`\x04R`$_\xFD[\x80_[`\x07\x81\x10\x15a\x0FEW\x81Q\x84R` \x93\x84\x01\x93\x90\x91\x01\x90`\x01\x01a'\xACV[a'\xE0\x82\x82Q\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[` \x81\x81\x01Q\x80Q`@\x85\x01R\x90\x81\x01Q``\x84\x01RP`@\x81\x01Q\x80Q`\x80\x84\x01R` \x81\x01Q`\xA0\x84\x01RP``\x81\x01Q\x80Q`\xC0\x84\x01R` \x81\x01Q`\xE0\x84\x01RP`\x80\x81\x01Qa\x01\0a(C\x81\x85\x01\x83\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xA0\x83\x01Q\x91Pa\x01@a(c\x81\x86\x01\x84\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xC0\x84\x01Q\x92Pa\x01\x80a(\x83\x81\x87\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xE0\x85\x01Q\x93Pa\x01\xC0a(\xA3\x81\x88\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x85\x01Q\x93Pa\x02\0\x92a(\xC3\x87\x85\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01 \x86\x01Q\x94Pa\x02@a(\xE4\x81\x89\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x86\x01Q\x94Pa\x02\x80\x92a)\x04\x88\x85\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01`\x87\x01Q\x95Pa\x02\xC0a)%\x81\x8A\x01\x88\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x87\x01Q\x80Qa\x03\0\x8A\x01R` \x01Qa\x03 \x89\x01Ra\x01\xA0\x87\x01Qa\x03@\x89\x01R\x90\x86\x01Qa\x03`\x88\x01Ra\x01\xE0\x86\x01Qa\x03\x80\x88\x01R\x92\x85\x01Qa\x03\xA0\x87\x01Ra\x02 \x85\x01Qa\x03\xC0\x87\x01R\x91\x84\x01Qa\x03\xE0\x86\x01Ra\x02`\x84\x01Qa\x04\0\x86\x01R\x83\x01Qa\x04 \x85\x01Ra\x02\xA0\x83\x01Qa\x04@\x85\x01R\x90\x91\x01Qa\x04`\x90\x92\x01\x91\x90\x91RPV[_a\n`\x82\x01\x90P\x84Q\x82R` \x85\x01Q` \x83\x01R`@\x85\x01Qa)\xE1`@\x84\x01\x82\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[P``\x85\x01Q\x80Q`\x80\x84\x01R` \x81\x01Q`\xA0\x84\x01RP`\x80\x85\x01Q\x80Q`\xC0\x84\x01R` \x81\x01Q`\xE0\x84\x01RP`\xA0\x85\x01Qa\x01\0a*.\x81\x85\x01\x83\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xC0\x87\x01Q\x91Pa\x01@a*N\x81\x86\x01\x84\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xE0\x88\x01Q\x92Pa\x01\x80a*n\x81\x87\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x88\x01Q\x92Pa\x01\xC0\x91a*\x8E\x86\x84\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01 \x89\x01Q\x93Pa\x02\0a*\xAF\x81\x88\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x89\x01Q\x93Pa\x02@\x91a*\xCF\x87\x84\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01`\x8A\x01Q\x94Pa\x02\x80a*\xF0\x81\x89\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x8A\x01Q\x80Qa\x02\xC0\x89\x01R` \x90\x81\x01Qa\x02\xE0\x89\x01Ra\x01\xA0\x8B\x01Q\x80Qa\x03\0\x8A\x01R\x81\x01Qa\x03 \x89\x01R\x93\x8A\x01Q\x80Qa\x03@\x89\x01R\x84\x01Qa\x03`\x88\x01Ra\x01\xE0\x8A\x01Q\x80Qa\x03\x80\x89\x01R\x84\x01Qa\x03\xA0\x88\x01R\x89\x01Q\x80Qa\x03\xC0\x88\x01R\x83\x01Qa\x03\xE0\x87\x01Ra\x02 \x89\x01Q\x80Qa\x04\0\x88\x01R\x83\x01Qa\x04 \x87\x01R\x90\x88\x01Q\x80Qa\x04@\x87\x01R\x82\x01Qa\x04`\x86\x01Ra\x02`\x88\x01Q\x80Qa\x04\x80\x87\x01R\x90\x91\x01Qa\x04\xA0\x85\x01R\x86\x01Qa\x04\xC0\x84\x01RPa\x02\xA0\x85\x01Qa\x04\xE0\x83\x01Ra+\xC7a\x05\0\x83\x01\x85a'\xA9V[a+\xD5a\x05\xE0\x83\x01\x84a'\xCBV[\x94\x93PPPPV[_` \x82\x84\x03\x12\x15a+\xEDW_\x80\xFD[\x81Q\x80\x15\x15\x81\x14a\x1ERW_\x80\xFD[`\x01`\x01`@\x1B\x03\x82\x81\x16\x82\x82\x16\x03\x90\x80\x82\x11\x15a,\x1CWa,\x1Ca'nV[P\x92\x91PPV[_`\x01`\x01`@\x1B\x03\x80\x83\x16\x81\x81\x03a,>Wa,>a'nV[`\x01\x01\x93\x92PPPV[_` \x82\x84\x03\x12\x15a,XW_\x80\xFD[PQ\x91\x90PV[_\x81a,mWa,ma'nV[P_\x19\x01\x90V[_\x82Qa,\x85\x81\x84` \x87\x01a%\xF2V[\x91\x90\x91\x01\x92\x91PPV\xFE6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\xA1dsolcC\0\x08\x17\0\n", + b"`\xA0`@R0`\x80R4\x80\x15b\0\0\x14W_\x80\xFD[P`@Qb\x005\xBF8\x03\x80b\x005\xBF\x839\x81\x01`@\x81\x90Rb\0\x007\x91b\0\x03(V[b\0\0Ab\0\0YV[b\0\0O\x84\x84\x84\x84b\0\x01\rV[PPPPb\0\x03\xF0V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80Th\x01\0\0\0\0\0\0\0\0\x90\x04`\xFF\x16\x15b\0\0\xAAW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x80T`\x01`\x01`@\x1B\x03\x90\x81\x16\x14b\0\x01\nW\x80T`\x01`\x01`@\x1B\x03\x19\x16`\x01`\x01`@\x1B\x03\x90\x81\x17\x82U`@Q\x90\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PV[\x83Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80b\0\x012WP` \x84\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80b\0\x01@WP` \x83\x01Q\x15[\x80b\0\x01NWP`@\x83\x01Q\x15[\x80b\0\x01\\WP``\x83\x01Q\x15[\x80b\0\x01gWP\x82Q\x15[\x80b\0\x01zWPa\x0E\x10\x82c\xFF\xFF\xFF\xFF\x16\x10[\x80b\0\x01\x8FWPc\x01\xE13\x80\x82c\xFF\xFF\xFF\xFF\x16\x11[\x80b\0\x01\xA2WP`\x01`\x01`@\x1B\x03\x81\x16\x15[\x15b\0\x01\xC1W`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x83Q`\t\x80T` \x80\x88\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16h\x01\0\0\0\0\0\0\0\0\x02`\x01`\x01`\x80\x1B\x03\x19\x93\x84\x16\x95\x82\x16\x95\x86\x17\x81\x17\x90\x94U`@\x98\x89\x01Q`\n\x81\x90U`\x0B\x80T\x90\x94\x16\x90\x95\x17\x90\x93\x17\x90\x91U`\x0C\x92\x90\x92U\x84Q`\x01\x81\x90U\x91\x85\x01Q`\x02\x81\x90U\x95\x85\x01Q`\x03\x81\x90U``\x90\x95\x01Q`\x04\x81\x90U`\x05\x92\x90\x92U`\x06\x95\x90\x95U`\x07\x93\x90\x93U`\x08\x92\x90\x92U`\r\x80Tc\xFF\xFF\xFF\xFF\x90\x92\x16`\x01`\xA0\x1B\x02c\xFF\xFF\xFF\xFF`\xA0\x1B\x19\x90\x92\x16\x91\x90\x91\x17\x90U_\x80T\x91\x90\x92\x16`\x01`\x01`@\x1B\x03\x19\x91\x90\x91\x16\x17\x90UV[`@Q``\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15b\0\x02\xC3WcNH{q`\xE0\x1B_R`A`\x04R`$_\xFD[`@R\x90V[`@Q`\x80\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15b\0\x02\xC3WcNH{q`\xE0\x1B_R`A`\x04R`$_\xFD[\x80Q`\x01`\x01`@\x1B\x03\x81\x16\x81\x14b\0\x03\x0FW_\x80\xFD[\x91\x90PV[\x80Qc\xFF\xFF\xFF\xFF\x81\x16\x81\x14b\0\x03\x0FW_\x80\xFD[_\x80_\x80\x84\x86\x03a\x01 \x81\x12\x15b\0\x03>W_\x80\xFD[``\x81\x12\x15b\0\x03LW_\x80\xFD[b\0\x03Vb\0\x02\x94V[b\0\x03a\x87b\0\x02\xF8V[\x81Rb\0\x03q` \x88\x01b\0\x02\xF8V[` \x82\x01R`@\x87\x81\x01Q\x90\x82\x01R\x94P`\x80`_\x19\x82\x01\x12\x15b\0\x03\x94W_\x80\xFD[Pb\0\x03\x9Fb\0\x02\xC9V[``\x86\x81\x01Q\x82R`\x80\x87\x01Q` \x83\x01R`\xA0\x87\x01Q`@\x83\x01R`\xC0\x87\x01Q\x90\x82\x01R\x92Pb\0\x03\xD4`\xE0\x86\x01b\0\x03\x14V[\x91Pb\0\x03\xE5a\x01\0\x86\x01b\0\x02\xF8V[\x90P\x92\x95\x91\x94P\x92PV[`\x80Qa1\xA8b\0\x04\x17_9_\x81\x81a\x11=\x01R\x81\x81a\x11f\x01Ra\x12\xE3\x01Ra1\xA8_\xF3\xFE`\x80`@R`\x046\x10a\x01\xF1W_5`\xE0\x1C\x80c\x82nA\xFC\x11a\x01\x08W\x80c\xB2BN?\x11a\0\x9DW\x80c\xD2M\x93=\x11a\0mW\x80c\xD2M\x93=\x14a\x06\xF6W\x80c\xE003\x01\x14a\x07%W\x80c\xF2\xFD\xE3\x8B\x14a\x07DW\x80c\xF5ga`\x14a\x07cW\x80c\xF9\xE5\r\x19\x14a\x07\x82W_\x80\xFD[\x80c\xB2BN?\x14a\x06.W\x80c\xB5\xAD\xEA<\x14a\x06LW\x80c\xC2;\x9E\x9E\x14a\x06\xA3W\x80c\xC8\xE5\xE4\x98\x14a\x06\xDBW_\x80\xFD[\x80c\x96\xC1\xCAa\x11a\0\xD8W\x80c\x96\xC1\xCAa\x14a\x05^W\x80c\x9F\xDBT\xA7\x14a\x05}W\x80c\xA1\xBE\x8DR\x14a\x05\xD2W\x80c\xAD<\xB1\xCC\x14a\x05\xF1W_\x80\xFD[\x80c\x82nA\xFC\x14a\x04\x9CW\x80c\x85\x84\xD2?\x14a\x04\xC7W\x80c\x8D\xA5\xCB[\x14a\x05\x03W\x80c\x90\xC1C\x90\x14a\x05?W_\x80\xFD[\x80c<#\xB6\xDB\x11a\x01\x89W\x80ci\xCCj\x04\x11a\x01YW\x80ci\xCCj\x04\x14a\x04\"W\x80cqP\x18\xA6\x14a\x046W\x80cu|7\xAD\x14a\x04JW\x80cvg\x18\x08\x14a\x04iW\x80c\x81\x1F\x85?\x14a\x04}W_\x80\xFD[\x80c<#\xB6\xDB\x14a\x03\x9DW\x80cBm1\x94\x14a\x03\xD9W\x80cO\x1E\xF2\x86\x14a\x03\xFBW\x80cR\xD1\x90-\x14a\x04\x0EW_\x80\xFD[\x80c-R\xAA\xD6\x11a\x01\xC4W\x80c-R\xAA\xD6\x14a\x02\xE0W\x80c/y\x88\x9D\x14a\x03\x0CW\x80c1=\xF7\xB1\x14a\x03JW\x80c7\x8E\xC2;\x14a\x03\x81W_\x80\xFD[\x80c\x01?\xA5\xFC\x14a\x01\xF5W\x80c\x02\xB5\x92\xF3\x14a\x02\x16W\x80c\x06%\xE1\x9B\x14a\x02sW\x80c\r\x8En,\x14a\x02\xB5W[_\x80\xFD[4\x80\x15a\x02\0W_\x80\xFD[Pa\x02\x14a\x02\x0F6`\x04a%XV[a\x07\x96V[\0[4\x80\x15a\x02!W_\x80\xFD[Pa\x025a\x0206`\x04a%qV[a\x08IV[`@Qa\x02j\x94\x93\x92\x91\x90`\x01`\x01`@\x1B\x03\x94\x85\x16\x81R\x92\x84\x16` \x84\x01R\x92\x16`@\x82\x01R``\x81\x01\x91\x90\x91R`\x80\x01\x90V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02~W_\x80\xFD[P`\x05T`\x06T`\x07T`\x08Ta\x02\x95\x93\x92\x91\x90\x84V[`@\x80Q\x94\x85R` \x85\x01\x93\x90\x93R\x91\x83\x01R``\x82\x01R`\x80\x01a\x02jV[4\x80\x15a\x02\xC0W_\x80\xFD[P`@\x80Q`\x01\x81R_` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01a\x02jV[4\x80\x15a\x02\xEBW_\x80\xFD[Pa\x02\x14a\x02\xFA6`\x04a%qV[`\x0F\x80T`\xFF\x19\x16`\x01\x17\x90U`\x10UV[4\x80\x15a\x03\x17W_\x80\xFD[P`\rTa\x032\x90`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x81V[`@Q`\x01`\x01`@\x1B\x03\x90\x91\x16\x81R` \x01a\x02jV[4\x80\x15a\x03UW_\x80\xFD[P`\rTa\x03i\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x02jV[4\x80\x15a\x03\x8CW_\x80\xFD[PC[`@Q\x90\x81R` \x01a\x02jV[4\x80\x15a\x03\xA8W_\x80\xFD[Pa\x02\x14a\x03\xB76`\x04a%\x9EV[_\x80Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01`\x01`@\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[4\x80\x15a\x03\xE4W_\x80\xFD[P`\x01T`\x02T`\x03T`\x04Ta\x02\x95\x93\x92\x91\x90\x84V[a\x02\x14a\x04\t6`\x04a&FV[a\x08\x92V[4\x80\x15a\x04\x19W_\x80\xFD[Pa\x03\x8Fa\x08\xB1V[4\x80\x15a\x04-W_\x80\xFD[Pa\x02\x14a\x08\xCCV[4\x80\x15a\x04AW_\x80\xFD[Pa\x02\x14a\t:V[4\x80\x15a\x04UW_\x80\xFD[Pa\x02\x14a\x04d6`\x04a'\xD8V[a\tKV[4\x80\x15a\x04tW_\x80\xFD[Pa\x032a\x0C\x16V[4\x80\x15a\x04\x88W_\x80\xFD[Pa\x02\x14a\x04\x976`\x04a)\xB1V[a\x0C@V[4\x80\x15a\x04\xA7W_\x80\xFD[P`\rT`\x01`\x01`\xA0\x1B\x03\x16\x15\x15[`@Q\x90\x15\x15\x81R` \x01a\x02jV[4\x80\x15a\x04\xD2W_\x80\xFD[Pa\x04\xE6a\x04\xE16`\x04a%qV[a\rdV[`@\x80Q\x92\x83R`\x01`\x01`@\x1B\x03\x90\x91\x16` \x83\x01R\x01a\x02jV[4\x80\x15a\x05\x0EW_\x80\xFD[P\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16a\x03iV[4\x80\x15a\x05JW_\x80\xFD[Pa\x032a\x05Y6`\x04a*\x17V[a\x0E\x8FV[4\x80\x15a\x05iW_\x80\xFD[Pa\x02\x14a\x05x6`\x04a*HV[a\x0E\xECV[4\x80\x15a\x05\x88W_\x80\xFD[P`\x0BT`\x0CTa\x05\xAC\x91`\x01`\x01`@\x1B\x03\x80\x82\x16\x92`\x01`@\x1B\x90\x92\x04\x16\x90\x83V[`@\x80Q`\x01`\x01`@\x1B\x03\x94\x85\x16\x81R\x93\x90\x92\x16` \x84\x01R\x90\x82\x01R``\x01a\x02jV[4\x80\x15a\x05\xDDW_\x80\xFD[Pa\x04\xB7a\x05\xEC6`\x04a%\x9EV[a\x0FuV[4\x80\x15a\x05\xFCW_\x80\xFD[Pa\x06!`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\x02j\x91\x90a*\x83V[4\x80\x15a\x069W_\x80\xFD[P_Ta\x032\x90`\x01`\x01`@\x1B\x03\x16\x81V[4\x80\x15a\x06WW_\x80\xFD[Pa\x02\x14a\x06f6`\x04a*\xB5V[\x80Q`\x0B\x80T` \x84\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x92\x16\x93\x16\x92\x90\x92\x17\x91\x90\x91\x17\x90U`@\x01Q`\x0CUV[4\x80\x15a\x06\xAEW_\x80\xFD[P`\rTa\x06\xC6\x90`\x01`\xA0\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81V[`@Qc\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01a\x02jV[4\x80\x15a\x06\xE6W_\x80\xFD[Pa\x02\x14`\x0F\x80T`\xFF\x19\x16\x90UV[4\x80\x15a\x07\x01W_\x80\xFD[P`\tT`\nTa\x05\xAC\x91`\x01`\x01`@\x1B\x03\x80\x82\x16\x92`\x01`@\x1B\x90\x92\x04\x16\x90\x83V[4\x80\x15a\x070W_\x80\xFD[Pa\x04\xB7a\x07?6`\x04a*\xCFV[a\x0F\xB7V[4\x80\x15a\x07OW_\x80\xFD[Pa\x02\x14a\x07^6`\x04a%XV[a\x0F\xEAV[4\x80\x15a\x07nW_\x80\xFD[Pa\x02\x14a\x07}6`\x04a*\xEFV[a\x10,V[4\x80\x15a\x07\x8DW_\x80\xFD[P`\x0ETa\x03\x8FV[a\x07\x9Ea\x10\xD7V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x07\xC5W`@Qc\xE6\xC4${`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\rT`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x90\x82\x16\x03a\x07\xF4W`@Qc\xA8c\xAE\xC9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\r\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x81\x17\x90\x91U`@Q\x90\x81R\x7F\x80\x17\xBB\x88\x7F\xDF\x8F\xCAC\x14\xA9\xD4\x0Fns\xB3\xB8\x10\x02\xD6~\\\xFA\x85\xD8\x81s\xAFj\xA4`r\x90` \x01[`@Q\x80\x91\x03\x90\xA1PV[`\x0E\x81\x81T\x81\x10a\x08XW_\x80\xFD[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01\x80T`\x01\x90\x91\x01T`\x01`\x01`@\x1B\x03\x80\x83\x16\x93P`\x01`@\x1B\x83\x04\x81\x16\x92`\x01`\x80\x1B\x90\x04\x16\x90\x84V[a\x08\x9Aa\x112V[a\x08\xA3\x82a\x11\xD6V[a\x08\xAD\x82\x82a\x12\x17V[PPV[_a\x08\xBAa\x12\xD8V[P_\x80Q` a1|\x839\x81Q\x91R\x90V[a\x08\xD4a\x10\xD7V[`\rT`\x01`\x01`\xA0\x1B\x03\x16\x15a\t\x1FW`\r\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16\x90U`@Q\x7F\x9A_W\xDE\x85m\xD6h\xC5M\xD9^\\U\xDF\x93C!q\xCB\xCAI\xA8wmV \xEAY\xC0$P\x90_\x90\xA1V[`@Qc\xA8c\xAE\xC9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a\tBa\x10\xD7V[a\t8_a\x13!V[`\rT`\x01`\x01`\xA0\x1B\x03\x16\x15\x15\x80\x15a\tpWP`\rT`\x01`\x01`\xA0\x1B\x03\x163\x14\x15[\x15a\t\x8EW`@Qc\x01GL\x8F`\xE7\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x0BT\x83Q`\x01`\x01`@\x1B\x03\x91\x82\x16\x91\x16\x11\x15\x80a\t\xC7WP`\x0BT` \x84\x01Q`\x01`\x01`@\x1B\x03`\x01`@\x1B\x90\x92\x04\x82\x16\x91\x16\x11\x15[\x15a\t\xE5W`@Qc\x05\x1CF\xEF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\t\xF2\x83`@\x01Qa\x13\x91V[_a\t\xFBa\x0C\x16V[` \x85\x01Q_\x80T\x92\x93P\x91a\n\x1A\x91\x90`\x01`\x01`@\x1B\x03\x16a\x0E\x8FV[\x90Pa\n'\x82`\x01a+\xF1V[`\x01`\x01`@\x1B\x03\x16\x81`\x01`\x01`@\x1B\x03\x16\x14\x80\x15a\n`WP`\x0BTa\n^\x90`\x01`@\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16a\x0FuV[\x15[\x80\x15a\ntWP_\x82`\x01`\x01`@\x1B\x03\x16\x11[\x15a\n\x92W`@QcqP\xDEE`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\n\x9D\x82`\x02a+\xF1V[`\x01`\x01`@\x1B\x03\x16\x81`\x01`\x01`@\x1B\x03\x16\x10a\n\xCEW`@QcqP\xDEE`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\n\xDB\x84` \x01Qa\x13\x91V[a\n\xE8\x84`@\x01Qa\x13\x91V[a\n\xF5\x84``\x01Qa\x13\x91V[a\x0B\0\x85\x85\x85a\x14\x01V[\x84Q`\x0B\x80T` \x88\x01Q`\x01`\x01`@\x1B\x03\x81\x81\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x93\x16\x94\x16\x93\x90\x93\x17\x17\x90U`@\x86\x01Q`\x0CUa\x0BB\x90a\x0FuV[\x15a\x0B\xACW\x83Q`\x05U` \x84\x01Q`\x06U`@\x84\x01Q`\x07U``\x84\x01Q`\x08U\x7F1\xEA\xBD\x90\x99\xFD\xB2]\xAC\xDD\xD2\x06\xAB\xFF\x871\x1EU4A\xFC\x9D\x0F\xCD\xEF \x10b\xD7\xE7\x07\x1Ba\x0B\x90\x82`\x01a+\xF1V[`@Q`\x01`\x01`@\x1B\x03\x90\x91\x16\x81R` \x01`@Q\x80\x91\x03\x90\xA1[a\x0B\xB7CB\x87a\x15YV[\x84` \x01Q`\x01`\x01`@\x1B\x03\x16\x85_\x01Q`\x01`\x01`@\x1B\x03\x16\x7F\xA0Jw9$PZA\x85d67%\xF5h2\xF5w.k\x8D\r\xBDn\xFC\xE7$\xDF\xE8\x03\xDA\xE6\x87`@\x01Q`@Qa\x0C\x07\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA3PPPPPV[`\x0BT_\x80T\x90\x91a\x0C;\x91`\x01`\x01`@\x1B\x03`\x01`@\x1B\x90\x92\x04\x82\x16\x91\x16a\x0E\x8FV[\x90P\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16_\x81\x15\x80\x15a\x0C\x84WP\x82[\x90P_\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\x0C\x9FWP0;\x15[\x90P\x81\x15\x80\x15a\x0C\xADWP\x80\x15[\x15a\x0C\xCBW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\x0C\xF5W\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\x0C\xFE\x87a\x17BV[a\r\x06a\x17SV[a\r\x12\x8A\x8A\x8A\x89a\x17[V[\x83\x15a\rXW\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPPPPV[`\x0E\x80T_\x91\x82\x91\x90a\rx`\x01\x83a,\x11V[\x81T\x81\x10a\r\x88Wa\r\x88a,$V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x80\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x84\x10a\r\xC7W`@Qc\x18V\xA4\x99`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\rT`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16[\x81\x81\x10\x15a\x0E\x88W\x84`\x0E\x82\x81T\x81\x10a\r\xF7Wa\r\xF7a,$V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x80\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x11\x15a\x0E\x80W`\x0E\x81\x81T\x81\x10a\x0E0Wa\x0E0a,$V[\x90_R` _ \x90`\x02\x02\x01`\x01\x01T`\x0E\x82\x81T\x81\x10a\x0ESWa\x0ESa,$V[\x90_R` _ \x90`\x02\x02\x01_\x01`\x10\x90T\x90a\x01\0\n\x90\x04`\x01`\x01`@\x1B\x03\x16\x93P\x93PPP\x91P\x91V[`\x01\x01a\r\xDBV[PP\x91P\x91V[_\x81`\x01`\x01`@\x1B\x03\x16_\x03a\x0E\xA7WP_a\x0E\xE6V[a\x0E\xB1\x82\x84a,LV[`\x01`\x01`@\x1B\x03\x16_\x03a\x0E\xD1Wa\x0E\xCA\x82\x84a,qV[\x90Pa\x0E\xE6V[a\x0E\xDB\x82\x84a,qV[a\x0E\xCA\x90`\x01a+\xF1V[\x92\x91PPV[a\x0E\xF4a\x10\xD7V[a\x0E\x10\x81c\xFF\xFF\xFF\xFF\x16\x10\x80a\x0F\x13WPc\x01\xE13\x80\x81c\xFF\xFF\xFF\xFF\x16\x11[\x80a\x0F1WP`\rTc\xFF\xFF\xFF\xFF`\x01`\xA0\x1B\x90\x91\x04\x81\x16\x90\x82\x16\x11\x15[\x15a\x0FOW`@Qc\x07\xA5\x07w`\xE5\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\r\x80Tc\xFF\xFF\xFF\xFF\x90\x92\x16`\x01`\xA0\x1B\x02c\xFF\xFF\xFF\xFF`\xA0\x1B\x19\x90\x92\x16\x91\x90\x91\x17\x90UV[_\x81`\x01`\x01`@\x1B\x03\x16_\x03a\x0F\x8DWP_\x91\x90PV[_Ta\x0F\xA2\x90`\x01`\x01`@\x1B\x03\x16\x83a,LV[`\x01`\x01`@\x1B\x03\x16\x15\x92\x91PPV[\x91\x90PV[`\x0FT_\x90`\xFF\x16a\x0F\xD2Wa\x0F\xCD\x83\x83a\x18\xD5V[a\x0F\xE3V[\x81`\x10T\x84a\x0F\xE1\x91\x90a,\x11V[\x11[\x93\x92PPPV[a\x0F\xF2a\x10\xD7V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x10 W`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R_`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[a\x10)\x81a\x13!V[PV[a\x107`\x0E_a\"vV[_[\x81Q\x81\x10\x15a\x08\xADW`\x0E\x82\x82\x81Q\x81\x10a\x10VWa\x10Va,$V[` \x90\x81\x02\x91\x90\x91\x01\x81\x01Q\x82T`\x01\x81\x81\x01\x85U_\x94\x85R\x93\x83\x90 \x82Q`\x02\x90\x92\x02\x01\x80T\x93\x83\x01Q`@\x84\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16`\x01`\x80\x1B\x02g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`\x80\x1B\x19\x92\x82\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x97\x16\x91\x90\x94\x16\x17\x94\x90\x94\x17\x93\x90\x93\x16\x17\x82U``\x01Q\x90\x82\x01U\x01a\x109V[3a\x11\t\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\t8W`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R3`\x04\x82\x01R`$\x01a\x10\x17V[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a\x11\xB8WP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a\x11\xAC_\x80Q` a1|\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\t8W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x11\xDEa\x10\xD7V[`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x81R\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x90` \x01a\x08>V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x12qWP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x12n\x91\x81\x01\x90a,\x96V[`\x01[a\x12\x99W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x10\x17V[_\x80Q` a1|\x839\x81Q\x91R\x81\x14a\x12\xC9W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x10\x17V[a\x12\xD3\x83\x83a\x1A-V[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\t8W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T`\x01`\x01`\xA0\x1B\x03\x19\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90_\x90\xA3PPPV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x81\x10\x80a\x08\xADW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01a\x10\x17V[_a\x14\na\x1A\x82V[\x90Pa\x14\x14a\"\x94V[\x84Q`\x01`\x01`@\x1B\x03\x90\x81\x16\x82R` \x80\x87\x01\x80Q\x90\x92\x16\x90\x83\x01R`@\x80\x87\x01Q\x90\x83\x01R`\x06T``\x83\x01R`\x07T`\x80\x83\x01R`\x08T`\xA0\x83\x01R`\x05T`\xC0\x83\x01RQa\x14e\x90a\x0FuV[\x15a\x14\x97W` \x84\x01Q`\xE0\x82\x01R`@\x84\x01Qa\x01\0\x82\x01R``\x84\x01Qa\x01 \x82\x01R\x83Qa\x01@\x82\x01Ra\x14\xBBV[`\x06T`\xE0\x82\x01R`\x07Ta\x01\0\x82\x01R`\x08Ta\x01 \x82\x01R`\x05Ta\x01@\x82\x01R[`@Qc\xFC\x86`\xC7`\xE0\x1B\x81Rs_\xBD\xB21Vx\xAF\xEC\xB3g\xF02\xD9?d/d\x18\n\xA3\x90c\xFC\x86`\xC7\x90a\x14\xF6\x90\x85\x90\x85\x90\x88\x90`\x04\x01a.\xB9V[` `@Q\x80\x83\x03\x81\x86Z\xF4\x15\x80\x15a\x15\x11W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x155\x91\x90a0\xE7V[a\x15RW`@Qc\t\xBD\xE39`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPPV[`\x0ET\x15\x80\x15\x90a\x15\xCEWP`\rT`\x0E\x80T`\x01`\xA0\x1B\x83\x04c\xFF\xFF\xFF\xFF\x16\x92`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x15\x99Wa\x15\x99a,$V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01Ta\x15\xC3\x90`\x01`@\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x84a1\x06V[`\x01`\x01`@\x1B\x03\x16\x11[\x15a\x16aW`\rT`\x0E\x80T\x90\x91`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x15\xFBWa\x15\xFBa,$V[_\x91\x82R` \x82 `\x02\x90\x91\x02\x01\x80T`\x01`\x01`\xC0\x1B\x03\x19\x16\x81U`\x01\x01U`\r\x80T`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90`\x18a\x16;\x83a1&V[\x91\x90a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UPP[`@\x80Q`\x80\x81\x01\x82R`\x01`\x01`@\x1B\x03\x94\x85\x16\x81R\x92\x84\x16` \x80\x85\x01\x91\x82R\x83\x01Q\x85\x16\x84\x83\x01\x90\x81R\x92\x90\x91\x01Q``\x84\x01\x90\x81R`\x0E\x80T`\x01\x81\x01\x82U_\x91\x90\x91R\x93Q`\x02\x90\x94\x02\x7F\xBB{JEM\xC3I9#H/\x07\x82#)\xED\x19\xE8$N\xFFX,\xC2\x04\xF8UL6 \xC3\xFD\x81\x01\x80T\x93Q\x94Q\x87\x16`\x01`\x80\x1B\x02g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`\x80\x1B\x19\x95\x88\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x95\x16\x96\x90\x97\x16\x95\x90\x95\x17\x92\x90\x92\x17\x92\x90\x92\x16\x93\x90\x93\x17\x90\x91UQ\x7F\xBB{JEM\xC3I9#H/\x07\x82#)\xED\x19\xE8$N\xFFX,\xC2\x04\xF8UL6 \xC3\xFE\x90\x91\x01UV[a\x17Ja \xB1V[a\x10)\x81a \xFAV[a\t8a \xB1V[\x83Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80a\x17\x7FWP` \x84\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80a\x17\x8CWP` \x83\x01Q\x15[\x80a\x17\x99WP`@\x83\x01Q\x15[\x80a\x17\xA6WP``\x83\x01Q\x15[\x80a\x17\xB0WP\x82Q\x15[\x80a\x17\xC2WPa\x0E\x10\x82c\xFF\xFF\xFF\xFF\x16\x10[\x80a\x17\xD6WPc\x01\xE13\x80\x82c\xFF\xFF\xFF\xFF\x16\x11[\x80a\x17\xE8WP`\x01`\x01`@\x1B\x03\x81\x16\x15[\x15a\x18\x06W`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x83Q`\t\x80T` \x80\x88\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x93\x84\x16\x95\x82\x16\x95\x86\x17\x81\x17\x90\x94U`@\x98\x89\x01Q`\n\x81\x90U`\x0B\x80T\x90\x94\x16\x90\x95\x17\x90\x93\x17\x90\x91U`\x0C\x92\x90\x92U\x84Q`\x01\x81\x90U\x91\x85\x01Q`\x02\x81\x90U\x95\x85\x01Q`\x03\x81\x90U``\x90\x95\x01Q`\x04\x81\x90U`\x05\x92\x90\x92U`\x06\x95\x90\x95U`\x07\x93\x90\x93U`\x08\x92\x90\x92U`\r\x80Tc\xFF\xFF\xFF\xFF\x90\x92\x16`\x01`\xA0\x1B\x02c\xFF\xFF\xFF\xFF`\xA0\x1B\x19\x90\x92\x16\x91\x90\x91\x17\x90U_\x80T\x91\x90\x92\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x91\x90\x91\x16\x17\x90UV[`\x0ET_\x90C\x84\x11\x80a\x18\xE6WP\x80\x15[\x80a\x190WP`\rT`\x0E\x80T\x90\x91`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x19\x14Wa\x19\x14a,$V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x84\x10[\x15a\x19NW`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_\x80\x80a\x19\\`\x01\x85a,\x11V[\x90P[\x81a\x19\xF8W`\rT`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x81\x10a\x19\xF8W\x86`\x0E\x82\x81T\x81\x10a\x19\x91Wa\x19\x91a,$V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x11a\x19\xE6W`\x01\x91P`\x0E\x81\x81T\x81\x10a\x19\xC6Wa\x19\xC6a,$V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x92Pa\x19\xF8V[\x80a\x19\xF0\x81a1KV[\x91PPa\x19_V[\x81a\x1A\x16W`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x85a\x1A!\x84\x89a,\x11V[\x11\x97\x96PPPPPPPV[a\x1A6\x82a!\x02V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90_\x90\xA2\x80Q\x15a\x1AzWa\x12\xD3\x82\x82a!eV[a\x08\xADa!\xD7V[a\x1A\x8Aa\"\xB3V[b\x01\0\0\x81R`\x0B` \x82\x01R\x7F/\xAFZ\x11>\xFD\x87\xD7X\x18\xE6?\xF9\xA6\x17\0\x07\xF2,\x89\xBB\xC4\xA8\xBD\x0F+H&\x87W\xB0\x14`@\x82\x01QR\x7F\x18Z\xEE\x05\xF8\xD3\xBA\xBF\xCEg\x93\x1F\x15\xDB9\xE6\x1F%\xF7\x94\xA4\x13M{\xEEn\x18\xC5\xAD\x1E\xC0W` `@\x83\x01Q\x01R\x7F\r\xCC\xF5\xDC\xF6g\xA3|\xA9;\x8Dr\x10\x91\xD8\xF3\xA8\x04\x9B=\x1E\x89\xA5mf\xE4'Q\xBB\xAF{^``\x82\x01QR\x7F,\xF1\tI\xFC[\xFC\xEC\xB3\xBCT\xDDA!\xE5X\x07C\x0F\x17\xF3\x04\x98\xA7\xEAj\x02`p\xB1\x91b` ``\x83\x01Q\x01R\x7F\x08\xD7\x0EN\x01\x84\xFES\xBDVo\r~\xDCL\xD7\xB0\xE39I\ts\xD0\xFA\xEC}\xAC \x89\xF58\xE5`\x80\x82\x01QR~\xF6e\xFE\x1F\xD1\x10\xD3}\x1D\xEADn\x84\0\xF0o\x06\xB9\xB5\x8A\xB3\xDF\x90\xFB\xAE|G\xEEX`A` `\x80\x83\x01Q\x01R\x7F\x08~\x14\xD7\x19$\xAC\x0F(\x80\xAD\xF0\xF1\x06\x92^Zo\xDDW\xD0 \xBB<\x8A\xA7\x0F\xA9\xFC\0\xCC\xF3`\xA0\x82\x01QR\x7F\x01\xDB~1x\xB3B\xF9\x1DT\xFC\x97,\xEErV\x9FB\x9A99\x88\xEEC\xC2\x89\xE2\xED\x96\x07qR` `\xA0\x83\x01Q\x01R\x7F\x19m\xD4-vr\x01\xF7\xF1\x96\xC4*\xAE\xF4\x85e`F1\x0FP\x83U\x95\x92\xBD\x13\x13\xE1iH\xB7`\xC0\x82\x01QR\x7F\x17\x88\x96\x80\x81\n\xAA\xBD\x1F\xF3\xACJlT\x92\x10\x05y\xE0Y\x17\x0C\xD2\xB7~+=\xA6\xD3|\xC2F` `\xC0\x83\x01Q\x01R\x7F$\x93^zw\xAC1?\xD3\xD6\x0F\xF3\xF1\xA0\xA7\x9E\xC3,}\xC5\x19\xB3\x9D\xA0\xAC\xB2\xC4\x9F6wq\xCC`\xE0\x82\x01QR\x7F\x16\x8E)B^\xF18\xCBiC\xC7SR\xF3<\x19\x0E_\x14\x88\xEBT\xA9\xE1\x1D\xEBtM\xA7\xFBk.` `\xE0\x83\x01Q\x01R\x7F\x1BX\xD5X\xB5RdS\xBD\x10(\xCA\x93\x8C\x94\x0B\xB8\x9Er?|5x|\x02\xF9\xF1y\xAE\x9A\x0C\xEAa\x01\0\x82\x01QR\x7F!\xAF\xC1!\xD9\x1D\x9D\x1C\x17\xDA\xFB\x926\xBC\x9B\x87,[C\xDF\x06L\x0B\x12\x86\x01/\xB4:v#$` a\x01\0\x83\x01Q\x01R\x7F\x10G\xFCUyM\x1EY}\xE1U\x07v\x11\xE3\xC7\x89\xA0\xA2\xBE\x02\x188!\xBB\xA5l\xF6\x1C\xC1\xB8\xEDa\x01 \x82\x01QR\x7F\x17BR2G'\xC0\xD2\xEE^P\xEBW\xA5#\x1FgGL\xEE\xD6\x93*\xD4\xFF\xE9\xBC\xF8f\xAA4(` a\x01 \x83\x01Q\x01R\x7F(\xDB(\x9AL\xFBs\xBA\x92\x96\x15r\xF3\x18R\x98\xAE6n\xD1\xA4Iq`{\xCB\xF8\x01\xF1 \xF5aa\x01@\x82\x01QR\x7F\x04\\\xFEz\xE2\xCD\x17U\x08\x17.}\x9C.\x89\x9B\xB1\xD2\x16\xDF\xC3\x1F\xE8\x9F\xC6\xC9\x17\xCA\xAE\xE8w\xA2` a\x01@\x83\x01Q\x01R\x7F\x19_.\xEC\x85Gr\x7F\xC4n\xD0\x1By\xE8\xF6f\xDE\xD6J\xE5OW\x078t\xA5\xA2G\x03\x80\xA7\x85a\x01`\x82\x01QR\x7F\x15'2.\x85\xDA\x1A\xEF\xBD\x83\x9Ee\xD1\x1D\xC6\x95\xAA\xC1k\r\xB6\xC6%\x91\xD9\x812B\xD4\x1C\xBE1` a\x01`\x83\x01Q\x01R\x7F\x10\xC8\xD7\xD75_~\x0F\x8C\0/H,\xC3\xB9\x8C\x90\xBA\xA9Ba\xC5\x9A\x17\xB4$\xEE\xCF\xE4\xE9c\xB2a\x01\x80\x82\x01QR\x7F\"r\xE3\x01xdqg\xBB\xEA\xD3\xA2\xD77\x19\x88\xF2\xE1\x98\xE6X\x15\x02\x9D\xEDLd\xBF\xC0\x85\x0F\x1F` a\x01\x80\x83\x01Q\x01R\x7F\x15\xD5n\xA7\xAB/\xA6\x12e\xF5Q\xC2\xAE%8\x9C\x8F\xE7\xBC\xB3\xBFf\x08\x08,6\xA2\x01\xF2%\xF7}a\x01\xA0\x82\x01QR\x7F\x0BXTh\x87 .rs\xD3\xD0\xC5]e\xDDa2\xCA\xC9\x8E\xBF\x04\xEF\xB1\xB5$E\xC5\x13\xC4\xA4\xDF` a\x01\xA0\x83\x01Q\x01R\x7F\x05\roCwN\x8D\xFF\xAA\x86\x8F*}\xC8/Vli\xD1u\xD8\x18\xD4Q|\xC7\n\xC5\xFC\xB2\xF1\xB1a\x01\xC0\x82\x01QR\x7F/\xFF\x87\xBF`^\x99\x83s\xBBdU?:b]\xAB\xCD\x12\x88\x86\x92\xD6x\xA8\xF4M\x13d@\xC8c` a\x01\xC0\x83\x01Q\x01R\x7F\x12\xD0\x85`\x8C`,\xFB[\x8C\x03\xEC{\xD1:\xC0\xFF\x9Ed\xA9\xAC\x1E\x9A\xA7FYJ\x03>FK\xF2a\x01\xE0\x82\x01QR\x7F\x18\xACZ56\x04.\xEB\x0B\x0C|/C\xF5\xE2\xCA;!s\xDA\xA4\xC2\x81/\xFC\xA6G\x87\xE8\xE9V\xB2` a\x01\xE0\x83\x01Q\x01R\x7F\x0F\x0F\x98\x91\xFC+y\x0Et\xDC%<\x88T\xDFc\x92\xE0\x10\xF4\xDEg`\xB8B:=\xD6\x9B\xBE]\xCEa\x02\0\x82\x01QR\x7F\x16\xBE\xD1\xD2D\xA2\xFE:\xB9\xA6R\xC7\xFE\xECVP\x16\x1D\x8Au\"}\xEC\xE7)O<\x8F\xC5B\xFDl` a\x02\0\x83\x01Q\x01R\x7F\x0F\xA3m\0g/\xA6\xA1\xC4L\xD3\xC2Y!,\x1A\xDAH\xC6k\xF7\xBB\x08_$G\x1B\x15\xB1~nQa\x02 \x82\x01QR\x7F\x18 \x88\xE5kd\x95R2F\x08\x91\xD2\xB2yvS%\x81:\xEF\x1D\xAE\x85^_IlA\x8A\xFCA` a\x02 \x83\x01Q\x01R\x7F+\xAFZ\xE2\xDD\x83.\x14I\xFA\xCCa\x1Bk\x80\xFDf\xD5\x8C\x87\x1DX'\xC5\xC8\xE2tpd\xE2\x99da\x02@\x82\x01QR\x7F)\xF5C\xB5C\x13~\x88\x18\x04\xC9\x89\xCD;\x99\x93@\x10\0\"8\xE8\xAB>\xEC\x88.\t\xD3\x06h\x1F` a\x02@\x83\x01Q\x01R\x7F-\xB0\xDD\xC7\x12;B\xF5 \xE2WFj\r\x92\xDA\x8BVO\xE0\x1E\xC6e\tl\x14\x11\x96C\x01)\x84a\x02`\x82\x01QR\x7F\x1Bz\xB2zf\x96b\x84\xD7\xFB)\xBC\xE9\xD5P\xEA\xFB\xA1lI\xFB\xC6&x'\xCD\xFC\x8D\x0B\x16\xF9O` a\x02`\x83\x01Q\x01R\x7F\xB0\x83\x88\x93\xEC\x1F#~\x8B\x072;\x07DY\x9FN\x97\xB5\x98\xB3\xB5\x89\xBC\xC2\xBC7\xB8\xD5\xC4\x18\x01a\x02\x80\x82\x01R\x7F\xC1\x83\x93\xC0\xFA0\xFEN\x8B\x03\x8E5z\xD8Q\xEA\xE8\xDE\x91\x07XN\xFF\xE7\xC7\xF1\xF6Q\xB2\x01\x0E&a\x02\xA0\x82\x01R\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a\t8W`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0F\xF2a \xB1V[\x80`\x01`\x01`\xA0\x1B\x03\x16;_\x03a!7W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x10\x17V[_\x80Q` a1|\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[``_\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa!\x81\x91\x90a1`V[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a!\xB9W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a!\xBEV[``\x91P[P\x91P\x91Pa!\xCE\x85\x83\x83a!\xF6V[\x95\x94PPPPPV[4\x15a\t8W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a\"\x06Wa\x0F\xCD\x82a\"MV[\x81Q\x15\x80\x15a\"\x1DWP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\"FW`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x10\x17V[P\x92\x91PPV[\x80Q\x15a\"]W\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80T_\x82U`\x02\x02\x90_R` _ \x90\x81\x01\x90a\x10)\x91\x90a%\x19V[`@Q\x80a\x01`\x01`@R\x80`\x0B\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80a\x02\xC0\x01`@R\x80_\x81R` \x01_\x81R` \x01a\"\xE6`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a#\x06`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a#&`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a#F`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a#f`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a#\x86`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a#\xA6`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a#\xC6`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a#\xE6`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a$\x06`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a$&`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a$F`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a$f`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a$\x86`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a$\xA6`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a$\xC6`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a$\xE6`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a%\x06`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R_` \x82\x01\x81\x90R`@\x90\x91\x01R\x90V[[\x80\x82\x11\x15a%>W\x80T`\x01`\x01`\xC0\x1B\x03\x19\x16\x81U_`\x01\x82\x01U`\x02\x01a%\x1AV[P\x90V[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x0F\xB2W_\x80\xFD[_` \x82\x84\x03\x12\x15a%hW_\x80\xFD[a\x0F\xE3\x82a%BV[_` \x82\x84\x03\x12\x15a%\x81W_\x80\xFD[P5\x91\x90PV[\x805`\x01`\x01`@\x1B\x03\x81\x16\x81\x14a\x0F\xB2W_\x80\xFD[_` \x82\x84\x03\x12\x15a%\xAEW_\x80\xFD[a\x0F\xE3\x82a%\x88V[cNH{q`\xE0\x1B_R`A`\x04R`$_\xFD[`@Q`\x80\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a%\xEDWa%\xEDa%\xB7V[`@R\x90V[`@Qa\x02\xE0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a%\xEDWa%\xEDa%\xB7V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&>Wa&>a%\xB7V[`@R\x91\x90PV[_\x80`@\x83\x85\x03\x12\x15a&WW_\x80\xFD[a&`\x83a%BV[\x91P` \x80\x84\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a&|W_\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12a&\x8FW_\x80\xFD[\x815\x81\x81\x11\x15a&\xA1Wa&\xA1a%\xB7V[a&\xB3`\x1F\x82\x01`\x1F\x19\x16\x85\x01a&\x16V[\x91P\x80\x82R\x87\x84\x82\x85\x01\x01\x11\x15a&\xC8W_\x80\xFD[\x80\x84\x84\x01\x85\x84\x017_\x84\x82\x84\x01\x01RP\x80\x93PPPP\x92P\x92\x90PV[_``\x82\x84\x03\x12\x15a&\xF5W_\x80\xFD[`@Q``\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a'\x17Wa'\x17a%\xB7V[`@R\x90P\x80a'&\x83a%\x88V[\x81Ra'4` \x84\x01a%\x88V[` \x82\x01R`@\x83\x015`@\x82\x01RP\x92\x91PPV[_`\x80\x82\x84\x03\x12\x15a'ZW_\x80\xFD[a'ba%\xCBV[\x90P\x815\x81R` \x82\x015` \x82\x01R`@\x82\x015`@\x82\x01R``\x82\x015``\x82\x01R\x92\x91PPV[_`@\x82\x84\x03\x12\x15a'\x9CW_\x80\xFD[`@Q`@\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a'\xBEWa'\xBEa%\xB7V[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[_\x80_\x83\x85\x03a\x05`\x81\x12\x15a'\xECW_\x80\xFD[a'\xF6\x86\x86a&\xE5V[\x93Pa(\x05\x86``\x87\x01a'JV[\x92Pa\x04\x80\x80`\xDF\x19\x83\x01\x12\x15a(\x1AW_\x80\xFD[a(\"a%\xF3V[\x91Pa(1\x87`\xE0\x88\x01a'\x8CV[\x82Ra\x01 a(B\x88\x82\x89\x01a'\x8CV[` \x84\x01Ra\x01`a(V\x89\x82\x8A\x01a'\x8CV[`@\x85\x01Ra\x01\xA0a(j\x8A\x82\x8B\x01a'\x8CV[``\x86\x01Ra\x01\xE0a(~\x8B\x82\x8C\x01a'\x8CV[`\x80\x87\x01Ra\x02 a(\x92\x8C\x82\x8D\x01a'\x8CV[`\xA0\x88\x01Ra\x02`a(\xA6\x8D\x82\x8E\x01a'\x8CV[`\xC0\x89\x01Ra\x02\xA0a(\xBA\x8E\x82\x8F\x01a'\x8CV[`\xE0\x8A\x01Ra(\xCD\x8Ea\x02\xE0\x8F\x01a'\x8CV[a\x01\0\x8A\x01Ra(\xE1\x8Ea\x03 \x8F\x01a'\x8CV[\x87\x8A\x01Ra(\xF3\x8Ea\x03`\x8F\x01a'\x8CV[a\x01@\x8A\x01Ra)\x07\x8Ea\x03\xA0\x8F\x01a'\x8CV[\x86\x8A\x01Ra)\x19\x8Ea\x03\xE0\x8F\x01a'\x8CV[a\x01\x80\x8A\x01Ra\x04 \x8D\x015\x85\x8A\x01Ra\x04@\x8D\x015a\x01\xC0\x8A\x01Ra\x04`\x8D\x015\x84\x8A\x01R\x87\x8D\x015a\x02\0\x8A\x01Ra\x04\xA0\x8D\x015\x83\x8A\x01Ra\x04\xC0\x8D\x015a\x02@\x8A\x01Ra\x04\xE0\x8D\x015\x82\x8A\x01Ra\x05\0\x8D\x015a\x02\x80\x8A\x01Ra\x05 \x8D\x015\x81\x8A\x01RPPPPPPPPa\x05@\x85\x015a\x02\xC0\x82\x01R\x80\x91PP\x92P\x92P\x92V[\x805c\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x0F\xB2W_\x80\xFD[_\x80_\x80_a\x01@\x86\x88\x03\x12\x15a)\xC6W_\x80\xFD[a)\xD0\x87\x87a&\xE5V[\x94Pa)\xDF\x87``\x88\x01a'JV[\x93Pa)\xED`\xE0\x87\x01a)\x9EV[\x92Pa)\xFCa\x01\0\x87\x01a%BV[\x91Pa*\x0Ba\x01 \x87\x01a%\x88V[\x90P\x92\x95P\x92\x95\x90\x93PV[_\x80`@\x83\x85\x03\x12\x15a*(W_\x80\xFD[a*1\x83a%\x88V[\x91Pa*?` \x84\x01a%\x88V[\x90P\x92P\x92\x90PV[_` \x82\x84\x03\x12\x15a*XW_\x80\xFD[a\x0F\xE3\x82a)\x9EV[_[\x83\x81\x10\x15a*{W\x81\x81\x01Q\x83\x82\x01R` \x01a*cV[PP_\x91\x01RV[` \x81R_\x82Q\x80` \x84\x01Ra*\xA1\x81`@\x85\x01` \x87\x01a*aV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[_``\x82\x84\x03\x12\x15a*\xC5W_\x80\xFD[a\x0F\xE3\x83\x83a&\xE5V[_\x80`@\x83\x85\x03\x12\x15a*\xE0W_\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[_` \x80\x83\x85\x03\x12\x15a+\0W_\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a+\x16W_\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a+)W_\x80\xFD[\x815\x81\x81\x11\x15a+;Wa+;a%\xB7V[a+I\x84\x82`\x05\x1B\x01a&\x16V[\x81\x81R\x84\x81\x01\x92P`\x07\x91\x90\x91\x1B\x83\x01\x84\x01\x90\x87\x82\x11\x15a+hW_\x80\xFD[\x92\x84\x01\x92[\x81\x84\x10\x15a+\xD2W`\x80\x84\x89\x03\x12\x15a+\x84W_\x80\xFD[a+\x8Ca%\xCBV[a+\x95\x85a%\x88V[\x81Ra+\xA2\x86\x86\x01a%\x88V[\x86\x82\x01R`@a+\xB3\x81\x87\x01a%\x88V[\x90\x82\x01R``\x85\x81\x015\x90\x82\x01R\x83R`\x80\x90\x93\x01\x92\x91\x84\x01\x91a+mV[\x97\x96PPPPPPPV[cNH{q`\xE0\x1B_R`\x11`\x04R`$_\xFD[`\x01`\x01`@\x1B\x03\x81\x81\x16\x83\x82\x16\x01\x90\x80\x82\x11\x15a\"FWa\"Fa+\xDDV[\x81\x81\x03\x81\x81\x11\x15a\x0E\xE6Wa\x0E\xE6a+\xDDV[cNH{q`\xE0\x1B_R`2`\x04R`$_\xFD[cNH{q`\xE0\x1B_R`\x12`\x04R`$_\xFD[_`\x01`\x01`@\x1B\x03\x80\x84\x16\x80a,eWa,ea,8V[\x92\x16\x91\x90\x91\x06\x92\x91PPV[_`\x01`\x01`@\x1B\x03\x80\x84\x16\x80a,\x8AWa,\x8Aa,8V[\x92\x16\x91\x90\x91\x04\x92\x91PPV[_` \x82\x84\x03\x12\x15a,\xA6W_\x80\xFD[PQ\x91\x90PV[\x80_[`\x0B\x81\x10\x15a,\xCFW\x81Q\x84R` \x93\x84\x01\x93\x90\x91\x01\x90`\x01\x01a,\xB0V[PPPPV[a,\xEA\x82\x82Q\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[` \x81\x81\x01Q\x80Q`@\x85\x01R\x90\x81\x01Q``\x84\x01RP`@\x81\x01Q\x80Q`\x80\x84\x01R` \x81\x01Q`\xA0\x84\x01RP``\x81\x01Q\x80Q`\xC0\x84\x01R` \x81\x01Q`\xE0\x84\x01RP`\x80\x81\x01Qa\x01\0a-M\x81\x85\x01\x83\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xA0\x83\x01Q\x91Pa\x01@a-m\x81\x86\x01\x84\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xC0\x84\x01Q\x92Pa\x01\x80a-\x8D\x81\x87\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xE0\x85\x01Q\x93Pa\x01\xC0a-\xAD\x81\x88\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x85\x01Q\x93Pa\x02\0\x92a-\xCD\x87\x85\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01 \x86\x01Q\x94Pa\x02@a-\xEE\x81\x89\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x86\x01Q\x94Pa\x02\x80\x92a.\x0E\x88\x85\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01`\x87\x01Q\x95Pa\x02\xC0a./\x81\x8A\x01\x88\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x87\x01Q\x80Qa\x03\0\x8A\x01R` \x01Qa\x03 \x89\x01Ra\x01\xA0\x87\x01Qa\x03@\x89\x01R\x90\x86\x01Qa\x03`\x88\x01Ra\x01\xE0\x86\x01Qa\x03\x80\x88\x01R\x92\x85\x01Qa\x03\xA0\x87\x01Ra\x02 \x85\x01Qa\x03\xC0\x87\x01R\x91\x84\x01Qa\x03\xE0\x86\x01Ra\x02`\x84\x01Qa\x04\0\x86\x01R\x83\x01Qa\x04 \x85\x01Ra\x02\xA0\x83\x01Qa\x04@\x85\x01R\x90\x91\x01Qa\x04`\x90\x92\x01\x91\x90\x91RPV[_a\n\xE0\x82\x01\x90P\x84Q\x82R` \x85\x01Q` \x83\x01R`@\x85\x01Qa.\xEB`@\x84\x01\x82\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[P``\x85\x01Q\x80Q`\x80\x84\x01R` \x81\x01Q`\xA0\x84\x01RP`\x80\x85\x01Q\x80Q`\xC0\x84\x01R` \x81\x01Q`\xE0\x84\x01RP`\xA0\x85\x01Qa\x01\0a/8\x81\x85\x01\x83\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xC0\x87\x01Q\x91Pa\x01@a/X\x81\x86\x01\x84\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xE0\x88\x01Q\x92Pa\x01\x80a/x\x81\x87\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x88\x01Q\x92Pa\x01\xC0\x91a/\x98\x86\x84\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01 \x89\x01Q\x93Pa\x02\0a/\xB9\x81\x88\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x89\x01Q\x93Pa\x02@\x91a/\xD9\x87\x84\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01`\x8A\x01Q\x94Pa\x02\x80a/\xFA\x81\x89\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x8A\x01Q\x80Qa\x02\xC0\x89\x01R` \x90\x81\x01Qa\x02\xE0\x89\x01Ra\x01\xA0\x8B\x01Q\x80Qa\x03\0\x8A\x01R\x81\x01Qa\x03 \x89\x01R\x93\x8A\x01Q\x80Qa\x03@\x89\x01R\x84\x01Qa\x03`\x88\x01Ra\x01\xE0\x8A\x01Q\x80Qa\x03\x80\x89\x01R\x84\x01Qa\x03\xA0\x88\x01R\x89\x01Q\x80Qa\x03\xC0\x88\x01R\x83\x01Qa\x03\xE0\x87\x01Ra\x02 \x89\x01Q\x80Qa\x04\0\x88\x01R\x83\x01Qa\x04 \x87\x01R\x90\x88\x01Q\x80Qa\x04@\x87\x01R\x82\x01Qa\x04`\x86\x01Ra\x02`\x88\x01Q\x80Qa\x04\x80\x87\x01R\x90\x91\x01Qa\x04\xA0\x85\x01R\x86\x01Qa\x04\xC0\x84\x01RPa\x02\xA0\x85\x01Qa\x04\xE0\x83\x01Ra0\xD1a\x05\0\x83\x01\x85a,\xADV[a0\xDFa\x06`\x83\x01\x84a,\xD5V[\x94\x93PPPPV[_` \x82\x84\x03\x12\x15a0\xF7W_\x80\xFD[\x81Q\x80\x15\x15\x81\x14a\x0F\xE3W_\x80\xFD[`\x01`\x01`@\x1B\x03\x82\x81\x16\x82\x82\x16\x03\x90\x80\x82\x11\x15a\"FWa\"Fa+\xDDV[_`\x01`\x01`@\x1B\x03\x80\x83\x16\x81\x81\x03a1AWa1Aa+\xDDV[`\x01\x01\x93\x92PPPV[_\x81a1YWa1Ya+\xDDV[P_\x19\x01\x90V[_\x82Qa1q\x81\x84` \x87\x01a*aV[\x91\x90\x91\x01\x92\x91PPV\xFE6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\xA1dsolcC\0\x08\x17\0\n", ); /// The runtime bytecode of the contract, as deployed on the network. /// /// ```text - ///0x6080604052600436106101af575f3560e01c80638584d23f116100e7578063c23b9e9e11610087578063e030330111610062578063e030330114610614578063f2fde38b14610633578063f567616014610652578063f9e50d1914610671575f80fd5b8063c23b9e9e14610592578063c8e5e498146105ca578063d24d933d146105e5575f80fd5b80639baa3cc9116100c25780639baa3cc91461048a5780639fdb54a7146104a9578063ad3cb1cc146104fe578063b5adea3c1461053b575f80fd5b80638584d23f146103f35780638da5cb5b1461042f57806396c1ca611461046b575f80fd5b8063378ec23b1161015257806352d1902d1161012d57806352d1902d1461038c57806369cc6a04146103a0578063715018a6146103b4578063826e41fc146103c8575f80fd5b8063378ec23b1461031c578063426d3194146103385780634f1ef28614610379575f80fd5b80632063d4f71161018d5780632063d4f71461025c5780632d52aad61461027b5780632f79889d146102a7578063313df7b1146102e5575f80fd5b8063013fa5fc146101b357806302b592f3146101d45780630d8e6e2c14610231575b5f80fd5b3480156101be575f80fd5b506101d26101cd366004612168565b610685565b005b3480156101df575f80fd5b506101f36101ee366004612181565b610738565b60405161022894939291906001600160401b039485168152928416602084015292166040820152606081019190915260800190565b60405180910390f35b34801561023c575f80fd5b5060408051600181525f6020820181905291810191909152606001610228565b348015610267575f80fd5b506101d26102763660046122ee565b610781565b348015610286575f80fd5b506101d2610295366004612181565b600a805460ff19166001179055600b55565b3480156102b2575f80fd5b506008546102cd90600160c01b90046001600160401b031681565b6040516001600160401b039091168152602001610228565b3480156102f0575f80fd5b50600854610304906001600160a01b031681565b6040516001600160a01b039091168152602001610228565b348015610327575f80fd5b50435b604051908152602001610228565b348015610343575f80fd5b505f546001546002546003546103599392919084565b604080519485526020850193909352918301526060820152608001610228565b6101d261038736600461249f565b6108db565b348015610397575f80fd5b5061032a6108fa565b3480156103ab575f80fd5b506101d2610915565b3480156103bf575f80fd5b506101d2610983565b3480156103d3575f80fd5b506008546001600160a01b031615155b6040519015158152602001610228565b3480156103fe575f80fd5b5061041261040d366004612181565b610994565b604080519283526001600160401b03909116602083015201610228565b34801561043a575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610304565b348015610476575f80fd5b506101d2610485366004612551565b610abf565b348015610495575f80fd5b506101d26104a436600461256a565b610b48565b3480156104b4575f80fd5b506006546007546104d8916001600160401b0380821692600160401b909204169083565b604080516001600160401b03948516815293909216602084015290820152606001610228565b348015610509575f80fd5b5061052e604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516102289190612614565b348015610546575f80fd5b506101d2610555366004612646565b80516006805460208401516001600160401b03908116600160401b026001600160801b031990921693169290921791909117905560400151600755565b34801561059d575f80fd5b506008546105b590600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610228565b3480156105d5575f80fd5b506101d2600a805460ff19169055565b3480156105f0575f80fd5b506004546005546104d8916001600160401b0380821692600160401b909204169083565b34801561061f575f80fd5b506103e361062e366004612660565b610c6a565b34801561063e575f80fd5b506101d261064d366004612168565b610c9f565b34801561065d575f80fd5b506101d261066c366004612680565b610ce1565b34801561067c575f80fd5b5060095461032a565b61068d610d8c565b6001600160a01b0381166106b45760405163e6c4247b60e01b815260040160405180910390fd5b6008546001600160a01b03908116908216036106e35760405163a863aec960e01b815260040160405180910390fd5b600880546001600160a01b0319166001600160a01b0383169081179091556040519081527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b60098181548110610747575f80fd5b5f918252602090912060029091020180546001909101546001600160401b038083169350600160401b8304811692600160801b9004169084565b6008546001600160a01b0316151580156107a657506008546001600160a01b03163314155b156107c4576040516301474c8f60e71b815260040160405180910390fd5b60065482516001600160401b0391821691161115806107fd575060065460208301516001600160401b03600160401b9092048216911611155b1561081b5760405163051c46ef60e01b815260040160405180910390fd5b6108288260400151610de7565b6108328282610e57565b81516006805460208501516001600160401b03908116600160401b026001600160801b0319909216931692909217919091179055604082015160075561087f6108784390565b4284610f4b565b81602001516001600160401b0316825f01516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae684604001516040516108cf91815260200190565b60405180910390a35050565b6108e3611134565b6108ec826111d8565b6108f68282611219565b5050565b5f6109036112da565b505f80516020612c9083398151915290565b61091d610d8c565b6008546001600160a01b03161561096857600880546001600160a01b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c02450905f90a1565b60405163a863aec960e01b815260040160405180910390fd5b565b61098b610d8c565b6109815f611323565b600980545f918291906109a8600183612782565b815481106109b8576109b8612795565b5f918252602090912060029091020154600160801b90046001600160401b031684106109f757604051631856a49960e21b815260040160405180910390fd5b600854600160c01b90046001600160401b03165b81811015610ab8578460098281548110610a2757610a27612795565b5f918252602090912060029091020154600160801b90046001600160401b03161115610ab05760098181548110610a6057610a60612795565b905f5260205f2090600202016001015460098281548110610a8357610a83612795565b905f5260205f2090600202015f0160109054906101000a90046001600160401b0316935093505050915091565b600101610a0b565b5050915091565b610ac7610d8c565b610e108163ffffffff161080610ae657506301e133808163ffffffff16115b80610b04575060085463ffffffff600160a01b909104811690821611155b15610b22576040516307a5077760e51b815260040160405180910390fd5b6008805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610b8c5750825b90505f826001600160401b03166001148015610ba75750303b155b905081158015610bb5575080155b15610bd35760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610bfd57845460ff60401b1916600160401b1785555b610c0686611393565b610c0e6113a4565b610c198989896113ac565b8315610c5f57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b600a545f9060ff16610c8557610c8083836114d8565b610c96565b81600b5484610c949190612782565b115b90505b92915050565b610ca7610d8c565b6001600160a01b038116610cd557604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b610cde81611323565b50565b610cec60095f611e82565b5f5b81518110156108f6576009828281518110610d0b57610d0b612795565b6020908102919091018101518254600181810185555f94855293839020825160029092020180549383015160408401516001600160401b03908116600160801b0267ffffffffffffffff60801b19928216600160401b026001600160801b031990971691909416179490941793909316178255606001519082015501610cee565b33610dbe7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146109815760405163118cdaa760e01b8152336004820152602401610ccc565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110806108f65760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401610ccc565b5f610e60611630565b9050610e6a611ea0565b83516001600160401b0390811682526020850151168160016020020152604084810151828201526001546060830152600254608083015260035460a08301525f5460c08301525163ce537a7760e01b8152735fbdb2315678afecb367f032d93f642f64180aa39063ce537a7790610ee9908590859088906004016129af565b602060405180830381865af4158015610f04573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f289190612bdd565b610f45576040516309bde33960e01b815260040160405180910390fd5b50505050565b60095415801590610fc0575060085460098054600160a01b830463ffffffff1692600160c01b90046001600160401b0316908110610f8b57610f8b612795565b5f918252602090912060029091020154610fb590600160401b90046001600160401b031684612bfc565b6001600160401b0316115b1561105357600854600980549091600160c01b90046001600160401b0316908110610fed57610fed612795565b5f9182526020822060029091020180546001600160c01b03191681556001015560088054600160c01b90046001600160401b031690601861102d83612c23565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516080810182526001600160401b03948516815292841660208085019182528301518516848301908152929091015160608401908152600980546001810182555f91909152935160029094027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af81018054935194518716600160801b0267ffffffffffffffff60801b19958816600160401b026001600160801b03199095169690971695909517929092179290921693909317909155517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b090910155565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806111ba57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166111ae5f80516020612c90833981519152546001600160a01b031690565b6001600160a01b031614155b156109815760405163703e46dd60e11b815260040160405180910390fd5b6111e0610d8c565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d9060200161072d565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611273575060408051601f3d908101601f1916820190925261127091810190612c48565b60015b61129b57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610ccc565b5f80516020612c9083398151915281146112cb57604051632a87526960e21b815260048101829052602401610ccc565b6112d58383611c60565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109815760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b61139b611cb5565b610cde81611cfe565b610981611cb5565b82516001600160401b03161515806113d0575060208301516001600160401b031615155b806113dd57506020820151155b806113ea57506040820151155b806113f757506060820151155b8061140157508151155b806114135750610e108163ffffffff16105b8061142757506301e133808163ffffffff16115b15611445576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b03908116600160401b026001600160801b0319938416919095169081178517909355604096870151600581905586515f5590860151600155958501516002556060909401516003556006805490941617179091556007919091556008805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b6009545f90438411806114e9575080155b806115335750600854600980549091600160c01b90046001600160401b031690811061151757611517612795565b5f9182526020909120600290910201546001600160401b031684105b156115515760405163b0b4387760e01b815260040160405180910390fd5b5f808061155f600185612782565b90505b816115fb57600854600160c01b90046001600160401b031681106115fb57866009828154811061159457611594612795565b5f9182526020909120600290910201546001600160401b0316116115e95760019150600981815481106115c9576115c9612795565b5f9182526020909120600290910201546001600160401b031692506115fb565b806115f381612c5f565b915050611562565b816116195760405163b0b4387760e01b815260040160405180910390fd5b856116248489612782565b11979650505050505050565b611638611ebe565b620100008152600760208201527f1369aa78dc50135ad756d62c97a64a0edcd30066584168200d9d1facf82ca4f56040820151527f2cf23456d712b06f8e3aa5bf0acc3e46a3d094602a3a2b99d873bba05a4391476020604083015101527f08a35f379d2d2c490a51006697275e4db79b67b4a175c1477e262d29e25e42316060820151527f218828131bb7940ccc88c561b299755af4bf0b71ed930b129e8be0a1218139ea6020606083015101527f23a2172436c1145b36d5bc6d3b31fa1610c73a543ea443918aaa3ee175f9921b6080820151527f2502adf404d62877c310214ae9942e93c40b154d34c024bab48a3ca057e60a116020608083015101527f1bb88ada91ab7734882f7826b81275320081ac485f9cf8bfbc3ba54b6eb4dff360a0820151527f25c74a27e9a3b20114a3a91f31c20f01777e7ed913e0ef949f0285e2e7c2069b602060a083015101527f12b0ce76ac8b0dbd405ebc5dd0bae0f91aed50033c7ea36fc62aaba2b98333dc60c0820151527f185b42af49dd1cbe337a84f74b704172428e754a0bea024ab3eb2f996afb2c47602060c083015101527f21f53ad4538b45438bbf0521446070223920e3df6f9022a64cc16d7f94e85c0860e0820151527f2278ac3dedfdac7feb9725a022497175518eada52c8932fc40e6e75bea889fb8602060e083015101527f0876136f81c16298487bfb1be74d4a3487ec45645ab1d09dc2e5b865d62230df610100820151527f098c641c947ecd798dfd5e1b2fe428024cdf03061a53ff774ea8a9e3de9d3f2b602061010083015101527f15eaac2c6232d2268bf79dc47ed9666f992fb3d96ad23fb21690c21586c5472e610120820151527f0f10f1ffc54881287fda6f200bc85d8245b508d844a974098a41119867b325d0602061012083015101527f0895ceea40b085534e9739ca5442ba48b3a3592affde2b509df74521b47d8ab0610140820151527f2e12ec5800ac92fe2a8e7040bc5b435b9eb71e31380173fa7688bf81fcbba455602061014083015101527f2f5384eb5653e47576efe248e7903f463243414bfed5237dda750df3996bd918610160820151527f1c3cd6b11da8704cdc871ab4fa323d7ee57bd40ce165b49a56d5ef6489cd251a602061016083015101527f13579994957ce1554cc1e5b194fb63c9513707f627414f8442681ae736e36450610180820151527f26c9bdcd96d8e420b12974ade93ad9c312c4185213d2f6831a7c625a18890e95602061018083015101527f0cc70a1d542a9a1535ae5d9201696adc5c99c1bcebd9951dfa8afec79fa0b6446101a0820151527f10b043d9f1869181b96579d6616efc17a5df7b84c4d431d966c9094bf1e8815360206101a083015101527f198a65309d131a43b0ab1c47659d0336cfbf62b27f4727106b4fd971c73dd4036101c0820151527f23df99eac3c1947903b211b800efeb76f47d5e87b7414866543492e8c7798d1a60206101c083015101527f221cc5e47b81ce8dcfa72ef981916a8eddef12fcde59c56c62830c126ebef0de6101e0820151527f231f99340c35c9e09652a6df73c9cec5d88738cb71ff45716fdc9e9e45a4926e60206101e083015101527f2c9f1489fce0f263e03f3e97bf0a72273aafcca9325ff47786adb04a52a6d22c610200820151527f21f66e28f17e01e9fd593e16d022c4eca25bd5db96daec606d97b604cc414838602061020083015101527f2015745604a9571e226bd99043cfaf1f96267cc5de67f497563ff81100531d26610220820151527f206889ff4c58dd08ee1107191a2a5bc5dbae55c49d7d8397801799868d10f805602061022083015101527f21062ab8f8ecd8932b429a1eb8614b1e03db61bff6a5cd2d5d7ea193e90e9927610240820151527f217f9b27b934b88ffe555d682dfe6e8b6d503f86b14bbd96342bc48487a60b27602061024083015101527f1c9eda2d195cb731f903235ead6a4f7c66db49da713ecb27afee076f0eea7154610260820151527f2647c161c00b90258e1cefebb17481f8a5d91b5f9dca626e3e89a9215bcca16a602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b611c6982611d06565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611cad576112d58282611d69565b6108f6611ddb565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661098157604051631afcd79f60e31b815260040160405180910390fd5b610ca7611cb5565b806001600160a01b03163b5f03611d3b57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610ccc565b5f80516020612c9083398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b031684604051611d859190612c74565b5f60405180830381855af49150503d805f8114611dbd576040519150601f19603f3d011682016040523d82523d5f602084013e611dc2565b606091505b5091509150611dd2858383611dfa565b95945050505050565b34156109815760405163b398979f60e01b815260040160405180910390fd5b606082611e0f57611e0a82611e59565b611e52565b8151158015611e2657506001600160a01b0384163b155b15611e4f57604051639996b31560e01b81526001600160a01b0385166004820152602401610ccc565b50805b9392505050565b805115611e695780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080545f8255600202905f5260205f2090810190610cde9190612124565b6040518060e001604052806007906020820280368337509192915050565b604051806102c001604052805f81526020015f8152602001611ef160405180604001604052805f81526020015f81525090565b8152602001611f1160405180604001604052805f81526020015f81525090565b8152602001611f3160405180604001604052805f81526020015f81525090565b8152602001611f5160405180604001604052805f81526020015f81525090565b8152602001611f7160405180604001604052805f81526020015f81525090565b8152602001611f9160405180604001604052805f81526020015f81525090565b8152602001611fb160405180604001604052805f81526020015f81525090565b8152602001611fd160405180604001604052805f81526020015f81525090565b8152602001611ff160405180604001604052805f81526020015f81525090565b815260200161201160405180604001604052805f81526020015f81525090565b815260200161203160405180604001604052805f81526020015f81525090565b815260200161205160405180604001604052805f81526020015f81525090565b815260200161207160405180604001604052805f81526020015f81525090565b815260200161209160405180604001604052805f81526020015f81525090565b81526020016120b160405180604001604052805f81526020015f81525090565b81526020016120d160405180604001604052805f81526020015f81525090565b81526020016120f160405180604001604052805f81526020015f81525090565b815260200161211160405180604001604052805f81526020015f81525090565b81525f6020820181905260409091015290565b5b808211156121495780546001600160c01b03191681555f6001820155600201612125565b5090565b80356001600160a01b0381168114612163575f80fd5b919050565b5f60208284031215612178575f80fd5b610c968261214d565b5f60208284031215612191575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b6040516102e081016001600160401b03811182821017156121cf576121cf612198565b60405290565b604051608081016001600160401b03811182821017156121cf576121cf612198565b604051601f8201601f191681016001600160401b038111828210171561221f5761221f612198565b604052919050565b80356001600160401b0381168114612163575f80fd5b5f6060828403121561224d575f80fd5b604051606081018181106001600160401b038211171561226f5761226f612198565b60405290508061227e83612227565b815261228c60208401612227565b6020820152604083013560408201525092915050565b5f604082840312156122b2575f80fd5b604051604081018181106001600160401b03821117156122d4576122d4612198565b604052823581526020928301359281019290925250919050565b5f808284036104e0811215612301575f80fd5b61230b858561223d565b925061048080605f1983011215612320575f80fd5b6123286121ac565b915061233786606087016122a2565b82526123468660a087016122a2565b60208301526123588660e087016122a2565b604083015261012061236c878288016122a2565b6060840152610160612380888289016122a2565b60808501526101a061239489828a016122a2565b60a08601526101e06123a88a828b016122a2565b60c08701526102206123bc8b828c016122a2565b60e08801526102606123d08c828d016122a2565b6101008901526102a06123e58d828e016122a2565b878a01526123f78d6102e08e016122a2565b6101408a015261240b8d6103208e016122a2565b868a015261241d8d6103608e016122a2565b6101808a01526103a08c0135948901949094526103c08b01356101c08901526103e08b0135928801929092526104008a01356102008801526104208a013590870152610440890135610240870152610460890135908601529287013561028085015250506104a0850135908201526104c0909301356102c08401525092909150565b5f80604083850312156124b0575f80fd5b6124b98361214d565b91506020808401356001600160401b03808211156124d5575f80fd5b818601915086601f8301126124e8575f80fd5b8135818111156124fa576124fa612198565b61250c601f8201601f191685016121f7565b91508082528784828501011115612521575f80fd5b80848401858401375f848284010152508093505050509250929050565b803563ffffffff81168114612163575f80fd5b5f60208284031215612561575f80fd5b610c968261253e565b5f805f8084860361012081121561257f575f80fd5b612589878761223d565b94506080605f198201121561259c575f80fd5b506125a56121d5565b60608681013582526080870135602083015260a0870135604083015260c08701359082015292506125d860e0860161253e565b91506125e7610100860161214d565b905092959194509250565b5f5b8381101561260c5781810151838201526020016125f4565b50505f910152565b602081525f82518060208401526126328160408501602087016125f2565b601f01601f19169190910160400192915050565b5f60608284031215612656575f80fd5b610c96838361223d565b5f8060408385031215612671575f80fd5b50508035926020909101359150565b5f6020808385031215612691575f80fd5b82356001600160401b03808211156126a7575f80fd5b818501915085601f8301126126ba575f80fd5b8135818111156126cc576126cc612198565b6126da848260051b016121f7565b818152848101925060079190911b8301840190878211156126f9575f80fd5b928401925b818410156127635760808489031215612715575f80fd5b61271d6121d5565b61272685612227565b8152612733868601612227565b868201526040612744818701612227565b90820152606085810135908201528352608090930192918401916126fe565b979650505050505050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610c9957610c9961276e565b634e487b7160e01b5f52603260045260245ffd5b805f5b6007811015610f455781518452602093840193909101906001016127ac565b6127e082825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e08401525060808101516101006128438185018380518252602090810151910152565b60a083015191506101406128638186018480518252602090810151910152565b60c084015192506101806128838187018580518252602090810151910152565b60e085015193506101c06128a38188018680518252602090810151910152565b928501519350610200926128c38785018680518252602090810151910152565b61012086015194506102406128e48189018780518252602090810151910152565b928601519450610280926129048885018780518252602090810151910152565b61016087015195506102c0612925818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b5f610a6082019050845182526020850151602083015260408501516129e1604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a0850151610100612a2e8185018380518252602090810151910152565b60c08701519150610140612a4e8186018480518252602090810151910152565b60e08801519250610180612a6e8187018580518252602090810151910152565b9188015192506101c091612a8e8684018580518252602090810151910152565b6101208901519350610200612aaf8188018680518252602090810151910152565b91890151935061024091612acf8784018680518252602090810151910152565b6101608a01519450610280612af08189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e0830152612bc76105008301856127a9565b612bd56105e08301846127cb565b949350505050565b5f60208284031215612bed575f80fd5b81518015158114611e52575f80fd5b6001600160401b03828116828216039080821115612c1c57612c1c61276e565b5092915050565b5f6001600160401b03808316818103612c3e57612c3e61276e565b6001019392505050565b5f60208284031215612c58575f80fd5b5051919050565b5f81612c6d57612c6d61276e565b505f190190565b5f8251612c858184602087016125f2565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a + ///0x6080604052600436106101f1575f3560e01c8063826e41fc11610108578063b2424e3f1161009d578063d24d933d1161006d578063d24d933d146106f6578063e030330114610725578063f2fde38b14610744578063f567616014610763578063f9e50d1914610782575f80fd5b8063b2424e3f1461062e578063b5adea3c1461064c578063c23b9e9e146106a3578063c8e5e498146106db575f80fd5b806396c1ca61116100d857806396c1ca611461055e5780639fdb54a71461057d578063a1be8d52146105d2578063ad3cb1cc146105f1575f80fd5b8063826e41fc1461049c5780638584d23f146104c75780638da5cb5b1461050357806390c143901461053f575f80fd5b80633c23b6db1161018957806369cc6a041161015957806369cc6a0414610422578063715018a614610436578063757c37ad1461044a5780637667180814610469578063811f853f1461047d575f80fd5b80633c23b6db1461039d578063426d3194146103d95780634f1ef286146103fb57806352d1902d1461040e575f80fd5b80632d52aad6116101c45780632d52aad6146102e05780632f79889d1461030c578063313df7b11461034a578063378ec23b14610381575f80fd5b8063013fa5fc146101f557806302b592f3146102165780630625e19b146102735780630d8e6e2c146102b5575b5f80fd5b348015610200575f80fd5b5061021461020f366004612558565b610796565b005b348015610221575f80fd5b50610235610230366004612571565b610849565b60405161026a94939291906001600160401b039485168152928416602084015292166040820152606081019190915260800190565b60405180910390f35b34801561027e575f80fd5b506005546006546007546008546102959392919084565b60408051948552602085019390935291830152606082015260800161026a565b3480156102c0575f80fd5b5060408051600181525f602082018190529181019190915260600161026a565b3480156102eb575f80fd5b506102146102fa366004612571565b600f805460ff19166001179055601055565b348015610317575f80fd5b50600d5461033290600160c01b90046001600160401b031681565b6040516001600160401b03909116815260200161026a565b348015610355575f80fd5b50600d54610369906001600160a01b031681565b6040516001600160a01b03909116815260200161026a565b34801561038c575f80fd5b50435b60405190815260200161026a565b3480156103a8575f80fd5b506102146103b736600461259e565b5f805467ffffffffffffffff19166001600160401b0392909216919091179055565b3480156103e4575f80fd5b506001546002546003546004546102959392919084565b610214610409366004612646565b610892565b348015610419575f80fd5b5061038f6108b1565b34801561042d575f80fd5b506102146108cc565b348015610441575f80fd5b5061021461093a565b348015610455575f80fd5b506102146104643660046127d8565b61094b565b348015610474575f80fd5b50610332610c16565b348015610488575f80fd5b506102146104973660046129b1565b610c40565b3480156104a7575f80fd5b50600d546001600160a01b031615155b604051901515815260200161026a565b3480156104d2575f80fd5b506104e66104e1366004612571565b610d64565b604080519283526001600160401b0390911660208301520161026a565b34801561050e575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610369565b34801561054a575f80fd5b50610332610559366004612a17565b610e8f565b348015610569575f80fd5b50610214610578366004612a48565b610eec565b348015610588575f80fd5b50600b54600c546105ac916001600160401b0380821692600160401b909204169083565b604080516001600160401b0394851681529390921660208401529082015260600161026a565b3480156105dd575f80fd5b506104b76105ec36600461259e565b610f75565b3480156105fc575f80fd5b50610621604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161026a9190612a83565b348015610639575f80fd5b505f54610332906001600160401b031681565b348015610657575f80fd5b50610214610666366004612ab5565b8051600b805460208401516001600160401b03908116600160401b026001600160801b031990921693169290921791909117905560400151600c55565b3480156106ae575f80fd5b50600d546106c690600160a01b900463ffffffff1681565b60405163ffffffff909116815260200161026a565b3480156106e6575f80fd5b50610214600f805460ff19169055565b348015610701575f80fd5b50600954600a546105ac916001600160401b0380821692600160401b909204169083565b348015610730575f80fd5b506104b761073f366004612acf565b610fb7565b34801561074f575f80fd5b5061021461075e366004612558565b610fea565b34801561076e575f80fd5b5061021461077d366004612aef565b61102c565b34801561078d575f80fd5b50600e5461038f565b61079e6110d7565b6001600160a01b0381166107c55760405163e6c4247b60e01b815260040160405180910390fd5b600d546001600160a01b03908116908216036107f45760405163a863aec960e01b815260040160405180910390fd5b600d80546001600160a01b0319166001600160a01b0383169081179091556040519081527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b600e8181548110610858575f80fd5b5f918252602090912060029091020180546001909101546001600160401b038083169350600160401b8304811692600160801b9004169084565b61089a611132565b6108a3826111d6565b6108ad8282611217565b5050565b5f6108ba6112d8565b505f8051602061317c83398151915290565b6108d46110d7565b600d546001600160a01b03161561091f57600d80546001600160a01b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c02450905f90a1565b60405163a863aec960e01b815260040160405180910390fd5b565b6109426110d7565b6109385f611321565b600d546001600160a01b0316151580156109705750600d546001600160a01b03163314155b1561098e576040516301474c8f60e71b815260040160405180910390fd5b600b5483516001600160401b0391821691161115806109c75750600b5460208401516001600160401b03600160401b9092048216911611155b156109e55760405163051c46ef60e01b815260040160405180910390fd5b6109f28360400151611391565b5f6109fb610c16565b60208501515f805492935091610a1a91906001600160401b0316610e8f565b9050610a27826001612bf1565b6001600160401b0316816001600160401b0316148015610a605750600b54610a5e90600160401b90046001600160401b0316610f75565b155b8015610a7457505f826001600160401b0316115b15610a9257604051637150de4560e01b815260040160405180910390fd5b610a9d826002612bf1565b6001600160401b0316816001600160401b031610610ace57604051637150de4560e01b815260040160405180910390fd5b610adb8460200151611391565b610ae88460400151611391565b610af58460600151611391565b610b00858585611401565b8451600b805460208801516001600160401b03818116600160401b026001600160801b03199093169416939093171790556040860151600c55610b4290610f75565b15610bac5783516005556020840151600655604084015160075560608401516008557f31eabd9099fdb25dacddd206abff87311e553441fc9d0fcdef201062d7e7071b610b90826001612bf1565b6040516001600160401b03909116815260200160405180910390a15b610bb7434287611559565b84602001516001600160401b0316855f01516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae68760400151604051610c0791815260200190565b60405180910390a35050505050565b600b545f80549091610c3b916001600160401b03600160401b90920482169116610e8f565b905090565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610c845750825b90505f826001600160401b03166001148015610c9f5750303b155b905081158015610cad575080155b15610ccb5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610cf557845460ff60401b1916600160401b1785555b610cfe87611742565b610d06611753565b610d128a8a8a8961175b565b8315610d5857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b600e80545f91829190610d78600183612c11565b81548110610d8857610d88612c24565b5f918252602090912060029091020154600160801b90046001600160401b03168410610dc757604051631856a49960e21b815260040160405180910390fd5b600d54600160c01b90046001600160401b03165b81811015610e885784600e8281548110610df757610df7612c24565b5f918252602090912060029091020154600160801b90046001600160401b03161115610e8057600e8181548110610e3057610e30612c24565b905f5260205f20906002020160010154600e8281548110610e5357610e53612c24565b905f5260205f2090600202015f0160109054906101000a90046001600160401b0316935093505050915091565b600101610ddb565b5050915091565b5f816001600160401b03165f03610ea757505f610ee6565b610eb18284612c4c565b6001600160401b03165f03610ed157610eca8284612c71565b9050610ee6565b610edb8284612c71565b610eca906001612bf1565b92915050565b610ef46110d7565b610e108163ffffffff161080610f1357506301e133808163ffffffff16115b80610f315750600d5463ffffffff600160a01b909104811690821611155b15610f4f576040516307a5077760e51b815260040160405180910390fd5b600d805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b5f816001600160401b03165f03610f8d57505f919050565b5f54610fa2906001600160401b031683612c4c565b6001600160401b03161592915050565b919050565b600f545f9060ff16610fd257610fcd83836118d5565b610fe3565b8160105484610fe19190612c11565b115b9392505050565b610ff26110d7565b6001600160a01b03811661102057604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61102981611321565b50565b611037600e5f612276565b5f5b81518110156108ad57600e82828151811061105657611056612c24565b6020908102919091018101518254600181810185555f94855293839020825160029092020180549383015160408401516001600160401b03908116600160801b0267ffffffffffffffff60801b19928216600160401b026001600160801b031990971691909416179490941793909316178255606001519082015501611039565b336111097f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146109385760405163118cdaa760e01b8152336004820152602401611017565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806111b857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166111ac5f8051602061317c833981519152546001600160a01b031690565b6001600160a01b031614155b156109385760405163703e46dd60e11b815260040160405180910390fd5b6111de6110d7565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d9060200161083e565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611271575060408051601f3d908101601f1916820190925261126e91810190612c96565b60015b61129957604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611017565b5f8051602061317c83398151915281146112c957604051632a87526960e21b815260048101829052602401611017565b6112d38383611a2d565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109385760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110806108ad5760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401611017565b5f61140a611a82565b9050611414612294565b84516001600160401b0390811682526020808701805190921690830152604080870151908301526006546060830152600754608083015260085460a083015260055460c08301525161146590610f75565b1561149757602084015160e08201526040840151610100820152606084015161012082015283516101408201526114bb565b60065460e08201526007546101008201526008546101208201526005546101408201525b60405163fc8660c760e01b8152735fbdb2315678afecb367f032d93f642f64180aa39063fc8660c7906114f690859085908890600401612eb9565b602060405180830381865af4158015611511573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061153591906130e7565b611552576040516309bde33960e01b815260040160405180910390fd5b5050505050565b600e54158015906115ce5750600d54600e8054600160a01b830463ffffffff1692600160c01b90046001600160401b031690811061159957611599612c24565b5f9182526020909120600290910201546115c390600160401b90046001600160401b031684613106565b6001600160401b0316115b1561166157600d54600e80549091600160c01b90046001600160401b03169081106115fb576115fb612c24565b5f9182526020822060029091020180546001600160c01b031916815560010155600d8054600160c01b90046001600160401b031690601861163b83613126565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516080810182526001600160401b03948516815292841660208085019182528301518516848301908152929091015160608401908152600e80546001810182555f91909152935160029094027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd81018054935194518716600160801b0267ffffffffffffffff60801b19958816600160401b026001600160801b03199095169690971695909517929092179290921693909317909155517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe90910155565b61174a6120b1565b611029816120fa565b6109386120b1565b83516001600160401b031615158061177f575060208401516001600160401b031615155b8061178c57506020830151155b8061179957506040830151155b806117a657506060830151155b806117b057508251155b806117c25750610e108263ffffffff16105b806117d657506301e133808263ffffffff16115b806117e857506001600160401b038116155b15611806576040516350dd03f760e11b815260040160405180910390fd5b8351600980546020808801516001600160401b03908116600160401b026001600160801b03199384169582169586178117909455604098890151600a819055600b8054909416909517909317909155600c92909255845160018190559185015160028190559585015160038190556060909501516004819055600592909255600695909555600793909355600892909255600d805463ffffffff909216600160a01b0263ffffffff60a01b199092169190911790555f80549190921667ffffffffffffffff1991909116179055565b600e545f90438411806118e6575080155b806119305750600d54600e80549091600160c01b90046001600160401b031690811061191457611914612c24565b5f9182526020909120600290910201546001600160401b031684105b1561194e5760405163b0b4387760e01b815260040160405180910390fd5b5f808061195c600185612c11565b90505b816119f857600d54600160c01b90046001600160401b031681106119f85786600e828154811061199157611991612c24565b5f9182526020909120600290910201546001600160401b0316116119e65760019150600e81815481106119c6576119c6612c24565b5f9182526020909120600290910201546001600160401b031692506119f8565b806119f08161314b565b91505061195f565b81611a165760405163b0b4387760e01b815260040160405180910390fd5b85611a218489612c11565b11979650505050505050565b611a3682612102565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611a7a576112d38282612165565b6108ad6121d7565b611a8a6122b3565b620100008152600b60208201527f2faf5a113efd87d75818e63ff9a6170007f22c89bbc4a8bd0f2b48268757b0146040820151527f185aee05f8d3babfce67931f15db39e61f25f794a4134d7bee6e18c5ad1ec0576020604083015101527f0dccf5dcf667a37ca93b8d721091d8f3a8049b3d1e89a56d66e42751bbaf7b5e6060820151527f2cf10949fc5bfcecb3bc54dd4121e55807430f17f30498a7ea6a026070b191626020606083015101527f08d70e4e0184fe53bd566f0d7edc4cd7b0e339490973d0faec7dac2089f538e56080820151527ef665fe1fd110d37d1dea446e8400f06f06b9b58ab3df90fbae7c47ee5860416020608083015101527f087e14d71924ac0f2880adf0f106925e5a6fdd57d020bb3c8aa70fa9fc00ccf360a0820151527f01db7e3178b342f91d54fc972cee72569f429a393988ee43c289e2ed96077152602060a083015101527f196dd42d767201f7f196c42aaef485656046310f5083559592bd1313e16948b760c0820151527f17889680810aaabd1ff3ac4a6c5492100579e059170cd2b77e2b3da6d37cc246602060c083015101527f24935e7a77ac313fd3d60ff3f1a0a79ec32c7dc519b39da0acb2c49f367771cc60e0820151527f168e29425ef138cb6943c75352f33c190e5f1488eb54a9e11deb744da7fb6b2e602060e083015101527f1b58d558b5526453bd1028ca938c940bb89e723f7c35787c02f9f179ae9a0cea610100820151527f21afc121d91d9d1c17dafb9236bc9b872c5b43df064c0b1286012fb43a762324602061010083015101527f1047fc55794d1e597de155077611e3c789a0a2be02183821bba56cf61cc1b8ed610120820151527f174252324727c0d2ee5e50eb57a5231f67474ceed6932ad4ffe9bcf866aa3428602061012083015101527f28db289a4cfb73ba92961572f3185298ae366ed1a44971607bcbf801f120f561610140820151527f045cfe7ae2cd175508172e7d9c2e899bb1d216dfc31fe89fc6c917caaee877a2602061014083015101527f195f2eec8547727fc46ed01b79e8f666ded64ae54f57073874a5a2470380a785610160820151527f1527322e85da1aefbd839e65d11dc695aac16b0db6c62591d9813242d41cbe31602061016083015101527f10c8d7d7355f7e0f8c002f482cc3b98c90baa94261c59a17b424eecfe4e963b2610180820151527f2272e30178647167bbead3a2d7371988f2e198e65815029ded4c64bfc0850f1f602061018083015101527f15d56ea7ab2fa61265f551c2ae25389c8fe7bcb3bf6608082c36a201f225f77d6101a0820151527f0b58546887202e7273d3d0c55d65dd6132cac98ebf04efb1b52445c513c4a4df60206101a083015101527f050d6f43774e8dffaa868f2a7dc82f566c69d175d818d4517cc70ac5fcb2f1b16101c0820151527f2fff87bf605e998373bb64553f3a625dabcd12888692d678a8f44d136440c86360206101c083015101527f12d085608c602cfb5b8c03ec7bd13ac0ff9e64a9ac1e9aa746594a033e464bf26101e0820151527f18ac5a3536042eeb0b0c7c2f43f5e2ca3b2173daa4c2812ffca64787e8e956b260206101e083015101527f0f0f9891fc2b790e74dc253c8854df6392e010f4de6760b8423a3dd69bbe5dce610200820151527f16bed1d244a2fe3ab9a652c7feec5650161d8a75227dece7294f3c8fc542fd6c602061020083015101527f0fa36d00672fa6a1c44cd3c259212c1ada48c66bf7bb085f24471b15b17e6e51610220820151527f182088e56b64955232460891d2b279765325813aef1dae855e5f496c418afc41602061022083015101527f2baf5ae2dd832e1449facc611b6b80fd66d58c871d5827c5c8e2747064e29964610240820151527f29f543b543137e881804c989cd3b99934010002238e8ab3eec882e09d306681f602061024083015101527f2db0ddc7123b42f520e257466a0d92da8b564fe01ec665096c14119643012984610260820151527f1b7ab27a66966284d7fb29bce9d550eafba16c49fbc6267827cdfc8d0b16f94f602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661093857604051631afcd79f60e31b815260040160405180910390fd5b610ff26120b1565b806001600160a01b03163b5f0361213757604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611017565b5f8051602061317c83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516121819190613160565b5f60405180830381855af49150503d805f81146121b9576040519150601f19603f3d011682016040523d82523d5f602084013e6121be565b606091505b50915091506121ce8583836121f6565b95945050505050565b34156109385760405163b398979f60e01b815260040160405180910390fd5b60608261220657610fcd8261224d565b815115801561221d57506001600160a01b0384163b155b1561224657604051639996b31560e01b81526001600160a01b0385166004820152602401611017565b5092915050565b80511561225d5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080545f8255600202905f5260205f20908101906110299190612519565b604051806101600160405280600b906020820280368337509192915050565b604051806102c001604052805f81526020015f81526020016122e660405180604001604052805f81526020015f81525090565b815260200161230660405180604001604052805f81526020015f81525090565b815260200161232660405180604001604052805f81526020015f81525090565b815260200161234660405180604001604052805f81526020015f81525090565b815260200161236660405180604001604052805f81526020015f81525090565b815260200161238660405180604001604052805f81526020015f81525090565b81526020016123a660405180604001604052805f81526020015f81525090565b81526020016123c660405180604001604052805f81526020015f81525090565b81526020016123e660405180604001604052805f81526020015f81525090565b815260200161240660405180604001604052805f81526020015f81525090565b815260200161242660405180604001604052805f81526020015f81525090565b815260200161244660405180604001604052805f81526020015f81525090565b815260200161246660405180604001604052805f81526020015f81525090565b815260200161248660405180604001604052805f81526020015f81525090565b81526020016124a660405180604001604052805f81526020015f81525090565b81526020016124c660405180604001604052805f81526020015f81525090565b81526020016124e660405180604001604052805f81526020015f81525090565b815260200161250660405180604001604052805f81526020015f81525090565b81525f6020820181905260409091015290565b5b8082111561253e5780546001600160c01b03191681555f600182015560020161251a565b5090565b80356001600160a01b0381168114610fb2575f80fd5b5f60208284031215612568575f80fd5b610fe382612542565b5f60208284031215612581575f80fd5b5035919050565b80356001600160401b0381168114610fb2575f80fd5b5f602082840312156125ae575f80fd5b610fe382612588565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b03811182821017156125ed576125ed6125b7565b60405290565b6040516102e081016001600160401b03811182821017156125ed576125ed6125b7565b604051601f8201601f191681016001600160401b038111828210171561263e5761263e6125b7565b604052919050565b5f8060408385031215612657575f80fd5b61266083612542565b91506020808401356001600160401b038082111561267c575f80fd5b818601915086601f83011261268f575f80fd5b8135818111156126a1576126a16125b7565b6126b3601f8201601f19168501612616565b915080825287848285010111156126c8575f80fd5b80848401858401375f848284010152508093505050509250929050565b5f606082840312156126f5575f80fd5b604051606081018181106001600160401b0382111715612717576127176125b7565b60405290508061272683612588565b815261273460208401612588565b6020820152604083013560408201525092915050565b5f6080828403121561275a575f80fd5b6127626125cb565b90508135815260208201356020820152604082013560408201526060820135606082015292915050565b5f6040828403121561279c575f80fd5b604051604081018181106001600160401b03821117156127be576127be6125b7565b604052823581526020928301359281019290925250919050565b5f805f8385036105608112156127ec575f80fd5b6127f686866126e5565b9350612805866060870161274a565b92506104808060df198301121561281a575f80fd5b6128226125f3565b91506128318760e0880161278c565b82526101206128428882890161278c565b602084015261016061285689828a0161278c565b60408501526101a061286a8a828b0161278c565b60608601526101e061287e8b828c0161278c565b60808701526102206128928c828d0161278c565b60a08801526102606128a68d828e0161278c565b60c08901526102a06128ba8e828f0161278c565b60e08a01526128cd8e6102e08f0161278c565b6101008a01526128e18e6103208f0161278c565b878a01526128f38e6103608f0161278c565b6101408a01526129078e6103a08f0161278c565b868a01526129198e6103e08f0161278c565b6101808a01526104208d0135858a01526104408d01356101c08a01526104608d0135848a0152878d01356102008a01526104a08d0135838a01526104c08d01356102408a01526104e08d0135828a01526105008d01356102808a01526105208d0135818a015250505050505050506105408501356102c0820152809150509250925092565b803563ffffffff81168114610fb2575f80fd5b5f805f805f61014086880312156129c6575f80fd5b6129d087876126e5565b94506129df876060880161274a565b93506129ed60e0870161299e565b92506129fc6101008701612542565b9150612a0b6101208701612588565b90509295509295909350565b5f8060408385031215612a28575f80fd5b612a3183612588565b9150612a3f60208401612588565b90509250929050565b5f60208284031215612a58575f80fd5b610fe38261299e565b5f5b83811015612a7b578181015183820152602001612a63565b50505f910152565b602081525f8251806020840152612aa1816040850160208701612a61565b601f01601f19169190910160400192915050565b5f60608284031215612ac5575f80fd5b610fe383836126e5565b5f8060408385031215612ae0575f80fd5b50508035926020909101359150565b5f6020808385031215612b00575f80fd5b82356001600160401b0380821115612b16575f80fd5b818501915085601f830112612b29575f80fd5b813581811115612b3b57612b3b6125b7565b612b49848260051b01612616565b818152848101925060079190911b830184019087821115612b68575f80fd5b928401925b81841015612bd25760808489031215612b84575f80fd5b612b8c6125cb565b612b9585612588565b8152612ba2868601612588565b868201526040612bb3818701612588565b9082015260608581013590820152835260809093019291840191612b6d565b979650505050505050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111561224657612246612bdd565b81810381811115610ee657610ee6612bdd565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f6001600160401b0380841680612c6557612c65612c38565b92169190910692915050565b5f6001600160401b0380841680612c8a57612c8a612c38565b92169190910492915050565b5f60208284031215612ca6575f80fd5b5051919050565b805f5b600b811015612ccf578151845260209384019390910190600101612cb0565b50505050565b612cea82825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e0840152506080810151610100612d4d8185018380518252602090810151910152565b60a08301519150610140612d6d8186018480518252602090810151910152565b60c08401519250610180612d8d8187018580518252602090810151910152565b60e085015193506101c0612dad8188018680518252602090810151910152565b92850151935061020092612dcd8785018680518252602090810151910152565b6101208601519450610240612dee8189018780518252602090810151910152565b92860151945061028092612e0e8885018780518252602090810151910152565b61016087015195506102c0612e2f818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b5f610ae08201905084518252602085015160208301526040850151612eeb604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a0850151610100612f388185018380518252602090810151910152565b60c08701519150610140612f588186018480518252602090810151910152565b60e08801519250610180612f788187018580518252602090810151910152565b9188015192506101c091612f988684018580518252602090810151910152565b6101208901519350610200612fb98188018680518252602090810151910152565b91890151935061024091612fd98784018680518252602090810151910152565b6101608a01519450610280612ffa8189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e08301526130d1610500830185612cad565b6130df610660830184612cd5565b949350505050565b5f602082840312156130f7575f80fd5b81518015158114610fe3575f80fd5b6001600160401b0382811682821603908082111561224657612246612bdd565b5f6001600160401b0380831681810361314157613141612bdd565b6001019392505050565b5f8161315957613159612bdd565b505f190190565b5f8251613171818460208701612a61565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a /// ``` #[rustfmt::skip] #[allow(clippy::all)] pub static DEPLOYED_BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( - b"`\x80`@R`\x046\x10a\x01\xAFW_5`\xE0\x1C\x80c\x85\x84\xD2?\x11a\0\xE7W\x80c\xC2;\x9E\x9E\x11a\0\x87W\x80c\xE003\x01\x11a\0bW\x80c\xE003\x01\x14a\x06\x14W\x80c\xF2\xFD\xE3\x8B\x14a\x063W\x80c\xF5ga`\x14a\x06RW\x80c\xF9\xE5\r\x19\x14a\x06qW_\x80\xFD[\x80c\xC2;\x9E\x9E\x14a\x05\x92W\x80c\xC8\xE5\xE4\x98\x14a\x05\xCAW\x80c\xD2M\x93=\x14a\x05\xE5W_\x80\xFD[\x80c\x9B\xAA<\xC9\x11a\0\xC2W\x80c\x9B\xAA<\xC9\x14a\x04\x8AW\x80c\x9F\xDBT\xA7\x14a\x04\xA9W\x80c\xAD<\xB1\xCC\x14a\x04\xFEW\x80c\xB5\xAD\xEA<\x14a\x05;W_\x80\xFD[\x80c\x85\x84\xD2?\x14a\x03\xF3W\x80c\x8D\xA5\xCB[\x14a\x04/W\x80c\x96\xC1\xCAa\x14a\x04kW_\x80\xFD[\x80c7\x8E\xC2;\x11a\x01RW\x80cR\xD1\x90-\x11a\x01-W\x80cR\xD1\x90-\x14a\x03\x8CW\x80ci\xCCj\x04\x14a\x03\xA0W\x80cqP\x18\xA6\x14a\x03\xB4W\x80c\x82nA\xFC\x14a\x03\xC8W_\x80\xFD[\x80c7\x8E\xC2;\x14a\x03\x1CW\x80cBm1\x94\x14a\x038W\x80cO\x1E\xF2\x86\x14a\x03yW_\x80\xFD[\x80c c\xD4\xF7\x11a\x01\x8DW\x80c c\xD4\xF7\x14a\x02\\W\x80c-R\xAA\xD6\x14a\x02{W\x80c/y\x88\x9D\x14a\x02\xA7W\x80c1=\xF7\xB1\x14a\x02\xE5W_\x80\xFD[\x80c\x01?\xA5\xFC\x14a\x01\xB3W\x80c\x02\xB5\x92\xF3\x14a\x01\xD4W\x80c\r\x8En,\x14a\x021W[_\x80\xFD[4\x80\x15a\x01\xBEW_\x80\xFD[Pa\x01\xD2a\x01\xCD6`\x04a!hV[a\x06\x85V[\0[4\x80\x15a\x01\xDFW_\x80\xFD[Pa\x01\xF3a\x01\xEE6`\x04a!\x81V[a\x078V[`@Qa\x02(\x94\x93\x92\x91\x90`\x01`\x01`@\x1B\x03\x94\x85\x16\x81R\x92\x84\x16` \x84\x01R\x92\x16`@\x82\x01R``\x81\x01\x91\x90\x91R`\x80\x01\x90V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02W_\x80\xFD[Pa\x01\xD2a\x06M6`\x04a!hV[a\x0C\x9FV[4\x80\x15a\x06]W_\x80\xFD[Pa\x01\xD2a\x06l6`\x04a&\x80V[a\x0C\xE1V[4\x80\x15a\x06|W_\x80\xFD[P`\tTa\x03*V[a\x06\x8Da\r\x8CV[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x06\xB4W`@Qc\xE6\xC4${`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x08T`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x90\x82\x16\x03a\x06\xE3W`@Qc\xA8c\xAE\xC9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x08\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x81\x17\x90\x91U`@Q\x90\x81R\x7F\x80\x17\xBB\x88\x7F\xDF\x8F\xCAC\x14\xA9\xD4\x0Fns\xB3\xB8\x10\x02\xD6~\\\xFA\x85\xD8\x81s\xAFj\xA4`r\x90` \x01[`@Q\x80\x91\x03\x90\xA1PV[`\t\x81\x81T\x81\x10a\x07GW_\x80\xFD[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01\x80T`\x01\x90\x91\x01T`\x01`\x01`@\x1B\x03\x80\x83\x16\x93P`\x01`@\x1B\x83\x04\x81\x16\x92`\x01`\x80\x1B\x90\x04\x16\x90\x84V[`\x08T`\x01`\x01`\xA0\x1B\x03\x16\x15\x15\x80\x15a\x07\xA6WP`\x08T`\x01`\x01`\xA0\x1B\x03\x163\x14\x15[\x15a\x07\xC4W`@Qc\x01GL\x8F`\xE7\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x06T\x82Q`\x01`\x01`@\x1B\x03\x91\x82\x16\x91\x16\x11\x15\x80a\x07\xFDWP`\x06T` \x83\x01Q`\x01`\x01`@\x1B\x03`\x01`@\x1B\x90\x92\x04\x82\x16\x91\x16\x11\x15[\x15a\x08\x1BW`@Qc\x05\x1CF\xEF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x08(\x82`@\x01Qa\r\xE7V[a\x082\x82\x82a\x0EWV[\x81Q`\x06\x80T` \x85\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x92\x16\x93\x16\x92\x90\x92\x17\x91\x90\x91\x17\x90U`@\x82\x01Q`\x07Ua\x08\x7Fa\x08xC\x90V[B\x84a\x0FKV[\x81` \x01Q`\x01`\x01`@\x1B\x03\x16\x82_\x01Q`\x01`\x01`@\x1B\x03\x16\x7F\xA0Jw9$PZA\x85d67%\xF5h2\xF5w.k\x8D\r\xBDn\xFC\xE7$\xDF\xE8\x03\xDA\xE6\x84`@\x01Q`@Qa\x08\xCF\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA3PPV[a\x08\xE3a\x114V[a\x08\xEC\x82a\x11\xD8V[a\x08\xF6\x82\x82a\x12\x19V[PPV[_a\t\x03a\x12\xDAV[P_\x80Q` a,\x90\x839\x81Q\x91R\x90V[a\t\x1Da\r\x8CV[`\x08T`\x01`\x01`\xA0\x1B\x03\x16\x15a\thW`\x08\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16\x90U`@Q\x7F\x9A_W\xDE\x85m\xD6h\xC5M\xD9^\\U\xDF\x93C!q\xCB\xCAI\xA8wmV \xEAY\xC0$P\x90_\x90\xA1V[`@Qc\xA8c\xAE\xC9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a\t\x8Ba\r\x8CV[a\t\x81_a\x13#V[`\t\x80T_\x91\x82\x91\x90a\t\xA8`\x01\x83a'\x82V[\x81T\x81\x10a\t\xB8Wa\t\xB8a'\x95V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x80\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x84\x10a\t\xF7W`@Qc\x18V\xA4\x99`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x08T`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16[\x81\x81\x10\x15a\n\xB8W\x84`\t\x82\x81T\x81\x10a\n'Wa\n'a'\x95V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x80\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x11\x15a\n\xB0W`\t\x81\x81T\x81\x10a\n`Wa\n`a'\x95V[\x90_R` _ \x90`\x02\x02\x01`\x01\x01T`\t\x82\x81T\x81\x10a\n\x83Wa\n\x83a'\x95V[\x90_R` _ \x90`\x02\x02\x01_\x01`\x10\x90T\x90a\x01\0\n\x90\x04`\x01`\x01`@\x1B\x03\x16\x93P\x93PPP\x91P\x91V[`\x01\x01a\n\x0BV[PP\x91P\x91V[a\n\xC7a\r\x8CV[a\x0E\x10\x81c\xFF\xFF\xFF\xFF\x16\x10\x80a\n\xE6WPc\x01\xE13\x80\x81c\xFF\xFF\xFF\xFF\x16\x11[\x80a\x0B\x04WP`\x08Tc\xFF\xFF\xFF\xFF`\x01`\xA0\x1B\x90\x91\x04\x81\x16\x90\x82\x16\x11\x15[\x15a\x0B\"W`@Qc\x07\xA5\x07w`\xE5\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x08\x80Tc\xFF\xFF\xFF\xFF\x90\x92\x16`\x01`\xA0\x1B\x02c\xFF\xFF\xFF\xFF`\xA0\x1B\x19\x90\x92\x16\x91\x90\x91\x17\x90UV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16_\x81\x15\x80\x15a\x0B\x8CWP\x82[\x90P_\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\x0B\xA7WP0;\x15[\x90P\x81\x15\x80\x15a\x0B\xB5WP\x80\x15[\x15a\x0B\xD3W`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\x0B\xFDW\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\x0C\x06\x86a\x13\x93V[a\x0C\x0Ea\x13\xA4V[a\x0C\x19\x89\x89\x89a\x13\xACV[\x83\x15a\x0C_W\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPPPV[`\nT_\x90`\xFF\x16a\x0C\x85Wa\x0C\x80\x83\x83a\x14\xD8V[a\x0C\x96V[\x81`\x0BT\x84a\x0C\x94\x91\x90a'\x82V[\x11[\x90P[\x92\x91PPV[a\x0C\xA7a\r\x8CV[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x0C\xD5W`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R_`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[a\x0C\xDE\x81a\x13#V[PV[a\x0C\xEC`\t_a\x1E\x82V[_[\x81Q\x81\x10\x15a\x08\xF6W`\t\x82\x82\x81Q\x81\x10a\r\x0BWa\r\x0Ba'\x95V[` \x90\x81\x02\x91\x90\x91\x01\x81\x01Q\x82T`\x01\x81\x81\x01\x85U_\x94\x85R\x93\x83\x90 \x82Q`\x02\x90\x92\x02\x01\x80T\x93\x83\x01Q`@\x84\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16`\x01`\x80\x1B\x02g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`\x80\x1B\x19\x92\x82\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x97\x16\x91\x90\x94\x16\x17\x94\x90\x94\x17\x93\x90\x93\x16\x17\x82U``\x01Q\x90\x82\x01U\x01a\x0C\xEEV[3a\r\xBE\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\t\x81W`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R3`\x04\x82\x01R`$\x01a\x0C\xCCV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x81\x10\x80a\x08\xF6W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01a\x0C\xCCV[_a\x0E`a\x160V[\x90Pa\x0Eja\x1E\xA0V[\x83Q`\x01`\x01`@\x1B\x03\x90\x81\x16\x82R` \x85\x01Q\x16\x81`\x01` \x02\x01R`@\x84\x81\x01Q\x82\x82\x01R`\x01T``\x83\x01R`\x02T`\x80\x83\x01R`\x03T`\xA0\x83\x01R_T`\xC0\x83\x01RQc\xCESzw`\xE0\x1B\x81Rs_\xBD\xB21Vx\xAF\xEC\xB3g\xF02\xD9?d/d\x18\n\xA3\x90c\xCESzw\x90a\x0E\xE9\x90\x85\x90\x85\x90\x88\x90`\x04\x01a)\xAFV[` `@Q\x80\x83\x03\x81\x86Z\xF4\x15\x80\x15a\x0F\x04W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x0F(\x91\x90a+\xDDV[a\x0FEW`@Qc\t\xBD\xE39`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPV[`\tT\x15\x80\x15\x90a\x0F\xC0WP`\x08T`\t\x80T`\x01`\xA0\x1B\x83\x04c\xFF\xFF\xFF\xFF\x16\x92`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x0F\x8BWa\x0F\x8Ba'\x95V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01Ta\x0F\xB5\x90`\x01`@\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x84a+\xFCV[`\x01`\x01`@\x1B\x03\x16\x11[\x15a\x10SW`\x08T`\t\x80T\x90\x91`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x0F\xEDWa\x0F\xEDa'\x95V[_\x91\x82R` \x82 `\x02\x90\x91\x02\x01\x80T`\x01`\x01`\xC0\x1B\x03\x19\x16\x81U`\x01\x01U`\x08\x80T`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90`\x18a\x10-\x83a,#V[\x91\x90a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UPP[`@\x80Q`\x80\x81\x01\x82R`\x01`\x01`@\x1B\x03\x94\x85\x16\x81R\x92\x84\x16` \x80\x85\x01\x91\x82R\x83\x01Q\x85\x16\x84\x83\x01\x90\x81R\x92\x90\x91\x01Q``\x84\x01\x90\x81R`\t\x80T`\x01\x81\x01\x82U_\x91\x90\x91R\x93Q`\x02\x90\x94\x02\x7Fn\x15@\x17\x1Bl\x0C\x96\x0Bq\xA7\x02\r\x9F`\x07\x7Fj\xF91\xA8\xBB\xF5\x90\xDA\x02#\xDA\xCFu\xC7\xAF\x81\x01\x80T\x93Q\x94Q\x87\x16`\x01`\x80\x1B\x02g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`\x80\x1B\x19\x95\x88\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x95\x16\x96\x90\x97\x16\x95\x90\x95\x17\x92\x90\x92\x17\x92\x90\x92\x16\x93\x90\x93\x17\x90\x91UQ\x7Fn\x15@\x17\x1Bl\x0C\x96\x0Bq\xA7\x02\r\x9F`\x07\x7Fj\xF91\xA8\xBB\xF5\x90\xDA\x02#\xDA\xCFu\xC7\xB0\x90\x91\x01UV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a\x11\xBAWP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a\x11\xAE_\x80Q` a,\x90\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\t\x81W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x11\xE0a\r\x8CV[`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x81R\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x90` \x01a\x07-V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x12sWP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x12p\x91\x81\x01\x90a,HV[`\x01[a\x12\x9BW`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x0C\xCCV[_\x80Q` a,\x90\x839\x81Q\x91R\x81\x14a\x12\xCBW`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x0C\xCCV[a\x12\xD5\x83\x83a\x1C`V[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\t\x81W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T`\x01`\x01`\xA0\x1B\x03\x19\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90_\x90\xA3PPPV[a\x13\x9Ba\x1C\xB5V[a\x0C\xDE\x81a\x1C\xFEV[a\t\x81a\x1C\xB5V[\x82Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80a\x13\xD0WP` \x83\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80a\x13\xDDWP` \x82\x01Q\x15[\x80a\x13\xEAWP`@\x82\x01Q\x15[\x80a\x13\xF7WP``\x82\x01Q\x15[\x80a\x14\x01WP\x81Q\x15[\x80a\x14\x13WPa\x0E\x10\x81c\xFF\xFF\xFF\xFF\x16\x10[\x80a\x14'WPc\x01\xE13\x80\x81c\xFF\xFF\xFF\xFF\x16\x11[\x15a\x14EW`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x82Q`\x04\x80T` \x80\x87\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x93\x84\x16\x91\x90\x95\x16\x90\x81\x17\x85\x17\x90\x93U`@\x96\x87\x01Q`\x05\x81\x90U\x86Q_U\x90\x86\x01Q`\x01U\x95\x85\x01Q`\x02U``\x90\x94\x01Q`\x03U`\x06\x80T\x90\x94\x16\x17\x17\x90\x91U`\x07\x91\x90\x91U`\x08\x80Tc\xFF\xFF\xFF\xFF\x90\x92\x16`\x01`\xA0\x1B\x02c\xFF\xFF\xFF\xFF`\xA0\x1B\x19\x90\x92\x16\x91\x90\x91\x17\x90UV[`\tT_\x90C\x84\x11\x80a\x14\xE9WP\x80\x15[\x80a\x153WP`\x08T`\t\x80T\x90\x91`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x15\x17Wa\x15\x17a'\x95V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x84\x10[\x15a\x15QW`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_\x80\x80a\x15_`\x01\x85a'\x82V[\x90P[\x81a\x15\xFBW`\x08T`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x81\x10a\x15\xFBW\x86`\t\x82\x81T\x81\x10a\x15\x94Wa\x15\x94a'\x95V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x11a\x15\xE9W`\x01\x91P`\t\x81\x81T\x81\x10a\x15\xC9Wa\x15\xC9a'\x95V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x92Pa\x15\xFBV[\x80a\x15\xF3\x81a,_V[\x91PPa\x15bV[\x81a\x16\x19W`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x85a\x16$\x84\x89a'\x82V[\x11\x97\x96PPPPPPPV[a\x168a\x1E\xBEV[b\x01\0\0\x81R`\x07` \x82\x01R\x7F\x13i\xAAx\xDCP\x13Z\xD7V\xD6,\x97\xA6J\x0E\xDC\xD3\0fXAh \r\x9D\x1F\xAC\xF8,\xA4\xF5`@\x82\x01QR\x7F,\xF24V\xD7\x12\xB0o\x8E:\xA5\xBF\n\xCC>F\xA3\xD0\x94`*:+\x99\xD8s\xBB\xA0ZC\x91G` `@\x83\x01Q\x01R\x7F\x08\xA3_7\x9D-,I\nQ\0f\x97'^M\xB7\x9Bg\xB4\xA1u\xC1G~&-)\xE2^B1``\x82\x01QR\x7F!\x88(\x13\x1B\xB7\x94\x0C\xCC\x88\xC5a\xB2\x99uZ\xF4\xBF\x0Bq\xED\x93\x0B\x12\x9E\x8B\xE0\xA1!\x819\xEA` ``\x83\x01Q\x01R\x7F#\xA2\x17$6\xC1\x14[6\xD5\xBCm;1\xFA\x16\x10\xC7:T>\xA4C\x91\x8A\xAA>\xE1u\xF9\x92\x1B`\x80\x82\x01QR\x7F%\x02\xAD\xF4\x04\xD6(w\xC3\x10!J\xE9\x94.\x93\xC4\x0B\x15M4\xC0$\xBA\xB4\x8A<\xA0W\xE6\n\x11` `\x80\x83\x01Q\x01R\x7F\x1B\xB8\x8A\xDA\x91\xABw4\x88/x&\xB8\x12u2\0\x81\xACH_\x9C\xF8\xBF\xBC;\xA5Kn\xB4\xDF\xF3`\xA0\x82\x01QR\x7F%\xC7J'\xE9\xA3\xB2\x01\x14\xA3\xA9\x1F1\xC2\x0F\x01w~~\xD9\x13\xE0\xEF\x94\x9F\x02\x85\xE2\xE7\xC2\x06\x9B` `\xA0\x83\x01Q\x01R\x7F\x12\xB0\xCEv\xAC\x8B\r\xBD@^\xBC]\xD0\xBA\xE0\xF9\x1A\xEDP\x03<~\xA3o\xC6*\xAB\xA2\xB9\x833\xDC`\xC0\x82\x01QR\x7F\x18[B\xAFI\xDD\x1C\xBE3z\x84\xF7KpArB\x8EuJ\x0B\xEA\x02J\xB3\xEB/\x99j\xFB,G` `\xC0\x83\x01Q\x01R\x7F!\xF5:\xD4S\x8BEC\x8B\xBF\x05!D`p\"9 \xE3\xDFo\x90\"\xA6L\xC1m\x7F\x94\xE8\\\x08`\xE0\x82\x01QR\x7F\"x\xAC=\xED\xFD\xAC\x7F\xEB\x97%\xA0\"IquQ\x8E\xAD\xA5,\x892\xFC@\xE6\xE7[\xEA\x88\x9F\xB8` `\xE0\x83\x01Q\x01R\x7F\x08v\x13o\x81\xC1b\x98H{\xFB\x1B\xE7MJ4\x87\xECEdZ\xB1\xD0\x9D\xC2\xE5\xB8e\xD6\"0\xDFa\x01\0\x82\x01QR\x7F\t\x8Cd\x1C\x94~\xCDy\x8D\xFD^\x1B/\xE4(\x02L\xDF\x03\x06\x1AS\xFFwN\xA8\xA9\xE3\xDE\x9D?+` a\x01\0\x83\x01Q\x01R\x7F\x15\xEA\xAC,b2\xD2&\x8B\xF7\x9D\xC4~\xD9fo\x99/\xB3\xD9j\xD2?\xB2\x16\x90\xC2\x15\x86\xC5G.a\x01 \x82\x01QR\x7F\x0F\x10\xF1\xFF\xC5H\x81(\x7F\xDAo \x0B\xC8]\x82E\xB5\x08\xD8D\xA9t\t\x8AA\x11\x98g\xB3%\xD0` a\x01 \x83\x01Q\x01R\x7F\x08\x95\xCE\xEA@\xB0\x85SN\x979\xCATB\xBAH\xB3\xA3Y*\xFF\xDE+P\x9D\xF7E!\xB4}\x8A\xB0a\x01@\x82\x01QR\x7F.\x12\xECX\0\xAC\x92\xFE*\x8Ep@\xBC[C[\x9E\xB7\x1E18\x01s\xFAv\x88\xBF\x81\xFC\xBB\xA4U` a\x01@\x83\x01Q\x01R\x7F/S\x84\xEBVS\xE4uv\xEF\xE2H\xE7\x90?F2CAK\xFE\xD5#}\xDAu\r\xF3\x99k\xD9\x18a\x01`\x82\x01QR\x7F\x1C<\xD6\xB1\x1D\xA8pL\xDC\x87\x1A\xB4\xFA2=~\xE5{\xD4\x0C\xE1e\xB4\x9AV\xD5\xEFd\x89\xCD%\x1A` a\x01`\x83\x01Q\x01R\x7F\x13W\x99\x94\x95|\xE1UL\xC1\xE5\xB1\x94\xFBc\xC9Q7\x07\xF6'AO\x84Bh\x1A\xE76\xE3dPa\x01\x80\x82\x01QR\x7F&\xC9\xBD\xCD\x96\xD8\xE4 \xB1)t\xAD\xE9:\xD9\xC3\x12\xC4\x18R\x13\xD2\xF6\x83\x1A|bZ\x18\x89\x0E\x95` a\x01\x80\x83\x01Q\x01R\x7F\x0C\xC7\n\x1DT*\x9A\x155\xAE]\x92\x01ij\xDC\\\x99\xC1\xBC\xEB\xD9\x95\x1D\xFA\x8A\xFE\xC7\x9F\xA0\xB6Da\x01\xA0\x82\x01QR\x7F\x10\xB0C\xD9\xF1\x86\x91\x81\xB9ey\xD6an\xFC\x17\xA5\xDF{\x84\xC4\xD41\xD9f\xC9\tK\xF1\xE8\x81S` a\x01\xA0\x83\x01Q\x01R\x7F\x19\x8Ae0\x9D\x13\x1AC\xB0\xAB\x1CGe\x9D\x036\xCF\xBFb\xB2\x7FG'\x10kO\xD9q\xC7=\xD4\x03a\x01\xC0\x82\x01QR\x7F#\xDF\x99\xEA\xC3\xC1\x94y\x03\xB2\x11\xB8\0\xEF\xEBv\xF4}^\x87\xB7AHfT4\x92\xE8\xC7y\x8D\x1A` a\x01\xC0\x83\x01Q\x01R\x7F\"\x1C\xC5\xE4{\x81\xCE\x8D\xCF\xA7.\xF9\x81\x91j\x8E\xDD\xEF\x12\xFC\xDEY\xC5lb\x83\x0C\x12n\xBE\xF0\xDEa\x01\xE0\x82\x01QR\x7F#\x1F\x994\x0C5\xC9\xE0\x96R\xA6\xDFs\xC9\xCE\xC5\xD8\x878\xCBq\xFFEqo\xDC\x9E\x9EE\xA4\x92n` a\x01\xE0\x83\x01Q\x01R\x7F,\x9F\x14\x89\xFC\xE0\xF2c\xE0?>\x97\xBF\nr':\xAF\xCC\xA92_\xF4w\x86\xAD\xB0JR\xA6\xD2,a\x02\0\x82\x01QR\x7F!\xF6n(\xF1~\x01\xE9\xFDY>\x16\xD0\"\xC4\xEC\xA2[\xD5\xDB\x96\xDA\xEC`m\x97\xB6\x04\xCCAH8` a\x02\0\x83\x01Q\x01R\x7F \x15tV\x04\xA9W\x1E\"k\xD9\x90C\xCF\xAF\x1F\x96&|\xC5\xDEg\xF4\x97V?\xF8\x11\0S\x1D&a\x02 \x82\x01QR\x7F h\x89\xFFLX\xDD\x08\xEE\x11\x07\x19\x1A*[\xC5\xDB\xAEU\xC4\x9D}\x83\x97\x80\x17\x99\x86\x8D\x10\xF8\x05` a\x02 \x83\x01Q\x01R\x7F!\x06*\xB8\xF8\xEC\xD8\x93+B\x9A\x1E\xB8aK\x1E\x03\xDBa\xBF\xF6\xA5\xCD-]~\xA1\x93\xE9\x0E\x99'a\x02@\x82\x01QR\x7F!\x7F\x9B'\xB94\xB8\x8F\xFEU]h-\xFEn\x8BmP?\x86\xB1K\xBD\x964+\xC4\x84\x87\xA6\x0B'` a\x02@\x83\x01Q\x01R\x7F\x1C\x9E\xDA-\x19\\\xB71\xF9\x03#^\xADjO|f\xDBI\xDAq>\xCB'\xAF\xEE\x07o\x0E\xEAqTa\x02`\x82\x01QR\x7F&G\xC1a\xC0\x0B\x90%\x8E\x1C\xEF\xEB\xB1t\x81\xF8\xA5\xD9\x1B_\x9D\xCAbn>\x89\xA9![\xCC\xA1j` a\x02`\x83\x01Q\x01R\x7F\xB0\x83\x88\x93\xEC\x1F#~\x8B\x072;\x07DY\x9FN\x97\xB5\x98\xB3\xB5\x89\xBC\xC2\xBC7\xB8\xD5\xC4\x18\x01a\x02\x80\x82\x01R\x7F\xC1\x83\x93\xC0\xFA0\xFEN\x8B\x03\x8E5z\xD8Q\xEA\xE8\xDE\x91\x07XN\xFF\xE7\xC7\xF1\xF6Q\xB2\x01\x0E&a\x02\xA0\x82\x01R\x90V[a\x1Ci\x82a\x1D\x06V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90_\x90\xA2\x80Q\x15a\x1C\xADWa\x12\xD5\x82\x82a\x1DiV[a\x08\xF6a\x1D\xDBV[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a\t\x81W`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0C\xA7a\x1C\xB5V[\x80`\x01`\x01`\xA0\x1B\x03\x16;_\x03a\x1D;W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x0C\xCCV[_\x80Q` a,\x90\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[``_\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa\x1D\x85\x91\x90a,tV[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a\x1D\xBDW`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a\x1D\xC2V[``\x91P[P\x91P\x91Pa\x1D\xD2\x85\x83\x83a\x1D\xFAV[\x95\x94PPPPPV[4\x15a\t\x81W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a\x1E\x0FWa\x1E\n\x82a\x1EYV[a\x1ERV[\x81Q\x15\x80\x15a\x1E&WP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\x1EOW`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x0C\xCCV[P\x80[\x93\x92PPPV[\x80Q\x15a\x1EiW\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80T_\x82U`\x02\x02\x90_R` _ \x90\x81\x01\x90a\x0C\xDE\x91\x90a!$V[`@Q\x80`\xE0\x01`@R\x80`\x07\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80a\x02\xC0\x01`@R\x80_\x81R` \x01_\x81R` \x01a\x1E\xF1`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1F\x11`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1F1`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1FQ`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1Fq`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1F\x91`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1F\xB1`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1F\xD1`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a\x1F\xF1`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a \x11`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a 1`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a Q`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a q`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a \x91`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a \xB1`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a \xD1`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a \xF1`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a!\x11`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R_` \x82\x01\x81\x90R`@\x90\x91\x01R\x90V[[\x80\x82\x11\x15a!IW\x80T`\x01`\x01`\xC0\x1B\x03\x19\x16\x81U_`\x01\x82\x01U`\x02\x01a!%V[P\x90V[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a!cW_\x80\xFD[\x91\x90PV[_` \x82\x84\x03\x12\x15a!xW_\x80\xFD[a\x0C\x96\x82a!MV[_` \x82\x84\x03\x12\x15a!\x91W_\x80\xFD[P5\x91\x90PV[cNH{q`\xE0\x1B_R`A`\x04R`$_\xFD[`@Qa\x02\xE0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a!\xCFWa!\xCFa!\x98V[`@R\x90V[`@Q`\x80\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a!\xCFWa!\xCFa!\x98V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a\"\x1FWa\"\x1Fa!\x98V[`@R\x91\x90PV[\x805`\x01`\x01`@\x1B\x03\x81\x16\x81\x14a!cW_\x80\xFD[_``\x82\x84\x03\x12\x15a\"MW_\x80\xFD[`@Q``\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a\"oWa\"oa!\x98V[`@R\x90P\x80a\"~\x83a\"'V[\x81Ra\"\x8C` \x84\x01a\"'V[` \x82\x01R`@\x83\x015`@\x82\x01RP\x92\x91PPV[_`@\x82\x84\x03\x12\x15a\"\xB2W_\x80\xFD[`@Q`@\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a\"\xD4Wa\"\xD4a!\x98V[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[_\x80\x82\x84\x03a\x04\xE0\x81\x12\x15a#\x01W_\x80\xFD[a#\x0B\x85\x85a\"=V[\x92Pa\x04\x80\x80`_\x19\x83\x01\x12\x15a# W_\x80\xFD[a#(a!\xACV[\x91Pa#7\x86``\x87\x01a\"\xA2V[\x82Ra#F\x86`\xA0\x87\x01a\"\xA2V[` \x83\x01Ra#X\x86`\xE0\x87\x01a\"\xA2V[`@\x83\x01Ra\x01 a#l\x87\x82\x88\x01a\"\xA2V[``\x84\x01Ra\x01`a#\x80\x88\x82\x89\x01a\"\xA2V[`\x80\x85\x01Ra\x01\xA0a#\x94\x89\x82\x8A\x01a\"\xA2V[`\xA0\x86\x01Ra\x01\xE0a#\xA8\x8A\x82\x8B\x01a\"\xA2V[`\xC0\x87\x01Ra\x02 a#\xBC\x8B\x82\x8C\x01a\"\xA2V[`\xE0\x88\x01Ra\x02`a#\xD0\x8C\x82\x8D\x01a\"\xA2V[a\x01\0\x89\x01Ra\x02\xA0a#\xE5\x8D\x82\x8E\x01a\"\xA2V[\x87\x8A\x01Ra#\xF7\x8Da\x02\xE0\x8E\x01a\"\xA2V[a\x01@\x8A\x01Ra$\x0B\x8Da\x03 \x8E\x01a\"\xA2V[\x86\x8A\x01Ra$\x1D\x8Da\x03`\x8E\x01a\"\xA2V[a\x01\x80\x8A\x01Ra\x03\xA0\x8C\x015\x94\x89\x01\x94\x90\x94Ra\x03\xC0\x8B\x015a\x01\xC0\x89\x01Ra\x03\xE0\x8B\x015\x92\x88\x01\x92\x90\x92Ra\x04\0\x8A\x015a\x02\0\x88\x01Ra\x04 \x8A\x015\x90\x87\x01Ra\x04@\x89\x015a\x02@\x87\x01Ra\x04`\x89\x015\x90\x86\x01R\x92\x87\x015a\x02\x80\x85\x01RPPa\x04\xA0\x85\x015\x90\x82\x01Ra\x04\xC0\x90\x93\x015a\x02\xC0\x84\x01RP\x92\x90\x91PV[_\x80`@\x83\x85\x03\x12\x15a$\xB0W_\x80\xFD[a$\xB9\x83a!MV[\x91P` \x80\x84\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a$\xD5W_\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12a$\xE8W_\x80\xFD[\x815\x81\x81\x11\x15a$\xFAWa$\xFAa!\x98V[a%\x0C`\x1F\x82\x01`\x1F\x19\x16\x85\x01a!\xF7V[\x91P\x80\x82R\x87\x84\x82\x85\x01\x01\x11\x15a%!W_\x80\xFD[\x80\x84\x84\x01\x85\x84\x017_\x84\x82\x84\x01\x01RP\x80\x93PPPP\x92P\x92\x90PV[\x805c\xFF\xFF\xFF\xFF\x81\x16\x81\x14a!cW_\x80\xFD[_` \x82\x84\x03\x12\x15a%aW_\x80\xFD[a\x0C\x96\x82a%>V[_\x80_\x80\x84\x86\x03a\x01 \x81\x12\x15a%\x7FW_\x80\xFD[a%\x89\x87\x87a\"=V[\x94P`\x80`_\x19\x82\x01\x12\x15a%\x9CW_\x80\xFD[Pa%\xA5a!\xD5V[``\x86\x81\x015\x82R`\x80\x87\x015` \x83\x01R`\xA0\x87\x015`@\x83\x01R`\xC0\x87\x015\x90\x82\x01R\x92Pa%\xD8`\xE0\x86\x01a%>V[\x91Pa%\xE7a\x01\0\x86\x01a!MV[\x90P\x92\x95\x91\x94P\x92PV[_[\x83\x81\x10\x15a&\x0CW\x81\x81\x01Q\x83\x82\x01R` \x01a%\xF4V[PP_\x91\x01RV[` \x81R_\x82Q\x80` \x84\x01Ra&2\x81`@\x85\x01` \x87\x01a%\xF2V[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[_``\x82\x84\x03\x12\x15a&VW_\x80\xFD[a\x0C\x96\x83\x83a\"=V[_\x80`@\x83\x85\x03\x12\x15a&qW_\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[_` \x80\x83\x85\x03\x12\x15a&\x91W_\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a&\xA7W_\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a&\xBAW_\x80\xFD[\x815\x81\x81\x11\x15a&\xCCWa&\xCCa!\x98V[a&\xDA\x84\x82`\x05\x1B\x01a!\xF7V[\x81\x81R\x84\x81\x01\x92P`\x07\x91\x90\x91\x1B\x83\x01\x84\x01\x90\x87\x82\x11\x15a&\xF9W_\x80\xFD[\x92\x84\x01\x92[\x81\x84\x10\x15a'cW`\x80\x84\x89\x03\x12\x15a'\x15W_\x80\xFD[a'\x1Da!\xD5V[a'&\x85a\"'V[\x81Ra'3\x86\x86\x01a\"'V[\x86\x82\x01R`@a'D\x81\x87\x01a\"'V[\x90\x82\x01R``\x85\x81\x015\x90\x82\x01R\x83R`\x80\x90\x93\x01\x92\x91\x84\x01\x91a&\xFEV[\x97\x96PPPPPPPV[cNH{q`\xE0\x1B_R`\x11`\x04R`$_\xFD[\x81\x81\x03\x81\x81\x11\x15a\x0C\x99Wa\x0C\x99a'nV[cNH{q`\xE0\x1B_R`2`\x04R`$_\xFD[\x80_[`\x07\x81\x10\x15a\x0FEW\x81Q\x84R` \x93\x84\x01\x93\x90\x91\x01\x90`\x01\x01a'\xACV[a'\xE0\x82\x82Q\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[` \x81\x81\x01Q\x80Q`@\x85\x01R\x90\x81\x01Q``\x84\x01RP`@\x81\x01Q\x80Q`\x80\x84\x01R` \x81\x01Q`\xA0\x84\x01RP``\x81\x01Q\x80Q`\xC0\x84\x01R` \x81\x01Q`\xE0\x84\x01RP`\x80\x81\x01Qa\x01\0a(C\x81\x85\x01\x83\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xA0\x83\x01Q\x91Pa\x01@a(c\x81\x86\x01\x84\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xC0\x84\x01Q\x92Pa\x01\x80a(\x83\x81\x87\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xE0\x85\x01Q\x93Pa\x01\xC0a(\xA3\x81\x88\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x85\x01Q\x93Pa\x02\0\x92a(\xC3\x87\x85\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01 \x86\x01Q\x94Pa\x02@a(\xE4\x81\x89\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x86\x01Q\x94Pa\x02\x80\x92a)\x04\x88\x85\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01`\x87\x01Q\x95Pa\x02\xC0a)%\x81\x8A\x01\x88\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x87\x01Q\x80Qa\x03\0\x8A\x01R` \x01Qa\x03 \x89\x01Ra\x01\xA0\x87\x01Qa\x03@\x89\x01R\x90\x86\x01Qa\x03`\x88\x01Ra\x01\xE0\x86\x01Qa\x03\x80\x88\x01R\x92\x85\x01Qa\x03\xA0\x87\x01Ra\x02 \x85\x01Qa\x03\xC0\x87\x01R\x91\x84\x01Qa\x03\xE0\x86\x01Ra\x02`\x84\x01Qa\x04\0\x86\x01R\x83\x01Qa\x04 \x85\x01Ra\x02\xA0\x83\x01Qa\x04@\x85\x01R\x90\x91\x01Qa\x04`\x90\x92\x01\x91\x90\x91RPV[_a\n`\x82\x01\x90P\x84Q\x82R` \x85\x01Q` \x83\x01R`@\x85\x01Qa)\xE1`@\x84\x01\x82\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[P``\x85\x01Q\x80Q`\x80\x84\x01R` \x81\x01Q`\xA0\x84\x01RP`\x80\x85\x01Q\x80Q`\xC0\x84\x01R` \x81\x01Q`\xE0\x84\x01RP`\xA0\x85\x01Qa\x01\0a*.\x81\x85\x01\x83\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xC0\x87\x01Q\x91Pa\x01@a*N\x81\x86\x01\x84\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xE0\x88\x01Q\x92Pa\x01\x80a*n\x81\x87\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x88\x01Q\x92Pa\x01\xC0\x91a*\x8E\x86\x84\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01 \x89\x01Q\x93Pa\x02\0a*\xAF\x81\x88\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x89\x01Q\x93Pa\x02@\x91a*\xCF\x87\x84\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01`\x8A\x01Q\x94Pa\x02\x80a*\xF0\x81\x89\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x8A\x01Q\x80Qa\x02\xC0\x89\x01R` \x90\x81\x01Qa\x02\xE0\x89\x01Ra\x01\xA0\x8B\x01Q\x80Qa\x03\0\x8A\x01R\x81\x01Qa\x03 \x89\x01R\x93\x8A\x01Q\x80Qa\x03@\x89\x01R\x84\x01Qa\x03`\x88\x01Ra\x01\xE0\x8A\x01Q\x80Qa\x03\x80\x89\x01R\x84\x01Qa\x03\xA0\x88\x01R\x89\x01Q\x80Qa\x03\xC0\x88\x01R\x83\x01Qa\x03\xE0\x87\x01Ra\x02 \x89\x01Q\x80Qa\x04\0\x88\x01R\x83\x01Qa\x04 \x87\x01R\x90\x88\x01Q\x80Qa\x04@\x87\x01R\x82\x01Qa\x04`\x86\x01Ra\x02`\x88\x01Q\x80Qa\x04\x80\x87\x01R\x90\x91\x01Qa\x04\xA0\x85\x01R\x86\x01Qa\x04\xC0\x84\x01RPa\x02\xA0\x85\x01Qa\x04\xE0\x83\x01Ra+\xC7a\x05\0\x83\x01\x85a'\xA9V[a+\xD5a\x05\xE0\x83\x01\x84a'\xCBV[\x94\x93PPPPV[_` \x82\x84\x03\x12\x15a+\xEDW_\x80\xFD[\x81Q\x80\x15\x15\x81\x14a\x1ERW_\x80\xFD[`\x01`\x01`@\x1B\x03\x82\x81\x16\x82\x82\x16\x03\x90\x80\x82\x11\x15a,\x1CWa,\x1Ca'nV[P\x92\x91PPV[_`\x01`\x01`@\x1B\x03\x80\x83\x16\x81\x81\x03a,>Wa,>a'nV[`\x01\x01\x93\x92PPPV[_` \x82\x84\x03\x12\x15a,XW_\x80\xFD[PQ\x91\x90PV[_\x81a,mWa,ma'nV[P_\x19\x01\x90V[_\x82Qa,\x85\x81\x84` \x87\x01a%\xF2V[\x91\x90\x91\x01\x92\x91PPV\xFE6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\xA1dsolcC\0\x08\x17\0\n", + b"`\x80`@R`\x046\x10a\x01\xF1W_5`\xE0\x1C\x80c\x82nA\xFC\x11a\x01\x08W\x80c\xB2BN?\x11a\0\x9DW\x80c\xD2M\x93=\x11a\0mW\x80c\xD2M\x93=\x14a\x06\xF6W\x80c\xE003\x01\x14a\x07%W\x80c\xF2\xFD\xE3\x8B\x14a\x07DW\x80c\xF5ga`\x14a\x07cW\x80c\xF9\xE5\r\x19\x14a\x07\x82W_\x80\xFD[\x80c\xB2BN?\x14a\x06.W\x80c\xB5\xAD\xEA<\x14a\x06LW\x80c\xC2;\x9E\x9E\x14a\x06\xA3W\x80c\xC8\xE5\xE4\x98\x14a\x06\xDBW_\x80\xFD[\x80c\x96\xC1\xCAa\x11a\0\xD8W\x80c\x96\xC1\xCAa\x14a\x05^W\x80c\x9F\xDBT\xA7\x14a\x05}W\x80c\xA1\xBE\x8DR\x14a\x05\xD2W\x80c\xAD<\xB1\xCC\x14a\x05\xF1W_\x80\xFD[\x80c\x82nA\xFC\x14a\x04\x9CW\x80c\x85\x84\xD2?\x14a\x04\xC7W\x80c\x8D\xA5\xCB[\x14a\x05\x03W\x80c\x90\xC1C\x90\x14a\x05?W_\x80\xFD[\x80c<#\xB6\xDB\x11a\x01\x89W\x80ci\xCCj\x04\x11a\x01YW\x80ci\xCCj\x04\x14a\x04\"W\x80cqP\x18\xA6\x14a\x046W\x80cu|7\xAD\x14a\x04JW\x80cvg\x18\x08\x14a\x04iW\x80c\x81\x1F\x85?\x14a\x04}W_\x80\xFD[\x80c<#\xB6\xDB\x14a\x03\x9DW\x80cBm1\x94\x14a\x03\xD9W\x80cO\x1E\xF2\x86\x14a\x03\xFBW\x80cR\xD1\x90-\x14a\x04\x0EW_\x80\xFD[\x80c-R\xAA\xD6\x11a\x01\xC4W\x80c-R\xAA\xD6\x14a\x02\xE0W\x80c/y\x88\x9D\x14a\x03\x0CW\x80c1=\xF7\xB1\x14a\x03JW\x80c7\x8E\xC2;\x14a\x03\x81W_\x80\xFD[\x80c\x01?\xA5\xFC\x14a\x01\xF5W\x80c\x02\xB5\x92\xF3\x14a\x02\x16W\x80c\x06%\xE1\x9B\x14a\x02sW\x80c\r\x8En,\x14a\x02\xB5W[_\x80\xFD[4\x80\x15a\x02\0W_\x80\xFD[Pa\x02\x14a\x02\x0F6`\x04a%XV[a\x07\x96V[\0[4\x80\x15a\x02!W_\x80\xFD[Pa\x025a\x0206`\x04a%qV[a\x08IV[`@Qa\x02j\x94\x93\x92\x91\x90`\x01`\x01`@\x1B\x03\x94\x85\x16\x81R\x92\x84\x16` \x84\x01R\x92\x16`@\x82\x01R``\x81\x01\x91\x90\x91R`\x80\x01\x90V[`@Q\x80\x91\x03\x90\xF3[4\x80\x15a\x02~W_\x80\xFD[P`\x05T`\x06T`\x07T`\x08Ta\x02\x95\x93\x92\x91\x90\x84V[`@\x80Q\x94\x85R` \x85\x01\x93\x90\x93R\x91\x83\x01R``\x82\x01R`\x80\x01a\x02jV[4\x80\x15a\x02\xC0W_\x80\xFD[P`@\x80Q`\x01\x81R_` \x82\x01\x81\x90R\x91\x81\x01\x91\x90\x91R``\x01a\x02jV[4\x80\x15a\x02\xEBW_\x80\xFD[Pa\x02\x14a\x02\xFA6`\x04a%qV[`\x0F\x80T`\xFF\x19\x16`\x01\x17\x90U`\x10UV[4\x80\x15a\x03\x17W_\x80\xFD[P`\rTa\x032\x90`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x81V[`@Q`\x01`\x01`@\x1B\x03\x90\x91\x16\x81R` \x01a\x02jV[4\x80\x15a\x03UW_\x80\xFD[P`\rTa\x03i\x90`\x01`\x01`\xA0\x1B\x03\x16\x81V[`@Q`\x01`\x01`\xA0\x1B\x03\x90\x91\x16\x81R` \x01a\x02jV[4\x80\x15a\x03\x8CW_\x80\xFD[PC[`@Q\x90\x81R` \x01a\x02jV[4\x80\x15a\x03\xA8W_\x80\xFD[Pa\x02\x14a\x03\xB76`\x04a%\x9EV[_\x80Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01`\x01`@\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[4\x80\x15a\x03\xE4W_\x80\xFD[P`\x01T`\x02T`\x03T`\x04Ta\x02\x95\x93\x92\x91\x90\x84V[a\x02\x14a\x04\t6`\x04a&FV[a\x08\x92V[4\x80\x15a\x04\x19W_\x80\xFD[Pa\x03\x8Fa\x08\xB1V[4\x80\x15a\x04-W_\x80\xFD[Pa\x02\x14a\x08\xCCV[4\x80\x15a\x04AW_\x80\xFD[Pa\x02\x14a\t:V[4\x80\x15a\x04UW_\x80\xFD[Pa\x02\x14a\x04d6`\x04a'\xD8V[a\tKV[4\x80\x15a\x04tW_\x80\xFD[Pa\x032a\x0C\x16V[4\x80\x15a\x04\x88W_\x80\xFD[Pa\x02\x14a\x04\x976`\x04a)\xB1V[a\x0C@V[4\x80\x15a\x04\xA7W_\x80\xFD[P`\rT`\x01`\x01`\xA0\x1B\x03\x16\x15\x15[`@Q\x90\x15\x15\x81R` \x01a\x02jV[4\x80\x15a\x04\xD2W_\x80\xFD[Pa\x04\xE6a\x04\xE16`\x04a%qV[a\rdV[`@\x80Q\x92\x83R`\x01`\x01`@\x1B\x03\x90\x91\x16` \x83\x01R\x01a\x02jV[4\x80\x15a\x05\x0EW_\x80\xFD[P\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16a\x03iV[4\x80\x15a\x05JW_\x80\xFD[Pa\x032a\x05Y6`\x04a*\x17V[a\x0E\x8FV[4\x80\x15a\x05iW_\x80\xFD[Pa\x02\x14a\x05x6`\x04a*HV[a\x0E\xECV[4\x80\x15a\x05\x88W_\x80\xFD[P`\x0BT`\x0CTa\x05\xAC\x91`\x01`\x01`@\x1B\x03\x80\x82\x16\x92`\x01`@\x1B\x90\x92\x04\x16\x90\x83V[`@\x80Q`\x01`\x01`@\x1B\x03\x94\x85\x16\x81R\x93\x90\x92\x16` \x84\x01R\x90\x82\x01R``\x01a\x02jV[4\x80\x15a\x05\xDDW_\x80\xFD[Pa\x04\xB7a\x05\xEC6`\x04a%\x9EV[a\x0FuV[4\x80\x15a\x05\xFCW_\x80\xFD[Pa\x06!`@Q\x80`@\x01`@R\x80`\x05\x81R` \x01d\x03R\xE3\x02\xE3`\xDC\x1B\x81RP\x81V[`@Qa\x02j\x91\x90a*\x83V[4\x80\x15a\x069W_\x80\xFD[P_Ta\x032\x90`\x01`\x01`@\x1B\x03\x16\x81V[4\x80\x15a\x06WW_\x80\xFD[Pa\x02\x14a\x06f6`\x04a*\xB5V[\x80Q`\x0B\x80T` \x84\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x92\x16\x93\x16\x92\x90\x92\x17\x91\x90\x91\x17\x90U`@\x01Q`\x0CUV[4\x80\x15a\x06\xAEW_\x80\xFD[P`\rTa\x06\xC6\x90`\x01`\xA0\x1B\x90\x04c\xFF\xFF\xFF\xFF\x16\x81V[`@Qc\xFF\xFF\xFF\xFF\x90\x91\x16\x81R` \x01a\x02jV[4\x80\x15a\x06\xE6W_\x80\xFD[Pa\x02\x14`\x0F\x80T`\xFF\x19\x16\x90UV[4\x80\x15a\x07\x01W_\x80\xFD[P`\tT`\nTa\x05\xAC\x91`\x01`\x01`@\x1B\x03\x80\x82\x16\x92`\x01`@\x1B\x90\x92\x04\x16\x90\x83V[4\x80\x15a\x070W_\x80\xFD[Pa\x04\xB7a\x07?6`\x04a*\xCFV[a\x0F\xB7V[4\x80\x15a\x07OW_\x80\xFD[Pa\x02\x14a\x07^6`\x04a%XV[a\x0F\xEAV[4\x80\x15a\x07nW_\x80\xFD[Pa\x02\x14a\x07}6`\x04a*\xEFV[a\x10,V[4\x80\x15a\x07\x8DW_\x80\xFD[P`\x0ETa\x03\x8FV[a\x07\x9Ea\x10\xD7V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x07\xC5W`@Qc\xE6\xC4${`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\rT`\x01`\x01`\xA0\x1B\x03\x90\x81\x16\x90\x82\x16\x03a\x07\xF4W`@Qc\xA8c\xAE\xC9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\r\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x81\x17\x90\x91U`@Q\x90\x81R\x7F\x80\x17\xBB\x88\x7F\xDF\x8F\xCAC\x14\xA9\xD4\x0Fns\xB3\xB8\x10\x02\xD6~\\\xFA\x85\xD8\x81s\xAFj\xA4`r\x90` \x01[`@Q\x80\x91\x03\x90\xA1PV[`\x0E\x81\x81T\x81\x10a\x08XW_\x80\xFD[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01\x80T`\x01\x90\x91\x01T`\x01`\x01`@\x1B\x03\x80\x83\x16\x93P`\x01`@\x1B\x83\x04\x81\x16\x92`\x01`\x80\x1B\x90\x04\x16\x90\x84V[a\x08\x9Aa\x112V[a\x08\xA3\x82a\x11\xD6V[a\x08\xAD\x82\x82a\x12\x17V[PPV[_a\x08\xBAa\x12\xD8V[P_\x80Q` a1|\x839\x81Q\x91R\x90V[a\x08\xD4a\x10\xD7V[`\rT`\x01`\x01`\xA0\x1B\x03\x16\x15a\t\x1FW`\r\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16\x90U`@Q\x7F\x9A_W\xDE\x85m\xD6h\xC5M\xD9^\\U\xDF\x93C!q\xCB\xCAI\xA8wmV \xEAY\xC0$P\x90_\x90\xA1V[`@Qc\xA8c\xAE\xC9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[V[a\tBa\x10\xD7V[a\t8_a\x13!V[`\rT`\x01`\x01`\xA0\x1B\x03\x16\x15\x15\x80\x15a\tpWP`\rT`\x01`\x01`\xA0\x1B\x03\x163\x14\x15[\x15a\t\x8EW`@Qc\x01GL\x8F`\xE7\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\x0BT\x83Q`\x01`\x01`@\x1B\x03\x91\x82\x16\x91\x16\x11\x15\x80a\t\xC7WP`\x0BT` \x84\x01Q`\x01`\x01`@\x1B\x03`\x01`@\x1B\x90\x92\x04\x82\x16\x91\x16\x11\x15[\x15a\t\xE5W`@Qc\x05\x1CF\xEF`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\t\xF2\x83`@\x01Qa\x13\x91V[_a\t\xFBa\x0C\x16V[` \x85\x01Q_\x80T\x92\x93P\x91a\n\x1A\x91\x90`\x01`\x01`@\x1B\x03\x16a\x0E\x8FV[\x90Pa\n'\x82`\x01a+\xF1V[`\x01`\x01`@\x1B\x03\x16\x81`\x01`\x01`@\x1B\x03\x16\x14\x80\x15a\n`WP`\x0BTa\n^\x90`\x01`@\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16a\x0FuV[\x15[\x80\x15a\ntWP_\x82`\x01`\x01`@\x1B\x03\x16\x11[\x15a\n\x92W`@QcqP\xDEE`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\n\x9D\x82`\x02a+\xF1V[`\x01`\x01`@\x1B\x03\x16\x81`\x01`\x01`@\x1B\x03\x16\x10a\n\xCEW`@QcqP\xDEE`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\n\xDB\x84` \x01Qa\x13\x91V[a\n\xE8\x84`@\x01Qa\x13\x91V[a\n\xF5\x84``\x01Qa\x13\x91V[a\x0B\0\x85\x85\x85a\x14\x01V[\x84Q`\x0B\x80T` \x88\x01Q`\x01`\x01`@\x1B\x03\x81\x81\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x93\x16\x94\x16\x93\x90\x93\x17\x17\x90U`@\x86\x01Q`\x0CUa\x0BB\x90a\x0FuV[\x15a\x0B\xACW\x83Q`\x05U` \x84\x01Q`\x06U`@\x84\x01Q`\x07U``\x84\x01Q`\x08U\x7F1\xEA\xBD\x90\x99\xFD\xB2]\xAC\xDD\xD2\x06\xAB\xFF\x871\x1EU4A\xFC\x9D\x0F\xCD\xEF \x10b\xD7\xE7\x07\x1Ba\x0B\x90\x82`\x01a+\xF1V[`@Q`\x01`\x01`@\x1B\x03\x90\x91\x16\x81R` \x01`@Q\x80\x91\x03\x90\xA1[a\x0B\xB7CB\x87a\x15YV[\x84` \x01Q`\x01`\x01`@\x1B\x03\x16\x85_\x01Q`\x01`\x01`@\x1B\x03\x16\x7F\xA0Jw9$PZA\x85d67%\xF5h2\xF5w.k\x8D\r\xBDn\xFC\xE7$\xDF\xE8\x03\xDA\xE6\x87`@\x01Q`@Qa\x0C\x07\x91\x81R` \x01\x90V[`@Q\x80\x91\x03\x90\xA3PPPPPV[`\x0BT_\x80T\x90\x91a\x0C;\x91`\x01`\x01`@\x1B\x03`\x01`@\x1B\x90\x92\x04\x82\x16\x91\x16a\x0E\x8FV[\x90P\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0\x80T`\x01`@\x1B\x81\x04`\xFF\x16\x15\x90`\x01`\x01`@\x1B\x03\x16_\x81\x15\x80\x15a\x0C\x84WP\x82[\x90P_\x82`\x01`\x01`@\x1B\x03\x16`\x01\x14\x80\x15a\x0C\x9FWP0;\x15[\x90P\x81\x15\x80\x15a\x0C\xADWP\x80\x15[\x15a\x0C\xCBW`@Qc\xF9.\xE8\xA9`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x84Tg\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x16`\x01\x17\x85U\x83\x15a\x0C\xF5W\x84T`\xFF`@\x1B\x19\x16`\x01`@\x1B\x17\x85U[a\x0C\xFE\x87a\x17BV[a\r\x06a\x17SV[a\r\x12\x8A\x8A\x8A\x89a\x17[V[\x83\x15a\rXW\x84T`\xFF`@\x1B\x19\x16\x85U`@Q`\x01\x81R\x7F\xC7\xF5\x05\xB2\xF3q\xAE!u\xEEI\x13\xF4I\x9E\x1F&3\xA7\xB5\x93c!\xEE\xD1\xCD\xAE\xB6\x11Q\x81\xD2\x90` \x01`@Q\x80\x91\x03\x90\xA1[PPPPPPPPPPV[`\x0E\x80T_\x91\x82\x91\x90a\rx`\x01\x83a,\x11V[\x81T\x81\x10a\r\x88Wa\r\x88a,$V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x80\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x84\x10a\r\xC7W`@Qc\x18V\xA4\x99`\xE2\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\rT`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16[\x81\x81\x10\x15a\x0E\x88W\x84`\x0E\x82\x81T\x81\x10a\r\xF7Wa\r\xF7a,$V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x80\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x11\x15a\x0E\x80W`\x0E\x81\x81T\x81\x10a\x0E0Wa\x0E0a,$V[\x90_R` _ \x90`\x02\x02\x01`\x01\x01T`\x0E\x82\x81T\x81\x10a\x0ESWa\x0ESa,$V[\x90_R` _ \x90`\x02\x02\x01_\x01`\x10\x90T\x90a\x01\0\n\x90\x04`\x01`\x01`@\x1B\x03\x16\x93P\x93PPP\x91P\x91V[`\x01\x01a\r\xDBV[PP\x91P\x91V[_\x81`\x01`\x01`@\x1B\x03\x16_\x03a\x0E\xA7WP_a\x0E\xE6V[a\x0E\xB1\x82\x84a,LV[`\x01`\x01`@\x1B\x03\x16_\x03a\x0E\xD1Wa\x0E\xCA\x82\x84a,qV[\x90Pa\x0E\xE6V[a\x0E\xDB\x82\x84a,qV[a\x0E\xCA\x90`\x01a+\xF1V[\x92\x91PPV[a\x0E\xF4a\x10\xD7V[a\x0E\x10\x81c\xFF\xFF\xFF\xFF\x16\x10\x80a\x0F\x13WPc\x01\xE13\x80\x81c\xFF\xFF\xFF\xFF\x16\x11[\x80a\x0F1WP`\rTc\xFF\xFF\xFF\xFF`\x01`\xA0\x1B\x90\x91\x04\x81\x16\x90\x82\x16\x11\x15[\x15a\x0FOW`@Qc\x07\xA5\x07w`\xE5\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[`\r\x80Tc\xFF\xFF\xFF\xFF\x90\x92\x16`\x01`\xA0\x1B\x02c\xFF\xFF\xFF\xFF`\xA0\x1B\x19\x90\x92\x16\x91\x90\x91\x17\x90UV[_\x81`\x01`\x01`@\x1B\x03\x16_\x03a\x0F\x8DWP_\x91\x90PV[_Ta\x0F\xA2\x90`\x01`\x01`@\x1B\x03\x16\x83a,LV[`\x01`\x01`@\x1B\x03\x16\x15\x92\x91PPV[\x91\x90PV[`\x0FT_\x90`\xFF\x16a\x0F\xD2Wa\x0F\xCD\x83\x83a\x18\xD5V[a\x0F\xE3V[\x81`\x10T\x84a\x0F\xE1\x91\x90a,\x11V[\x11[\x93\x92PPPV[a\x0F\xF2a\x10\xD7V[`\x01`\x01`\xA0\x1B\x03\x81\x16a\x10 W`@Qc\x1EO\xBD\xF7`\xE0\x1B\x81R_`\x04\x82\x01R`$\x01[`@Q\x80\x91\x03\x90\xFD[a\x10)\x81a\x13!V[PV[a\x107`\x0E_a\"vV[_[\x81Q\x81\x10\x15a\x08\xADW`\x0E\x82\x82\x81Q\x81\x10a\x10VWa\x10Va,$V[` \x90\x81\x02\x91\x90\x91\x01\x81\x01Q\x82T`\x01\x81\x81\x01\x85U_\x94\x85R\x93\x83\x90 \x82Q`\x02\x90\x92\x02\x01\x80T\x93\x83\x01Q`@\x84\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16`\x01`\x80\x1B\x02g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`\x80\x1B\x19\x92\x82\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x97\x16\x91\x90\x94\x16\x17\x94\x90\x94\x17\x93\x90\x93\x16\x17\x82U``\x01Q\x90\x82\x01U\x01a\x109V[3a\x11\t\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0T`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14a\t8W`@Qc\x11\x8C\xDA\xA7`\xE0\x1B\x81R3`\x04\x82\x01R`$\x01a\x10\x17V[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14\x80a\x11\xB8WP\x7F\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`\x01`\x01`\xA0\x1B\x03\x16a\x11\xAC_\x80Q` a1|\x839\x81Q\x91RT`\x01`\x01`\xA0\x1B\x03\x16\x90V[`\x01`\x01`\xA0\x1B\x03\x16\x14\x15[\x15a\t8W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x11\xDEa\x10\xD7V[`@Q`\x01`\x01`\xA0\x1B\x03\x82\x16\x81R\x7F\xF7\x87!\"n\xFE\x9A\x1B\xB6x\x18\x9A\x16\xD1UI(\xB9\xF2\x19.,\xB9>\xED\xA8;y\xFA@\0}\x90` \x01a\x08>V[\x81`\x01`\x01`\xA0\x1B\x03\x16cR\xD1\x90-`@Q\x81c\xFF\xFF\xFF\xFF\x16`\xE0\x1B\x81R`\x04\x01` `@Q\x80\x83\x03\x81\x86Z\xFA\x92PPP\x80\x15a\x12qWP`@\x80Q`\x1F=\x90\x81\x01`\x1F\x19\x16\x82\x01\x90\x92Ra\x12n\x91\x81\x01\x90a,\x96V[`\x01[a\x12\x99W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x83\x16`\x04\x82\x01R`$\x01a\x10\x17V[_\x80Q` a1|\x839\x81Q\x91R\x81\x14a\x12\xC9W`@Qc*\x87Ri`\xE2\x1B\x81R`\x04\x81\x01\x82\x90R`$\x01a\x10\x17V[a\x12\xD3\x83\x83a\x1A-V[PPPV[0`\x01`\x01`\xA0\x1B\x03\x7F\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\x16\x14a\t8W`@Qcp>F\xDD`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x7F\x90\x16\xD0\x9Dr\xD4\x0F\xDA\xE2\xFD\x8C\xEA\xC6\xB6#Lw\x06!O\xD3\x9C\x1C\xD1\xE6\t\xA0R\x8C\x19\x93\0\x80T`\x01`\x01`\xA0\x1B\x03\x19\x81\x16`\x01`\x01`\xA0\x1B\x03\x84\x81\x16\x91\x82\x17\x84U`@Q\x92\x16\x91\x82\x90\x7F\x8B\xE0\x07\x9CS\x16Y\x14\x13D\xCD\x1F\xD0\xA4\xF2\x84\x19I\x7F\x97\"\xA3\xDA\xAF\xE3\xB4\x18okdW\xE0\x90_\x90\xA3PPPV[\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\x81\x10\x80a\x08\xADW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01a\x10\x17V[_a\x14\na\x1A\x82V[\x90Pa\x14\x14a\"\x94V[\x84Q`\x01`\x01`@\x1B\x03\x90\x81\x16\x82R` \x80\x87\x01\x80Q\x90\x92\x16\x90\x83\x01R`@\x80\x87\x01Q\x90\x83\x01R`\x06T``\x83\x01R`\x07T`\x80\x83\x01R`\x08T`\xA0\x83\x01R`\x05T`\xC0\x83\x01RQa\x14e\x90a\x0FuV[\x15a\x14\x97W` \x84\x01Q`\xE0\x82\x01R`@\x84\x01Qa\x01\0\x82\x01R``\x84\x01Qa\x01 \x82\x01R\x83Qa\x01@\x82\x01Ra\x14\xBBV[`\x06T`\xE0\x82\x01R`\x07Ta\x01\0\x82\x01R`\x08Ta\x01 \x82\x01R`\x05Ta\x01@\x82\x01R[`@Qc\xFC\x86`\xC7`\xE0\x1B\x81Rs_\xBD\xB21Vx\xAF\xEC\xB3g\xF02\xD9?d/d\x18\n\xA3\x90c\xFC\x86`\xC7\x90a\x14\xF6\x90\x85\x90\x85\x90\x88\x90`\x04\x01a.\xB9V[` `@Q\x80\x83\x03\x81\x86Z\xF4\x15\x80\x15a\x15\x11W=_\x80>=_\xFD[PPPP`@Q=`\x1F\x19`\x1F\x82\x01\x16\x82\x01\x80`@RP\x81\x01\x90a\x155\x91\x90a0\xE7V[a\x15RW`@Qc\t\xBD\xE39`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[PPPPPV[`\x0ET\x15\x80\x15\x90a\x15\xCEWP`\rT`\x0E\x80T`\x01`\xA0\x1B\x83\x04c\xFF\xFF\xFF\xFF\x16\x92`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x15\x99Wa\x15\x99a,$V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01Ta\x15\xC3\x90`\x01`@\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x84a1\x06V[`\x01`\x01`@\x1B\x03\x16\x11[\x15a\x16aW`\rT`\x0E\x80T\x90\x91`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x15\xFBWa\x15\xFBa,$V[_\x91\x82R` \x82 `\x02\x90\x91\x02\x01\x80T`\x01`\x01`\xC0\x1B\x03\x19\x16\x81U`\x01\x01U`\r\x80T`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90`\x18a\x16;\x83a1&V[\x91\x90a\x01\0\n\x81T\x81`\x01`\x01`@\x1B\x03\x02\x19\x16\x90\x83`\x01`\x01`@\x1B\x03\x16\x02\x17\x90UPP[`@\x80Q`\x80\x81\x01\x82R`\x01`\x01`@\x1B\x03\x94\x85\x16\x81R\x92\x84\x16` \x80\x85\x01\x91\x82R\x83\x01Q\x85\x16\x84\x83\x01\x90\x81R\x92\x90\x91\x01Q``\x84\x01\x90\x81R`\x0E\x80T`\x01\x81\x01\x82U_\x91\x90\x91R\x93Q`\x02\x90\x94\x02\x7F\xBB{JEM\xC3I9#H/\x07\x82#)\xED\x19\xE8$N\xFFX,\xC2\x04\xF8UL6 \xC3\xFD\x81\x01\x80T\x93Q\x94Q\x87\x16`\x01`\x80\x1B\x02g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF`\x80\x1B\x19\x95\x88\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x90\x95\x16\x96\x90\x97\x16\x95\x90\x95\x17\x92\x90\x92\x17\x92\x90\x92\x16\x93\x90\x93\x17\x90\x91UQ\x7F\xBB{JEM\xC3I9#H/\x07\x82#)\xED\x19\xE8$N\xFFX,\xC2\x04\xF8UL6 \xC3\xFE\x90\x91\x01UV[a\x17Ja \xB1V[a\x10)\x81a \xFAV[a\t8a \xB1V[\x83Q`\x01`\x01`@\x1B\x03\x16\x15\x15\x80a\x17\x7FWP` \x84\x01Q`\x01`\x01`@\x1B\x03\x16\x15\x15[\x80a\x17\x8CWP` \x83\x01Q\x15[\x80a\x17\x99WP`@\x83\x01Q\x15[\x80a\x17\xA6WP``\x83\x01Q\x15[\x80a\x17\xB0WP\x82Q\x15[\x80a\x17\xC2WPa\x0E\x10\x82c\xFF\xFF\xFF\xFF\x16\x10[\x80a\x17\xD6WPc\x01\xE13\x80\x82c\xFF\xFF\xFF\xFF\x16\x11[\x80a\x17\xE8WP`\x01`\x01`@\x1B\x03\x81\x16\x15[\x15a\x18\x06W`@QcP\xDD\x03\xF7`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x83Q`\t\x80T` \x80\x88\x01Q`\x01`\x01`@\x1B\x03\x90\x81\x16`\x01`@\x1B\x02`\x01`\x01`\x80\x1B\x03\x19\x93\x84\x16\x95\x82\x16\x95\x86\x17\x81\x17\x90\x94U`@\x98\x89\x01Q`\n\x81\x90U`\x0B\x80T\x90\x94\x16\x90\x95\x17\x90\x93\x17\x90\x91U`\x0C\x92\x90\x92U\x84Q`\x01\x81\x90U\x91\x85\x01Q`\x02\x81\x90U\x95\x85\x01Q`\x03\x81\x90U``\x90\x95\x01Q`\x04\x81\x90U`\x05\x92\x90\x92U`\x06\x95\x90\x95U`\x07\x93\x90\x93U`\x08\x92\x90\x92U`\r\x80Tc\xFF\xFF\xFF\xFF\x90\x92\x16`\x01`\xA0\x1B\x02c\xFF\xFF\xFF\xFF`\xA0\x1B\x19\x90\x92\x16\x91\x90\x91\x17\x90U_\x80T\x91\x90\x92\x16g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x19\x91\x90\x91\x16\x17\x90UV[`\x0ET_\x90C\x84\x11\x80a\x18\xE6WP\x80\x15[\x80a\x190WP`\rT`\x0E\x80T\x90\x91`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x90\x81\x10a\x19\x14Wa\x19\x14a,$V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x84\x10[\x15a\x19NW`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_\x80\x80a\x19\\`\x01\x85a,\x11V[\x90P[\x81a\x19\xF8W`\rT`\x01`\xC0\x1B\x90\x04`\x01`\x01`@\x1B\x03\x16\x81\x10a\x19\xF8W\x86`\x0E\x82\x81T\x81\x10a\x19\x91Wa\x19\x91a,$V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x11a\x19\xE6W`\x01\x91P`\x0E\x81\x81T\x81\x10a\x19\xC6Wa\x19\xC6a,$V[_\x91\x82R` \x90\x91 `\x02\x90\x91\x02\x01T`\x01`\x01`@\x1B\x03\x16\x92Pa\x19\xF8V[\x80a\x19\xF0\x81a1KV[\x91PPa\x19_V[\x81a\x1A\x16W`@Qc\xB0\xB48w`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[\x85a\x1A!\x84\x89a,\x11V[\x11\x97\x96PPPPPPPV[a\x1A6\x82a!\x02V[`@Q`\x01`\x01`\xA0\x1B\x03\x83\x16\x90\x7F\xBC|\xD7Z \xEE'\xFD\x9A\xDE\xBA\xB3 A\xF7U!M\xBCk\xFF\xA9\x0C\xC0\"[9\xDA.\\-;\x90_\x90\xA2\x80Q\x15a\x1AzWa\x12\xD3\x82\x82a!eV[a\x08\xADa!\xD7V[a\x1A\x8Aa\"\xB3V[b\x01\0\0\x81R`\x0B` \x82\x01R\x7F/\xAFZ\x11>\xFD\x87\xD7X\x18\xE6?\xF9\xA6\x17\0\x07\xF2,\x89\xBB\xC4\xA8\xBD\x0F+H&\x87W\xB0\x14`@\x82\x01QR\x7F\x18Z\xEE\x05\xF8\xD3\xBA\xBF\xCEg\x93\x1F\x15\xDB9\xE6\x1F%\xF7\x94\xA4\x13M{\xEEn\x18\xC5\xAD\x1E\xC0W` `@\x83\x01Q\x01R\x7F\r\xCC\xF5\xDC\xF6g\xA3|\xA9;\x8Dr\x10\x91\xD8\xF3\xA8\x04\x9B=\x1E\x89\xA5mf\xE4'Q\xBB\xAF{^``\x82\x01QR\x7F,\xF1\tI\xFC[\xFC\xEC\xB3\xBCT\xDDA!\xE5X\x07C\x0F\x17\xF3\x04\x98\xA7\xEAj\x02`p\xB1\x91b` ``\x83\x01Q\x01R\x7F\x08\xD7\x0EN\x01\x84\xFES\xBDVo\r~\xDCL\xD7\xB0\xE39I\ts\xD0\xFA\xEC}\xAC \x89\xF58\xE5`\x80\x82\x01QR~\xF6e\xFE\x1F\xD1\x10\xD3}\x1D\xEADn\x84\0\xF0o\x06\xB9\xB5\x8A\xB3\xDF\x90\xFB\xAE|G\xEEX`A` `\x80\x83\x01Q\x01R\x7F\x08~\x14\xD7\x19$\xAC\x0F(\x80\xAD\xF0\xF1\x06\x92^Zo\xDDW\xD0 \xBB<\x8A\xA7\x0F\xA9\xFC\0\xCC\xF3`\xA0\x82\x01QR\x7F\x01\xDB~1x\xB3B\xF9\x1DT\xFC\x97,\xEErV\x9FB\x9A99\x88\xEEC\xC2\x89\xE2\xED\x96\x07qR` `\xA0\x83\x01Q\x01R\x7F\x19m\xD4-vr\x01\xF7\xF1\x96\xC4*\xAE\xF4\x85e`F1\x0FP\x83U\x95\x92\xBD\x13\x13\xE1iH\xB7`\xC0\x82\x01QR\x7F\x17\x88\x96\x80\x81\n\xAA\xBD\x1F\xF3\xACJlT\x92\x10\x05y\xE0Y\x17\x0C\xD2\xB7~+=\xA6\xD3|\xC2F` `\xC0\x83\x01Q\x01R\x7F$\x93^zw\xAC1?\xD3\xD6\x0F\xF3\xF1\xA0\xA7\x9E\xC3,}\xC5\x19\xB3\x9D\xA0\xAC\xB2\xC4\x9F6wq\xCC`\xE0\x82\x01QR\x7F\x16\x8E)B^\xF18\xCBiC\xC7SR\xF3<\x19\x0E_\x14\x88\xEBT\xA9\xE1\x1D\xEBtM\xA7\xFBk.` `\xE0\x83\x01Q\x01R\x7F\x1BX\xD5X\xB5RdS\xBD\x10(\xCA\x93\x8C\x94\x0B\xB8\x9Er?|5x|\x02\xF9\xF1y\xAE\x9A\x0C\xEAa\x01\0\x82\x01QR\x7F!\xAF\xC1!\xD9\x1D\x9D\x1C\x17\xDA\xFB\x926\xBC\x9B\x87,[C\xDF\x06L\x0B\x12\x86\x01/\xB4:v#$` a\x01\0\x83\x01Q\x01R\x7F\x10G\xFCUyM\x1EY}\xE1U\x07v\x11\xE3\xC7\x89\xA0\xA2\xBE\x02\x188!\xBB\xA5l\xF6\x1C\xC1\xB8\xEDa\x01 \x82\x01QR\x7F\x17BR2G'\xC0\xD2\xEE^P\xEBW\xA5#\x1FgGL\xEE\xD6\x93*\xD4\xFF\xE9\xBC\xF8f\xAA4(` a\x01 \x83\x01Q\x01R\x7F(\xDB(\x9AL\xFBs\xBA\x92\x96\x15r\xF3\x18R\x98\xAE6n\xD1\xA4Iq`{\xCB\xF8\x01\xF1 \xF5aa\x01@\x82\x01QR\x7F\x04\\\xFEz\xE2\xCD\x17U\x08\x17.}\x9C.\x89\x9B\xB1\xD2\x16\xDF\xC3\x1F\xE8\x9F\xC6\xC9\x17\xCA\xAE\xE8w\xA2` a\x01@\x83\x01Q\x01R\x7F\x19_.\xEC\x85Gr\x7F\xC4n\xD0\x1By\xE8\xF6f\xDE\xD6J\xE5OW\x078t\xA5\xA2G\x03\x80\xA7\x85a\x01`\x82\x01QR\x7F\x15'2.\x85\xDA\x1A\xEF\xBD\x83\x9Ee\xD1\x1D\xC6\x95\xAA\xC1k\r\xB6\xC6%\x91\xD9\x812B\xD4\x1C\xBE1` a\x01`\x83\x01Q\x01R\x7F\x10\xC8\xD7\xD75_~\x0F\x8C\0/H,\xC3\xB9\x8C\x90\xBA\xA9Ba\xC5\x9A\x17\xB4$\xEE\xCF\xE4\xE9c\xB2a\x01\x80\x82\x01QR\x7F\"r\xE3\x01xdqg\xBB\xEA\xD3\xA2\xD77\x19\x88\xF2\xE1\x98\xE6X\x15\x02\x9D\xEDLd\xBF\xC0\x85\x0F\x1F` a\x01\x80\x83\x01Q\x01R\x7F\x15\xD5n\xA7\xAB/\xA6\x12e\xF5Q\xC2\xAE%8\x9C\x8F\xE7\xBC\xB3\xBFf\x08\x08,6\xA2\x01\xF2%\xF7}a\x01\xA0\x82\x01QR\x7F\x0BXTh\x87 .rs\xD3\xD0\xC5]e\xDDa2\xCA\xC9\x8E\xBF\x04\xEF\xB1\xB5$E\xC5\x13\xC4\xA4\xDF` a\x01\xA0\x83\x01Q\x01R\x7F\x05\roCwN\x8D\xFF\xAA\x86\x8F*}\xC8/Vli\xD1u\xD8\x18\xD4Q|\xC7\n\xC5\xFC\xB2\xF1\xB1a\x01\xC0\x82\x01QR\x7F/\xFF\x87\xBF`^\x99\x83s\xBBdU?:b]\xAB\xCD\x12\x88\x86\x92\xD6x\xA8\xF4M\x13d@\xC8c` a\x01\xC0\x83\x01Q\x01R\x7F\x12\xD0\x85`\x8C`,\xFB[\x8C\x03\xEC{\xD1:\xC0\xFF\x9Ed\xA9\xAC\x1E\x9A\xA7FYJ\x03>FK\xF2a\x01\xE0\x82\x01QR\x7F\x18\xACZ56\x04.\xEB\x0B\x0C|/C\xF5\xE2\xCA;!s\xDA\xA4\xC2\x81/\xFC\xA6G\x87\xE8\xE9V\xB2` a\x01\xE0\x83\x01Q\x01R\x7F\x0F\x0F\x98\x91\xFC+y\x0Et\xDC%<\x88T\xDFc\x92\xE0\x10\xF4\xDEg`\xB8B:=\xD6\x9B\xBE]\xCEa\x02\0\x82\x01QR\x7F\x16\xBE\xD1\xD2D\xA2\xFE:\xB9\xA6R\xC7\xFE\xECVP\x16\x1D\x8Au\"}\xEC\xE7)O<\x8F\xC5B\xFDl` a\x02\0\x83\x01Q\x01R\x7F\x0F\xA3m\0g/\xA6\xA1\xC4L\xD3\xC2Y!,\x1A\xDAH\xC6k\xF7\xBB\x08_$G\x1B\x15\xB1~nQa\x02 \x82\x01QR\x7F\x18 \x88\xE5kd\x95R2F\x08\x91\xD2\xB2yvS%\x81:\xEF\x1D\xAE\x85^_IlA\x8A\xFCA` a\x02 \x83\x01Q\x01R\x7F+\xAFZ\xE2\xDD\x83.\x14I\xFA\xCCa\x1Bk\x80\xFDf\xD5\x8C\x87\x1DX'\xC5\xC8\xE2tpd\xE2\x99da\x02@\x82\x01QR\x7F)\xF5C\xB5C\x13~\x88\x18\x04\xC9\x89\xCD;\x99\x93@\x10\0\"8\xE8\xAB>\xEC\x88.\t\xD3\x06h\x1F` a\x02@\x83\x01Q\x01R\x7F-\xB0\xDD\xC7\x12;B\xF5 \xE2WFj\r\x92\xDA\x8BVO\xE0\x1E\xC6e\tl\x14\x11\x96C\x01)\x84a\x02`\x82\x01QR\x7F\x1Bz\xB2zf\x96b\x84\xD7\xFB)\xBC\xE9\xD5P\xEA\xFB\xA1lI\xFB\xC6&x'\xCD\xFC\x8D\x0B\x16\xF9O` a\x02`\x83\x01Q\x01R\x7F\xB0\x83\x88\x93\xEC\x1F#~\x8B\x072;\x07DY\x9FN\x97\xB5\x98\xB3\xB5\x89\xBC\xC2\xBC7\xB8\xD5\xC4\x18\x01a\x02\x80\x82\x01R\x7F\xC1\x83\x93\xC0\xFA0\xFEN\x8B\x03\x8E5z\xD8Q\xEA\xE8\xDE\x91\x07XN\xFF\xE7\xC7\xF1\xF6Q\xB2\x01\x0E&a\x02\xA0\x82\x01R\x90V[\x7F\xF0\xC5~\x16\x84\r\xF0@\xF1P\x88\xDC/\x81\xFE9\x1C9#\xBE\xC7>#\xA9f.\xFC\x9C\"\x9Cj\0T`\x01`@\x1B\x90\x04`\xFF\x16a\t8W`@Qc\x1A\xFC\xD7\x9F`\xE3\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0F\xF2a \xB1V[\x80`\x01`\x01`\xA0\x1B\x03\x16;_\x03a!7W`@QcL\x9C\x8C\xE3`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x82\x16`\x04\x82\x01R`$\x01a\x10\x17V[_\x80Q` a1|\x839\x81Q\x91R\x80T`\x01`\x01`\xA0\x1B\x03\x19\x16`\x01`\x01`\xA0\x1B\x03\x92\x90\x92\x16\x91\x90\x91\x17\x90UV[``_\x80\x84`\x01`\x01`\xA0\x1B\x03\x16\x84`@Qa!\x81\x91\x90a1`V[_`@Q\x80\x83\x03\x81\x85Z\xF4\x91PP=\x80_\x81\x14a!\xB9W`@Q\x91P`\x1F\x19`?=\x01\x16\x82\x01`@R=\x82R=_` \x84\x01>a!\xBEV[``\x91P[P\x91P\x91Pa!\xCE\x85\x83\x83a!\xF6V[\x95\x94PPPPPV[4\x15a\t8W`@Qc\xB3\x98\x97\x9F`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[``\x82a\"\x06Wa\x0F\xCD\x82a\"MV[\x81Q\x15\x80\x15a\"\x1DWP`\x01`\x01`\xA0\x1B\x03\x84\x16;\x15[\x15a\"FW`@Qc\x99\x96\xB3\x15`\xE0\x1B\x81R`\x01`\x01`\xA0\x1B\x03\x85\x16`\x04\x82\x01R`$\x01a\x10\x17V[P\x92\x91PPV[\x80Q\x15a\"]W\x80Q\x80\x82` \x01\xFD[`@Qc\n\x12\xF5!`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[P\x80T_\x82U`\x02\x02\x90_R` _ \x90\x81\x01\x90a\x10)\x91\x90a%\x19V[`@Q\x80a\x01`\x01`@R\x80`\x0B\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[`@Q\x80a\x02\xC0\x01`@R\x80_\x81R` \x01_\x81R` \x01a\"\xE6`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a#\x06`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a#&`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a#F`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a#f`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a#\x86`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a#\xA6`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a#\xC6`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a#\xE6`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a$\x06`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a$&`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a$F`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a$f`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a$\x86`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a$\xA6`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a$\xC6`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a$\xE6`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R` \x01a%\x06`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[\x81R_` \x82\x01\x81\x90R`@\x90\x91\x01R\x90V[[\x80\x82\x11\x15a%>W\x80T`\x01`\x01`\xC0\x1B\x03\x19\x16\x81U_`\x01\x82\x01U`\x02\x01a%\x1AV[P\x90V[\x805`\x01`\x01`\xA0\x1B\x03\x81\x16\x81\x14a\x0F\xB2W_\x80\xFD[_` \x82\x84\x03\x12\x15a%hW_\x80\xFD[a\x0F\xE3\x82a%BV[_` \x82\x84\x03\x12\x15a%\x81W_\x80\xFD[P5\x91\x90PV[\x805`\x01`\x01`@\x1B\x03\x81\x16\x81\x14a\x0F\xB2W_\x80\xFD[_` \x82\x84\x03\x12\x15a%\xAEW_\x80\xFD[a\x0F\xE3\x82a%\x88V[cNH{q`\xE0\x1B_R`A`\x04R`$_\xFD[`@Q`\x80\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a%\xEDWa%\xEDa%\xB7V[`@R\x90V[`@Qa\x02\xE0\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a%\xEDWa%\xEDa%\xB7V[`@Q`\x1F\x82\x01`\x1F\x19\x16\x81\x01`\x01`\x01`@\x1B\x03\x81\x11\x82\x82\x10\x17\x15a&>Wa&>a%\xB7V[`@R\x91\x90PV[_\x80`@\x83\x85\x03\x12\x15a&WW_\x80\xFD[a&`\x83a%BV[\x91P` \x80\x84\x015`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a&|W_\x80\xFD[\x81\x86\x01\x91P\x86`\x1F\x83\x01\x12a&\x8FW_\x80\xFD[\x815\x81\x81\x11\x15a&\xA1Wa&\xA1a%\xB7V[a&\xB3`\x1F\x82\x01`\x1F\x19\x16\x85\x01a&\x16V[\x91P\x80\x82R\x87\x84\x82\x85\x01\x01\x11\x15a&\xC8W_\x80\xFD[\x80\x84\x84\x01\x85\x84\x017_\x84\x82\x84\x01\x01RP\x80\x93PPPP\x92P\x92\x90PV[_``\x82\x84\x03\x12\x15a&\xF5W_\x80\xFD[`@Q``\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a'\x17Wa'\x17a%\xB7V[`@R\x90P\x80a'&\x83a%\x88V[\x81Ra'4` \x84\x01a%\x88V[` \x82\x01R`@\x83\x015`@\x82\x01RP\x92\x91PPV[_`\x80\x82\x84\x03\x12\x15a'ZW_\x80\xFD[a'ba%\xCBV[\x90P\x815\x81R` \x82\x015` \x82\x01R`@\x82\x015`@\x82\x01R``\x82\x015``\x82\x01R\x92\x91PPV[_`@\x82\x84\x03\x12\x15a'\x9CW_\x80\xFD[`@Q`@\x81\x01\x81\x81\x10`\x01`\x01`@\x1B\x03\x82\x11\x17\x15a'\xBEWa'\xBEa%\xB7V[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[_\x80_\x83\x85\x03a\x05`\x81\x12\x15a'\xECW_\x80\xFD[a'\xF6\x86\x86a&\xE5V[\x93Pa(\x05\x86``\x87\x01a'JV[\x92Pa\x04\x80\x80`\xDF\x19\x83\x01\x12\x15a(\x1AW_\x80\xFD[a(\"a%\xF3V[\x91Pa(1\x87`\xE0\x88\x01a'\x8CV[\x82Ra\x01 a(B\x88\x82\x89\x01a'\x8CV[` \x84\x01Ra\x01`a(V\x89\x82\x8A\x01a'\x8CV[`@\x85\x01Ra\x01\xA0a(j\x8A\x82\x8B\x01a'\x8CV[``\x86\x01Ra\x01\xE0a(~\x8B\x82\x8C\x01a'\x8CV[`\x80\x87\x01Ra\x02 a(\x92\x8C\x82\x8D\x01a'\x8CV[`\xA0\x88\x01Ra\x02`a(\xA6\x8D\x82\x8E\x01a'\x8CV[`\xC0\x89\x01Ra\x02\xA0a(\xBA\x8E\x82\x8F\x01a'\x8CV[`\xE0\x8A\x01Ra(\xCD\x8Ea\x02\xE0\x8F\x01a'\x8CV[a\x01\0\x8A\x01Ra(\xE1\x8Ea\x03 \x8F\x01a'\x8CV[\x87\x8A\x01Ra(\xF3\x8Ea\x03`\x8F\x01a'\x8CV[a\x01@\x8A\x01Ra)\x07\x8Ea\x03\xA0\x8F\x01a'\x8CV[\x86\x8A\x01Ra)\x19\x8Ea\x03\xE0\x8F\x01a'\x8CV[a\x01\x80\x8A\x01Ra\x04 \x8D\x015\x85\x8A\x01Ra\x04@\x8D\x015a\x01\xC0\x8A\x01Ra\x04`\x8D\x015\x84\x8A\x01R\x87\x8D\x015a\x02\0\x8A\x01Ra\x04\xA0\x8D\x015\x83\x8A\x01Ra\x04\xC0\x8D\x015a\x02@\x8A\x01Ra\x04\xE0\x8D\x015\x82\x8A\x01Ra\x05\0\x8D\x015a\x02\x80\x8A\x01Ra\x05 \x8D\x015\x81\x8A\x01RPPPPPPPPa\x05@\x85\x015a\x02\xC0\x82\x01R\x80\x91PP\x92P\x92P\x92V[\x805c\xFF\xFF\xFF\xFF\x81\x16\x81\x14a\x0F\xB2W_\x80\xFD[_\x80_\x80_a\x01@\x86\x88\x03\x12\x15a)\xC6W_\x80\xFD[a)\xD0\x87\x87a&\xE5V[\x94Pa)\xDF\x87``\x88\x01a'JV[\x93Pa)\xED`\xE0\x87\x01a)\x9EV[\x92Pa)\xFCa\x01\0\x87\x01a%BV[\x91Pa*\x0Ba\x01 \x87\x01a%\x88V[\x90P\x92\x95P\x92\x95\x90\x93PV[_\x80`@\x83\x85\x03\x12\x15a*(W_\x80\xFD[a*1\x83a%\x88V[\x91Pa*?` \x84\x01a%\x88V[\x90P\x92P\x92\x90PV[_` \x82\x84\x03\x12\x15a*XW_\x80\xFD[a\x0F\xE3\x82a)\x9EV[_[\x83\x81\x10\x15a*{W\x81\x81\x01Q\x83\x82\x01R` \x01a*cV[PP_\x91\x01RV[` \x81R_\x82Q\x80` \x84\x01Ra*\xA1\x81`@\x85\x01` \x87\x01a*aV[`\x1F\x01`\x1F\x19\x16\x91\x90\x91\x01`@\x01\x92\x91PPV[_``\x82\x84\x03\x12\x15a*\xC5W_\x80\xFD[a\x0F\xE3\x83\x83a&\xE5V[_\x80`@\x83\x85\x03\x12\x15a*\xE0W_\x80\xFD[PP\x805\x92` \x90\x91\x015\x91PV[_` \x80\x83\x85\x03\x12\x15a+\0W_\x80\xFD[\x825`\x01`\x01`@\x1B\x03\x80\x82\x11\x15a+\x16W_\x80\xFD[\x81\x85\x01\x91P\x85`\x1F\x83\x01\x12a+)W_\x80\xFD[\x815\x81\x81\x11\x15a+;Wa+;a%\xB7V[a+I\x84\x82`\x05\x1B\x01a&\x16V[\x81\x81R\x84\x81\x01\x92P`\x07\x91\x90\x91\x1B\x83\x01\x84\x01\x90\x87\x82\x11\x15a+hW_\x80\xFD[\x92\x84\x01\x92[\x81\x84\x10\x15a+\xD2W`\x80\x84\x89\x03\x12\x15a+\x84W_\x80\xFD[a+\x8Ca%\xCBV[a+\x95\x85a%\x88V[\x81Ra+\xA2\x86\x86\x01a%\x88V[\x86\x82\x01R`@a+\xB3\x81\x87\x01a%\x88V[\x90\x82\x01R``\x85\x81\x015\x90\x82\x01R\x83R`\x80\x90\x93\x01\x92\x91\x84\x01\x91a+mV[\x97\x96PPPPPPPV[cNH{q`\xE0\x1B_R`\x11`\x04R`$_\xFD[`\x01`\x01`@\x1B\x03\x81\x81\x16\x83\x82\x16\x01\x90\x80\x82\x11\x15a\"FWa\"Fa+\xDDV[\x81\x81\x03\x81\x81\x11\x15a\x0E\xE6Wa\x0E\xE6a+\xDDV[cNH{q`\xE0\x1B_R`2`\x04R`$_\xFD[cNH{q`\xE0\x1B_R`\x12`\x04R`$_\xFD[_`\x01`\x01`@\x1B\x03\x80\x84\x16\x80a,eWa,ea,8V[\x92\x16\x91\x90\x91\x06\x92\x91PPV[_`\x01`\x01`@\x1B\x03\x80\x84\x16\x80a,\x8AWa,\x8Aa,8V[\x92\x16\x91\x90\x91\x04\x92\x91PPV[_` \x82\x84\x03\x12\x15a,\xA6W_\x80\xFD[PQ\x91\x90PV[\x80_[`\x0B\x81\x10\x15a,\xCFW\x81Q\x84R` \x93\x84\x01\x93\x90\x91\x01\x90`\x01\x01a,\xB0V[PPPPV[a,\xEA\x82\x82Q\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[` \x81\x81\x01Q\x80Q`@\x85\x01R\x90\x81\x01Q``\x84\x01RP`@\x81\x01Q\x80Q`\x80\x84\x01R` \x81\x01Q`\xA0\x84\x01RP``\x81\x01Q\x80Q`\xC0\x84\x01R` \x81\x01Q`\xE0\x84\x01RP`\x80\x81\x01Qa\x01\0a-M\x81\x85\x01\x83\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xA0\x83\x01Q\x91Pa\x01@a-m\x81\x86\x01\x84\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xC0\x84\x01Q\x92Pa\x01\x80a-\x8D\x81\x87\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xE0\x85\x01Q\x93Pa\x01\xC0a-\xAD\x81\x88\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x85\x01Q\x93Pa\x02\0\x92a-\xCD\x87\x85\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01 \x86\x01Q\x94Pa\x02@a-\xEE\x81\x89\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x86\x01Q\x94Pa\x02\x80\x92a.\x0E\x88\x85\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01`\x87\x01Q\x95Pa\x02\xC0a./\x81\x8A\x01\x88\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x92\x87\x01Q\x80Qa\x03\0\x8A\x01R` \x01Qa\x03 \x89\x01Ra\x01\xA0\x87\x01Qa\x03@\x89\x01R\x90\x86\x01Qa\x03`\x88\x01Ra\x01\xE0\x86\x01Qa\x03\x80\x88\x01R\x92\x85\x01Qa\x03\xA0\x87\x01Ra\x02 \x85\x01Qa\x03\xC0\x87\x01R\x91\x84\x01Qa\x03\xE0\x86\x01Ra\x02`\x84\x01Qa\x04\0\x86\x01R\x83\x01Qa\x04 \x85\x01Ra\x02\xA0\x83\x01Qa\x04@\x85\x01R\x90\x91\x01Qa\x04`\x90\x92\x01\x91\x90\x91RPV[_a\n\xE0\x82\x01\x90P\x84Q\x82R` \x85\x01Q` \x83\x01R`@\x85\x01Qa.\xEB`@\x84\x01\x82\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[P``\x85\x01Q\x80Q`\x80\x84\x01R` \x81\x01Q`\xA0\x84\x01RP`\x80\x85\x01Q\x80Q`\xC0\x84\x01R` \x81\x01Q`\xE0\x84\x01RP`\xA0\x85\x01Qa\x01\0a/8\x81\x85\x01\x83\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xC0\x87\x01Q\x91Pa\x01@a/X\x81\x86\x01\x84\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[`\xE0\x88\x01Q\x92Pa\x01\x80a/x\x81\x87\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x88\x01Q\x92Pa\x01\xC0\x91a/\x98\x86\x84\x01\x85\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01 \x89\x01Q\x93Pa\x02\0a/\xB9\x81\x88\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x89\x01Q\x93Pa\x02@\x91a/\xD9\x87\x84\x01\x86\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[a\x01`\x8A\x01Q\x94Pa\x02\x80a/\xFA\x81\x89\x01\x87\x80Q\x82R` \x90\x81\x01Q\x91\x01RV[\x91\x8A\x01Q\x80Qa\x02\xC0\x89\x01R` \x90\x81\x01Qa\x02\xE0\x89\x01Ra\x01\xA0\x8B\x01Q\x80Qa\x03\0\x8A\x01R\x81\x01Qa\x03 \x89\x01R\x93\x8A\x01Q\x80Qa\x03@\x89\x01R\x84\x01Qa\x03`\x88\x01Ra\x01\xE0\x8A\x01Q\x80Qa\x03\x80\x89\x01R\x84\x01Qa\x03\xA0\x88\x01R\x89\x01Q\x80Qa\x03\xC0\x88\x01R\x83\x01Qa\x03\xE0\x87\x01Ra\x02 \x89\x01Q\x80Qa\x04\0\x88\x01R\x83\x01Qa\x04 \x87\x01R\x90\x88\x01Q\x80Qa\x04@\x87\x01R\x82\x01Qa\x04`\x86\x01Ra\x02`\x88\x01Q\x80Qa\x04\x80\x87\x01R\x90\x91\x01Qa\x04\xA0\x85\x01R\x86\x01Qa\x04\xC0\x84\x01RPa\x02\xA0\x85\x01Qa\x04\xE0\x83\x01Ra0\xD1a\x05\0\x83\x01\x85a,\xADV[a0\xDFa\x06`\x83\x01\x84a,\xD5V[\x94\x93PPPPV[_` \x82\x84\x03\x12\x15a0\xF7W_\x80\xFD[\x81Q\x80\x15\x15\x81\x14a\x0F\xE3W_\x80\xFD[`\x01`\x01`@\x1B\x03\x82\x81\x16\x82\x82\x16\x03\x90\x80\x82\x11\x15a\"FWa\"Fa+\xDDV[_`\x01`\x01`@\x1B\x03\x80\x83\x16\x81\x81\x03a1AWa1Aa+\xDDV[`\x01\x01\x93\x92PPPV[_\x81a1YWa1Ya+\xDDV[P_\x19\x01\x90V[_\x82Qa1q\x81\x84` \x87\x01a*aV[\x91\x90\x91\x01\x92\x91PPV\xFE6\x08\x94\xA1;\xA1\xA3!\x06g\xC8(I-\xB9\x8D\xCA> v\xCC75\xA9 \xA3\xCAP]8+\xBC\xA1dsolcC\0\x08\x17\0\n", ); /**Custom error with signature `AddressEmptyCode(address)` and selector `0x9996b315`. ```solidity @@ -4036,6 +4209,66 @@ pub mod LightClientMock { } } }; + /**Custom error with signature `MissingLastBlockInEpochUpdate()` and selector `0x7150de45`. + ```solidity + error MissingLastBlockInEpochUpdate(); + ```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct MissingLastBlockInEpochUpdate {} + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: MissingLastBlockInEpochUpdate) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for MissingLastBlockInEpochUpdate { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + #[automatically_derived] + impl alloy_sol_types::SolError for MissingLastBlockInEpochUpdate { + type Parameters<'a> = UnderlyingSolTuple<'a>; + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "MissingLastBlockInEpochUpdate()"; + const SELECTOR: [u8; 4] = [113u8, 80u8, 222u8, 69u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + } + }; /**Custom error with signature `NoChangeRequired()` and selector `0xa863aec9`. ```solidity error NoChangeRequired(); @@ -4692,9 +4925,9 @@ pub mod LightClientMock { } } }; - /**Event with signature `NewState(uint64,uint64,uint256)` and selector `0xa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6`. + /**Event with signature `NewEpoch(uint64)` and selector `0x31eabd9099fdb25dacddd206abff87311e553441fc9d0fcdef201062d7e7071b`. ```solidity - event NewState(uint64 indexed viewNum, uint64 indexed blockHeight, BN254.ScalarField blockCommRoot); + event NewEpoch(uint64 epoch); ```*/ #[allow( non_camel_case_types, @@ -4703,13 +4936,9 @@ pub mod LightClientMock { clippy::style )] #[derive(Clone)] - pub struct NewState { - #[allow(missing_docs)] - pub viewNum: u64, - #[allow(missing_docs)] - pub blockHeight: u64, + pub struct NewEpoch { #[allow(missing_docs)] - pub blockCommRoot: ::RustType, + pub epoch: u64, } #[allow( non_camel_case_types, @@ -4720,20 +4949,16 @@ pub mod LightClientMock { const _: () = { use alloy::sol_types as alloy_sol_types; #[automatically_derived] - impl alloy_sol_types::SolEvent for NewState { - type DataTuple<'a> = (BN254::ScalarField,); + impl alloy_sol_types::SolEvent for NewEpoch { + type DataTuple<'a> = (alloy::sol_types::sol_data::Uint<64>,); type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - type TopicList = ( - alloy_sol_types::sol_data::FixedBytes<32>, - alloy::sol_types::sol_data::Uint<64>, - alloy::sol_types::sol_data::Uint<64>, - ); - const SIGNATURE: &'static str = "NewState(uint64,uint64,uint256)"; + type TopicList = (alloy_sol_types::sol_data::FixedBytes<32>,); + const SIGNATURE: &'static str = "NewEpoch(uint64)"; const SIGNATURE_HASH: alloy_sol_types::private::B256 = alloy_sol_types::private::B256::new([ - 160u8, 74u8, 119u8, 57u8, 36u8, 80u8, 90u8, 65u8, 133u8, 100u8, 54u8, 55u8, - 37u8, 245u8, 104u8, 50u8, 245u8, 119u8, 46u8, 107u8, 141u8, 13u8, 189u8, 110u8, - 252u8, 231u8, 36u8, 223u8, 232u8, 3u8, 218u8, 230u8, + 49u8, 234u8, 189u8, 144u8, 153u8, 253u8, 178u8, 93u8, 172u8, 221u8, 210u8, 6u8, + 171u8, 255u8, 135u8, 49u8, 30u8, 85u8, 52u8, 65u8, 252u8, 157u8, 15u8, 205u8, + 239u8, 32u8, 16u8, 98u8, 215u8, 231u8, 7u8, 27u8, ]); const ANONYMOUS: bool = false; #[allow(unused_variables)] @@ -4742,11 +4967,7 @@ pub mod LightClientMock { topics: ::RustType, data: as alloy_sol_types::SolType>::RustType, ) -> Self { - Self { - viewNum: topics.1, - blockHeight: topics.2, - blockCommRoot: data.0, - } + Self { epoch: data.0 } } #[inline] fn check_signature( @@ -4763,17 +4984,15 @@ pub mod LightClientMock { } #[inline] fn tokenize_body(&self) -> Self::DataToken<'_> { - (::tokenize( - &self.blockCommRoot, - ),) + ( + as alloy_sol_types::SolType>::tokenize( + &self.epoch, + ), + ) } #[inline] fn topics(&self) -> ::RustType { - ( - Self::SIGNATURE_HASH.into(), - self.viewNum.clone(), - self.blockHeight.clone(), - ) + (Self::SIGNATURE_HASH.into(),) } #[inline] fn encode_topics_raw( @@ -4784,17 +5003,11 @@ pub mod LightClientMock { return Err(alloy_sol_types::Error::Overrun); } out[0usize] = alloy_sol_types::abi::token::WordToken(Self::SIGNATURE_HASH); - out[1usize] = as alloy_sol_types::EventTopic>::encode_topic(&self.viewNum); - out[2usize] = as alloy_sol_types::EventTopic>::encode_topic(&self.blockHeight); Ok(()) } } #[automatically_derived] - impl alloy_sol_types::private::IntoLogData for NewState { + impl alloy_sol_types::private::IntoLogData for NewEpoch { fn to_log_data(&self) -> alloy_sol_types::private::LogData { From::from(self) } @@ -4803,16 +5016,16 @@ pub mod LightClientMock { } } #[automatically_derived] - impl From<&NewState> for alloy_sol_types::private::LogData { + impl From<&NewEpoch> for alloy_sol_types::private::LogData { #[inline] - fn from(this: &NewState) -> alloy_sol_types::private::LogData { + fn from(this: &NewEpoch) -> alloy_sol_types::private::LogData { alloy_sol_types::SolEvent::encode_log_data(this) } } }; - /**Event with signature `OwnershipTransferred(address,address)` and selector `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0`. + /**Event with signature `NewState(uint64,uint64,uint256)` and selector `0xa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae6`. ```solidity - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + event NewState(uint64 indexed viewNum, uint64 indexed blockHeight, BN254.ScalarField blockCommRoot); ```*/ #[allow( non_camel_case_types, @@ -4821,9 +5034,127 @@ pub mod LightClientMock { clippy::style )] #[derive(Clone)] - pub struct OwnershipTransferred { + pub struct NewState { #[allow(missing_docs)] - pub previousOwner: alloy::sol_types::private::Address, + pub viewNum: u64, + #[allow(missing_docs)] + pub blockHeight: u64, + #[allow(missing_docs)] + pub blockCommRoot: ::RustType, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + #[automatically_derived] + impl alloy_sol_types::SolEvent for NewState { + type DataTuple<'a> = (BN254::ScalarField,); + type DataToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + type TopicList = ( + alloy_sol_types::sol_data::FixedBytes<32>, + alloy::sol_types::sol_data::Uint<64>, + alloy::sol_types::sol_data::Uint<64>, + ); + const SIGNATURE: &'static str = "NewState(uint64,uint64,uint256)"; + const SIGNATURE_HASH: alloy_sol_types::private::B256 = + alloy_sol_types::private::B256::new([ + 160u8, 74u8, 119u8, 57u8, 36u8, 80u8, 90u8, 65u8, 133u8, 100u8, 54u8, 55u8, + 37u8, 245u8, 104u8, 50u8, 245u8, 119u8, 46u8, 107u8, 141u8, 13u8, 189u8, 110u8, + 252u8, 231u8, 36u8, 223u8, 232u8, 3u8, 218u8, 230u8, + ]); + const ANONYMOUS: bool = false; + #[allow(unused_variables)] + #[inline] + fn new( + topics: ::RustType, + data: as alloy_sol_types::SolType>::RustType, + ) -> Self { + Self { + viewNum: topics.1, + blockHeight: topics.2, + blockCommRoot: data.0, + } + } + #[inline] + fn check_signature( + topics: &::RustType, + ) -> alloy_sol_types::Result<()> { + if topics.0 != Self::SIGNATURE_HASH { + return Err(alloy_sol_types::Error::invalid_event_signature_hash( + Self::SIGNATURE, + topics.0, + Self::SIGNATURE_HASH, + )); + } + Ok(()) + } + #[inline] + fn tokenize_body(&self) -> Self::DataToken<'_> { + (::tokenize( + &self.blockCommRoot, + ),) + } + #[inline] + fn topics(&self) -> ::RustType { + ( + Self::SIGNATURE_HASH.into(), + self.viewNum.clone(), + self.blockHeight.clone(), + ) + } + #[inline] + fn encode_topics_raw( + &self, + out: &mut [alloy_sol_types::abi::token::WordToken], + ) -> alloy_sol_types::Result<()> { + if out.len() < ::COUNT { + return Err(alloy_sol_types::Error::Overrun); + } + out[0usize] = alloy_sol_types::abi::token::WordToken(Self::SIGNATURE_HASH); + out[1usize] = as alloy_sol_types::EventTopic>::encode_topic(&self.viewNum); + out[2usize] = as alloy_sol_types::EventTopic>::encode_topic(&self.blockHeight); + Ok(()) + } + } + #[automatically_derived] + impl alloy_sol_types::private::IntoLogData for NewState { + fn to_log_data(&self) -> alloy_sol_types::private::LogData { + From::from(self) + } + fn into_log_data(self) -> alloy_sol_types::private::LogData { + From::from(&self) + } + } + #[automatically_derived] + impl From<&NewState> for alloy_sol_types::private::LogData { + #[inline] + fn from(this: &NewState) -> alloy_sol_types::private::LogData { + alloy_sol_types::SolEvent::encode_log_data(this) + } + } + }; + /**Event with signature `OwnershipTransferred(address,address)` and selector `0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0`. + ```solidity + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + ```*/ + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + #[derive(Clone)] + pub struct OwnershipTransferred { + #[allow(missing_docs)] + pub previousOwner: alloy::sol_types::private::Address, #[allow(missing_docs)] pub newOwner: alloy::sol_types::private::Address, } @@ -5318,7 +5649,7 @@ pub mod LightClientMock { }; /**Constructor`. ```solidity - constructor(LightClient.LightClientState genesis, LightClient.StakeTableState genesisStakeTableState, uint32 maxHistorySeconds); + constructor(LightClient.LightClientState genesis, LightClient.StakeTableState genesisStakeTableState, uint32 maxHistorySeconds, uint64 blocksPerEpoch); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] @@ -5327,6 +5658,7 @@ pub mod LightClientMock { pub genesisStakeTableState: ::RustType, pub maxHistorySeconds: u32, + pub blocksPerEpoch: u64, } const _: () = { use alloy::sol_types as alloy_sol_types; @@ -5336,12 +5668,14 @@ pub mod LightClientMock { LightClient::LightClientState, LightClient::StakeTableState, alloy::sol_types::sol_data::Uint<32>, + alloy::sol_types::sol_data::Uint<64>, ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( ::RustType, ::RustType, u32, + u64, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -5360,6 +5694,7 @@ pub mod LightClientMock { value.genesis, value.genesisStakeTableState, value.maxHistorySeconds, + value.blocksPerEpoch, ) } } @@ -5371,6 +5706,7 @@ pub mod LightClientMock { genesis: tuple.0, genesisStakeTableState: tuple.1, maxHistorySeconds: tuple.2, + blocksPerEpoch: tuple.3, } } } @@ -5381,6 +5717,7 @@ pub mod LightClientMock { LightClient::LightClientState, LightClient::StakeTableState, alloy::sol_types::sol_data::Uint<32>, + alloy::sol_types::sol_data::Uint<64>, ); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; #[inline] @@ -5391,32 +5728,365 @@ pub mod LightClientMock { } #[inline] fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.genesis, - ), - ::tokenize( - &self.genesisStakeTableState, - ), - as alloy_sol_types::SolType>::tokenize( - &self.maxHistorySeconds, - ), + ( + ::tokenize( + &self.genesis, + ), + ::tokenize( + &self.genesisStakeTableState, + ), + as alloy_sol_types::SolType>::tokenize( + &self.maxHistorySeconds, + ), + as alloy_sol_types::SolType>::tokenize( + &self.blocksPerEpoch, + ), + ) + } + } + }; + /**Function with signature `UPGRADE_INTERFACE_VERSION()` and selector `0xad3cb1cc`. + ```solidity + function UPGRADE_INTERFACE_VERSION() external view returns (string memory); + ```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct UPGRADE_INTERFACE_VERSIONCall {} + ///Container type for the return parameters of the [`UPGRADE_INTERFACE_VERSION()`](UPGRADE_INTERFACE_VERSIONCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct UPGRADE_INTERFACE_VERSIONReturn { + pub _0: alloy::sol_types::private::String, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: UPGRADE_INTERFACE_VERSIONCall) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for UPGRADE_INTERFACE_VERSIONCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::String,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (alloy::sol_types::private::String,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: UPGRADE_INTERFACE_VERSIONReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for UPGRADE_INTERFACE_VERSIONReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for UPGRADE_INTERFACE_VERSIONCall { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = UPGRADE_INTERFACE_VERSIONReturn; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::String,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "UPGRADE_INTERFACE_VERSION()"; + const SELECTOR: [u8; 4] = [173u8, 60u8, 177u8, 204u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn abi_decode_returns( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence( + data, validate, + ) + .map(Into::into) + } + } + }; + /**Function with signature `_blocksPerEpoch()` and selector `0xb2424e3f`. + ```solidity + function _blocksPerEpoch() external view returns (uint64); + ```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct _blocksPerEpochCall {} + ///Container type for the return parameters of the [`_blocksPerEpoch()`](_blocksPerEpochCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct _blocksPerEpochReturn { + pub _0: u64, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From<_blocksPerEpochCall> for UnderlyingRustTuple<'_> { + fn from(value: _blocksPerEpochCall) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for _blocksPerEpochCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<64>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (u64,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From<_blocksPerEpochReturn> for UnderlyingRustTuple<'_> { + fn from(value: _blocksPerEpochReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for _blocksPerEpochReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for _blocksPerEpochCall { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = _blocksPerEpochReturn; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<64>,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "_blocksPerEpoch()"; + const SELECTOR: [u8; 4] = [178u8, 66u8, 78u8, 63u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn abi_decode_returns( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence( + data, validate, + ) + .map(Into::into) + } + } + }; + /**Function with signature `currentBlockNumber()` and selector `0x378ec23b`. + ```solidity + function currentBlockNumber() external view returns (uint256); + ```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct currentBlockNumberCall {} + ///Container type for the return parameters of the [`currentBlockNumber()`](currentBlockNumberCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct currentBlockNumberReturn { + pub _0: alloy::sol_types::private::primitives::aliases::U256, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: currentBlockNumberCall) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for currentBlockNumberCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (alloy::sol_types::private::primitives::aliases::U256,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: currentBlockNumberReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for currentBlockNumberReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for currentBlockNumberCall { + type Parameters<'a> = (); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = currentBlockNumberReturn; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "currentBlockNumber()"; + const SELECTOR: [u8; 4] = [55u8, 142u8, 194u8, 59u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + () + } + #[inline] + fn abi_decode_returns( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence( + data, validate, ) + .map(Into::into) } } }; - /**Function with signature `UPGRADE_INTERFACE_VERSION()` and selector `0xad3cb1cc`. + /**Function with signature `currentEpoch()` and selector `0x76671808`. ```solidity - function UPGRADE_INTERFACE_VERSION() external view returns (string memory); + function currentEpoch() external view returns (uint64); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct UPGRADE_INTERFACE_VERSIONCall {} - ///Container type for the return parameters of the [`UPGRADE_INTERFACE_VERSION()`](UPGRADE_INTERFACE_VERSIONCall) function. + pub struct currentEpochCall {} + ///Container type for the return parameters of the [`currentEpoch()`](currentEpochCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct UPGRADE_INTERFACE_VERSIONReturn { - pub _0: alloy::sol_types::private::String, + pub struct currentEpochReturn { + pub _0: u64, } #[allow( non_camel_case_types, @@ -5442,14 +6112,14 @@ pub mod LightClientMock { } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: UPGRADE_INTERFACE_VERSIONCall) -> Self { + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: currentEpochCall) -> Self { () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for UPGRADE_INTERFACE_VERSIONCall { + impl ::core::convert::From> for currentEpochCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self {} } @@ -5457,9 +6127,9 @@ pub mod LightClientMock { } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::String,); + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<64>,); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::String,); + type UnderlyingRustTuple<'a> = (u64,); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { @@ -5471,28 +6141,28 @@ pub mod LightClientMock { } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: UPGRADE_INTERFACE_VERSIONReturn) -> Self { + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: currentEpochReturn) -> Self { (value._0,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for UPGRADE_INTERFACE_VERSIONReturn { + impl ::core::convert::From> for currentEpochReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for UPGRADE_INTERFACE_VERSIONCall { + impl alloy_sol_types::SolCall for currentEpochCall { type Parameters<'a> = (); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = UPGRADE_INTERFACE_VERSIONReturn; - type ReturnTuple<'a> = (alloy::sol_types::sol_data::String,); + type Return = currentEpochReturn; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<64>,); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "UPGRADE_INTERFACE_VERSION()"; - const SELECTOR: [u8; 4] = [173u8, 60u8, 177u8, 204u8]; + const SIGNATURE: &'static str = "currentEpoch()"; + const SELECTOR: [u8; 4] = [118u8, 103u8, 24u8, 8u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -5515,19 +6185,17 @@ pub mod LightClientMock { } } }; - /**Function with signature `currentBlockNumber()` and selector `0x378ec23b`. + /**Function with signature `disablePermissionedProverMode()` and selector `0x69cc6a04`. ```solidity - function currentBlockNumber() external view returns (uint256); + function disablePermissionedProverMode() external; ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct currentBlockNumberCall {} - ///Container type for the return parameters of the [`currentBlockNumber()`](currentBlockNumberCall) function. + pub struct disablePermissionedProverModeCall {} + ///Container type for the return parameters of the [`disablePermissionedProverMode()`](disablePermissionedProverModeCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct currentBlockNumberReturn { - pub _0: alloy::sol_types::private::primitives::aliases::U256, - } + pub struct disablePermissionedProverModeReturn {} #[allow( non_camel_case_types, non_snake_case, @@ -5552,14 +6220,14 @@ pub mod LightClientMock { } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: currentBlockNumberCall) -> Self { + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: disablePermissionedProverModeCall) -> Self { () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for currentBlockNumberCall { + impl ::core::convert::From> for disablePermissionedProverModeCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self {} } @@ -5567,9 +6235,9 @@ pub mod LightClientMock { } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type UnderlyingSolTuple<'a> = (); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::primitives::aliases::U256,); + type UnderlyingRustTuple<'a> = (); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { @@ -5581,28 +6249,28 @@ pub mod LightClientMock { } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: currentBlockNumberReturn) -> Self { - (value._0,) + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: disablePermissionedProverModeReturn) -> Self { + () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for currentBlockNumberReturn { + impl ::core::convert::From> for disablePermissionedProverModeReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _0: tuple.0 } + Self {} } } } #[automatically_derived] - impl alloy_sol_types::SolCall for currentBlockNumberCall { + impl alloy_sol_types::SolCall for disablePermissionedProverModeCall { type Parameters<'a> = (); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = currentBlockNumberReturn; - type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); + type Return = disablePermissionedProverModeReturn; + type ReturnTuple<'a> = (); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "currentBlockNumber()"; - const SELECTOR: [u8; 4] = [55u8, 142u8, 194u8, 59u8]; + const SIGNATURE: &'static str = "disablePermissionedProverMode()"; + const SELECTOR: [u8; 4] = [105u8, 204u8, 106u8, 4u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -5625,17 +6293,22 @@ pub mod LightClientMock { } } }; - /**Function with signature `disablePermissionedProverMode()` and selector `0x69cc6a04`. + /**Function with signature `epochFromBlockNumber(uint64,uint64)` and selector `0x90c14390`. ```solidity - function disablePermissionedProverMode() external; + function epochFromBlockNumber(uint64 blockNum, uint64 blocksPerEpoch) external pure returns (uint64); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct disablePermissionedProverModeCall {} - ///Container type for the return parameters of the [`disablePermissionedProverMode()`](disablePermissionedProverModeCall) function. + pub struct epochFromBlockNumberCall { + pub blockNum: u64, + pub blocksPerEpoch: u64, + } + ///Container type for the return parameters of the [`epochFromBlockNumber(uint64,uint64)`](epochFromBlockNumberCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct disablePermissionedProverModeReturn {} + pub struct epochFromBlockNumberReturn { + pub _0: u64, + } #[allow( non_camel_case_types, non_snake_case, @@ -5646,9 +6319,12 @@ pub mod LightClientMock { use alloy::sol_types as alloy_sol_types; { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (); + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<64>, + alloy::sol_types::sol_data::Uint<64>, + ); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); + type UnderlyingRustTuple<'a> = (u64, u64); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { @@ -5660,24 +6336,27 @@ pub mod LightClientMock { } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: disablePermissionedProverModeCall) -> Self { - () + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: epochFromBlockNumberCall) -> Self { + (value.blockNum, value.blocksPerEpoch) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for disablePermissionedProverModeCall { + impl ::core::convert::From> for epochFromBlockNumberCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self {} + Self { + blockNum: tuple.0, + blocksPerEpoch: tuple.1, + } } } } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (); + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<64>,); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); + type UnderlyingRustTuple<'a> = (u64,); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { @@ -5689,28 +6368,31 @@ pub mod LightClientMock { } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: disablePermissionedProverModeReturn) -> Self { - () + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: epochFromBlockNumberReturn) -> Self { + (value._0,) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for disablePermissionedProverModeReturn { + impl ::core::convert::From> for epochFromBlockNumberReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self {} + Self { _0: tuple.0 } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for disablePermissionedProverModeCall { - type Parameters<'a> = (); + impl alloy_sol_types::SolCall for epochFromBlockNumberCall { + type Parameters<'a> = ( + alloy::sol_types::sol_data::Uint<64>, + alloy::sol_types::sol_data::Uint<64>, + ); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = disablePermissionedProverModeReturn; - type ReturnTuple<'a> = (); + type Return = epochFromBlockNumberReturn; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<64>,); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "disablePermissionedProverMode()"; - const SELECTOR: [u8; 4] = [105u8, 204u8, 106u8, 4u8]; + const SIGNATURE: &'static str = "epochFromBlockNumber(uint64,uint64)"; + const SELECTOR: [u8; 4] = [144u8, 193u8, 67u8, 144u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -5719,7 +6401,14 @@ pub mod LightClientMock { } #[inline] fn tokenize(&self) -> Self::Token<'_> { - () + ( + as alloy_sol_types::SolType>::tokenize( + &self.blockNum, + ), + as alloy_sol_types::SolType>::tokenize( + &self.blocksPerEpoch, + ), + ) } #[inline] fn abi_decode_returns( @@ -6487,9 +7176,9 @@ pub mod LightClientMock { } } }; - /**Function with signature `initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address)` and selector `0x9baa3cc9`. + /**Function with signature `initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address,uint64)` and selector `0x811f853f`. ```solidity - function initialize(LightClient.LightClientState memory _genesis, LightClient.StakeTableState memory _genesisStakeTableState, uint32 _stateHistoryRetentionPeriod, address owner) external; + function initialize(LightClient.LightClientState memory _genesis, LightClient.StakeTableState memory _genesisStakeTableState, uint32 _stateHistoryRetentionPeriod, address owner, uint64 blocksPerEpoch) external; ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] @@ -6499,8 +7188,9 @@ pub mod LightClientMock { ::RustType, pub _stateHistoryRetentionPeriod: u32, pub owner: alloy::sol_types::private::Address, + pub blocksPerEpoch: u64, } - ///Container type for the return parameters of the [`initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address)`](initializeCall) function. + ///Container type for the return parameters of the [`initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address,uint64)`](initializeCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] pub struct initializeReturn {} @@ -6519,6 +7209,7 @@ pub mod LightClientMock { LightClient::StakeTableState, alloy::sol_types::sol_data::Uint<32>, alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Uint<64>, ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( @@ -6526,6 +7217,7 @@ pub mod LightClientMock { ::RustType, u32, alloy::sol_types::private::Address, + u64, ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] @@ -6545,6 +7237,7 @@ pub mod LightClientMock { value._genesisStakeTableState, value._stateHistoryRetentionPeriod, value.owner, + value.blocksPerEpoch, ) } } @@ -6557,6 +7250,7 @@ pub mod LightClientMock { _genesisStakeTableState: tuple.1, _stateHistoryRetentionPeriod: tuple.2, owner: tuple.3, + blocksPerEpoch: tuple.4, } } } @@ -6597,13 +7291,144 @@ pub mod LightClientMock { LightClient::StakeTableState, alloy::sol_types::sol_data::Uint<32>, alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Uint<64>, ); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = initializeReturn; - type ReturnTuple<'a> = (); + type Return = initializeReturn; + type ReturnTuple<'a> = (); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address,uint64)"; + const SELECTOR: [u8; 4] = [129u8, 31u8, 133u8, 63u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + ::tokenize( + &self._genesis, + ), + ::tokenize( + &self._genesisStakeTableState, + ), + as alloy_sol_types::SolType>::tokenize( + &self._stateHistoryRetentionPeriod, + ), + ::tokenize( + &self.owner, + ), + as alloy_sol_types::SolType>::tokenize( + &self.blocksPerEpoch, + ), + ) + } + #[inline] + fn abi_decode_returns( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence( + data, validate, + ) + .map(Into::into) + } + } + }; + /**Function with signature `isLastBlockInEpoch(uint64)` and selector `0xa1be8d52`. + ```solidity + function isLastBlockInEpoch(uint64 blockHeight) external view returns (bool); + ```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct isLastBlockInEpochCall { + pub blockHeight: u64, + } + ///Container type for the return parameters of the [`isLastBlockInEpoch(uint64)`](isLastBlockInEpochCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct isLastBlockInEpochReturn { + pub _0: bool, + } + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<64>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (u64,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: isLastBlockInEpochCall) -> Self { + (value.blockHeight,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for isLastBlockInEpochCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + blockHeight: tuple.0, + } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Bool,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (bool,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: isLastBlockInEpochReturn) -> Self { + (value._0,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for isLastBlockInEpochReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { _0: tuple.0 } + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for isLastBlockInEpochCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Uint<64>,); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = isLastBlockInEpochReturn; + type ReturnTuple<'a> = (alloy::sol_types::sol_data::Bool,); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address)"; - const SELECTOR: [u8; 4] = [155u8, 170u8, 60u8, 201u8]; + const SIGNATURE: &'static str = "isLastBlockInEpoch(uint64)"; + const SELECTOR: [u8; 4] = [161u8, 190u8, 141u8, 82u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -6613,17 +7438,8 @@ pub mod LightClientMock { #[inline] fn tokenize(&self) -> Self::Token<'_> { ( - ::tokenize( - &self._genesis, - ), - ::tokenize( - &self._genesisStakeTableState, - ), - as alloy_sol_types::SolType>::tokenize( - &self._stateHistoryRetentionPeriod, - ), - ::tokenize( - &self.owner, + as alloy_sol_types::SolType>::tokenize( + &self.blockHeight, ), ) } @@ -6881,17 +7697,18 @@ pub mod LightClientMock { } } }; - /**Function with signature `newFinalizedState((uint64,uint64,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0x2063d4f7`. + /**Function with signature `newFinalizedState((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0x757c37ad`. ```solidity - function newFinalizedState(LightClient.LightClientState memory newState, IPlonkVerifier.PlonkProof memory proof) external; + function newFinalizedState(LightClient.LightClientState memory newState, LightClient.StakeTableState memory nextStakeTable, IPlonkVerifier.PlonkProof memory proof) external; ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] pub struct newFinalizedStateCall { pub newState: ::RustType, + pub nextStakeTable: ::RustType, pub proof: ::RustType, } - ///Container type for the return parameters of the [`newFinalizedState((uint64,uint64,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))`](newFinalizedStateCall) function. + ///Container type for the return parameters of the [`newFinalizedState((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))`](newFinalizedStateCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] pub struct newFinalizedStateReturn {} @@ -6905,11 +7722,15 @@ pub mod LightClientMock { use alloy::sol_types as alloy_sol_types; { #[doc(hidden)] - type UnderlyingSolTuple<'a> = - (LightClient::LightClientState, IPlonkVerifier::PlonkProof); + type UnderlyingSolTuple<'a> = ( + LightClient::LightClientState, + LightClient::StakeTableState, + IPlonkVerifier::PlonkProof, + ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( ::RustType, + ::RustType, ::RustType, ); #[cfg(test)] @@ -6925,7 +7746,7 @@ pub mod LightClientMock { #[doc(hidden)] impl ::core::convert::From for UnderlyingRustTuple<'_> { fn from(value: newFinalizedStateCall) -> Self { - (value.newState, value.proof) + (value.newState, value.nextStakeTable, value.proof) } } #[automatically_derived] @@ -6934,7 +7755,8 @@ pub mod LightClientMock { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { Self { newState: tuple.0, - proof: tuple.1, + nextStakeTable: tuple.1, + proof: tuple.2, } } } @@ -6970,13 +7792,17 @@ pub mod LightClientMock { } #[automatically_derived] impl alloy_sol_types::SolCall for newFinalizedStateCall { - type Parameters<'a> = (LightClient::LightClientState, IPlonkVerifier::PlonkProof); + type Parameters<'a> = ( + LightClient::LightClientState, + LightClient::StakeTableState, + IPlonkVerifier::PlonkProof, + ); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; type Return = newFinalizedStateReturn; type ReturnTuple<'a> = (); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "newFinalizedState((uint64,uint64,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))"; - const SELECTOR: [u8; 4] = [32u8, 99u8, 212u8, 247u8]; + const SIGNATURE: &'static str = "newFinalizedState((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))"; + const SELECTOR: [u8; 4] = [117u8, 124u8, 55u8, 173u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -6989,6 +7815,9 @@ pub mod LightClientMock { ::tokenize( &self.newState, ), + ::tokenize( + &self.nextStakeTable, + ), ::tokenize(&self.proof), ) } @@ -7442,6 +8271,122 @@ pub mod LightClientMock { } } }; + /**Function with signature `setBlocksPerEpoch(uint64)` and selector `0x3c23b6db`. + ```solidity + function setBlocksPerEpoch(uint64 newBlocksPerEpoch) external; + ```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct setBlocksPerEpochCall { + pub newBlocksPerEpoch: u64, + } + ///Container type for the return parameters of the [`setBlocksPerEpoch(uint64)`](setBlocksPerEpochCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct setBlocksPerEpochReturn {} + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<64>,); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (u64,); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: setBlocksPerEpochCall) -> Self { + (value.newBlocksPerEpoch,) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for setBlocksPerEpochCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + newBlocksPerEpoch: tuple.0, + } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: setBlocksPerEpochReturn) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for setBlocksPerEpochReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for setBlocksPerEpochCall { + type Parameters<'a> = (alloy::sol_types::sol_data::Uint<64>,); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = setBlocksPerEpochReturn; + type ReturnTuple<'a> = (); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "setBlocksPerEpoch(uint64)"; + const SELECTOR: [u8; 4] = [60u8, 35u8, 182u8, 219u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + as alloy_sol_types::SolType>::tokenize( + &self.newBlocksPerEpoch, + ), + ) + } + #[inline] + fn abi_decode_returns( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence( + data, validate, + ) + .map(Into::into) + } + } + }; /**Function with signature `setFinalizedState((uint64,uint64,uint256))` and selector `0xb5adea3c`. ```solidity function setFinalizedState(LightClient.LightClientState memory state) external; @@ -8580,11 +9525,138 @@ pub mod LightClientMock { impl alloy_sol_types::SolCall for transferOwnershipCall { type Parameters<'a> = (alloy::sol_types::sol_data::Address,); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = transferOwnershipReturn; + type Return = transferOwnershipReturn; + type ReturnTuple<'a> = (); + type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; + const SIGNATURE: &'static str = "transferOwnership(address)"; + const SELECTOR: [u8; 4] = [242u8, 253u8, 227u8, 139u8]; + #[inline] + fn new<'a>( + tuple: as alloy_sol_types::SolType>::RustType, + ) -> Self { + tuple.into() + } + #[inline] + fn tokenize(&self) -> Self::Token<'_> { + ( + ::tokenize( + &self.newOwner, + ), + ) + } + #[inline] + fn abi_decode_returns( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + as alloy_sol_types::SolType>::abi_decode_sequence( + data, validate, + ) + .map(Into::into) + } + } + }; + /**Function with signature `upgradeToAndCall(address,bytes)` and selector `0x4f1ef286`. + ```solidity + function upgradeToAndCall(address newImplementation, bytes memory data) external payable; + ```*/ + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct upgradeToAndCallCall { + pub newImplementation: alloy::sol_types::private::Address, + pub data: alloy::sol_types::private::Bytes, + } + ///Container type for the return parameters of the [`upgradeToAndCall(address,bytes)`](upgradeToAndCallCall) function. + #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] + #[derive(Clone)] + pub struct upgradeToAndCallReturn {} + #[allow( + non_camel_case_types, + non_snake_case, + clippy::pub_underscore_fields, + clippy::style + )] + const _: () = { + use alloy::sol_types as alloy_sol_types; + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Bytes, + ); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::Address, + alloy::sol_types::private::Bytes, + ); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: upgradeToAndCallCall) -> Self { + (value.newImplementation, value.data) + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for upgradeToAndCallCall { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self { + newImplementation: tuple.0, + data: tuple.1, + } + } + } + } + { + #[doc(hidden)] + type UnderlyingSolTuple<'a> = (); + #[doc(hidden)] + type UnderlyingRustTuple<'a> = (); + #[cfg(test)] + #[allow(dead_code, unreachable_patterns)] + fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { + match _t { + alloy_sol_types::private::AssertTypeEq::< + ::RustType, + >(_) => {} + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: upgradeToAndCallReturn) -> Self { + () + } + } + #[automatically_derived] + #[doc(hidden)] + impl ::core::convert::From> for upgradeToAndCallReturn { + fn from(tuple: UnderlyingRustTuple<'_>) -> Self { + Self {} + } + } + } + #[automatically_derived] + impl alloy_sol_types::SolCall for upgradeToAndCallCall { + type Parameters<'a> = ( + alloy::sol_types::sol_data::Address, + alloy::sol_types::sol_data::Bytes, + ); + type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; + type Return = upgradeToAndCallReturn; type ReturnTuple<'a> = (); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "transferOwnership(address)"; - const SELECTOR: [u8; 4] = [242u8, 253u8, 227u8, 139u8]; + const SIGNATURE: &'static str = "upgradeToAndCall(address,bytes)"; + const SELECTOR: [u8; 4] = [79u8, 30u8, 242u8, 134u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -8595,7 +9667,10 @@ pub mod LightClientMock { fn tokenize(&self) -> Self::Token<'_> { ( ::tokenize( - &self.newOwner, + &self.newImplementation, + ), + ::tokenize( + &self.data, ), ) } @@ -8611,20 +9686,22 @@ pub mod LightClientMock { } } }; - /**Function with signature `upgradeToAndCall(address,bytes)` and selector `0x4f1ef286`. + /**Function with signature `votingStakeTableState()` and selector `0x0625e19b`. ```solidity - function upgradeToAndCall(address newImplementation, bytes memory data) external payable; + function votingStakeTableState() external view returns (uint256 threshold, BN254.ScalarField blsKeyComm, BN254.ScalarField schnorrKeyComm, BN254.ScalarField amountComm); ```*/ #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct upgradeToAndCallCall { - pub newImplementation: alloy::sol_types::private::Address, - pub data: alloy::sol_types::private::Bytes, - } - ///Container type for the return parameters of the [`upgradeToAndCall(address,bytes)`](upgradeToAndCallCall) function. + pub struct votingStakeTableStateCall {} + ///Container type for the return parameters of the [`votingStakeTableState()`](votingStakeTableStateCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] - pub struct upgradeToAndCallReturn {} + pub struct votingStakeTableStateReturn { + pub threshold: alloy::sol_types::private::primitives::aliases::U256, + pub blsKeyComm: ::RustType, + pub schnorrKeyComm: ::RustType, + pub amountComm: ::RustType, + } #[allow( non_camel_case_types, non_snake_case, @@ -8635,15 +9712,9 @@ pub mod LightClientMock { use alloy::sol_types as alloy_sol_types; { #[doc(hidden)] - type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::Address, - alloy::sol_types::sol_data::Bytes, - ); + type UnderlyingSolTuple<'a> = (); #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::Address, - alloy::sol_types::private::Bytes, - ); + type UnderlyingRustTuple<'a> = (); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { @@ -8655,27 +9726,34 @@ pub mod LightClientMock { } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: upgradeToAndCallCall) -> Self { - (value.newImplementation, value.data) + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: votingStakeTableStateCall) -> Self { + () } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for upgradeToAndCallCall { + impl ::core::convert::From> for votingStakeTableStateCall { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - newImplementation: tuple.0, - data: tuple.1, - } + Self {} } } } { #[doc(hidden)] - type UnderlyingSolTuple<'a> = (); + type UnderlyingSolTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + BN254::ScalarField, + BN254::ScalarField, + BN254::ScalarField, + ); #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); + type UnderlyingRustTuple<'a> = ( + alloy::sol_types::private::primitives::aliases::U256, + ::RustType, + ::RustType, + ::RustType, + ); #[cfg(test)] #[allow(dead_code, unreachable_patterns)] fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { @@ -8687,31 +9765,43 @@ pub mod LightClientMock { } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: upgradeToAndCallReturn) -> Self { - () + impl ::core::convert::From for UnderlyingRustTuple<'_> { + fn from(value: votingStakeTableStateReturn) -> Self { + ( + value.threshold, + value.blsKeyComm, + value.schnorrKeyComm, + value.amountComm, + ) } } #[automatically_derived] #[doc(hidden)] - impl ::core::convert::From> for upgradeToAndCallReturn { + impl ::core::convert::From> for votingStakeTableStateReturn { fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self {} + Self { + threshold: tuple.0, + blsKeyComm: tuple.1, + schnorrKeyComm: tuple.2, + amountComm: tuple.3, + } } } } #[automatically_derived] - impl alloy_sol_types::SolCall for upgradeToAndCallCall { - type Parameters<'a> = ( - alloy::sol_types::sol_data::Address, - alloy::sol_types::sol_data::Bytes, - ); + impl alloy_sol_types::SolCall for votingStakeTableStateCall { + type Parameters<'a> = (); type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = upgradeToAndCallReturn; - type ReturnTuple<'a> = (); + type Return = votingStakeTableStateReturn; + type ReturnTuple<'a> = ( + alloy::sol_types::sol_data::Uint<256>, + BN254::ScalarField, + BN254::ScalarField, + BN254::ScalarField, + ); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "upgradeToAndCall(address,bytes)"; - const SELECTOR: [u8; 4] = [79u8, 30u8, 242u8, 134u8]; + const SIGNATURE: &'static str = "votingStakeTableState()"; + const SELECTOR: [u8; 4] = [6u8, 37u8, 225u8, 155u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -8720,14 +9810,7 @@ pub mod LightClientMock { } #[inline] fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize( - &self.newImplementation, - ), - ::tokenize( - &self.data, - ), - ) + () } #[inline] fn abi_decode_returns( @@ -8744,8 +9827,11 @@ pub mod LightClientMock { ///Container for all the [`LightClientMock`](self) function calls. pub enum LightClientMockCalls { UPGRADE_INTERFACE_VERSION(UPGRADE_INTERFACE_VERSIONCall), + _blocksPerEpoch(_blocksPerEpochCall), currentBlockNumber(currentBlockNumberCall), + currentEpoch(currentEpochCall), disablePermissionedProverMode(disablePermissionedProverModeCall), + epochFromBlockNumber(epochFromBlockNumberCall), finalizedState(finalizedStateCall), genesisStakeTableState(genesisStakeTableStateCall), genesisState(genesisStateCall), @@ -8753,6 +9839,7 @@ pub mod LightClientMock { getStateHistoryCount(getStateHistoryCountCall), getVersion(getVersionCall), initialize(initializeCall), + isLastBlockInEpoch(isLastBlockInEpochCall), isPermissionedProverEnabled(isPermissionedProverEnabledCall), lagOverEscapeHatchThreshold(lagOverEscapeHatchThresholdCall), newFinalizedState(newFinalizedStateCall), @@ -8760,6 +9847,7 @@ pub mod LightClientMock { permissionedProver(permissionedProverCall), proxiableUUID(proxiableUUIDCall), renounceOwnership(renounceOwnershipCall), + setBlocksPerEpoch(setBlocksPerEpochCall), setFinalizedState(setFinalizedStateCall), setHotShotDownSince(setHotShotDownSinceCall), setHotShotUp(setHotShotUpCall), @@ -8771,6 +9859,7 @@ pub mod LightClientMock { stateHistoryRetentionPeriod(stateHistoryRetentionPeriodCall), transferOwnership(transferOwnershipCall), upgradeToAndCall(upgradeToAndCallCall), + votingStakeTableState(votingStakeTableStateCall), } #[automatically_derived] impl LightClientMockCalls { @@ -8783,24 +9872,30 @@ pub mod LightClientMock { pub const SELECTORS: &'static [[u8; 4usize]] = &[ [1u8, 63u8, 165u8, 252u8], [2u8, 181u8, 146u8, 243u8], + [6u8, 37u8, 225u8, 155u8], [13u8, 142u8, 110u8, 44u8], - [32u8, 99u8, 212u8, 247u8], [45u8, 82u8, 170u8, 214u8], [47u8, 121u8, 136u8, 157u8], [49u8, 61u8, 247u8, 177u8], [55u8, 142u8, 194u8, 59u8], + [60u8, 35u8, 182u8, 219u8], [66u8, 109u8, 49u8, 148u8], [79u8, 30u8, 242u8, 134u8], [82u8, 209u8, 144u8, 45u8], [105u8, 204u8, 106u8, 4u8], [113u8, 80u8, 24u8, 166u8], + [117u8, 124u8, 55u8, 173u8], + [118u8, 103u8, 24u8, 8u8], + [129u8, 31u8, 133u8, 63u8], [130u8, 110u8, 65u8, 252u8], [133u8, 132u8, 210u8, 63u8], [141u8, 165u8, 203u8, 91u8], + [144u8, 193u8, 67u8, 144u8], [150u8, 193u8, 202u8, 97u8], - [155u8, 170u8, 60u8, 201u8], [159u8, 219u8, 84u8, 167u8], + [161u8, 190u8, 141u8, 82u8], [173u8, 60u8, 177u8, 204u8], + [178u8, 66u8, 78u8, 63u8], [181u8, 173u8, 234u8, 60u8], [194u8, 59u8, 158u8, 158u8], [200u8, 229u8, 228u8, 152u8], @@ -8815,19 +9910,26 @@ pub mod LightClientMock { impl alloy_sol_types::SolInterface for LightClientMockCalls { const NAME: &'static str = "LightClientMockCalls"; const MIN_DATA_LENGTH: usize = 0usize; - const COUNT: usize = 28usize; + const COUNT: usize = 34usize; #[inline] fn selector(&self) -> [u8; 4] { match self { Self::UPGRADE_INTERFACE_VERSION(_) => { ::SELECTOR } + Self::_blocksPerEpoch(_) => { + <_blocksPerEpochCall as alloy_sol_types::SolCall>::SELECTOR + } Self::currentBlockNumber(_) => { ::SELECTOR } + Self::currentEpoch(_) => ::SELECTOR, Self::disablePermissionedProverMode(_) => { ::SELECTOR } + Self::epochFromBlockNumber(_) => { + ::SELECTOR + } Self::finalizedState(_) => { ::SELECTOR } @@ -8843,6 +9945,9 @@ pub mod LightClientMock { } Self::getVersion(_) => ::SELECTOR, Self::initialize(_) => ::SELECTOR, + Self::isLastBlockInEpoch(_) => { + ::SELECTOR + } Self::isPermissionedProverEnabled(_) => { ::SELECTOR } @@ -8860,6 +9965,9 @@ pub mod LightClientMock { Self::renounceOwnership(_) => { ::SELECTOR } + Self::setBlocksPerEpoch(_) => { + ::SELECTOR + } Self::setFinalizedState(_) => { ::SELECTOR } @@ -8891,6 +9999,9 @@ pub mod LightClientMock { Self::upgradeToAndCall(_) => { ::SELECTOR } + Self::votingStakeTableState(_) => { + ::SELECTOR + } } } #[inline] @@ -8938,26 +10049,26 @@ pub mod LightClientMock { stateHistoryCommitments }, { - fn getVersion( + fn votingStakeTableState( data: &[u8], validate: bool, ) -> alloy_sol_types::Result { - ::abi_decode_raw(data, validate) - .map(LightClientMockCalls::getVersion) + ::abi_decode_raw( + data, validate, + ) + .map(LightClientMockCalls::votingStakeTableState) } - getVersion + votingStakeTableState }, { - fn newFinalizedState( + fn getVersion( data: &[u8], validate: bool, ) -> alloy_sol_types::Result { - ::abi_decode_raw( - data, validate, - ) - .map(LightClientMockCalls::newFinalizedState) + ::abi_decode_raw(data, validate) + .map(LightClientMockCalls::getVersion) } - newFinalizedState + getVersion }, { fn setHotShotDownSince( @@ -9007,6 +10118,18 @@ pub mod LightClientMock { } currentBlockNumber }, + { + fn setBlocksPerEpoch( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, validate, + ) + .map(LightClientMockCalls::setBlocksPerEpoch) + } + setBlocksPerEpoch + }, { fn genesisStakeTableState( data: &[u8], @@ -9068,6 +10191,40 @@ pub mod LightClientMock { } renounceOwnership }, + { + fn newFinalizedState( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, validate, + ) + .map(LightClientMockCalls::newFinalizedState) + } + newFinalizedState + }, + { + fn currentEpoch( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, validate, + ) + .map(LightClientMockCalls::currentEpoch) + } + currentEpoch + }, + { + fn initialize( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + ::abi_decode_raw(data, validate) + .map(LightClientMockCalls::initialize) + } + initialize + }, { fn isPermissionedProverEnabled( data: &[u8], @@ -9103,6 +10260,18 @@ pub mod LightClientMock { } owner }, + { + fn epochFromBlockNumber( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, validate, + ) + .map(LightClientMockCalls::epochFromBlockNumber) + } + epochFromBlockNumber + }, { fn setstateHistoryRetentionPeriod( data: &[u8], @@ -9117,26 +10286,28 @@ pub mod LightClientMock { setstateHistoryRetentionPeriod }, { - fn initialize( + fn finalizedState( data: &[u8], validate: bool, ) -> alloy_sol_types::Result { - ::abi_decode_raw(data, validate) - .map(LightClientMockCalls::initialize) + ::abi_decode_raw( + data, validate, + ) + .map(LightClientMockCalls::finalizedState) } - initialize + finalizedState }, { - fn finalizedState( + fn isLastBlockInEpoch( data: &[u8], validate: bool, ) -> alloy_sol_types::Result { - ::abi_decode_raw( + ::abi_decode_raw( data, validate, ) - .map(LightClientMockCalls::finalizedState) + .map(LightClientMockCalls::isLastBlockInEpoch) } - finalizedState + isLastBlockInEpoch }, { fn UPGRADE_INTERFACE_VERSION( @@ -9150,6 +10321,18 @@ pub mod LightClientMock { } UPGRADE_INTERFACE_VERSION }, + { + fn _blocksPerEpoch( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + <_blocksPerEpochCall as alloy_sol_types::SolCall>::abi_decode_raw( + data, validate, + ) + .map(LightClientMockCalls::_blocksPerEpoch) + } + _blocksPerEpoch + }, { fn setFinalizedState( data: &[u8], @@ -9265,16 +10448,31 @@ pub mod LightClientMock { inner, ) } + Self::_blocksPerEpoch(inner) => { + <_blocksPerEpochCall as alloy_sol_types::SolCall>::abi_encoded_size( + inner, + ) + } Self::currentBlockNumber(inner) => { ::abi_encoded_size( inner, ) } + Self::currentEpoch(inner) => { + ::abi_encoded_size( + inner, + ) + } Self::disablePermissionedProverMode(inner) => { ::abi_encoded_size( inner, ) } + Self::epochFromBlockNumber(inner) => { + ::abi_encoded_size( + inner, + ) + } Self::finalizedState(inner) => { ::abi_encoded_size( inner, @@ -9306,6 +10504,11 @@ pub mod LightClientMock { Self::initialize(inner) => { ::abi_encoded_size(inner) } + Self::isLastBlockInEpoch(inner) => { + ::abi_encoded_size( + inner, + ) + } Self::isPermissionedProverEnabled(inner) => { ::abi_encoded_size( inner, @@ -9339,6 +10542,11 @@ pub mod LightClientMock { inner, ) } + Self::setBlocksPerEpoch(inner) => { + ::abi_encoded_size( + inner, + ) + } Self::setFinalizedState(inner) => { ::abi_encoded_size( inner, @@ -9394,6 +10602,11 @@ pub mod LightClientMock { inner, ) } + Self::votingStakeTableState(inner) => { + ::abi_encoded_size( + inner, + ) + } } } #[inline] @@ -9404,14 +10617,25 @@ pub mod LightClientMock { inner, out, ) } + Self::_blocksPerEpoch(inner) => { + <_blocksPerEpochCall as alloy_sol_types::SolCall>::abi_encode_raw(inner, out) + } Self::currentBlockNumber(inner) => { ::abi_encode_raw(inner, out) } + Self::currentEpoch(inner) => { + ::abi_encode_raw(inner, out) + } Self::disablePermissionedProverMode(inner) => { ::abi_encode_raw( inner, out, ) } + Self::epochFromBlockNumber(inner) => { + ::abi_encode_raw( + inner, out, + ) + } Self::finalizedState(inner) => { ::abi_encode_raw(inner, out) } @@ -9439,6 +10663,9 @@ pub mod LightClientMock { Self::initialize(inner) => { ::abi_encode_raw(inner, out) } + Self::isLastBlockInEpoch(inner) => { + ::abi_encode_raw(inner, out) + } Self::isPermissionedProverEnabled(inner) => { ::abi_encode_raw( inner, out, @@ -9464,6 +10691,9 @@ pub mod LightClientMock { Self::renounceOwnership(inner) => { ::abi_encode_raw(inner, out) } + Self::setBlocksPerEpoch(inner) => { + ::abi_encode_raw(inner, out) + } Self::setFinalizedState(inner) => { ::abi_encode_raw(inner, out) } @@ -9509,6 +10739,11 @@ pub mod LightClientMock { Self::upgradeToAndCall(inner) => { ::abi_encode_raw(inner, out) } + Self::votingStakeTableState(inner) => { + ::abi_encode_raw( + inner, out, + ) + } } } } @@ -9525,6 +10760,7 @@ pub mod LightClientMock { InvalidInitialization(InvalidInitialization), InvalidMaxStateHistory(InvalidMaxStateHistory), InvalidProof(InvalidProof), + MissingLastBlockInEpochUpdate(MissingLastBlockInEpochUpdate), NoChangeRequired(NoChangeRequired), NotInitializing(NotInitializing), OutdatedState(OutdatedState), @@ -9552,6 +10788,7 @@ pub mod LightClientMock { [76u8, 156u8, 140u8, 227u8], [81u8, 97u8, 128u8, 137u8], [97u8, 90u8, 146u8, 100u8], + [113u8, 80u8, 222u8, 69u8], [153u8, 150u8, 179u8, 21u8], [161u8, 186u8, 7u8, 238u8], [163u8, 166u8, 71u8, 128u8], @@ -9570,7 +10807,7 @@ pub mod LightClientMock { impl alloy_sol_types::SolInterface for LightClientMockErrors { const NAME: &'static str = "LightClientMockErrors"; const MIN_DATA_LENGTH: usize = 0usize; - const COUNT: usize = 20usize; + const COUNT: usize = 21usize; #[inline] fn selector(&self) -> [u8; 4] { match self { @@ -9601,6 +10838,9 @@ pub mod LightClientMock { ::SELECTOR } Self::InvalidProof(_) => ::SELECTOR, + Self::MissingLastBlockInEpochUpdate(_) => { + ::SELECTOR + } Self::NoChangeRequired(_) => { ::SELECTOR } @@ -9743,6 +10983,19 @@ pub mod LightClientMock { } InvalidHotShotBlockForCommitmentCheck }, + { + fn MissingLastBlockInEpochUpdate( + data: &[u8], + validate: bool, + ) -> alloy_sol_types::Result { + ::abi_decode_raw( + data, + validate, + ) + .map(LightClientMockErrors::MissingLastBlockInEpochUpdate) + } + MissingLastBlockInEpochUpdate + }, { fn AddressEmptyCode( data: &[u8], @@ -9948,6 +11201,11 @@ pub mod LightClientMock { Self::InvalidProof(inner) => { ::abi_encoded_size(inner) } + Self::MissingLastBlockInEpochUpdate(inner) => { + ::abi_encoded_size( + inner, + ) + } Self::NoChangeRequired(inner) => { ::abi_encoded_size( inner, @@ -10062,6 +11320,12 @@ pub mod LightClientMock { out, ) } + Self::MissingLastBlockInEpochUpdate(inner) => { + ::abi_encode_raw( + inner, + out, + ) + } Self::NoChangeRequired(inner) => { ::abi_encode_raw( inner, @@ -10122,6 +11386,7 @@ pub mod LightClientMock { ///Container for all the [`LightClientMock`](self) events. pub enum LightClientMockEvents { Initialized(Initialized), + NewEpoch(NewEpoch), NewState(NewState), OwnershipTransferred(OwnershipTransferred), PermissionedProverNotRequired(PermissionedProverNotRequired), @@ -10138,6 +11403,11 @@ pub mod LightClientMock { /// /// Prefer using `SolInterface` methods instead. pub const SELECTORS: &'static [[u8; 32usize]] = &[ + [ + 49u8, 234u8, 189u8, 144u8, 153u8, 253u8, 178u8, 93u8, 172u8, 221u8, 210u8, 6u8, + 171u8, 255u8, 135u8, 49u8, 30u8, 85u8, 52u8, 65u8, 252u8, 157u8, 15u8, 205u8, + 239u8, 32u8, 16u8, 98u8, 215u8, 231u8, 7u8, 27u8, + ], [ 128u8, 23u8, 187u8, 136u8, 127u8, 223u8, 143u8, 202u8, 67u8, 20u8, 169u8, 212u8, 15u8, 110u8, 115u8, 179u8, 184u8, 16u8, 2u8, 214u8, 126u8, 92u8, 250u8, 133u8, @@ -10178,7 +11448,7 @@ pub mod LightClientMock { #[automatically_derived] impl alloy_sol_types::SolEventInterface for LightClientMockEvents { const NAME: &'static str = "LightClientMockEvents"; - const COUNT: usize = 7usize; + const COUNT: usize = 8usize; fn decode_raw_log( topics: &[alloy_sol_types::Word], data: &[u8], @@ -10191,6 +11461,10 @@ pub mod LightClientMock { ) .map(Self::Initialized) } + Some(::SIGNATURE_HASH) => { + ::decode_raw_log(topics, data, validate) + .map(Self::NewEpoch) + } Some(::SIGNATURE_HASH) => { ::decode_raw_log(topics, data, validate) .map(Self::NewState) @@ -10240,6 +11514,7 @@ pub mod LightClientMock { Self::Initialized(inner) => { alloy_sol_types::private::IntoLogData::to_log_data(inner) } + Self::NewEpoch(inner) => alloy_sol_types::private::IntoLogData::to_log_data(inner), Self::NewState(inner) => alloy_sol_types::private::IntoLogData::to_log_data(inner), Self::OwnershipTransferred(inner) => { alloy_sol_types::private::IntoLogData::to_log_data(inner) @@ -10259,6 +11534,9 @@ pub mod LightClientMock { Self::Initialized(inner) => { alloy_sol_types::private::IntoLogData::into_log_data(inner) } + Self::NewEpoch(inner) => { + alloy_sol_types::private::IntoLogData::into_log_data(inner) + } Self::NewState(inner) => { alloy_sol_types::private::IntoLogData::into_log_data(inner) } @@ -10308,6 +11586,7 @@ pub mod LightClientMock { genesis: ::RustType, genesisStakeTableState: ::RustType, maxHistorySeconds: u32, + blocksPerEpoch: u64, ) -> impl ::core::future::Future>> { LightClientMockInstance::::deploy( @@ -10315,6 +11594,7 @@ pub mod LightClientMock { genesis, genesisStakeTableState, maxHistorySeconds, + blocksPerEpoch, ) } /**Creates a `RawCallBuilder` for deploying this contract using the given `provider` @@ -10332,12 +11612,14 @@ pub mod LightClientMock { genesis: ::RustType, genesisStakeTableState: ::RustType, maxHistorySeconds: u32, + blocksPerEpoch: u64, ) -> alloy_contract::RawCallBuilder { LightClientMockInstance::::deploy_builder( provider, genesis, genesisStakeTableState, maxHistorySeconds, + blocksPerEpoch, ) } /**A [`LightClientMock`](self) instance. @@ -10396,9 +11678,15 @@ pub mod LightClientMock { genesis: ::RustType, genesisStakeTableState: ::RustType, maxHistorySeconds: u32, + blocksPerEpoch: u64, ) -> alloy_contract::Result> { - let call_builder = - Self::deploy_builder(provider, genesis, genesisStakeTableState, maxHistorySeconds); + let call_builder = Self::deploy_builder( + provider, + genesis, + genesisStakeTableState, + maxHistorySeconds, + blocksPerEpoch, + ); let contract_address = call_builder.deploy().await?; Ok(Self::new(contract_address, call_builder.provider)) } @@ -10413,6 +11701,7 @@ pub mod LightClientMock { genesis: ::RustType, genesisStakeTableState: ::RustType, maxHistorySeconds: u32, + blocksPerEpoch: u64, ) -> alloy_contract::RawCallBuilder { alloy_contract::RawCallBuilder::new_raw_deploy( provider, @@ -10422,6 +11711,7 @@ pub mod LightClientMock { genesis, genesisStakeTableState, maxHistorySeconds, + blocksPerEpoch, })[..], ] .concat() @@ -10484,18 +11774,39 @@ pub mod LightClientMock { ) -> alloy_contract::SolCallBuilder { self.call_builder(&UPGRADE_INTERFACE_VERSIONCall {}) } + ///Creates a new call builder for the [`_blocksPerEpoch`] function. + pub fn _blocksPerEpoch( + &self, + ) -> alloy_contract::SolCallBuilder { + self.call_builder(&_blocksPerEpochCall {}) + } ///Creates a new call builder for the [`currentBlockNumber`] function. pub fn currentBlockNumber( &self, ) -> alloy_contract::SolCallBuilder { self.call_builder(¤tBlockNumberCall {}) } + ///Creates a new call builder for the [`currentEpoch`] function. + pub fn currentEpoch(&self) -> alloy_contract::SolCallBuilder { + self.call_builder(¤tEpochCall {}) + } ///Creates a new call builder for the [`disablePermissionedProverMode`] function. pub fn disablePermissionedProverMode( &self, ) -> alloy_contract::SolCallBuilder { self.call_builder(&disablePermissionedProverModeCall {}) } + ///Creates a new call builder for the [`epochFromBlockNumber`] function. + pub fn epochFromBlockNumber( + &self, + blockNum: u64, + blocksPerEpoch: u64, + ) -> alloy_contract::SolCallBuilder { + self.call_builder(&epochFromBlockNumberCall { + blockNum, + blocksPerEpoch, + }) + } ///Creates a new call builder for the [`finalizedState`] function. pub fn finalizedState( &self, @@ -10536,14 +11847,23 @@ pub mod LightClientMock { _genesisStakeTableState: ::RustType, _stateHistoryRetentionPeriod: u32, owner: alloy::sol_types::private::Address, + blocksPerEpoch: u64, ) -> alloy_contract::SolCallBuilder { self.call_builder(&initializeCall { _genesis, _genesisStakeTableState, _stateHistoryRetentionPeriod, owner, + blocksPerEpoch, }) } + ///Creates a new call builder for the [`isLastBlockInEpoch`] function. + pub fn isLastBlockInEpoch( + &self, + blockHeight: u64, + ) -> alloy_contract::SolCallBuilder { + self.call_builder(&isLastBlockInEpochCall { blockHeight }) + } ///Creates a new call builder for the [`isPermissionedProverEnabled`] function. pub fn isPermissionedProverEnabled( &self, @@ -10565,9 +11885,14 @@ pub mod LightClientMock { pub fn newFinalizedState( &self, newState: ::RustType, + nextStakeTable: ::RustType, proof: ::RustType, ) -> alloy_contract::SolCallBuilder { - self.call_builder(&newFinalizedStateCall { newState, proof }) + self.call_builder(&newFinalizedStateCall { + newState, + nextStakeTable, + proof, + }) } ///Creates a new call builder for the [`owner`] function. pub fn owner(&self) -> alloy_contract::SolCallBuilder { @@ -10589,6 +11914,13 @@ pub mod LightClientMock { ) -> alloy_contract::SolCallBuilder { self.call_builder(&renounceOwnershipCall {}) } + ///Creates a new call builder for the [`setBlocksPerEpoch`] function. + pub fn setBlocksPerEpoch( + &self, + newBlocksPerEpoch: u64, + ) -> alloy_contract::SolCallBuilder { + self.call_builder(&setBlocksPerEpochCall { newBlocksPerEpoch }) + } ///Creates a new call builder for the [`setFinalizedState`] function. pub fn setFinalizedState( &self, @@ -10669,6 +12001,12 @@ pub mod LightClientMock { data, }) } + ///Creates a new call builder for the [`votingStakeTableState`] function. + pub fn votingStakeTableState( + &self, + ) -> alloy_contract::SolCallBuilder { + self.call_builder(&votingStakeTableStateCall {}) + } } /// Event filters. #[automatically_derived] @@ -10691,6 +12029,10 @@ pub mod LightClientMock { pub fn Initialized_filter(&self) -> alloy_contract::Event { self.event_filter::() } + ///Creates a new event filter for the [`NewEpoch`] event. + pub fn NewEpoch_filter(&self) -> alloy_contract::Event { + self.event_filter::() + } ///Creates a new event filter for the [`NewState`] event. pub fn NewState_filter(&self) -> alloy_contract::Event { self.event_filter::() diff --git a/contract-bindings-alloy/src/plonkverifier.rs b/contract-bindings-alloy/src/plonkverifier.rs index 363d08a96a..b7d3ef59e7 100644 --- a/contract-bindings-alloy/src/plonkverifier.rs +++ b/contract-bindings-alloy/src/plonkverifier.rs @@ -1898,7 +1898,7 @@ interface PlonkVerifier { error UnsupportedDegree(); error WrongPlonkVK(); - function verify(IPlonkVerifier.VerifyingKey memory verifyingKey, uint256[7] memory publicInput, IPlonkVerifier.PlonkProof memory proof) external view returns (bool); + function verify(IPlonkVerifier.VerifyingKey memory verifyingKey, uint256[11] memory publicInput, IPlonkVerifier.PlonkProof memory proof) external view returns (bool); } ``` @@ -2244,8 +2244,8 @@ interface PlonkVerifier { }, { "name": "publicInput", - "type": "uint256[7]", - "internalType": "uint256[7]" + "type": "uint256[11]", + "internalType": "uint256[11]" }, { "name": "proof", @@ -2565,22 +2565,22 @@ pub mod PlonkVerifier { /// The creation / init bytecode of the contract. /// /// ```text - ///0x6122a4610035600b8282823980515f1a60731461002957634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe7300000000000000000000000000000000000000003014608060405260043610610034575f3560e01c8063ce537a7714610038575b5f80fd5b61004b610046366004612033565b61005f565b604051901515815260200160405180910390f35b5f610069826100d0565b610079835f5b602002015161020b565b61008483600161006f565b61008f83600261006f565b61009a83600361006f565b6100a583600461006f565b6100b083600561006f565b6100bb83600661006f565b6100c6848484610271565b90505b9392505050565b80516100db90610465565b6100e88160200151610465565b6100f58160400151610465565b6101028160600151610465565b61010f8160800151610465565b61011c8160a00151610465565b6101298160c00151610465565b6101368160e00151610465565b610144816101000151610465565b610152816101200151610465565b610160816101400151610465565b61016e816101600151610465565b61017c816101800151610465565b61018a816101a0015161020b565b610198816101c0015161020b565b6101a6816101e0015161020b565b6101b481610200015161020b565b6101c281610220015161020b565b6101d081610240015161020b565b6101de81610260015161020b565b6101ec81610280015161020b565b6101fa816102a0015161020b565b610208816102c0015161020b565b50565b5f8051602061227883398151915281108061026d5760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c64000000000060448201526064015b60405180910390fd5b5050565b5f8360200151600714610297576040516320fa9d8960e11b815260040160405180910390fd5b5f6102a3858585610513565b90505f6102b2865f0151610a73565b90505f6102c4828460a0015188610e51565b90506102e160405180604001604052805f81526020015f81525090565b604080518082019091525f80825260208201526103158761016001516103108961018001518860e00151610eae565b610f4f565b91505f806103258b88878c610ff3565b91509150610336816103108461122b565b925061034f836103108b61016001518a60a00151610eae565b60a08801516040880151602001519194505f80516020612278833981519152918290820990508160e08a015182099050610392856103108d610180015184610eae565b94505f60405180608001604052807f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b081526020017f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c181526020017f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e5581526020017f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4815250905061045387826104468961122b565b61044e6112c8565b611395565b9e9d5050505050505050505050505050565b805160208201515f917f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4791159015161561049e57505050565b82516020840151826003848585860985090883828309148382108484101616935050508161050e5760405162461bcd60e51b815260206004820152601760248201527f426e3235343a20696e76616c696420473120706f696e740000000000000000006044820152606401610264565b505050565b6105536040518061010001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b5f5f805160206122788339815191529050604051602081015f815260fe60e01b8152865160c01b6004820152602087015160c01b600c82015261028087015160208201526102a08701516040820152600160608201527f2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a60808201527f1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb02560a08201527f2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a60c08201527f2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e88160e082015260e087015180516101008301526020810151610120830152506101008701518051610140830152602081015161016083015250610120870151805161018083015260208101516101a08301525061014087015180516101c083015260208101516101e083015250610160870151805161020083015260208101516102208301525061018087015180516102408301526020810151610260830152506101e0870151805161028083015260208101516102a08301525061020087015180516102c083015260208101516102e083015250610220870151805161030083015260208101516103208301525061024087015180516103408301526020810151610360830152506101a0870151805161038083015260208101516103a0830152506101c087015180516103c083015260208101516103e0830152506102608701518051610400830152602081015161042083015250604087015180516104408301526020810151610460830152506060870151805161048083015260208101516104a083015250608087015180516104c083015260208101516104e08301525060a0870151805161050083015260208101516105208301525060c08701518051610540830152602081015161056083015250855161058082015260208601516105a082015260408601516105c082015260608601516105e0820152608086015161060082015260a086015161062082015260c086015161064082015284518051610660830152602081015161068083015250602085015180516106a083015260208101516106c083015250604085015180516106e083015260208101516107008301525060608501518051610720830152602081015161074083015250608085015180516107608301526020810151610780830152505f82526107c08220825282825106606085015260208220825282825106608085015260a085015180518252602081015160208301525060608220808352838106855283818209848282099150806020870152508060408601525060c085015180518252602081015160208301525060e085015180516040830152602081015160608301525061010085015180516080830152602081015160a083015250610120850151805160c0830152602081015160e0830152506101408501518051610100830152602081015161012083015250610160822082528282510660a08501526101a085015181526101c085015160208201526101e085015160408201526102008501516060820152610220850151608082015261024085015160a082015261026085015160c082015261028085015160e08201526102a08501516101008201526102c0850151610120820152610160822082528282510660c08501526101608501518051825260208101516020830152506101808501518051604083015260208101516060830152505060a0812082810660e08501525050509392505050565b610a7b611d0e565b816201000003610bba576040518060600160405280601081526020017f30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c100181526020016040518060e00160405280600181526020017eeeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b781526020017f2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb81526020017f086812a00ac43ea801669c640171203c41a496671bfbc065ac8db24d52cf31e581526020017f2d965651cdd9e4811f4e51b80ddca8a8b4a93ee17420aae6adaa01c2617c6e8581526020017f12597a56c2e438620b9041b98992ae0d4e705b780057bf7766a2767cece16e1d81526020017f02d94117cd17bcf1290fd67c01155dd40807857dff4a5a0b4dc67befa8aa34fd8152508152509050919050565b816210000003610cfa576040518060600160405280601481526020017f30644b6c9c4a72169e4daa317d25f04512ae15c53b34e8f5acd8e155d0a6c10181526020016040518060e00160405280600181526020017f26125da10a0ed06327508aba06d1e303ac616632dbed349f53422da95333785781526020017f2260e724844bca5251829353968e4915305258418357473a5c1d597f613f6cbd81526020017f2087ea2cd664278608fb0ebdb820907f598502c81b6690c185e2bf15cb935f4281526020017f19ddbcaf3a8d46c15c0176fbb5b95e4dc57088ff13f4d1bd84c6bfa57dcdc0e081526020017f05a2c85cfc591789605cae818e37dd4161eef9aa666bec6fe4288d09e6d2341881526020017f11f70e5363258ff4f0d716a653e1dc41f1c64484d7f4b6e219d6377614a3905c8152508152509050919050565b81602003610e38576040518060600160405280600581526020017f2ee12bff4a2813286a8dc388cd754d9a3ef2490635eba50cb9c2e5e75080000181526020016040518060e00160405280600181526020017f09c532c6306b93d29678200d47c0b2a99c18d51b838eeb1d3eed4c533bb512d081526020017f21082ca216cbbf4e1c6e4f4594dd508c996dfbe1174efb98b11509c6e306460b81526020017f1277ae6415f0ef18f2ba5fb162c39eb7311f386e2d26d64401f4a25da77c253b81526020017f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8081526020017f2fbd4dd2976be55d1a163aa9820fb88dfac5ddce77e1872e90632027327a5ebe81526020017f107aab49e65a67f9da9cd2abf78be38bd9dc1d5db39f81de36bcfa5b4b0390438152508152509050919050565b60405163e2ef09e560e01b815260040160405180910390fd5b610e7260405180606001604052805f81526020015f81526020015f81525090565b610e7c8484611475565b808252610e8c90859085906114c6565b60208201528051610ea290859084908690611535565b60408201529392505050565b604080518082019091525f8082526020820152610ec9611d32565b8351815260208085015190820152604081018390525f60608360808460076107d05a03fa90508080610ef9575f80fd5b5080610f475760405162461bcd60e51b815260206004820152601960248201527f426e3235343a207363616c6172206d756c206661696c656421000000000000006044820152606401610264565b505092915050565b604080518082019091525f8082526020820152610f6a611d50565b8351815260208085015181830152835160408301528301516060808301919091525f908360c08460066107d05a03fa90508080610fa5575f80fd5b5080610f475760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a2067726f7570206164646974696f6e206661696c6564210000006044820152606401610264565b604080518082019091525f8082526020820152604080518082019091525f80825260208201525f61102687878787611683565b90505f805160206122788339815191525f611042888789611b4d565b905061104e8183612225565b60c08901516101a08801519192509081908490819083098408925061107a856103108a5f015184610eae565b955083828209905083846101c08a01518309840892506110a2866103108a6020015184610eae565b955083828209905083846101e08a01518309840892506110ca866103108a6040015184610eae565b955083828209905083846102008a01518309840892506110f2866103108a6060015184610eae565b955083828209905083846102208a015183098408925061111a866103108a6080015184610eae565b955083828209905083846102408a0151830984089250611142866103108d6040015184610eae565b955083828209905083846102608a015183098408925061116a866103108d6060015184610eae565b955083828209905083846102808a0151830984089250611192866103108d6080015184610eae565b955083828209905083846102a08a01518309840892506111ba866103108d60a0015184610eae565b95505f8a60e00151905084856102c08b01518309850893506111e4876103108b60a0015184610eae565b965061121a6112146040805180820182525f80825260209182015281518083019092526001825260029082015290565b85610eae565b975050505050505094509492505050565b604080518082019091525f8082526020820152815160208301511590151615611252575090565b6040518060400160405280835f015181526020017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4784602001516112969190612258565b6112c0907f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47612225565b905292915050565b6112ef60405180608001604052805f81526020015f81526020015f81526020015f81525090565b60405180608001604052807f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa81526020017f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b815250905090565b5f805f6040518751815260208801516020820152602087015160408201528651606082015260608701516080820152604087015160a0820152855160c0820152602086015160e0820152602085015161010082015284516101208201526060850151610140820152604085015161016082015260205f6101808360085afa9150505f519150806114675760405162461bcd60e51b815260206004820152601c60248201527f426e3235343a2050616972696e6720636865636b206661696c656421000000006044820152606401610264565b50151590505b949350505050565b81515f905f80516020612278833981519152908380156114b6578493505f5b828110156114aa57838586099450600101611494565b506001840393506114bd565b6001830393505b50505092915050565b5f826001036114d7575060016100c9565b815f036114e557505f6100c9565b60208401515f80516020612278833981519152905f908281860990508580156115135760018703925061151a565b6001840392505b5061152482611c38565b915082828209979650505050505050565b5f5f805160206122788339815191528282036115ae5760015f5b60078110156115a3578186036115805786816007811061157157611571612211565b6020020151935050505061146d565b828061158e5761158e612244565b6040890151602001518309915060010161154f565b505f9250505061146d565b6115b6611d6e565b6040870151600160c0838101828152920190805b60078110156115f75760208403935085868a85518903088309808552601f199093019291506001016115ca565b505050505f805f90506001838960408c01515f5b600781101561164b578882518a85518c88518a0909098981880896505088898d84518c03088609945060209384019392830192919091019060010161160b565b50505050809250505f61165d83611c38565b905060208a015185818909965050848187099550848287099a9950505050505050505050565b604080518082019091525f80825260208201525f805f805f5f80516020612278833981519152905060808901518160208a015160208c0151099550895194508160a08b015160608c0151099350816101a089015185089250818184089250818584099450817f2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a85099250816101c089015184089250818184089250818584099450817f1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb02585099250816101e089015184089250818184089250818584099450817f2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a850992508161020089015184089250818184089250818584099450817f2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e881850992508161022089015184089250818184089250508084830993508084860894506117f08760a0015186610eae565b9550885160608a015160808b0151838284099750836102c08b015189099750836102408b015183099550836101a08b015187089550838187089550838689099750836102608b015183099550836101c08b015187089550838187089550838689099750836102808b015183099550836101e08b015187089550838187089550838689099750836102a08b015183099550836102008b0151870895508381870895505050508083860994506118b7866103108c60c0015188856118b29190612225565b610eae565b95506118d0866103108c60e001518a6101a00151610eae565b95506118ea866103108c61010001518a6101c00151610eae565b9550611904866103108c61012001518a6101e00151610eae565b955061191e866103108c61014001518a6102000151610eae565b9550806101c08801516101a0890151099250611943866103108c610160015186610eae565b9550806102008801516101e0890151099250611968866103108c610180015186610eae565b95506101a08701519250808384099150808283099150808284099250611997866103108c6101e0015186610eae565b95506101c087015192508083840991508082830991508082840992506119c6866103108c610200015186610eae565b95506101e087015192508083840991508082830991508082840992506119f5866103108c610220015186610eae565b95506102008701519250808384099150808283099150808284099250611a24866103108c610240015186610eae565b9550611a41866103108c6101a001516118b28b6102200151611cd9565b9550611a52868b6101c00151610f4f565b9550806101c08801516101a0890151099250806101e08801518409925080610200880151840992508061022088015184099250611a98866103108c610260015186610eae565b9550611aa6885f0151611cd9565b9450611aba866103108960c0015188610eae565b955080600189510860a08a0151909350819080099150808284099250808386099450611aee866103108960e0015188610eae565b9550808386099450611b098661031089610100015188610eae565b9550808386099450611b248661031089610120015188610eae565b9550808386099450611b3f8661031089610140015188610eae565b9a9950505050505050505050565b5f805f8051602061227883398151915290505f836020015190505f846040015190505f60019050606088015160808901516101a08901516102408a01518788898387098a868608088609945050506101c08901516102608a01518788898387098a868608088609945050506101e08901516102808a01518788898387098a868608088609945050506102008901516102a08a01518788898387098a8686080886099450505061022089015191506102c0890151868782898587080985099350505050875160208901518586868309870385089650508485838309860387089998505050505050505050565b5f805f5f80516020612278833981519152905060405160208152602080820152602060408201528460608201526002820360808201528160a082015260205f60c08360055afa9250505f51925081611cd25760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a20706f7720707265636f6d70696c65206661696c6564210000006044820152606401610264565b5050919050565b5f611cf15f8051602061227883398151915283612258565b611d08905f80516020612278833981519152612225565b92915050565b60405180606001604052805f81526020015f8152602001611d2d611d6e565b905290565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b6040518060e001604052806007906020820280368337509192915050565b634e487b7160e01b5f52604160045260245ffd5b6040516102e0810167ffffffffffffffff81118282101715611dc457611dc4611d8c565b60405290565b6040516102c0810167ffffffffffffffff81118282101715611dc457611dc4611d8c565b5f60408284031215611dfe575f80fd5b6040516040810181811067ffffffffffffffff82111715611e2157611e21611d8c565b604052823581526020928301359281019290925250919050565b5f82601f830112611e4a575f80fd5b60405160e0810181811067ffffffffffffffff82111715611e6d57611e6d611d8c565b6040528060e0840185811115611e81575f80fd5b845b81811015611e9b578035835260209283019201611e83565b509195945050505050565b5f6104808284031215611eb7575f80fd5b611ebf611da0565b9050611ecb8383611dee565b8152611eda8360408401611dee565b6020820152611eec8360808401611dee565b6040820152611efe8360c08401611dee565b6060820152610100611f1284828501611dee565b6080830152610140611f2685828601611dee565b60a0840152610180611f3a86828701611dee565b60c08501526101c0611f4e87828801611dee565b60e0860152610200611f6288828901611dee565b858701526102409450611f7788868901611dee565b610120870152610280611f8c89828a01611dee565b858801526102c09450611fa189868a01611dee565b610160880152611fb5896103008a01611dee565b848801526103408801356101a0880152610360880135838801526103808801356101e08801526103a0880135828801526103c08801356102208801526103e08801358688015261040088013561026088015261042088013581880152505050506104408401356102a084015261046084013581840152505092915050565b5f805f838503610a60811215612047575f80fd5b61050080821215612056575f80fd5b61205e611dca565b9150853582526020860135602083015261207b8760408801611dee565b604083015261208d8760808801611dee565b606083015261209f8760c08801611dee565b60808301526101006120b388828901611dee565b60a08401526101406120c789828a01611dee565b60c08501526101806120db8a828b01611dee565b60e08601526101c06120ef8b828c01611dee565b8487015261020093506121048b858c01611dee565b6101208701526102406121198c828d01611dee565b84880152610280935061212e8c858d01611dee565b6101608801526121428c6102c08d01611dee565b838801526121548c6103008d01611dee565b6101a08801526121688c6103408d01611dee565b8288015261217a8c6103808d01611dee565b6101e088015261218e8c6103c08d01611dee565b858801526121a08c6104008d01611dee565b6102208801526121b48c6104408d01611dee565b818801525050506121c9896104808a01611dee565b6102608501526104c08801358185015250506104e08601356102a08301528194506121f687828801611e3b565b93505050612208856105e08601611ea6565b90509250925092565b634e487b7160e01b5f52603260045260245ffd5b81810381811115611d0857634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261227257634e487b7160e01b5f52601260045260245ffd5b50069056fe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a164736f6c6343000817000a + ///0x6124ca610035600b8282823980515f1a60731461002957634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe7300000000000000000000000000000000000000003014608060405260043610610034575f3560e01c8063fc8660c714610038575b5f80fd5b61004b610046366004612259565b61005f565b604051901515815260200160405180910390f35b5f610069826100fc565b610079835f5b6020020151610237565b61008483600161006f565b61008f83600261006f565b61009a83600361006f565b6100a583600461006f565b6100b083600561006f565b6100bb83600661006f565b6100c683600761006f565b6100d183600861006f565b6100dc83600961006f565b6100e783600a61006f565b6100f284848461029d565b90505b9392505050565b805161010790610491565b6101148160200151610491565b6101218160400151610491565b61012e8160600151610491565b61013b8160800151610491565b6101488160a00151610491565b6101558160c00151610491565b6101628160e00151610491565b610170816101000151610491565b61017e816101200151610491565b61018c816101400151610491565b61019a816101600151610491565b6101a8816101800151610491565b6101b6816101a00151610237565b6101c4816101c00151610237565b6101d2816101e00151610237565b6101e0816102000151610237565b6101ee816102200151610237565b6101fc816102400151610237565b61020a816102600151610237565b610218816102800151610237565b610226816102a00151610237565b610234816102c00151610237565b50565b5f8051602061249e8339815191528110806102995760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c64000000000060448201526064015b60405180910390fd5b5050565b5f8360200151600b146102c3576040516320fa9d8960e11b815260040160405180910390fd5b5f6102cf85858561053f565b90505f6102de865f0151610ace565b90505f6102f0828460a0015188611075565b905061030d60405180604001604052805f81526020015f81525090565b604080518082019091525f808252602082015261034187610160015161033c8961018001518860e001516110d2565b611173565b91505f806103518b88878c611217565b915091506103628161033c8461144f565b925061037b8361033c8b61016001518a60a001516110d2565b60a08801516040880151602001519194505f8051602061249e833981519152918290820990508160e08a0151820990506103be8561033c8d6101800151846110d2565b94505f60405180608001604052807f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b081526020017f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c181526020017f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e5581526020017f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4815250905061047f87826104728961144f565b61047a6114ec565b6115b9565b9e9d5050505050505050505050505050565b805160208201515f917f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd479115901516156104ca57505050565b82516020840151826003848585860985090883828309148382108484101616935050508161053a5760405162461bcd60e51b815260206004820152601760248201527f426e3235343a20696e76616c696420473120706f696e740000000000000000006044820152606401610290565b505050565b61057f6040518061010001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b5f5f8051602061249e8339815191529050604051602081015f815260fe60e01b8152865160c01b6004820152602087015160c01b600c82015261028087015160208201526102a08701516040820152600160608201527f2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a60808201527f1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb02560a08201527f2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a60c08201527f2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e88160e082015260e087015180516101008301526020810151610120830152506101008701518051610140830152602081015161016083015250610120870151805161018083015260208101516101a08301525061014087015180516101c083015260208101516101e083015250610160870151805161020083015260208101516102208301525061018087015180516102408301526020810151610260830152506101e0870151805161028083015260208101516102a08301525061020087015180516102c083015260208101516102e083015250610220870151805161030083015260208101516103208301525061024087015180516103408301526020810151610360830152506101a0870151805161038083015260208101516103a0830152506101c087015180516103c083015260208101516103e0830152506102608701518051610400830152602081015161042083015250604087015180516104408301526020810151610460830152506060870151805161048083015260208101516104a083015250608087015180516104c083015260208101516104e08301525060a0870151805161050083015260208101516105208301525060c08701518051610540830152602081015161056083015250855161058082015260208601516105a082015260408601516105c082015260608601516105e0820152608086015161060082015260a086015161062082015260c086015161064082015260e08601516106608201526101008601516106808201526101208601516106a08201526101408601516106c0820152845180516106e08301526020810151610700830152506020850151805161072083015260208101516107408301525060408501518051610760830152602081015161078083015250606085015180516107a083015260208101516107c083015250608085015180516107e08301526020810151610800830152505f82526108408220825282825106606085015260208220825282825106608085015260a085015180518252602081015160208301525060608220808352838106855283818209848282099150806020870152508060408601525060c085015180518252602081015160208301525060e085015180516040830152602081015160608301525061010085015180516080830152602081015160a083015250610120850151805160c0830152602081015160e0830152506101408501518051610100830152602081015161012083015250610160822082528282510660a08501526101a085015181526101c085015160208201526101e085015160408201526102008501516060820152610220850151608082015261024085015160a082015261026085015160c082015261028085015160e08201526102a08501516101008201526102c0850151610120820152610160822082528282510660c08501526101608501518051825260208101516020830152506101808501518051604083015260208101516060830152505060a0812082810660e08501525050509392505050565b610ad6611f33565b816201000003610cad576040518060600160405280601081526020017f30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c10018152602001604051806101600160405280600181526020017eeeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b781526020017f2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb81526020017f086812a00ac43ea801669c640171203c41a496671bfbc065ac8db24d52cf31e581526020017f2d965651cdd9e4811f4e51b80ddca8a8b4a93ee17420aae6adaa01c2617c6e8581526020017f12597a56c2e438620b9041b98992ae0d4e705b780057bf7766a2767cece16e1d81526020017f02d94117cd17bcf1290fd67c01155dd40807857dff4a5a0b4dc67befa8aa34fd81526020017f15ee2475bee517c4ee05e51fa1ee7312a8373a0b13db8c51baf04cb2e99bd2bd81526020017e6fab49b869ae62001deac878b2667bd31bf3e28e3a2d764aa49b8d9bbdd31081526020017f2e856bf6d037708ffa4c06d4d8820f45ccadce9c5a6d178cbd573f82e0f9701181526020017f1407eee35993f2b1ad5ec6d9b8950ca3af33135d06037f871c5e33bf566dd7b48152508152509050919050565b816210000003610e86576040518060600160405280601481526020017f30644b6c9c4a72169e4daa317d25f04512ae15c53b34e8f5acd8e155d0a6c1018152602001604051806101600160405280600181526020017f26125da10a0ed06327508aba06d1e303ac616632dbed349f53422da95333785781526020017f2260e724844bca5251829353968e4915305258418357473a5c1d597f613f6cbd81526020017f2087ea2cd664278608fb0ebdb820907f598502c81b6690c185e2bf15cb935f4281526020017f19ddbcaf3a8d46c15c0176fbb5b95e4dc57088ff13f4d1bd84c6bfa57dcdc0e081526020017f05a2c85cfc591789605cae818e37dd4161eef9aa666bec6fe4288d09e6d2341881526020017f11f70e5363258ff4f0d716a653e1dc41f1c64484d7f4b6e219d6377614a3905c81526020017f29e84143f5870d4776a92df8da8c6c9303d59088f37ba85f40cf6fd14265b4bc81526020017f1bf82deba7d74902c3708cc6e70e61f30512eca95655210e276e5858ce8f58e581526020017f22b94b2e2b0043d04e662d5ec018ea1c8a99a23a62c9eb46f0318f6a194985f081526020017f29969d8d5363bef1101a68e446a14e1da7ba9294e142a146a980fddb4d4d41a58152508152509050919050565b8160200361105c576040518060600160405280600581526020017f2ee12bff4a2813286a8dc388cd754d9a3ef2490635eba50cb9c2e5e7508000018152602001604051806101600160405280600181526020017f09c532c6306b93d29678200d47c0b2a99c18d51b838eeb1d3eed4c533bb512d081526020017f21082ca216cbbf4e1c6e4f4594dd508c996dfbe1174efb98b11509c6e306460b81526020017f1277ae6415f0ef18f2ba5fb162c39eb7311f386e2d26d64401f4a25da77c253b81526020017f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8081526020017f2fbd4dd2976be55d1a163aa9820fb88dfac5ddce77e1872e90632027327a5ebe81526020017f107aab49e65a67f9da9cd2abf78be38bd9dc1d5db39f81de36bcfa5b4b03904381526020017ee14b6364a47e9c4284a9f80a5fc41cd212b0d4dbf8a5703770a40a9a34399081526020017f30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f70363681526020017f22399c34139bffada8de046aac50c9628e3517a3a452795364e777cd65bb9f4881526020017f2290ee31c482cf92b79b1944db1c0147635e9004db8c3b9d13644bef31ec3bd38152508152509050919050565b60405163e2ef09e560e01b815260040160405180910390fd5b61109660405180606001604052805f81526020015f81526020015f81525090565b6110a08484611699565b8082526110b090859085906116ea565b602082015280516110c690859084908690611759565b60408201529392505050565b604080518082019091525f80825260208201526110ed611f57565b8351815260208085015190820152604081018390525f60608360808460076107d05a03fa9050808061111d575f80fd5b508061116b5760405162461bcd60e51b815260206004820152601960248201527f426e3235343a207363616c6172206d756c206661696c656421000000000000006044820152606401610290565b505092915050565b604080518082019091525f808252602082015261118e611f75565b8351815260208085015181830152835160408301528301516060808301919091525f908360c08460066107d05a03fa905080806111c9575f80fd5b508061116b5760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a2067726f7570206164646974696f6e206661696c6564210000006044820152606401610290565b604080518082019091525f8082526020820152604080518082019091525f80825260208201525f61124a878787876118a8565b90505f8051602061249e8339815191525f611266888789611d72565b9050611272818361244b565b60c08901516101a08801519192509081908490819083098408925061129e8561033c8a5f0151846110d2565b955083828209905083846101c08a01518309840892506112c68661033c8a60200151846110d2565b955083828209905083846101e08a01518309840892506112ee8661033c8a60400151846110d2565b955083828209905083846102008a01518309840892506113168661033c8a60600151846110d2565b955083828209905083846102208a015183098408925061133e8661033c8a60800151846110d2565b955083828209905083846102408a01518309840892506113668661033c8d60400151846110d2565b955083828209905083846102608a015183098408925061138e8661033c8d60600151846110d2565b955083828209905083846102808a01518309840892506113b68661033c8d60800151846110d2565b955083828209905083846102a08a01518309840892506113de8661033c8d60a00151846110d2565b95505f8a60e00151905084856102c08b01518309850893506114088761033c8b60a00151846110d2565b965061143e6114386040805180820182525f80825260209182015281518083019092526001825260029082015290565b856110d2565b975050505050505094509492505050565b604080518082019091525f8082526020820152815160208301511590151615611476575090565b6040518060400160405280835f015181526020017f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4784602001516114ba919061247e565b6114e4907f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4761244b565b905292915050565b61151360405180608001604052805f81526020015f81526020015f81526020015f81525090565b60405180608001604052807f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa81526020017f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b815250905090565b5f805f6040518751815260208801516020820152602087015160408201528651606082015260608701516080820152604087015160a0820152855160c0820152602086015160e0820152602085015161010082015284516101208201526060850151610140820152604085015161016082015260205f6101808360085afa9150505f5191508061168b5760405162461bcd60e51b815260206004820152601c60248201527f426e3235343a2050616972696e6720636865636b206661696c656421000000006044820152606401610290565b50151590505b949350505050565b81515f905f8051602061249e833981519152908380156116da578493505f5b828110156116ce578385860994506001016116b8565b506001840393506116e1565b6001830393505b50505092915050565b5f826001036116fb575060016100f5565b815f0361170957505f6100f5565b60208401515f8051602061249e833981519152905f908281860990508580156117375760018703925061173e565b6001840392505b5061174882611e5d565b915082828209979650505050505050565b5f5f8051602061249e8339815191528282036117d25760015f5b600b8110156117c7578186036117a4578681600b811061179557611795612437565b60200201519350505050611691565b82806117b2576117b261246a565b60408901516020015183099150600101611773565b505f92505050611691565b6117da611f93565b60408701516001610140838101828152920190805b600b81101561181c5760208403935085868a85518903088309808552601f199093019291506001016117ef565b505050505f805f90506001838960408c01515f5b600b811015611870578882518a85518c88518a0909098981880896505088898d84518c030886099450602093840193928301929190910190600101611830565b50505050809250505f61188283611e5d565b905060208a015185818909965050848187099550848287099a9950505050505050505050565b604080518082019091525f80825260208201525f805f805f5f8051602061249e833981519152905060808901518160208a015160208c0151099550895194508160a08b015160608c0151099350816101a089015185089250818184089250818584099450817f2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a85099250816101c089015184089250818184089250818584099450817f1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb02585099250816101e089015184089250818184089250818584099450817f2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a850992508161020089015184089250818184089250818584099450817f2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e88185099250816102208901518408925081818408925050808483099350808486089450611a158760a00151866110d2565b9550885160608a015160808b0151838284099750836102c08b015189099750836102408b015183099550836101a08b015187089550838187089550838689099750836102608b015183099550836101c08b015187089550838187089550838689099750836102808b015183099550836101e08b015187089550838187089550838689099750836102a08b015183099550836102008b015187089550838187089550505050808386099450611adc8661033c8c60c001518885611ad7919061244b565b6110d2565b9550611af58661033c8c60e001518a6101a001516110d2565b9550611b0f8661033c8c61010001518a6101c001516110d2565b9550611b298661033c8c61012001518a6101e001516110d2565b9550611b438661033c8c61014001518a61020001516110d2565b9550806101c08801516101a0890151099250611b688661033c8c6101600151866110d2565b9550806102008801516101e0890151099250611b8d8661033c8c6101800151866110d2565b95506101a08701519250808384099150808283099150808284099250611bbc8661033c8c6101e00151866110d2565b95506101c08701519250808384099150808283099150808284099250611beb8661033c8c6102000151866110d2565b95506101e08701519250808384099150808283099150808284099250611c1a8661033c8c6102200151866110d2565b95506102008701519250808384099150808283099150808284099250611c498661033c8c6102400151866110d2565b9550611c668661033c8c6101a00151611ad78b6102200151611efe565b9550611c77868b6101c00151611173565b9550806101c08801516101a0890151099250806101e08801518409925080610200880151840992508061022088015184099250611cbd8661033c8c6102600151866110d2565b9550611ccb885f0151611efe565b9450611cdf8661033c8960c00151886110d2565b955080600189510860a08a0151909350819080099150808284099250808386099450611d138661033c8960e00151886110d2565b9550808386099450611d2e8661033c896101000151886110d2565b9550808386099450611d498661033c896101200151886110d2565b9550808386099450611d648661033c896101400151886110d2565b9a9950505050505050505050565b5f805f8051602061249e83398151915290505f836020015190505f846040015190505f60019050606088015160808901516101a08901516102408a01518788898387098a868608088609945050506101c08901516102608a01518788898387098a868608088609945050506101e08901516102808a01518788898387098a868608088609945050506102008901516102a08a01518788898387098a8686080886099450505061022089015191506102c0890151868782898587080985099350505050875160208901518586868309870385089650508485838309860387089998505050505050505050565b5f805f5f8051602061249e833981519152905060405160208152602080820152602060408201528460608201526002820360808201528160a082015260205f60c08360055afa9250505f51925081611ef75760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a20706f7720707265636f6d70696c65206661696c6564210000006044820152606401610290565b5050919050565b5f611f165f8051602061249e8339815191528361247e565b611f2d905f8051602061249e83398151915261244b565b92915050565b60405180606001604052805f81526020015f8152602001611f52611f93565b905290565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b604051806101600160405280600b906020820280368337509192915050565b634e487b7160e01b5f52604160045260245ffd5b6040516102e0810167ffffffffffffffff81118282101715611fea57611fea611fb2565b60405290565b6040516102c0810167ffffffffffffffff81118282101715611fea57611fea611fb2565b5f60408284031215612024575f80fd5b6040516040810181811067ffffffffffffffff8211171561204757612047611fb2565b604052823581526020928301359281019290925250919050565b5f82601f830112612070575f80fd5b60405161016080820182811067ffffffffffffffff8211171561209557612095611fb2565b604052830181858211156120a7575f80fd5b845b828110156120c15780358252602091820191016120a9565b509195945050505050565b5f61048082840312156120dd575f80fd5b6120e5611fc6565b90506120f18383612014565b81526121008360408401612014565b60208201526121128360808401612014565b60408201526121248360c08401612014565b606082015261010061213884828501612014565b608083015261014061214c85828601612014565b60a084015261018061216086828701612014565b60c08501526101c061217487828801612014565b60e086015261020061218888828901612014565b85870152610240945061219d88868901612014565b6101208701526102806121b289828a01612014565b858801526102c094506121c789868a01612014565b6101608801526121db896103008a01612014565b848801526103408801356101a0880152610360880135838801526103808801356101e08801526103a0880135828801526103c08801356102208801526103e08801358688015261040088013561026088015261042088013581880152505050506104408401356102a084015261046084013581840152505092915050565b5f805f838503610ae081121561226d575f80fd5b6105008082121561227c575f80fd5b612284611ff0565b915085358252602086013560208301526122a18760408801612014565b60408301526122b38760808801612014565b60608301526122c58760c08801612014565b60808301526101006122d988828901612014565b60a08401526101406122ed89828a01612014565b60c08501526101806123018a828b01612014565b60e08601526101c06123158b828c01612014565b84870152610200935061232a8b858c01612014565b61012087015261024061233f8c828d01612014565b8488015261028093506123548c858d01612014565b6101608801526123688c6102c08d01612014565b8388015261237a8c6103008d01612014565b6101a088015261238e8c6103408d01612014565b828801526123a08c6103808d01612014565b6101e08801526123b48c6103c08d01612014565b858801526123c68c6104008d01612014565b6102208801526123da8c6104408d01612014565b818801525050506123ef896104808a01612014565b6102608501526104c08801358185015250506104e08601356102a083015281945061241c87828801612061565b9350505061242e8561066086016120cc565b90509250925092565b634e487b7160e01b5f52603260045260245ffd5b81810381811115611f2d57634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f8261249857634e487b7160e01b5f52601260045260245ffd5b50069056fe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a164736f6c6343000817000a /// ``` #[rustfmt::skip] #[allow(clippy::all)] pub static BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( - b"a\"\xA4a\x005`\x0B\x82\x82\x829\x80Q_\x1A`s\x14a\0)WcNH{q`\xE0\x1B_R_`\x04R`$_\xFD[0_R`s\x81S\x82\x81\xF3\xFEs\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\x046\x10a\x004W_5`\xE0\x1C\x80c\xCESzw\x14a\08W[_\x80\xFD[a\0Ka\0F6`\x04a 3V[a\0_V[`@Q\x90\x15\x15\x81R` \x01`@Q\x80\x91\x03\x90\xF3[_a\0i\x82a\0\xD0V[a\0y\x83_[` \x02\x01Qa\x02\x0BV[a\0\x84\x83`\x01a\0oV[a\0\x8F\x83`\x02a\0oV[a\0\x9A\x83`\x03a\0oV[a\0\xA5\x83`\x04a\0oV[a\0\xB0\x83`\x05a\0oV[a\0\xBB\x83`\x06a\0oV[a\0\xC6\x84\x84\x84a\x02qV[\x90P[\x93\x92PPPV[\x80Qa\0\xDB\x90a\x04eV[a\0\xE8\x81` \x01Qa\x04eV[a\0\xF5\x81`@\x01Qa\x04eV[a\x01\x02\x81``\x01Qa\x04eV[a\x01\x0F\x81`\x80\x01Qa\x04eV[a\x01\x1C\x81`\xA0\x01Qa\x04eV[a\x01)\x81`\xC0\x01Qa\x04eV[a\x016\x81`\xE0\x01Qa\x04eV[a\x01D\x81a\x01\0\x01Qa\x04eV[a\x01R\x81a\x01 \x01Qa\x04eV[a\x01`\x81a\x01@\x01Qa\x04eV[a\x01n\x81a\x01`\x01Qa\x04eV[a\x01|\x81a\x01\x80\x01Qa\x04eV[a\x01\x8A\x81a\x01\xA0\x01Qa\x02\x0BV[a\x01\x98\x81a\x01\xC0\x01Qa\x02\x0BV[a\x01\xA6\x81a\x01\xE0\x01Qa\x02\x0BV[a\x01\xB4\x81a\x02\0\x01Qa\x02\x0BV[a\x01\xC2\x81a\x02 \x01Qa\x02\x0BV[a\x01\xD0\x81a\x02@\x01Qa\x02\x0BV[a\x01\xDE\x81a\x02`\x01Qa\x02\x0BV[a\x01\xEC\x81a\x02\x80\x01Qa\x02\x0BV[a\x01\xFA\x81a\x02\xA0\x01Qa\x02\x0BV[a\x02\x08\x81a\x02\xC0\x01Qa\x02\x0BV[PV[_\x80Q` a\"x\x839\x81Q\x91R\x81\x10\x80a\x02mW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[PPV[_\x83` \x01Q`\x07\x14a\x02\x97W`@Qc \xFA\x9D\x89`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_a\x02\xA3\x85\x85\x85a\x05\x13V[\x90P_a\x02\xB2\x86_\x01Qa\nsV[\x90P_a\x02\xC4\x82\x84`\xA0\x01Q\x88a\x0EQV[\x90Pa\x02\xE1`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01Ra\x03\x15\x87a\x01`\x01Qa\x03\x10\x89a\x01\x80\x01Q\x88`\xE0\x01Qa\x0E\xAEV[a\x0FOV[\x91P_\x80a\x03%\x8B\x88\x87\x8Ca\x0F\xF3V[\x91P\x91Pa\x036\x81a\x03\x10\x84a\x12+V[\x92Pa\x03O\x83a\x03\x10\x8Ba\x01`\x01Q\x8A`\xA0\x01Qa\x0E\xAEV[`\xA0\x88\x01Q`@\x88\x01Q` \x01Q\x91\x94P_\x80Q` a\"x\x839\x81Q\x91R\x91\x82\x90\x82\t\x90P\x81`\xE0\x8A\x01Q\x82\t\x90Pa\x03\x92\x85a\x03\x10\x8Da\x01\x80\x01Q\x84a\x0E\xAEV[\x94P_`@Q\x80`\x80\x01`@R\x80\x7F\x01\x18\xC4\xD5\xB87\xBC\xC2\xBC\x89\xB5\xB3\x98\xB5\x97N\x9FYD\x07;2\x07\x8B~#\x1F\xEC\x93\x88\x83\xB0\x81R` \x01\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1\x81R` \x01\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U\x81R` \x01\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4\x81RP\x90Pa\x04S\x87\x82a\x04F\x89a\x12+V[a\x04Na\x12\xC8V[a\x13\x95V[\x9E\x9DPPPPPPPPPPPPPPV[\x80Q` \x82\x01Q_\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x15\x90\x15\x16\x15a\x04\x9EWPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x05\x0EW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7FBn254: invalid G1 point\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x02dV[PPPV[a\x05S`@Q\x80a\x01\0\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81RP\x90V[__\x80Q` a\"x\x839\x81Q\x91R\x90P`@Q` \x81\x01_\x81R`\xFE`\xE0\x1B\x81R\x86Q`\xC0\x1B`\x04\x82\x01R` \x87\x01Q`\xC0\x1B`\x0C\x82\x01Ra\x02\x80\x87\x01Q` \x82\x01Ra\x02\xA0\x87\x01Q`@\x82\x01R`\x01``\x82\x01R\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85\x81R` \x01\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D\x81R` \x01\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD\x81RP\x81RP\x90P\x91\x90PV[\x81b\x10\0\0\x03a\x0C\xFAW`@Q\x80``\x01`@R\x80`\x14\x81R` \x01\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x81R` \x01`@Q\x80`\xE0\x01`@R\x80`\x01\x81R` \x01\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW\x81R` \x01\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD\x81R` \x01\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B\x81R` \x01\x7F\x19\xDD\xBC\xAF:\x8DF\xC1\\\x01v\xFB\xB5\xB9^M\xC5p\x88\xFF\x13\xF4\xD1\xBD\x84\xC6\xBF\xA5}\xCD\xC0\xE0\x81R` \x01\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18\x81R` \x01\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\\x81RP\x81RP\x90P\x91\x90PV[\x81` \x03a\x0E8W`@Q\x80``\x01`@R\x80`\x05\x81R` \x01\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x81R` \x01`@Q\x80`\xE0\x01`@R\x80`\x01\x81R` \x01\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0\x81R` \x01\x7F!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B\x81R` \x01\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;\x81R` \x01\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80\x81R` \x01\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE\x81R` \x01\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C\x81RP\x81RP\x90P\x91\x90PV[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0Er`@Q\x80``\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81RP\x90V[a\x0E|\x84\x84a\x14uV[\x80\x82Ra\x0E\x8C\x90\x85\x90\x85\x90a\x14\xC6V[` \x82\x01R\x80Qa\x0E\xA2\x90\x85\x90\x84\x90\x86\x90a\x155V[`@\x82\x01R\x93\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01Ra\x0E\xC9a\x1D2V[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R_``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80a\x0E\xF9W_\x80\xFD[P\x80a\x0FGW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x19`$\x82\x01R\x7FBn254: scalar mul failed!\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x02dV[PP\x92\x91PPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01Ra\x0Fja\x1DPV[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R_\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80a\x0F\xA5W_\x80\xFD[P\x80a\x0FGW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\x02dV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R_a\x10&\x87\x87\x87\x87a\x16\x83V[\x90P_\x80Q` a\"x\x839\x81Q\x91R_a\x10B\x88\x87\x89a\x1BMV[\x90Pa\x10N\x81\x83a\"%V[`\xC0\x89\x01Qa\x01\xA0\x88\x01Q\x91\x92P\x90\x81\x90\x84\x90\x81\x90\x83\t\x84\x08\x92Pa\x10z\x85a\x03\x10\x8A_\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xC0\x8A\x01Q\x83\t\x84\x08\x92Pa\x10\xA2\x86a\x03\x10\x8A` \x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xE0\x8A\x01Q\x83\t\x84\x08\x92Pa\x10\xCA\x86a\x03\x10\x8A`@\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\0\x8A\x01Q\x83\t\x84\x08\x92Pa\x10\xF2\x86a\x03\x10\x8A``\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02 \x8A\x01Q\x83\t\x84\x08\x92Pa\x11\x1A\x86a\x03\x10\x8A`\x80\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02@\x8A\x01Q\x83\t\x84\x08\x92Pa\x11B\x86a\x03\x10\x8D`@\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02`\x8A\x01Q\x83\t\x84\x08\x92Pa\x11j\x86a\x03\x10\x8D``\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\x80\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\x92\x86a\x03\x10\x8D`\x80\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\xA0\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\xBA\x86a\x03\x10\x8D`\xA0\x01Q\x84a\x0E\xAEV[\x95P_\x8A`\xE0\x01Q\x90P\x84\x85a\x02\xC0\x8B\x01Q\x83\t\x85\x08\x93Pa\x11\xE4\x87a\x03\x10\x8B`\xA0\x01Q\x84a\x0E\xAEV[\x96Pa\x12\x1Aa\x12\x14`@\x80Q\x80\x82\x01\x82R_\x80\x82R` \x91\x82\x01R\x81Q\x80\x83\x01\x90\x92R`\x01\x82R`\x02\x90\x82\x01R\x90V[\x85a\x0E\xAEV[\x97PPPPPPP\x94P\x94\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a\x12RWP\x90V[`@Q\x80`@\x01`@R\x80\x83_\x01Q\x81R` \x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x84` \x01Qa\x12\x96\x91\x90a\"XV[a\x12\xC0\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDGa\"%V[\x90R\x92\x91PPV[a\x12\xEF`@Q\x80`\x80\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[_\x80_`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` _a\x01\x80\x83`\x08Z\xFA\x91PP_Q\x91P\x80a\x14gW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R\x7FBn254: Pairing check failed!\0\0\0\0`D\x82\x01R`d\x01a\x02dV[P\x15\x15\x90P[\x94\x93PPPPV[\x81Q_\x90_\x80Q` a\"x\x839\x81Q\x91R\x90\x83\x80\x15a\x14\xB6W\x84\x93P_[\x82\x81\x10\x15a\x14\xAAW\x83\x85\x86\t\x94P`\x01\x01a\x14\x94V[P`\x01\x84\x03\x93Pa\x14\xBDV[`\x01\x83\x03\x93P[PPP\x92\x91PPV[_\x82`\x01\x03a\x14\xD7WP`\x01a\0\xC9V[\x81_\x03a\x14\xE5WP_a\0\xC9V[` \x84\x01Q_\x80Q` a\"x\x839\x81Q\x91R\x90_\x90\x82\x81\x86\t\x90P\x85\x80\x15a\x15\x13W`\x01\x87\x03\x92Pa\x15\x1AV[`\x01\x84\x03\x92P[Pa\x15$\x82a\x1C8V[\x91P\x82\x82\x82\t\x97\x96PPPPPPPV[__\x80Q` a\"x\x839\x81Q\x91R\x82\x82\x03a\x15\xAEW`\x01_[`\x07\x81\x10\x15a\x15\xA3W\x81\x86\x03a\x15\x80W\x86\x81`\x07\x81\x10a\x15qWa\x15qa\"\x11V[` \x02\x01Q\x93PPPPa\x14mV[\x82\x80a\x15\x8EWa\x15\x8Ea\"DV[`@\x89\x01Q` \x01Q\x83\t\x91P`\x01\x01a\x15OV[P_\x92PPPa\x14mV[a\x15\xB6a\x1DnV[`@\x87\x01Q`\x01`\xC0\x83\x81\x01\x82\x81R\x92\x01\x90\x80[`\x07\x81\x10\x15a\x15\xF7W` \x84\x03\x93P\x85\x86\x8A\x85Q\x89\x03\x08\x83\t\x80\x85R`\x1F\x19\x90\x93\x01\x92\x91P`\x01\x01a\x15\xCAV[PPPP_\x80_\x90P`\x01\x83\x89`@\x8C\x01Q_[`\x07\x81\x10\x15a\x16KW\x88\x82Q\x8A\x85Q\x8C\x88Q\x8A\t\t\t\x89\x81\x88\x08\x96PP\x88\x89\x8D\x84Q\x8C\x03\x08\x86\t\x94P` \x93\x84\x01\x93\x92\x83\x01\x92\x91\x90\x91\x01\x90`\x01\x01a\x16\x0BV[PPPP\x80\x92PP_a\x16]\x83a\x1C8V[\x90P` \x8A\x01Q\x85\x81\x89\t\x96PP\x84\x81\x87\t\x95P\x84\x82\x87\t\x9A\x99PPPPPPPPPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R_\x80_\x80__\x80Q` a\"x\x839\x81Q\x91R\x90P`\x80\x89\x01Q\x81` \x8A\x01Q` \x8C\x01Q\t\x95P\x89Q\x94P\x81`\xA0\x8B\x01Q``\x8C\x01Q\t\x93P\x81a\x01\xA0\x89\x01Q\x85\x08\x92P\x81\x81\x84\x08\x92P\x81\x85\x84\t\x94P\x81\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85\x81R` \x01\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D\x81R` \x01\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD\x81R` \x01\x7F\x15\xEE$u\xBE\xE5\x17\xC4\xEE\x05\xE5\x1F\xA1\xEEs\x12\xA87:\x0B\x13\xDB\x8CQ\xBA\xF0L\xB2\xE9\x9B\xD2\xBD\x81R` \x01~o\xABI\xB8i\xAEb\0\x1D\xEA\xC8x\xB2f{\xD3\x1B\xF3\xE2\x8E:-vJ\xA4\x9B\x8D\x9B\xBD\xD3\x10\x81R` \x01\x7F.\x85k\xF6\xD07p\x8F\xFAL\x06\xD4\xD8\x82\x0FE\xCC\xAD\xCE\x9CZm\x17\x8C\xBDW?\x82\xE0\xF9p\x11\x81R` \x01\x7F\x14\x07\xEE\xE3Y\x93\xF2\xB1\xAD^\xC6\xD9\xB8\x95\x0C\xA3\xAF3\x13]\x06\x03\x7F\x87\x1C^3\xBFVm\xD7\xB4\x81RP\x81RP\x90P\x91\x90PV[\x81b\x10\0\0\x03a\x0E\x86W`@Q\x80``\x01`@R\x80`\x14\x81R` \x01\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x81R` \x01`@Q\x80a\x01`\x01`@R\x80`\x01\x81R` \x01\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW\x81R` \x01\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD\x81R` \x01\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B\x81R` \x01\x7F\x19\xDD\xBC\xAF:\x8DF\xC1\\\x01v\xFB\xB5\xB9^M\xC5p\x88\xFF\x13\xF4\xD1\xBD\x84\xC6\xBF\xA5}\xCD\xC0\xE0\x81R` \x01\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18\x81R` \x01\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\\x81R` \x01\x7F)\xE8AC\xF5\x87\rGv\xA9-\xF8\xDA\x8Cl\x93\x03\xD5\x90\x88\xF3{\xA8_@\xCFo\xD1Be\xB4\xBC\x81R` \x01\x7F\x1B\xF8-\xEB\xA7\xD7I\x02\xC3p\x8C\xC6\xE7\x0Ea\xF3\x05\x12\xEC\xA9VU!\x0E'nXX\xCE\x8FX\xE5\x81R` \x01\x7F\"\xB9K.+\0C\xD0Nf-^\xC0\x18\xEA\x1C\x8A\x99\xA2:b\xC9\xEBF\xF01\x8Fj\x19I\x85\xF0\x81R` \x01\x7F)\x96\x9D\x8DSc\xBE\xF1\x10\x1Ah\xE4F\xA1N\x1D\xA7\xBA\x92\x94\xE1B\xA1F\xA9\x80\xFD\xDBMMA\xA5\x81RP\x81RP\x90P\x91\x90PV[\x81` \x03a\x10\\W`@Q\x80``\x01`@R\x80`\x05\x81R` \x01\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x81R` \x01`@Q\x80a\x01`\x01`@R\x80`\x01\x81R` \x01\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0\x81R` \x01\x7F!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B\x81R` \x01\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;\x81R` \x01\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80\x81R` \x01\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE\x81R` \x01\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C\x81R` \x01~\xE1Kcd\xA4~\x9CB\x84\xA9\xF8\n_\xC4\x1C\xD2\x12\xB0\xD4\xDB\xF8\xA5p7p\xA4\n\x9A49\x90\x81R` \x01\x7F0dNr\xE11\xA0)\x04\x8Bn\x19?\xD8A\x04\\\xEA$\xF6\xFDsk\xEC#\x12\x04p\x8Fp66\x81R` \x01\x7F\"9\x9C4\x13\x9B\xFF\xAD\xA8\xDE\x04j\xACP\xC9b\x8E5\x17\xA3\xA4RySd\xE7w\xCDe\xBB\x9FH\x81R` \x01\x7F\"\x90\xEE1\xC4\x82\xCF\x92\xB7\x9B\x19D\xDB\x1C\x01Gc^\x90\x04\xDB\x8C;\x9D\x13dK\xEF1\xEC;\xD3\x81RP\x81RP\x90P\x91\x90PV[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x10\x96`@Q\x80``\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81RP\x90V[a\x10\xA0\x84\x84a\x16\x99V[\x80\x82Ra\x10\xB0\x90\x85\x90\x85\x90a\x16\xEAV[` \x82\x01R\x80Qa\x10\xC6\x90\x85\x90\x84\x90\x86\x90a\x17YV[`@\x82\x01R\x93\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01Ra\x10\xEDa\x1FWV[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R_``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80a\x11\x1DW_\x80\xFD[P\x80a\x11kW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x19`$\x82\x01R\x7FBn254: scalar mul failed!\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x02\x90V[PP\x92\x91PPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01Ra\x11\x8Ea\x1FuV[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R_\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80a\x11\xC9W_\x80\xFD[P\x80a\x11kW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\x02\x90V[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R_a\x12J\x87\x87\x87\x87a\x18\xA8V[\x90P_\x80Q` a$\x9E\x839\x81Q\x91R_a\x12f\x88\x87\x89a\x1DrV[\x90Pa\x12r\x81\x83a$KV[`\xC0\x89\x01Qa\x01\xA0\x88\x01Q\x91\x92P\x90\x81\x90\x84\x90\x81\x90\x83\t\x84\x08\x92Pa\x12\x9E\x85a\x03<\x8A_\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xC0\x8A\x01Q\x83\t\x84\x08\x92Pa\x12\xC6\x86a\x03<\x8A` \x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xE0\x8A\x01Q\x83\t\x84\x08\x92Pa\x12\xEE\x86a\x03<\x8A`@\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\0\x8A\x01Q\x83\t\x84\x08\x92Pa\x13\x16\x86a\x03<\x8A``\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02 \x8A\x01Q\x83\t\x84\x08\x92Pa\x13>\x86a\x03<\x8A`\x80\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02@\x8A\x01Q\x83\t\x84\x08\x92Pa\x13f\x86a\x03<\x8D`@\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02`\x8A\x01Q\x83\t\x84\x08\x92Pa\x13\x8E\x86a\x03<\x8D``\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\x80\x8A\x01Q\x83\t\x84\x08\x92Pa\x13\xB6\x86a\x03<\x8D`\x80\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\xA0\x8A\x01Q\x83\t\x84\x08\x92Pa\x13\xDE\x86a\x03<\x8D`\xA0\x01Q\x84a\x10\xD2V[\x95P_\x8A`\xE0\x01Q\x90P\x84\x85a\x02\xC0\x8B\x01Q\x83\t\x85\x08\x93Pa\x14\x08\x87a\x03<\x8B`\xA0\x01Q\x84a\x10\xD2V[\x96Pa\x14>a\x148`@\x80Q\x80\x82\x01\x82R_\x80\x82R` \x91\x82\x01R\x81Q\x80\x83\x01\x90\x92R`\x01\x82R`\x02\x90\x82\x01R\x90V[\x85a\x10\xD2V[\x97PPPPPPP\x94P\x94\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a\x14vWP\x90V[`@Q\x80`@\x01`@R\x80\x83_\x01Q\x81R` \x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x84` \x01Qa\x14\xBA\x91\x90a$~V[a\x14\xE4\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDGa$KV[\x90R\x92\x91PPV[a\x15\x13`@Q\x80`\x80\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[_\x80_`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` _a\x01\x80\x83`\x08Z\xFA\x91PP_Q\x91P\x80a\x16\x8BW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R\x7FBn254: Pairing check failed!\0\0\0\0`D\x82\x01R`d\x01a\x02\x90V[P\x15\x15\x90P[\x94\x93PPPPV[\x81Q_\x90_\x80Q` a$\x9E\x839\x81Q\x91R\x90\x83\x80\x15a\x16\xDAW\x84\x93P_[\x82\x81\x10\x15a\x16\xCEW\x83\x85\x86\t\x94P`\x01\x01a\x16\xB8V[P`\x01\x84\x03\x93Pa\x16\xE1V[`\x01\x83\x03\x93P[PPP\x92\x91PPV[_\x82`\x01\x03a\x16\xFBWP`\x01a\0\xF5V[\x81_\x03a\x17\tWP_a\0\xF5V[` \x84\x01Q_\x80Q` a$\x9E\x839\x81Q\x91R\x90_\x90\x82\x81\x86\t\x90P\x85\x80\x15a\x177W`\x01\x87\x03\x92Pa\x17>V[`\x01\x84\x03\x92P[Pa\x17H\x82a\x1E]V[\x91P\x82\x82\x82\t\x97\x96PPPPPPPV[__\x80Q` a$\x9E\x839\x81Q\x91R\x82\x82\x03a\x17\xD2W`\x01_[`\x0B\x81\x10\x15a\x17\xC7W\x81\x86\x03a\x17\xA4W\x86\x81`\x0B\x81\x10a\x17\x95Wa\x17\x95a$7V[` \x02\x01Q\x93PPPPa\x16\x91V[\x82\x80a\x17\xB2Wa\x17\xB2a$jV[`@\x89\x01Q` \x01Q\x83\t\x91P`\x01\x01a\x17sV[P_\x92PPPa\x16\x91V[a\x17\xDAa\x1F\x93V[`@\x87\x01Q`\x01a\x01@\x83\x81\x01\x82\x81R\x92\x01\x90\x80[`\x0B\x81\x10\x15a\x18\x1CW` \x84\x03\x93P\x85\x86\x8A\x85Q\x89\x03\x08\x83\t\x80\x85R`\x1F\x19\x90\x93\x01\x92\x91P`\x01\x01a\x17\xEFV[PPPP_\x80_\x90P`\x01\x83\x89`@\x8C\x01Q_[`\x0B\x81\x10\x15a\x18pW\x88\x82Q\x8A\x85Q\x8C\x88Q\x8A\t\t\t\x89\x81\x88\x08\x96PP\x88\x89\x8D\x84Q\x8C\x03\x08\x86\t\x94P` \x93\x84\x01\x93\x92\x83\x01\x92\x91\x90\x91\x01\x90`\x01\x01a\x180V[PPPP\x80\x92PP_a\x18\x82\x83a\x1E]V[\x90P` \x8A\x01Q\x85\x81\x89\t\x96PP\x84\x81\x87\t\x95P\x84\x82\x87\t\x9A\x99PPPPPPPPPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R_\x80_\x80__\x80Q` a$\x9E\x839\x81Q\x91R\x90P`\x80\x89\x01Q\x81` \x8A\x01Q` \x8C\x01Q\t\x95P\x89Q\x94P\x81`\xA0\x8B\x01Q``\x8C\x01Q\t\x93P\x81a\x01\xA0\x89\x01Q\x85\x08\x92P\x81\x81\x84\x08\x92P\x81\x85\x84\t\x94P\x81\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85\x81R` \x01\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D\x81R` \x01\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD\x81RP\x81RP\x90P\x91\x90PV[\x81b\x10\0\0\x03a\x0C\xFAW`@Q\x80``\x01`@R\x80`\x14\x81R` \x01\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x81R` \x01`@Q\x80`\xE0\x01`@R\x80`\x01\x81R` \x01\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW\x81R` \x01\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD\x81R` \x01\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B\x81R` \x01\x7F\x19\xDD\xBC\xAF:\x8DF\xC1\\\x01v\xFB\xB5\xB9^M\xC5p\x88\xFF\x13\xF4\xD1\xBD\x84\xC6\xBF\xA5}\xCD\xC0\xE0\x81R` \x01\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18\x81R` \x01\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\\x81RP\x81RP\x90P\x91\x90PV[\x81` \x03a\x0E8W`@Q\x80``\x01`@R\x80`\x05\x81R` \x01\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x81R` \x01`@Q\x80`\xE0\x01`@R\x80`\x01\x81R` \x01\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0\x81R` \x01\x7F!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B\x81R` \x01\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;\x81R` \x01\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80\x81R` \x01\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE\x81R` \x01\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C\x81RP\x81RP\x90P\x91\x90PV[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0Er`@Q\x80``\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81RP\x90V[a\x0E|\x84\x84a\x14uV[\x80\x82Ra\x0E\x8C\x90\x85\x90\x85\x90a\x14\xC6V[` \x82\x01R\x80Qa\x0E\xA2\x90\x85\x90\x84\x90\x86\x90a\x155V[`@\x82\x01R\x93\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01Ra\x0E\xC9a\x1D2V[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R_``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80a\x0E\xF9W_\x80\xFD[P\x80a\x0FGW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x19`$\x82\x01R\x7FBn254: scalar mul failed!\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x02dV[PP\x92\x91PPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01Ra\x0Fja\x1DPV[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R_\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80a\x0F\xA5W_\x80\xFD[P\x80a\x0FGW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\x02dV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R_a\x10&\x87\x87\x87\x87a\x16\x83V[\x90P_\x80Q` a\"x\x839\x81Q\x91R_a\x10B\x88\x87\x89a\x1BMV[\x90Pa\x10N\x81\x83a\"%V[`\xC0\x89\x01Qa\x01\xA0\x88\x01Q\x91\x92P\x90\x81\x90\x84\x90\x81\x90\x83\t\x84\x08\x92Pa\x10z\x85a\x03\x10\x8A_\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xC0\x8A\x01Q\x83\t\x84\x08\x92Pa\x10\xA2\x86a\x03\x10\x8A` \x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xE0\x8A\x01Q\x83\t\x84\x08\x92Pa\x10\xCA\x86a\x03\x10\x8A`@\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\0\x8A\x01Q\x83\t\x84\x08\x92Pa\x10\xF2\x86a\x03\x10\x8A``\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02 \x8A\x01Q\x83\t\x84\x08\x92Pa\x11\x1A\x86a\x03\x10\x8A`\x80\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02@\x8A\x01Q\x83\t\x84\x08\x92Pa\x11B\x86a\x03\x10\x8D`@\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02`\x8A\x01Q\x83\t\x84\x08\x92Pa\x11j\x86a\x03\x10\x8D``\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\x80\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\x92\x86a\x03\x10\x8D`\x80\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\xA0\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\xBA\x86a\x03\x10\x8D`\xA0\x01Q\x84a\x0E\xAEV[\x95P_\x8A`\xE0\x01Q\x90P\x84\x85a\x02\xC0\x8B\x01Q\x83\t\x85\x08\x93Pa\x11\xE4\x87a\x03\x10\x8B`\xA0\x01Q\x84a\x0E\xAEV[\x96Pa\x12\x1Aa\x12\x14`@\x80Q\x80\x82\x01\x82R_\x80\x82R` \x91\x82\x01R\x81Q\x80\x83\x01\x90\x92R`\x01\x82R`\x02\x90\x82\x01R\x90V[\x85a\x0E\xAEV[\x97PPPPPPP\x94P\x94\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a\x12RWP\x90V[`@Q\x80`@\x01`@R\x80\x83_\x01Q\x81R` \x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x84` \x01Qa\x12\x96\x91\x90a\"XV[a\x12\xC0\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDGa\"%V[\x90R\x92\x91PPV[a\x12\xEF`@Q\x80`\x80\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[_\x80_`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` _a\x01\x80\x83`\x08Z\xFA\x91PP_Q\x91P\x80a\x14gW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R\x7FBn254: Pairing check failed!\0\0\0\0`D\x82\x01R`d\x01a\x02dV[P\x15\x15\x90P[\x94\x93PPPPV[\x81Q_\x90_\x80Q` a\"x\x839\x81Q\x91R\x90\x83\x80\x15a\x14\xB6W\x84\x93P_[\x82\x81\x10\x15a\x14\xAAW\x83\x85\x86\t\x94P`\x01\x01a\x14\x94V[P`\x01\x84\x03\x93Pa\x14\xBDV[`\x01\x83\x03\x93P[PPP\x92\x91PPV[_\x82`\x01\x03a\x14\xD7WP`\x01a\0\xC9V[\x81_\x03a\x14\xE5WP_a\0\xC9V[` \x84\x01Q_\x80Q` a\"x\x839\x81Q\x91R\x90_\x90\x82\x81\x86\t\x90P\x85\x80\x15a\x15\x13W`\x01\x87\x03\x92Pa\x15\x1AV[`\x01\x84\x03\x92P[Pa\x15$\x82a\x1C8V[\x91P\x82\x82\x82\t\x97\x96PPPPPPPV[__\x80Q` a\"x\x839\x81Q\x91R\x82\x82\x03a\x15\xAEW`\x01_[`\x07\x81\x10\x15a\x15\xA3W\x81\x86\x03a\x15\x80W\x86\x81`\x07\x81\x10a\x15qWa\x15qa\"\x11V[` \x02\x01Q\x93PPPPa\x14mV[\x82\x80a\x15\x8EWa\x15\x8Ea\"DV[`@\x89\x01Q` \x01Q\x83\t\x91P`\x01\x01a\x15OV[P_\x92PPPa\x14mV[a\x15\xB6a\x1DnV[`@\x87\x01Q`\x01`\xC0\x83\x81\x01\x82\x81R\x92\x01\x90\x80[`\x07\x81\x10\x15a\x15\xF7W` \x84\x03\x93P\x85\x86\x8A\x85Q\x89\x03\x08\x83\t\x80\x85R`\x1F\x19\x90\x93\x01\x92\x91P`\x01\x01a\x15\xCAV[PPPP_\x80_\x90P`\x01\x83\x89`@\x8C\x01Q_[`\x07\x81\x10\x15a\x16KW\x88\x82Q\x8A\x85Q\x8C\x88Q\x8A\t\t\t\x89\x81\x88\x08\x96PP\x88\x89\x8D\x84Q\x8C\x03\x08\x86\t\x94P` \x93\x84\x01\x93\x92\x83\x01\x92\x91\x90\x91\x01\x90`\x01\x01a\x16\x0BV[PPPP\x80\x92PP_a\x16]\x83a\x1C8V[\x90P` \x8A\x01Q\x85\x81\x89\t\x96PP\x84\x81\x87\t\x95P\x84\x82\x87\t\x9A\x99PPPPPPPPPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R_\x80_\x80__\x80Q` a\"x\x839\x81Q\x91R\x90P`\x80\x89\x01Q\x81` \x8A\x01Q` \x8C\x01Q\t\x95P\x89Q\x94P\x81`\xA0\x8B\x01Q``\x8C\x01Q\t\x93P\x81a\x01\xA0\x89\x01Q\x85\x08\x92P\x81\x81\x84\x08\x92P\x81\x85\x84\t\x94P\x81\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85\x81R` \x01\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D\x81R` \x01\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD\x81R` \x01\x7F\x15\xEE$u\xBE\xE5\x17\xC4\xEE\x05\xE5\x1F\xA1\xEEs\x12\xA87:\x0B\x13\xDB\x8CQ\xBA\xF0L\xB2\xE9\x9B\xD2\xBD\x81R` \x01~o\xABI\xB8i\xAEb\0\x1D\xEA\xC8x\xB2f{\xD3\x1B\xF3\xE2\x8E:-vJ\xA4\x9B\x8D\x9B\xBD\xD3\x10\x81R` \x01\x7F.\x85k\xF6\xD07p\x8F\xFAL\x06\xD4\xD8\x82\x0FE\xCC\xAD\xCE\x9CZm\x17\x8C\xBDW?\x82\xE0\xF9p\x11\x81R` \x01\x7F\x14\x07\xEE\xE3Y\x93\xF2\xB1\xAD^\xC6\xD9\xB8\x95\x0C\xA3\xAF3\x13]\x06\x03\x7F\x87\x1C^3\xBFVm\xD7\xB4\x81RP\x81RP\x90P\x91\x90PV[\x81b\x10\0\0\x03a\x0E\x86W`@Q\x80``\x01`@R\x80`\x14\x81R` \x01\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x81R` \x01`@Q\x80a\x01`\x01`@R\x80`\x01\x81R` \x01\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW\x81R` \x01\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD\x81R` \x01\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B\x81R` \x01\x7F\x19\xDD\xBC\xAF:\x8DF\xC1\\\x01v\xFB\xB5\xB9^M\xC5p\x88\xFF\x13\xF4\xD1\xBD\x84\xC6\xBF\xA5}\xCD\xC0\xE0\x81R` \x01\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18\x81R` \x01\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\\x81R` \x01\x7F)\xE8AC\xF5\x87\rGv\xA9-\xF8\xDA\x8Cl\x93\x03\xD5\x90\x88\xF3{\xA8_@\xCFo\xD1Be\xB4\xBC\x81R` \x01\x7F\x1B\xF8-\xEB\xA7\xD7I\x02\xC3p\x8C\xC6\xE7\x0Ea\xF3\x05\x12\xEC\xA9VU!\x0E'nXX\xCE\x8FX\xE5\x81R` \x01\x7F\"\xB9K.+\0C\xD0Nf-^\xC0\x18\xEA\x1C\x8A\x99\xA2:b\xC9\xEBF\xF01\x8Fj\x19I\x85\xF0\x81R` \x01\x7F)\x96\x9D\x8DSc\xBE\xF1\x10\x1Ah\xE4F\xA1N\x1D\xA7\xBA\x92\x94\xE1B\xA1F\xA9\x80\xFD\xDBMMA\xA5\x81RP\x81RP\x90P\x91\x90PV[\x81` \x03a\x10\\W`@Q\x80``\x01`@R\x80`\x05\x81R` \x01\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x81R` \x01`@Q\x80a\x01`\x01`@R\x80`\x01\x81R` \x01\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0\x81R` \x01\x7F!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B\x81R` \x01\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;\x81R` \x01\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80\x81R` \x01\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE\x81R` \x01\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C\x81R` \x01~\xE1Kcd\xA4~\x9CB\x84\xA9\xF8\n_\xC4\x1C\xD2\x12\xB0\xD4\xDB\xF8\xA5p7p\xA4\n\x9A49\x90\x81R` \x01\x7F0dNr\xE11\xA0)\x04\x8Bn\x19?\xD8A\x04\\\xEA$\xF6\xFDsk\xEC#\x12\x04p\x8Fp66\x81R` \x01\x7F\"9\x9C4\x13\x9B\xFF\xAD\xA8\xDE\x04j\xACP\xC9b\x8E5\x17\xA3\xA4RySd\xE7w\xCDe\xBB\x9FH\x81R` \x01\x7F\"\x90\xEE1\xC4\x82\xCF\x92\xB7\x9B\x19D\xDB\x1C\x01Gc^\x90\x04\xDB\x8C;\x9D\x13dK\xEF1\xEC;\xD3\x81RP\x81RP\x90P\x91\x90PV[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x10\x96`@Q\x80``\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81RP\x90V[a\x10\xA0\x84\x84a\x16\x99V[\x80\x82Ra\x10\xB0\x90\x85\x90\x85\x90a\x16\xEAV[` \x82\x01R\x80Qa\x10\xC6\x90\x85\x90\x84\x90\x86\x90a\x17YV[`@\x82\x01R\x93\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01Ra\x10\xEDa\x1FWV[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R_``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80a\x11\x1DW_\x80\xFD[P\x80a\x11kW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x19`$\x82\x01R\x7FBn254: scalar mul failed!\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x02\x90V[PP\x92\x91PPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01Ra\x11\x8Ea\x1FuV[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R_\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80a\x11\xC9W_\x80\xFD[P\x80a\x11kW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\x02\x90V[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R_a\x12J\x87\x87\x87\x87a\x18\xA8V[\x90P_\x80Q` a$\x9E\x839\x81Q\x91R_a\x12f\x88\x87\x89a\x1DrV[\x90Pa\x12r\x81\x83a$KV[`\xC0\x89\x01Qa\x01\xA0\x88\x01Q\x91\x92P\x90\x81\x90\x84\x90\x81\x90\x83\t\x84\x08\x92Pa\x12\x9E\x85a\x03<\x8A_\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xC0\x8A\x01Q\x83\t\x84\x08\x92Pa\x12\xC6\x86a\x03<\x8A` \x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xE0\x8A\x01Q\x83\t\x84\x08\x92Pa\x12\xEE\x86a\x03<\x8A`@\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\0\x8A\x01Q\x83\t\x84\x08\x92Pa\x13\x16\x86a\x03<\x8A``\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02 \x8A\x01Q\x83\t\x84\x08\x92Pa\x13>\x86a\x03<\x8A`\x80\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02@\x8A\x01Q\x83\t\x84\x08\x92Pa\x13f\x86a\x03<\x8D`@\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02`\x8A\x01Q\x83\t\x84\x08\x92Pa\x13\x8E\x86a\x03<\x8D``\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\x80\x8A\x01Q\x83\t\x84\x08\x92Pa\x13\xB6\x86a\x03<\x8D`\x80\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\xA0\x8A\x01Q\x83\t\x84\x08\x92Pa\x13\xDE\x86a\x03<\x8D`\xA0\x01Q\x84a\x10\xD2V[\x95P_\x8A`\xE0\x01Q\x90P\x84\x85a\x02\xC0\x8B\x01Q\x83\t\x85\x08\x93Pa\x14\x08\x87a\x03<\x8B`\xA0\x01Q\x84a\x10\xD2V[\x96Pa\x14>a\x148`@\x80Q\x80\x82\x01\x82R_\x80\x82R` \x91\x82\x01R\x81Q\x80\x83\x01\x90\x92R`\x01\x82R`\x02\x90\x82\x01R\x90V[\x85a\x10\xD2V[\x97PPPPPPP\x94P\x94\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a\x14vWP\x90V[`@Q\x80`@\x01`@R\x80\x83_\x01Q\x81R` \x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x84` \x01Qa\x14\xBA\x91\x90a$~V[a\x14\xE4\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDGa$KV[\x90R\x92\x91PPV[a\x15\x13`@Q\x80`\x80\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[_\x80_`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` _a\x01\x80\x83`\x08Z\xFA\x91PP_Q\x91P\x80a\x16\x8BW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R\x7FBn254: Pairing check failed!\0\0\0\0`D\x82\x01R`d\x01a\x02\x90V[P\x15\x15\x90P[\x94\x93PPPPV[\x81Q_\x90_\x80Q` a$\x9E\x839\x81Q\x91R\x90\x83\x80\x15a\x16\xDAW\x84\x93P_[\x82\x81\x10\x15a\x16\xCEW\x83\x85\x86\t\x94P`\x01\x01a\x16\xB8V[P`\x01\x84\x03\x93Pa\x16\xE1V[`\x01\x83\x03\x93P[PPP\x92\x91PPV[_\x82`\x01\x03a\x16\xFBWP`\x01a\0\xF5V[\x81_\x03a\x17\tWP_a\0\xF5V[` \x84\x01Q_\x80Q` a$\x9E\x839\x81Q\x91R\x90_\x90\x82\x81\x86\t\x90P\x85\x80\x15a\x177W`\x01\x87\x03\x92Pa\x17>V[`\x01\x84\x03\x92P[Pa\x17H\x82a\x1E]V[\x91P\x82\x82\x82\t\x97\x96PPPPPPPV[__\x80Q` a$\x9E\x839\x81Q\x91R\x82\x82\x03a\x17\xD2W`\x01_[`\x0B\x81\x10\x15a\x17\xC7W\x81\x86\x03a\x17\xA4W\x86\x81`\x0B\x81\x10a\x17\x95Wa\x17\x95a$7V[` \x02\x01Q\x93PPPPa\x16\x91V[\x82\x80a\x17\xB2Wa\x17\xB2a$jV[`@\x89\x01Q` \x01Q\x83\t\x91P`\x01\x01a\x17sV[P_\x92PPPa\x16\x91V[a\x17\xDAa\x1F\x93V[`@\x87\x01Q`\x01a\x01@\x83\x81\x01\x82\x81R\x92\x01\x90\x80[`\x0B\x81\x10\x15a\x18\x1CW` \x84\x03\x93P\x85\x86\x8A\x85Q\x89\x03\x08\x83\t\x80\x85R`\x1F\x19\x90\x93\x01\x92\x91P`\x01\x01a\x17\xEFV[PPPP_\x80_\x90P`\x01\x83\x89`@\x8C\x01Q_[`\x0B\x81\x10\x15a\x18pW\x88\x82Q\x8A\x85Q\x8C\x88Q\x8A\t\t\t\x89\x81\x88\x08\x96PP\x88\x89\x8D\x84Q\x8C\x03\x08\x86\t\x94P` \x93\x84\x01\x93\x92\x83\x01\x92\x91\x90\x91\x01\x90`\x01\x01a\x180V[PPPP\x80\x92PP_a\x18\x82\x83a\x1E]V[\x90P` \x8A\x01Q\x85\x81\x89\t\x96PP\x84\x81\x87\t\x95P\x84\x82\x87\t\x9A\x99PPPPPPPPPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R_\x80_\x80__\x80Q` a$\x9E\x839\x81Q\x91R\x90P`\x80\x89\x01Q\x81` \x8A\x01Q` \x8C\x01Q\t\x95P\x89Q\x94P\x81`\xA0\x8B\x01Q``\x8C\x01Q\t\x93P\x81a\x01\xA0\x89\x01Q\x85\x08\x92P\x81\x81\x84\x08\x92P\x81\x85\x84\t\x94P\x81\x7F/\x8D\xD1\xF1\xA7X::RustType, - pub publicInput: [alloy::sol_types::private::primitives::aliases::U256; 7usize], + pub publicInput: [alloy::sol_types::private::primitives::aliases::U256; 11usize], pub proof: ::RustType, } - ///Container type for the return parameters of the [`verify((uint256,uint256,(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),bytes32,bytes32),uint256[7],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))`](verifyCall) function. + ///Container type for the return parameters of the [`verify((uint256,uint256,(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),bytes32,bytes32),uint256[11],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))`](verifyCall) function. #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] #[derive(Clone)] pub struct verifyReturn { @@ -2793,14 +2793,14 @@ pub mod PlonkVerifier { IPlonkVerifier::VerifyingKey, alloy::sol_types::sol_data::FixedArray< alloy::sol_types::sol_data::Uint<256>, - 7usize, + 11usize, >, IPlonkVerifier::PlonkProof, ); #[doc(hidden)] type UnderlyingRustTuple<'a> = ( ::RustType, - [alloy::sol_types::private::primitives::aliases::U256; 7usize], + [alloy::sol_types::private::primitives::aliases::U256; 11usize], ::RustType, ); #[cfg(test)] @@ -2866,7 +2866,7 @@ pub mod PlonkVerifier { IPlonkVerifier::VerifyingKey, alloy::sol_types::sol_data::FixedArray< alloy::sol_types::sol_data::Uint<256>, - 7usize, + 11usize, >, IPlonkVerifier::PlonkProof, ); @@ -2874,8 +2874,8 @@ pub mod PlonkVerifier { type Return = verifyReturn; type ReturnTuple<'a> = (alloy::sol_types::sol_data::Bool,); type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "verify((uint256,uint256,(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),bytes32,bytes32),uint256[7],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))"; - const SELECTOR: [u8; 4] = [119u8, 174u8, 63u8, 7u8]; + const SIGNATURE: &'static str = "verify((uint256,uint256,(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),bytes32,bytes32),uint256[11],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))"; + const SELECTOR: [u8; 4] = [171u8, 149u8, 158u8, 227u8]; #[inline] fn new<'a>( tuple: as alloy_sol_types::SolType>::RustType, @@ -2890,7 +2890,7 @@ pub mod PlonkVerifier { ), , - 7usize, + 11usize, > as alloy_sol_types::SolType>::tokenize(&self.publicInput), ::tokenize(&self.proof), ) @@ -2919,12 +2919,12 @@ pub mod PlonkVerifier { /// No guarantees are made about the order of the selectors. /// /// Prefer using `SolInterface` methods instead. - pub const SELECTORS: &'static [[u8; 4usize]] = &[[119u8, 174u8, 63u8, 7u8]]; + pub const SELECTORS: &'static [[u8; 4usize]] = &[[171u8, 149u8, 158u8, 227u8]]; } #[automatically_derived] impl alloy_sol_types::SolInterface for PlonkVerifierCalls { const NAME: &'static str = "PlonkVerifierCalls"; - const MIN_DATA_LENGTH: usize = 672usize; + const MIN_DATA_LENGTH: usize = 800usize; const COUNT: usize = 1usize; #[inline] fn selector(&self) -> [u8; 4] { @@ -3283,7 +3283,7 @@ pub mod PlonkVerifier { pub fn verify( &self, verifyingKey: ::RustType, - publicInput: [alloy::sol_types::private::primitives::aliases::U256; 7usize], + publicInput: [alloy::sol_types::private::primitives::aliases::U256; 11usize], proof: ::RustType, ) -> alloy_contract::SolCallBuilder { self.call_builder(&verifyCall { diff --git a/contract-bindings-alloy/src/plonkverifier2.rs b/contract-bindings-alloy/src/plonkverifier2.rs deleted file mode 100644 index 12cc4014ac..0000000000 --- a/contract-bindings-alloy/src/plonkverifier2.rs +++ /dev/null @@ -1,3432 +0,0 @@ -///Module containing a contract's types and functions. -/** - -```solidity -library BN254 { - type BaseField is uint256; - type ScalarField is uint256; - struct G1Point { BaseField x; BaseField y; } -} -```*/ -#[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style, - clippy::empty_structs_with_brackets -)] -pub mod BN254 { - use super::*; - use alloy::sol_types as alloy_sol_types; - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct BaseField(alloy::sol_types::private::primitives::aliases::U256); - const _: () = { - use alloy::sol_types as alloy_sol_types; - #[automatically_derived] - impl alloy_sol_types::private::SolTypeValue - for alloy::sol_types::private::primitives::aliases::U256 - { - #[inline] - fn stv_to_tokens( - &self, - ) -> as alloy_sol_types::SolType>::Token<'_> - { - alloy_sol_types::private::SolTypeValue::< - alloy::sol_types::sol_data::Uint<256>, - >::stv_to_tokens(self) - } - #[inline] - fn stv_eip712_data_word(&self) -> alloy_sol_types::Word { - as alloy_sol_types::SolType>::tokenize(self) - .0 - } - #[inline] - fn stv_abi_encode_packed_to(&self, out: &mut alloy_sol_types::private::Vec) { - as alloy_sol_types::SolType>::abi_encode_packed_to(self, out) - } - #[inline] - fn stv_abi_packed_encoded_size(&self) -> usize { - as alloy_sol_types::SolType>::abi_encoded_size(self) - } - } - #[automatically_derived] - impl BaseField { - /// The Solidity type name. - pub const NAME: &'static str = stringify!(@ name); - /// Convert from the underlying value type. - #[inline] - pub const fn from(value: alloy::sol_types::private::primitives::aliases::U256) -> Self { - Self(value) - } - /// Return the underlying value. - #[inline] - pub const fn into(self) -> alloy::sol_types::private::primitives::aliases::U256 { - self.0 - } - /// Return the single encoding of this value, delegating to the - /// underlying type. - #[inline] - pub fn abi_encode(&self) -> alloy_sol_types::private::Vec { - ::abi_encode(&self.0) - } - /// Return the packed encoding of this value, delegating to the - /// underlying type. - #[inline] - pub fn abi_encode_packed(&self) -> alloy_sol_types::private::Vec { - ::abi_encode_packed(&self.0) - } - } - #[automatically_derived] - impl alloy_sol_types::SolType for BaseField { - type RustType = alloy::sol_types::private::primitives::aliases::U256; - type Token<'a> = - as alloy_sol_types::SolType>::Token<'a>; - const SOL_NAME: &'static str = Self::NAME; - const ENCODED_SIZE: Option = - as alloy_sol_types::SolType>::ENCODED_SIZE; - const PACKED_ENCODED_SIZE: Option = as alloy_sol_types::SolType>::PACKED_ENCODED_SIZE; - #[inline] - fn valid_token(token: &Self::Token<'_>) -> bool { - Self::type_check(token).is_ok() - } - #[inline] - fn type_check(token: &Self::Token<'_>) -> alloy_sol_types::Result<()> { - as alloy_sol_types::SolType>::type_check( - token, - ) - } - #[inline] - fn detokenize(token: Self::Token<'_>) -> Self::RustType { - as alloy_sol_types::SolType>::detokenize( - token, - ) - } - } - #[automatically_derived] - impl alloy_sol_types::EventTopic for BaseField { - #[inline] - fn topic_preimage_length(rust: &Self::RustType) -> usize { - as alloy_sol_types::EventTopic>::topic_preimage_length(rust) - } - #[inline] - fn encode_topic_preimage( - rust: &Self::RustType, - out: &mut alloy_sol_types::private::Vec, - ) { - as alloy_sol_types::EventTopic>::encode_topic_preimage(rust, out) - } - #[inline] - fn encode_topic(rust: &Self::RustType) -> alloy_sol_types::abi::token::WordToken { - as alloy_sol_types::EventTopic>::encode_topic( - rust, - ) - } - } - }; - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct ScalarField(alloy::sol_types::private::primitives::aliases::U256); - const _: () = { - use alloy::sol_types as alloy_sol_types; - #[automatically_derived] - impl alloy_sol_types::private::SolTypeValue - for alloy::sol_types::private::primitives::aliases::U256 - { - #[inline] - fn stv_to_tokens( - &self, - ) -> as alloy_sol_types::SolType>::Token<'_> - { - alloy_sol_types::private::SolTypeValue::< - alloy::sol_types::sol_data::Uint<256>, - >::stv_to_tokens(self) - } - #[inline] - fn stv_eip712_data_word(&self) -> alloy_sol_types::Word { - as alloy_sol_types::SolType>::tokenize(self) - .0 - } - #[inline] - fn stv_abi_encode_packed_to(&self, out: &mut alloy_sol_types::private::Vec) { - as alloy_sol_types::SolType>::abi_encode_packed_to(self, out) - } - #[inline] - fn stv_abi_packed_encoded_size(&self) -> usize { - as alloy_sol_types::SolType>::abi_encoded_size(self) - } - } - #[automatically_derived] - impl ScalarField { - /// The Solidity type name. - pub const NAME: &'static str = stringify!(@ name); - /// Convert from the underlying value type. - #[inline] - pub const fn from(value: alloy::sol_types::private::primitives::aliases::U256) -> Self { - Self(value) - } - /// Return the underlying value. - #[inline] - pub const fn into(self) -> alloy::sol_types::private::primitives::aliases::U256 { - self.0 - } - /// Return the single encoding of this value, delegating to the - /// underlying type. - #[inline] - pub fn abi_encode(&self) -> alloy_sol_types::private::Vec { - ::abi_encode(&self.0) - } - /// Return the packed encoding of this value, delegating to the - /// underlying type. - #[inline] - pub fn abi_encode_packed(&self) -> alloy_sol_types::private::Vec { - ::abi_encode_packed(&self.0) - } - } - #[automatically_derived] - impl alloy_sol_types::SolType for ScalarField { - type RustType = alloy::sol_types::private::primitives::aliases::U256; - type Token<'a> = - as alloy_sol_types::SolType>::Token<'a>; - const SOL_NAME: &'static str = Self::NAME; - const ENCODED_SIZE: Option = - as alloy_sol_types::SolType>::ENCODED_SIZE; - const PACKED_ENCODED_SIZE: Option = as alloy_sol_types::SolType>::PACKED_ENCODED_SIZE; - #[inline] - fn valid_token(token: &Self::Token<'_>) -> bool { - Self::type_check(token).is_ok() - } - #[inline] - fn type_check(token: &Self::Token<'_>) -> alloy_sol_types::Result<()> { - as alloy_sol_types::SolType>::type_check( - token, - ) - } - #[inline] - fn detokenize(token: Self::Token<'_>) -> Self::RustType { - as alloy_sol_types::SolType>::detokenize( - token, - ) - } - } - #[automatically_derived] - impl alloy_sol_types::EventTopic for ScalarField { - #[inline] - fn topic_preimage_length(rust: &Self::RustType) -> usize { - as alloy_sol_types::EventTopic>::topic_preimage_length(rust) - } - #[inline] - fn encode_topic_preimage( - rust: &Self::RustType, - out: &mut alloy_sol_types::private::Vec, - ) { - as alloy_sol_types::EventTopic>::encode_topic_preimage(rust, out) - } - #[inline] - fn encode_topic(rust: &Self::RustType) -> alloy_sol_types::abi::token::WordToken { - as alloy_sol_types::EventTopic>::encode_topic( - rust, - ) - } - } - }; - /**```solidity - struct G1Point { BaseField x; BaseField y; } - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct G1Point { - pub x: ::RustType, - pub y: ::RustType, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (BaseField, BaseField); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - ::RustType, - ::RustType, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: G1Point) -> Self { - (value.x, value.y) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for G1Point { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - x: tuple.0, - y: tuple.1, - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolValue for G1Point { - type SolType = Self; - } - #[automatically_derived] - impl alloy_sol_types::private::SolTypeValue for G1Point { - #[inline] - fn stv_to_tokens(&self) -> ::Token<'_> { - ( - ::tokenize(&self.x), - ::tokenize(&self.y), - ) - } - #[inline] - fn stv_abi_encoded_size(&self) -> usize { - if let Some(size) = ::ENCODED_SIZE { - return size; - } - let tuple = - as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_encoded_size(&tuple) - } - #[inline] - fn stv_eip712_data_word(&self) -> alloy_sol_types::Word { - ::eip712_hash_struct(self) - } - #[inline] - fn stv_abi_encode_packed_to(&self, out: &mut alloy_sol_types::private::Vec) { - let tuple = - as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_encode_packed_to( - &tuple, out, - ) - } - #[inline] - fn stv_abi_packed_encoded_size(&self) -> usize { - if let Some(size) = ::PACKED_ENCODED_SIZE { - return size; - } - let tuple = - as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_packed_encoded_size( - &tuple, - ) - } - } - #[automatically_derived] - impl alloy_sol_types::SolType for G1Point { - type RustType = Self; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SOL_NAME: &'static str = ::NAME; - const ENCODED_SIZE: Option = - as alloy_sol_types::SolType>::ENCODED_SIZE; - const PACKED_ENCODED_SIZE: Option = - as alloy_sol_types::SolType>::PACKED_ENCODED_SIZE; - #[inline] - fn valid_token(token: &Self::Token<'_>) -> bool { - as alloy_sol_types::SolType>::valid_token(token) - } - #[inline] - fn detokenize(token: Self::Token<'_>) -> Self::RustType { - let tuple = as alloy_sol_types::SolType>::detokenize(token); - >>::from(tuple) - } - } - #[automatically_derived] - impl alloy_sol_types::SolStruct for G1Point { - const NAME: &'static str = "G1Point"; - #[inline] - fn eip712_root_type() -> alloy_sol_types::private::Cow<'static, str> { - alloy_sol_types::private::Cow::Borrowed("G1Point(uint256 x,uint256 y)") - } - #[inline] - fn eip712_components( - ) -> alloy_sol_types::private::Vec> - { - alloy_sol_types::private::Vec::new() - } - #[inline] - fn eip712_encode_type() -> alloy_sol_types::private::Cow<'static, str> { - ::eip712_root_type() - } - #[inline] - fn eip712_encode_data(&self) -> alloy_sol_types::private::Vec { - [ - ::eip712_data_word(&self.x).0, - ::eip712_data_word(&self.y).0, - ] - .concat() - } - } - #[automatically_derived] - impl alloy_sol_types::EventTopic for G1Point { - #[inline] - fn topic_preimage_length(rust: &Self::RustType) -> usize { - 0usize - + ::topic_preimage_length(&rust.x) - + ::topic_preimage_length(&rust.y) - } - #[inline] - fn encode_topic_preimage( - rust: &Self::RustType, - out: &mut alloy_sol_types::private::Vec, - ) { - out.reserve(::topic_preimage_length(rust)); - ::encode_topic_preimage(&rust.x, out); - ::encode_topic_preimage(&rust.y, out); - } - #[inline] - fn encode_topic(rust: &Self::RustType) -> alloy_sol_types::abi::token::WordToken { - let mut out = alloy_sol_types::private::Vec::new(); - ::encode_topic_preimage(rust, &mut out); - alloy_sol_types::abi::token::WordToken(alloy_sol_types::private::keccak256(out)) - } - } - }; - use alloy::contract as alloy_contract; - /**Creates a new wrapper around an on-chain [`BN254`](self) contract instance. - - See the [wrapper's documentation](`BN254Instance`) for more details.*/ - #[inline] - pub const fn new< - T: alloy_contract::private::Transport + ::core::clone::Clone, - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - >( - address: alloy_sol_types::private::Address, - provider: P, - ) -> BN254Instance { - BN254Instance::::new(address, provider) - } - /**A [`BN254`](self) instance. - - Contains type-safe methods for interacting with an on-chain instance of the - [`BN254`](self) contract located at a given `address`, using a given - provider `P`. - - If the contract bytecode is available (see the [`sol!`](alloy_sol_types::sol!) - documentation on how to provide it), the `deploy` and `deploy_builder` methods can - be used to deploy a new instance of the contract. - - See the [module-level documentation](self) for all the available methods.*/ - #[derive(Clone)] - pub struct BN254Instance { - address: alloy_sol_types::private::Address, - provider: P, - _network_transport: ::core::marker::PhantomData<(N, T)>, - } - #[automatically_derived] - impl ::core::fmt::Debug for BN254Instance { - #[inline] - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple("BN254Instance").field(&self.address).finish() - } - } - /// Instantiation and getters/setters. - #[automatically_derived] - impl< - T: alloy_contract::private::Transport + ::core::clone::Clone, - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - > BN254Instance - { - /**Creates a new wrapper around an on-chain [`BN254`](self) contract instance. - - See the [wrapper's documentation](`BN254Instance`) for more details.*/ - #[inline] - pub const fn new(address: alloy_sol_types::private::Address, provider: P) -> Self { - Self { - address, - provider, - _network_transport: ::core::marker::PhantomData, - } - } - /// Returns a reference to the address. - #[inline] - pub const fn address(&self) -> &alloy_sol_types::private::Address { - &self.address - } - /// Sets the address. - #[inline] - pub fn set_address(&mut self, address: alloy_sol_types::private::Address) { - self.address = address; - } - /// Sets the address and returns `self`. - pub fn at(mut self, address: alloy_sol_types::private::Address) -> Self { - self.set_address(address); - self - } - /// Returns a reference to the provider. - #[inline] - pub const fn provider(&self) -> &P { - &self.provider - } - } - impl BN254Instance { - /// Clones the provider and returns a new instance with the cloned provider. - #[inline] - pub fn with_cloned_provider(self) -> BN254Instance { - BN254Instance { - address: self.address, - provider: ::core::clone::Clone::clone(&self.provider), - _network_transport: ::core::marker::PhantomData, - } - } - } - /// Function calls. - #[automatically_derived] - impl< - T: alloy_contract::private::Transport + ::core::clone::Clone, - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - > BN254Instance - { - /// Creates a new call builder using this contract instance's provider and address. - /// - /// Note that the call can be any function call, not just those defined in this - /// contract. Prefer using the other methods for building type-safe contract calls. - pub fn call_builder( - &self, - call: &C, - ) -> alloy_contract::SolCallBuilder { - alloy_contract::SolCallBuilder::new_sol(&self.provider, &self.address, call) - } - } - /// Event filters. - #[automatically_derived] - impl< - T: alloy_contract::private::Transport + ::core::clone::Clone, - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - > BN254Instance - { - /// Creates a new event filter using this contract instance's provider and address. - /// - /// Note that the type can be any event, not just those defined in this contract. - /// Prefer using the other methods for building type-safe event filters. - pub fn event_filter( - &self, - ) -> alloy_contract::Event { - alloy_contract::Event::new_sol(&self.provider, &self.address) - } - } -} -///Module containing a contract's types and functions. -/** - -```solidity -library IPlonkVerifier { - struct PlonkProof { BN254.G1Point wire0; BN254.G1Point wire1; BN254.G1Point wire2; BN254.G1Point wire3; BN254.G1Point wire4; BN254.G1Point prodPerm; BN254.G1Point split0; BN254.G1Point split1; BN254.G1Point split2; BN254.G1Point split3; BN254.G1Point split4; BN254.G1Point zeta; BN254.G1Point zetaOmega; BN254.ScalarField wireEval0; BN254.ScalarField wireEval1; BN254.ScalarField wireEval2; BN254.ScalarField wireEval3; BN254.ScalarField wireEval4; BN254.ScalarField sigmaEval0; BN254.ScalarField sigmaEval1; BN254.ScalarField sigmaEval2; BN254.ScalarField sigmaEval3; BN254.ScalarField prodPermZetaOmegaEval; } - struct VerifyingKey { uint256 domainSize; uint256 numInputs; BN254.G1Point sigma0; BN254.G1Point sigma1; BN254.G1Point sigma2; BN254.G1Point sigma3; BN254.G1Point sigma4; BN254.G1Point q1; BN254.G1Point q2; BN254.G1Point q3; BN254.G1Point q4; BN254.G1Point qM12; BN254.G1Point qM34; BN254.G1Point qO; BN254.G1Point qC; BN254.G1Point qH1; BN254.G1Point qH2; BN254.G1Point qH3; BN254.G1Point qH4; BN254.G1Point qEcc; bytes32 g2LSB; bytes32 g2MSB; } -} -```*/ -#[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style, - clippy::empty_structs_with_brackets -)] -pub mod IPlonkVerifier { - use super::*; - use alloy::sol_types as alloy_sol_types; - /**```solidity - struct PlonkProof { BN254.G1Point wire0; BN254.G1Point wire1; BN254.G1Point wire2; BN254.G1Point wire3; BN254.G1Point wire4; BN254.G1Point prodPerm; BN254.G1Point split0; BN254.G1Point split1; BN254.G1Point split2; BN254.G1Point split3; BN254.G1Point split4; BN254.G1Point zeta; BN254.G1Point zetaOmega; BN254.ScalarField wireEval0; BN254.ScalarField wireEval1; BN254.ScalarField wireEval2; BN254.ScalarField wireEval3; BN254.ScalarField wireEval4; BN254.ScalarField sigmaEval0; BN254.ScalarField sigmaEval1; BN254.ScalarField sigmaEval2; BN254.ScalarField sigmaEval3; BN254.ScalarField prodPermZetaOmegaEval; } - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct PlonkProof { - pub wire0: ::RustType, - pub wire1: ::RustType, - pub wire2: ::RustType, - pub wire3: ::RustType, - pub wire4: ::RustType, - pub prodPerm: ::RustType, - pub split0: ::RustType, - pub split1: ::RustType, - pub split2: ::RustType, - pub split3: ::RustType, - pub split4: ::RustType, - pub zeta: ::RustType, - pub zetaOmega: ::RustType, - pub wireEval0: ::RustType, - pub wireEval1: ::RustType, - pub wireEval2: ::RustType, - pub wireEval3: ::RustType, - pub wireEval4: ::RustType, - pub sigmaEval0: ::RustType, - pub sigmaEval1: ::RustType, - pub sigmaEval2: ::RustType, - pub sigmaEval3: ::RustType, - pub prodPermZetaOmegaEval: ::RustType, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - #[doc(hidden)] - type UnderlyingSolTuple<'a> = ( - BN254::G1Point, - BN254::G1Point, - BN254::G1Point, - BN254::G1Point, - BN254::G1Point, - BN254::G1Point, - BN254::G1Point, - BN254::G1Point, - BN254::G1Point, - BN254::G1Point, - BN254::G1Point, - BN254::G1Point, - BN254::G1Point, - BN254::ScalarField, - BN254::ScalarField, - BN254::ScalarField, - BN254::ScalarField, - BN254::ScalarField, - BN254::ScalarField, - BN254::ScalarField, - BN254::ScalarField, - BN254::ScalarField, - BN254::ScalarField, - ); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: PlonkProof) -> Self { - ( - value.wire0, - value.wire1, - value.wire2, - value.wire3, - value.wire4, - value.prodPerm, - value.split0, - value.split1, - value.split2, - value.split3, - value.split4, - value.zeta, - value.zetaOmega, - value.wireEval0, - value.wireEval1, - value.wireEval2, - value.wireEval3, - value.wireEval4, - value.sigmaEval0, - value.sigmaEval1, - value.sigmaEval2, - value.sigmaEval3, - value.prodPermZetaOmegaEval, - ) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for PlonkProof { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - wire0: tuple.0, - wire1: tuple.1, - wire2: tuple.2, - wire3: tuple.3, - wire4: tuple.4, - prodPerm: tuple.5, - split0: tuple.6, - split1: tuple.7, - split2: tuple.8, - split3: tuple.9, - split4: tuple.10, - zeta: tuple.11, - zetaOmega: tuple.12, - wireEval0: tuple.13, - wireEval1: tuple.14, - wireEval2: tuple.15, - wireEval3: tuple.16, - wireEval4: tuple.17, - sigmaEval0: tuple.18, - sigmaEval1: tuple.19, - sigmaEval2: tuple.20, - sigmaEval3: tuple.21, - prodPermZetaOmegaEval: tuple.22, - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolValue for PlonkProof { - type SolType = Self; - } - #[automatically_derived] - impl alloy_sol_types::private::SolTypeValue for PlonkProof { - #[inline] - fn stv_to_tokens(&self) -> ::Token<'_> { - ( - ::tokenize(&self.wire0), - ::tokenize(&self.wire1), - ::tokenize(&self.wire2), - ::tokenize(&self.wire3), - ::tokenize(&self.wire4), - ::tokenize(&self.prodPerm), - ::tokenize(&self.split0), - ::tokenize(&self.split1), - ::tokenize(&self.split2), - ::tokenize(&self.split3), - ::tokenize(&self.split4), - ::tokenize(&self.zeta), - ::tokenize(&self.zetaOmega), - ::tokenize(&self.wireEval0), - ::tokenize(&self.wireEval1), - ::tokenize(&self.wireEval2), - ::tokenize(&self.wireEval3), - ::tokenize(&self.wireEval4), - ::tokenize(&self.sigmaEval0), - ::tokenize(&self.sigmaEval1), - ::tokenize(&self.sigmaEval2), - ::tokenize(&self.sigmaEval3), - ::tokenize( - &self.prodPermZetaOmegaEval, - ), - ) - } - #[inline] - fn stv_abi_encoded_size(&self) -> usize { - if let Some(size) = ::ENCODED_SIZE { - return size; - } - let tuple = - as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_encoded_size(&tuple) - } - #[inline] - fn stv_eip712_data_word(&self) -> alloy_sol_types::Word { - ::eip712_hash_struct(self) - } - #[inline] - fn stv_abi_encode_packed_to(&self, out: &mut alloy_sol_types::private::Vec) { - let tuple = - as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_encode_packed_to( - &tuple, out, - ) - } - #[inline] - fn stv_abi_packed_encoded_size(&self) -> usize { - if let Some(size) = ::PACKED_ENCODED_SIZE { - return size; - } - let tuple = - as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_packed_encoded_size( - &tuple, - ) - } - } - #[automatically_derived] - impl alloy_sol_types::SolType for PlonkProof { - type RustType = Self; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SOL_NAME: &'static str = ::NAME; - const ENCODED_SIZE: Option = - as alloy_sol_types::SolType>::ENCODED_SIZE; - const PACKED_ENCODED_SIZE: Option = - as alloy_sol_types::SolType>::PACKED_ENCODED_SIZE; - #[inline] - fn valid_token(token: &Self::Token<'_>) -> bool { - as alloy_sol_types::SolType>::valid_token(token) - } - #[inline] - fn detokenize(token: Self::Token<'_>) -> Self::RustType { - let tuple = as alloy_sol_types::SolType>::detokenize(token); - >>::from(tuple) - } - } - #[automatically_derived] - impl alloy_sol_types::SolStruct for PlonkProof { - const NAME: &'static str = "PlonkProof"; - #[inline] - fn eip712_root_type() -> alloy_sol_types::private::Cow<'static, str> { - alloy_sol_types::private::Cow::Borrowed( - "PlonkProof(BN254.G1Point wire0,BN254.G1Point wire1,BN254.G1Point wire2,BN254.G1Point wire3,BN254.G1Point wire4,BN254.G1Point prodPerm,BN254.G1Point split0,BN254.G1Point split1,BN254.G1Point split2,BN254.G1Point split3,BN254.G1Point split4,BN254.G1Point zeta,BN254.G1Point zetaOmega,uint256 wireEval0,uint256 wireEval1,uint256 wireEval2,uint256 wireEval3,uint256 wireEval4,uint256 sigmaEval0,uint256 sigmaEval1,uint256 sigmaEval2,uint256 sigmaEval3,uint256 prodPermZetaOmegaEval)", - ) - } - #[inline] - fn eip712_components( - ) -> alloy_sol_types::private::Vec> - { - let mut components = alloy_sol_types::private::Vec::with_capacity(13); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components - } - #[inline] - fn eip712_encode_data(&self) -> alloy_sol_types::private::Vec { - [ - ::eip712_data_word(&self.wire0).0, - ::eip712_data_word(&self.wire1).0, - ::eip712_data_word(&self.wire2).0, - ::eip712_data_word(&self.wire3).0, - ::eip712_data_word(&self.wire4).0, - ::eip712_data_word(&self.prodPerm) - .0, - ::eip712_data_word(&self.split0).0, - ::eip712_data_word(&self.split1).0, - ::eip712_data_word(&self.split2).0, - ::eip712_data_word(&self.split3).0, - ::eip712_data_word(&self.split4).0, - ::eip712_data_word(&self.zeta).0, - ::eip712_data_word(&self.zetaOmega) - .0, - ::eip712_data_word( - &self.wireEval0, - ) - .0, - ::eip712_data_word( - &self.wireEval1, - ) - .0, - ::eip712_data_word( - &self.wireEval2, - ) - .0, - ::eip712_data_word( - &self.wireEval3, - ) - .0, - ::eip712_data_word( - &self.wireEval4, - ) - .0, - ::eip712_data_word( - &self.sigmaEval0, - ) - .0, - ::eip712_data_word( - &self.sigmaEval1, - ) - .0, - ::eip712_data_word( - &self.sigmaEval2, - ) - .0, - ::eip712_data_word( - &self.sigmaEval3, - ) - .0, - ::eip712_data_word( - &self.prodPermZetaOmegaEval, - ) - .0, - ] - .concat() - } - } - #[automatically_derived] - impl alloy_sol_types::EventTopic for PlonkProof { - #[inline] - fn topic_preimage_length(rust: &Self::RustType) -> usize { - 0usize - + ::topic_preimage_length( - &rust.wire0, - ) - + ::topic_preimage_length( - &rust.wire1, - ) - + ::topic_preimage_length( - &rust.wire2, - ) - + ::topic_preimage_length( - &rust.wire3, - ) - + ::topic_preimage_length( - &rust.wire4, - ) - + ::topic_preimage_length( - &rust.prodPerm, - ) - + ::topic_preimage_length( - &rust.split0, - ) - + ::topic_preimage_length( - &rust.split1, - ) - + ::topic_preimage_length( - &rust.split2, - ) - + ::topic_preimage_length( - &rust.split3, - ) - + ::topic_preimage_length( - &rust.split4, - ) - + ::topic_preimage_length( - &rust.zeta, - ) - + ::topic_preimage_length( - &rust.zetaOmega, - ) - + ::topic_preimage_length( - &rust.wireEval0, - ) - + ::topic_preimage_length( - &rust.wireEval1, - ) - + ::topic_preimage_length( - &rust.wireEval2, - ) - + ::topic_preimage_length( - &rust.wireEval3, - ) - + ::topic_preimage_length( - &rust.wireEval4, - ) - + ::topic_preimage_length( - &rust.sigmaEval0, - ) - + ::topic_preimage_length( - &rust.sigmaEval1, - ) - + ::topic_preimage_length( - &rust.sigmaEval2, - ) - + ::topic_preimage_length( - &rust.sigmaEval3, - ) - + ::topic_preimage_length( - &rust.prodPermZetaOmegaEval, - ) - } - #[inline] - fn encode_topic_preimage( - rust: &Self::RustType, - out: &mut alloy_sol_types::private::Vec, - ) { - out.reserve(::topic_preimage_length(rust)); - ::encode_topic_preimage( - &rust.wire0, - out, - ); - ::encode_topic_preimage( - &rust.wire1, - out, - ); - ::encode_topic_preimage( - &rust.wire2, - out, - ); - ::encode_topic_preimage( - &rust.wire3, - out, - ); - ::encode_topic_preimage( - &rust.wire4, - out, - ); - ::encode_topic_preimage( - &rust.prodPerm, - out, - ); - ::encode_topic_preimage( - &rust.split0, - out, - ); - ::encode_topic_preimage( - &rust.split1, - out, - ); - ::encode_topic_preimage( - &rust.split2, - out, - ); - ::encode_topic_preimage( - &rust.split3, - out, - ); - ::encode_topic_preimage( - &rust.split4, - out, - ); - ::encode_topic_preimage( - &rust.zeta, out, - ); - ::encode_topic_preimage( - &rust.zetaOmega, - out, - ); - ::encode_topic_preimage( - &rust.wireEval0, - out, - ); - ::encode_topic_preimage( - &rust.wireEval1, - out, - ); - ::encode_topic_preimage( - &rust.wireEval2, - out, - ); - ::encode_topic_preimage( - &rust.wireEval3, - out, - ); - ::encode_topic_preimage( - &rust.wireEval4, - out, - ); - ::encode_topic_preimage( - &rust.sigmaEval0, - out, - ); - ::encode_topic_preimage( - &rust.sigmaEval1, - out, - ); - ::encode_topic_preimage( - &rust.sigmaEval2, - out, - ); - ::encode_topic_preimage( - &rust.sigmaEval3, - out, - ); - ::encode_topic_preimage( - &rust.prodPermZetaOmegaEval, - out, - ); - } - #[inline] - fn encode_topic(rust: &Self::RustType) -> alloy_sol_types::abi::token::WordToken { - let mut out = alloy_sol_types::private::Vec::new(); - ::encode_topic_preimage(rust, &mut out); - alloy_sol_types::abi::token::WordToken(alloy_sol_types::private::keccak256(out)) - } - } - }; - /**```solidity - struct VerifyingKey { uint256 domainSize; uint256 numInputs; BN254.G1Point sigma0; BN254.G1Point sigma1; BN254.G1Point sigma2; BN254.G1Point sigma3; BN254.G1Point sigma4; BN254.G1Point q1; BN254.G1Point q2; BN254.G1Point q3; BN254.G1Point q4; BN254.G1Point qM12; BN254.G1Point qM34; BN254.G1Point qO; BN254.G1Point qC; BN254.G1Point qH1; BN254.G1Point qH2; BN254.G1Point qH3; BN254.G1Point qH4; BN254.G1Point qEcc; bytes32 g2LSB; bytes32 g2MSB; } - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct VerifyingKey { - pub domainSize: alloy::sol_types::private::primitives::aliases::U256, - pub numInputs: alloy::sol_types::private::primitives::aliases::U256, - pub sigma0: ::RustType, - pub sigma1: ::RustType, - pub sigma2: ::RustType, - pub sigma3: ::RustType, - pub sigma4: ::RustType, - pub q1: ::RustType, - pub q2: ::RustType, - pub q3: ::RustType, - pub q4: ::RustType, - pub qM12: ::RustType, - pub qM34: ::RustType, - pub qO: ::RustType, - pub qC: ::RustType, - pub qH1: ::RustType, - pub qH2: ::RustType, - pub qH3: ::RustType, - pub qH4: ::RustType, - pub qEcc: ::RustType, - pub g2LSB: alloy::sol_types::private::FixedBytes<32>, - pub g2MSB: alloy::sol_types::private::FixedBytes<32>, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - #[doc(hidden)] - type UnderlyingSolTuple<'a> = ( - alloy::sol_types::sol_data::Uint<256>, - alloy::sol_types::sol_data::Uint<256>, - BN254::G1Point, - BN254::G1Point, - BN254::G1Point, - BN254::G1Point, - BN254::G1Point, - BN254::G1Point, - BN254::G1Point, - BN254::G1Point, - BN254::G1Point, - BN254::G1Point, - BN254::G1Point, - BN254::G1Point, - BN254::G1Point, - BN254::G1Point, - BN254::G1Point, - BN254::G1Point, - BN254::G1Point, - BN254::G1Point, - alloy::sol_types::sol_data::FixedBytes<32>, - alloy::sol_types::sol_data::FixedBytes<32>, - ); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - alloy::sol_types::private::primitives::aliases::U256, - alloy::sol_types::private::primitives::aliases::U256, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - ::RustType, - alloy::sol_types::private::FixedBytes<32>, - alloy::sol_types::private::FixedBytes<32>, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: VerifyingKey) -> Self { - ( - value.domainSize, - value.numInputs, - value.sigma0, - value.sigma1, - value.sigma2, - value.sigma3, - value.sigma4, - value.q1, - value.q2, - value.q3, - value.q4, - value.qM12, - value.qM34, - value.qO, - value.qC, - value.qH1, - value.qH2, - value.qH3, - value.qH4, - value.qEcc, - value.g2LSB, - value.g2MSB, - ) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for VerifyingKey { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - domainSize: tuple.0, - numInputs: tuple.1, - sigma0: tuple.2, - sigma1: tuple.3, - sigma2: tuple.4, - sigma3: tuple.5, - sigma4: tuple.6, - q1: tuple.7, - q2: tuple.8, - q3: tuple.9, - q4: tuple.10, - qM12: tuple.11, - qM34: tuple.12, - qO: tuple.13, - qC: tuple.14, - qH1: tuple.15, - qH2: tuple.16, - qH3: tuple.17, - qH4: tuple.18, - qEcc: tuple.19, - g2LSB: tuple.20, - g2MSB: tuple.21, - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolValue for VerifyingKey { - type SolType = Self; - } - #[automatically_derived] - impl alloy_sol_types::private::SolTypeValue for VerifyingKey { - #[inline] - fn stv_to_tokens(&self) -> ::Token<'_> { - ( - as alloy_sol_types::SolType>::tokenize(&self.domainSize), - as alloy_sol_types::SolType>::tokenize(&self.numInputs), - ::tokenize(&self.sigma0), - ::tokenize(&self.sigma1), - ::tokenize(&self.sigma2), - ::tokenize(&self.sigma3), - ::tokenize(&self.sigma4), - ::tokenize(&self.q1), - ::tokenize(&self.q2), - ::tokenize(&self.q3), - ::tokenize(&self.q4), - ::tokenize(&self.qM12), - ::tokenize(&self.qM34), - ::tokenize(&self.qO), - ::tokenize(&self.qC), - ::tokenize(&self.qH1), - ::tokenize(&self.qH2), - ::tokenize(&self.qH3), - ::tokenize(&self.qH4), - ::tokenize(&self.qEcc), - as alloy_sol_types::SolType>::tokenize(&self.g2LSB), - as alloy_sol_types::SolType>::tokenize(&self.g2MSB), - ) - } - #[inline] - fn stv_abi_encoded_size(&self) -> usize { - if let Some(size) = ::ENCODED_SIZE { - return size; - } - let tuple = - as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_encoded_size(&tuple) - } - #[inline] - fn stv_eip712_data_word(&self) -> alloy_sol_types::Word { - ::eip712_hash_struct(self) - } - #[inline] - fn stv_abi_encode_packed_to(&self, out: &mut alloy_sol_types::private::Vec) { - let tuple = - as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_encode_packed_to( - &tuple, out, - ) - } - #[inline] - fn stv_abi_packed_encoded_size(&self) -> usize { - if let Some(size) = ::PACKED_ENCODED_SIZE { - return size; - } - let tuple = - as ::core::convert::From>::from(self.clone()); - as alloy_sol_types::SolType>::abi_packed_encoded_size( - &tuple, - ) - } - } - #[automatically_derived] - impl alloy_sol_types::SolType for VerifyingKey { - type RustType = Self; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SOL_NAME: &'static str = ::NAME; - const ENCODED_SIZE: Option = - as alloy_sol_types::SolType>::ENCODED_SIZE; - const PACKED_ENCODED_SIZE: Option = - as alloy_sol_types::SolType>::PACKED_ENCODED_SIZE; - #[inline] - fn valid_token(token: &Self::Token<'_>) -> bool { - as alloy_sol_types::SolType>::valid_token(token) - } - #[inline] - fn detokenize(token: Self::Token<'_>) -> Self::RustType { - let tuple = as alloy_sol_types::SolType>::detokenize(token); - >>::from(tuple) - } - } - #[automatically_derived] - impl alloy_sol_types::SolStruct for VerifyingKey { - const NAME: &'static str = "VerifyingKey"; - #[inline] - fn eip712_root_type() -> alloy_sol_types::private::Cow<'static, str> { - alloy_sol_types::private::Cow::Borrowed( - "VerifyingKey(uint256 domainSize,uint256 numInputs,BN254.G1Point sigma0,BN254.G1Point sigma1,BN254.G1Point sigma2,BN254.G1Point sigma3,BN254.G1Point sigma4,BN254.G1Point q1,BN254.G1Point q2,BN254.G1Point q3,BN254.G1Point q4,BN254.G1Point qM12,BN254.G1Point qM34,BN254.G1Point qO,BN254.G1Point qC,BN254.G1Point qH1,BN254.G1Point qH2,BN254.G1Point qH3,BN254.G1Point qH4,BN254.G1Point qEcc,bytes32 g2LSB,bytes32 g2MSB)", - ) - } - #[inline] - fn eip712_components( - ) -> alloy_sol_types::private::Vec> - { - let mut components = alloy_sol_types::private::Vec::with_capacity(18); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components.push(::eip712_root_type()); - components - .extend(::eip712_components()); - components - } - #[inline] - fn eip712_encode_data(&self) -> alloy_sol_types::private::Vec { - [ - as alloy_sol_types::SolType>::eip712_data_word(&self.domainSize) - .0, - as alloy_sol_types::SolType>::eip712_data_word(&self.numInputs) - .0, - ::eip712_data_word( - &self.sigma0, - ) - .0, - ::eip712_data_word( - &self.sigma1, - ) - .0, - ::eip712_data_word( - &self.sigma2, - ) - .0, - ::eip712_data_word( - &self.sigma3, - ) - .0, - ::eip712_data_word( - &self.sigma4, - ) - .0, - ::eip712_data_word( - &self.q1, - ) - .0, - ::eip712_data_word( - &self.q2, - ) - .0, - ::eip712_data_word( - &self.q3, - ) - .0, - ::eip712_data_word( - &self.q4, - ) - .0, - ::eip712_data_word( - &self.qM12, - ) - .0, - ::eip712_data_word( - &self.qM34, - ) - .0, - ::eip712_data_word( - &self.qO, - ) - .0, - ::eip712_data_word( - &self.qC, - ) - .0, - ::eip712_data_word( - &self.qH1, - ) - .0, - ::eip712_data_word( - &self.qH2, - ) - .0, - ::eip712_data_word( - &self.qH3, - ) - .0, - ::eip712_data_word( - &self.qH4, - ) - .0, - ::eip712_data_word( - &self.qEcc, - ) - .0, - as alloy_sol_types::SolType>::eip712_data_word(&self.g2LSB) - .0, - as alloy_sol_types::SolType>::eip712_data_word(&self.g2MSB) - .0, - ] - .concat() - } - } - #[automatically_derived] - impl alloy_sol_types::EventTopic for VerifyingKey { - #[inline] - fn topic_preimage_length(rust: &Self::RustType) -> usize { - 0usize - + as alloy_sol_types::EventTopic>::topic_preimage_length( - &rust.domainSize, - ) - + as alloy_sol_types::EventTopic>::topic_preimage_length( - &rust.numInputs, - ) - + ::topic_preimage_length( - &rust.sigma0, - ) - + ::topic_preimage_length( - &rust.sigma1, - ) - + ::topic_preimage_length( - &rust.sigma2, - ) - + ::topic_preimage_length( - &rust.sigma3, - ) - + ::topic_preimage_length( - &rust.sigma4, - ) - + ::topic_preimage_length( - &rust.q1, - ) - + ::topic_preimage_length( - &rust.q2, - ) - + ::topic_preimage_length( - &rust.q3, - ) - + ::topic_preimage_length( - &rust.q4, - ) - + ::topic_preimage_length( - &rust.qM12, - ) - + ::topic_preimage_length( - &rust.qM34, - ) - + ::topic_preimage_length( - &rust.qO, - ) - + ::topic_preimage_length( - &rust.qC, - ) - + ::topic_preimage_length( - &rust.qH1, - ) - + ::topic_preimage_length( - &rust.qH2, - ) - + ::topic_preimage_length( - &rust.qH3, - ) - + ::topic_preimage_length( - &rust.qH4, - ) - + ::topic_preimage_length( - &rust.qEcc, - ) - + as alloy_sol_types::EventTopic>::topic_preimage_length(&rust.g2LSB) - + as alloy_sol_types::EventTopic>::topic_preimage_length(&rust.g2MSB) - } - #[inline] - fn encode_topic_preimage( - rust: &Self::RustType, - out: &mut alloy_sol_types::private::Vec, - ) { - out.reserve(::topic_preimage_length(rust)); - as alloy_sol_types::EventTopic>::encode_topic_preimage( - &rust.domainSize, - out, - ); - as alloy_sol_types::EventTopic>::encode_topic_preimage( - &rust.numInputs, - out, - ); - ::encode_topic_preimage( - &rust.sigma0, - out, - ); - ::encode_topic_preimage( - &rust.sigma1, - out, - ); - ::encode_topic_preimage( - &rust.sigma2, - out, - ); - ::encode_topic_preimage( - &rust.sigma3, - out, - ); - ::encode_topic_preimage( - &rust.sigma4, - out, - ); - ::encode_topic_preimage( - &rust.q1, out, - ); - ::encode_topic_preimage( - &rust.q2, out, - ); - ::encode_topic_preimage( - &rust.q3, out, - ); - ::encode_topic_preimage( - &rust.q4, out, - ); - ::encode_topic_preimage( - &rust.qM12, out, - ); - ::encode_topic_preimage( - &rust.qM34, out, - ); - ::encode_topic_preimage( - &rust.qO, out, - ); - ::encode_topic_preimage( - &rust.qC, out, - ); - ::encode_topic_preimage( - &rust.qH1, out, - ); - ::encode_topic_preimage( - &rust.qH2, out, - ); - ::encode_topic_preimage( - &rust.qH3, out, - ); - ::encode_topic_preimage( - &rust.qH4, out, - ); - ::encode_topic_preimage( - &rust.qEcc, out, - ); - as alloy_sol_types::EventTopic>::encode_topic_preimage( - &rust.g2LSB, - out, - ); - as alloy_sol_types::EventTopic>::encode_topic_preimage( - &rust.g2MSB, - out, - ); - } - #[inline] - fn encode_topic(rust: &Self::RustType) -> alloy_sol_types::abi::token::WordToken { - let mut out = alloy_sol_types::private::Vec::new(); - ::encode_topic_preimage(rust, &mut out); - alloy_sol_types::abi::token::WordToken(alloy_sol_types::private::keccak256(out)) - } - } - }; - use alloy::contract as alloy_contract; - /**Creates a new wrapper around an on-chain [`IPlonkVerifier`](self) contract instance. - - See the [wrapper's documentation](`IPlonkVerifierInstance`) for more details.*/ - #[inline] - pub const fn new< - T: alloy_contract::private::Transport + ::core::clone::Clone, - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - >( - address: alloy_sol_types::private::Address, - provider: P, - ) -> IPlonkVerifierInstance { - IPlonkVerifierInstance::::new(address, provider) - } - /**A [`IPlonkVerifier`](self) instance. - - Contains type-safe methods for interacting with an on-chain instance of the - [`IPlonkVerifier`](self) contract located at a given `address`, using a given - provider `P`. - - If the contract bytecode is available (see the [`sol!`](alloy_sol_types::sol!) - documentation on how to provide it), the `deploy` and `deploy_builder` methods can - be used to deploy a new instance of the contract. - - See the [module-level documentation](self) for all the available methods.*/ - #[derive(Clone)] - pub struct IPlonkVerifierInstance { - address: alloy_sol_types::private::Address, - provider: P, - _network_transport: ::core::marker::PhantomData<(N, T)>, - } - #[automatically_derived] - impl ::core::fmt::Debug for IPlonkVerifierInstance { - #[inline] - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple("IPlonkVerifierInstance") - .field(&self.address) - .finish() - } - } - /// Instantiation and getters/setters. - #[automatically_derived] - impl< - T: alloy_contract::private::Transport + ::core::clone::Clone, - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - > IPlonkVerifierInstance - { - /**Creates a new wrapper around an on-chain [`IPlonkVerifier`](self) contract instance. - - See the [wrapper's documentation](`IPlonkVerifierInstance`) for more details.*/ - #[inline] - pub const fn new(address: alloy_sol_types::private::Address, provider: P) -> Self { - Self { - address, - provider, - _network_transport: ::core::marker::PhantomData, - } - } - /// Returns a reference to the address. - #[inline] - pub const fn address(&self) -> &alloy_sol_types::private::Address { - &self.address - } - /// Sets the address. - #[inline] - pub fn set_address(&mut self, address: alloy_sol_types::private::Address) { - self.address = address; - } - /// Sets the address and returns `self`. - pub fn at(mut self, address: alloy_sol_types::private::Address) -> Self { - self.set_address(address); - self - } - /// Returns a reference to the provider. - #[inline] - pub const fn provider(&self) -> &P { - &self.provider - } - } - impl IPlonkVerifierInstance { - /// Clones the provider and returns a new instance with the cloned provider. - #[inline] - pub fn with_cloned_provider(self) -> IPlonkVerifierInstance { - IPlonkVerifierInstance { - address: self.address, - provider: ::core::clone::Clone::clone(&self.provider), - _network_transport: ::core::marker::PhantomData, - } - } - } - /// Function calls. - #[automatically_derived] - impl< - T: alloy_contract::private::Transport + ::core::clone::Clone, - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - > IPlonkVerifierInstance - { - /// Creates a new call builder using this contract instance's provider and address. - /// - /// Note that the call can be any function call, not just those defined in this - /// contract. Prefer using the other methods for building type-safe contract calls. - pub fn call_builder( - &self, - call: &C, - ) -> alloy_contract::SolCallBuilder { - alloy_contract::SolCallBuilder::new_sol(&self.provider, &self.address, call) - } - } - /// Event filters. - #[automatically_derived] - impl< - T: alloy_contract::private::Transport + ::core::clone::Clone, - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - > IPlonkVerifierInstance - { - /// Creates a new event filter using this contract instance's provider and address. - /// - /// Note that the type can be any event, not just those defined in this contract. - /// Prefer using the other methods for building type-safe event filters. - pub fn event_filter( - &self, - ) -> alloy_contract::Event { - alloy_contract::Event::new_sol(&self.provider, &self.address) - } - } -} -/** - -Generated by the following Solidity interface... -```solidity -library BN254 { - type BaseField is uint256; - type ScalarField is uint256; - struct G1Point { - BaseField x; - BaseField y; - } -} - -library IPlonkVerifier { - struct PlonkProof { - BN254.G1Point wire0; - BN254.G1Point wire1; - BN254.G1Point wire2; - BN254.G1Point wire3; - BN254.G1Point wire4; - BN254.G1Point prodPerm; - BN254.G1Point split0; - BN254.G1Point split1; - BN254.G1Point split2; - BN254.G1Point split3; - BN254.G1Point split4; - BN254.G1Point zeta; - BN254.G1Point zetaOmega; - BN254.ScalarField wireEval0; - BN254.ScalarField wireEval1; - BN254.ScalarField wireEval2; - BN254.ScalarField wireEval3; - BN254.ScalarField wireEval4; - BN254.ScalarField sigmaEval0; - BN254.ScalarField sigmaEval1; - BN254.ScalarField sigmaEval2; - BN254.ScalarField sigmaEval3; - BN254.ScalarField prodPermZetaOmegaEval; - } - struct VerifyingKey { - uint256 domainSize; - uint256 numInputs; - BN254.G1Point sigma0; - BN254.G1Point sigma1; - BN254.G1Point sigma2; - BN254.G1Point sigma3; - BN254.G1Point sigma4; - BN254.G1Point q1; - BN254.G1Point q2; - BN254.G1Point q3; - BN254.G1Point q4; - BN254.G1Point qM12; - BN254.G1Point qM34; - BN254.G1Point qO; - BN254.G1Point qC; - BN254.G1Point qH1; - BN254.G1Point qH2; - BN254.G1Point qH3; - BN254.G1Point qH4; - BN254.G1Point qEcc; - bytes32 g2LSB; - bytes32 g2MSB; - } -} - -interface PlonkVerifier2 { - error UnsupportedDegree(); - - function P_MOD() external view returns (uint256); - function R_MOD() external view returns (uint256); - function verify(IPlonkVerifier.VerifyingKey memory vk, uint256[7] memory publicInput, IPlonkVerifier.PlonkProof memory proof) external view returns (bool success); -} -``` - -...which was generated by the following JSON ABI: -```json -[ - { - "type": "function", - "name": "P_MOD", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "R_MOD", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "verify", - "inputs": [ - { - "name": "vk", - "type": "tuple", - "internalType": "struct IPlonkVerifier.VerifyingKey", - "components": [ - { - "name": "domainSize", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "numInputs", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "sigma0", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "sigma1", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "sigma2", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "sigma3", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "sigma4", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "q1", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "q2", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "q3", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "q4", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "qM12", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "qM34", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "qO", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "qC", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "qH1", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "qH2", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "qH3", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "qH4", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "qEcc", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "g2LSB", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "g2MSB", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "name": "publicInput", - "type": "uint256[7]", - "internalType": "uint256[7]" - }, - { - "name": "proof", - "type": "tuple", - "internalType": "struct IPlonkVerifier.PlonkProof", - "components": [ - { - "name": "wire0", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "wire1", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "wire2", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "wire3", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "wire4", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "prodPerm", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "split0", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "split1", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "split2", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "split3", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "split4", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "zeta", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "zetaOmega", - "type": "tuple", - "internalType": "struct BN254.G1Point", - "components": [ - { - "name": "x", - "type": "uint256", - "internalType": "BN254.BaseField" - }, - { - "name": "y", - "type": "uint256", - "internalType": "BN254.BaseField" - } - ] - }, - { - "name": "wireEval0", - "type": "uint256", - "internalType": "BN254.ScalarField" - }, - { - "name": "wireEval1", - "type": "uint256", - "internalType": "BN254.ScalarField" - }, - { - "name": "wireEval2", - "type": "uint256", - "internalType": "BN254.ScalarField" - }, - { - "name": "wireEval3", - "type": "uint256", - "internalType": "BN254.ScalarField" - }, - { - "name": "wireEval4", - "type": "uint256", - "internalType": "BN254.ScalarField" - }, - { - "name": "sigmaEval0", - "type": "uint256", - "internalType": "BN254.ScalarField" - }, - { - "name": "sigmaEval1", - "type": "uint256", - "internalType": "BN254.ScalarField" - }, - { - "name": "sigmaEval2", - "type": "uint256", - "internalType": "BN254.ScalarField" - }, - { - "name": "sigmaEval3", - "type": "uint256", - "internalType": "BN254.ScalarField" - }, - { - "name": "prodPermZetaOmegaEval", - "type": "uint256", - "internalType": "BN254.ScalarField" - } - ] - } - ], - "outputs": [ - { - "name": "success", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "error", - "name": "UnsupportedDegree", - "inputs": [] - } -] -```*/ -#[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style, - clippy::empty_structs_with_brackets -)] -pub mod PlonkVerifier2 { - use super::*; - use alloy::sol_types as alloy_sol_types; - /// The creation / init bytecode of the contract. - /// - /// ```text - ///0x612620610035600b8282823980515f1a60731461002957634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040526004361061004a575f3560e01c80631d712e271461004e578063ce537a7714610088578063df6e6cb4146100ab575b5f80fd5b6100757f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4781565b6040519081526020015b60405180910390f35b61009b6100963660046123ed565b6100bf565b604051901515815260200161007f565b6100755f805160206125f483398151915281565b5f6100c982611012565b6100d9835f5b602002015161114d565b6100e48360016100cf565b6100ef8360026100cf565b6100fa8360036100cf565b6101058360046100cf565b6101108360056100cf565b61011b8360066100cf565b5f6101278585856111af565b90505f610136865f01516117b8565b90505f610148828460a0015188611b96565b90505f610156848784611bf3565b9050610235565b60405162461bcd60e51b815260206004820152600c60248201526b6572726f722076657269667960a01b6044820152606481fd5b60405162461bcd60e51b815260206004820152600d60248201526c6572726f722070616972696e6760981b6044820152606481fd5b604051815181526020820151602082015282604082015260405f60608360075afa9050806101f6576101f661015d565b505050565b6040805182518152602080840151818301525f5182840152516060820152908260808360065afa9050806102315761023161015d565b5050565b60405160c081017f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c160408301527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b060608301527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe460808301527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e5560a08301527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101008301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101208301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6101408301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa61016083015261018082016040525f805f8060808a01515f805160206125f483398151915260208a015160208d01510993508a515f805160206125f483398151915260a08d015160608e01510993505f805160206125f48339815191526101a08f0151850892505f805160206125f483398151915282840892505f805160206125f483398151915281840990505f805160206125f48339815191527f2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a850992505f805160206125f48339815191526101c08f0151840892505f805160206125f483398151915282840892505f805160206125f483398151915281840990505f805160206125f48339815191527f1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb025850992505f805160206125f48339815191526101e08f0151840892505f805160206125f483398151915282840892505f805160206125f483398151915281840990505f805160206125f48339815191527f2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a850992505f805160206125f48339815191526102008f0151840892505f805160206125f483398151915282840892505f805160206125f483398151915281840990505f805160206125f48339815191527f2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e881850992505f805160206125f48339815191526102208f0151840892505f805160206125f483398151915282840892505f805160206125f483398151915281840990505f805160206125f483398151915281860894505060a08d015194506105e084866101c6565b5f51865260205160208701525f805160206125f483398151915260608c01518c510993505f805160206125f48339815191526102c08e0151850993505f805160206125f48339815191526102408e015160608d01510992505f805160206125f48339815191526101a08e0151840892505f805160206125f483398151915281840892505f805160206125f483398151915283850993505f805160206125f48339815191526102608e015160608d01510992505f805160206125f48339815191526101c08e0151840892505f805160206125f483398151915281840892505f805160206125f483398151915283850993505f805160206125f48339815191526102808e015160608d01510992505f805160206125f48339815191526101e08e0151840892505f805160206125f483398151915281840892505f805160206125f483398151915283850993505f805160206125f48339815191526102a08e015160608d01510992505f805160206125f48339815191526102008e0151840892505f805160206125f48339815191528184089250505f805160206125f48339815191528284095f805160206125f483398151915203925060c08e015193506107a583856101c6565b6107ae856101fb565b6101a08c0151925060e08e015193506107c783856101c6565b6107d0856101fb565b6101c08c015192506101008e015193506107ea83856101c6565b6107f3856101fb565b6101e08c015192506101208e0151935061080d83856101c6565b610816856101fb565b6102008c015192506101408e0151935061083083856101c6565b610839856101fb565b5f805160206125f48339815191526101c08d01516101a08e01510992506101608e0151935061086883856101c6565b610871856101fb565b5f805160206125f48339815191526102008d01516101e08e01510992506101808e015193506108a083856101c6565b6108a9856101fb565b6101a08c015191505f805160206125f483398151915282830990505f805160206125f483398151915281820990505f805160206125f483398151915281830992506101e08e015193506108fc83856101c6565b610905856101fb565b6101c08c015191505f805160206125f483398151915282830990505f805160206125f483398151915281820990505f805160206125f483398151915281830992506102008e0151935061095883856101c6565b610961856101fb565b6101e08c015191505f805160206125f483398151915282830990505f805160206125f483398151915281820990505f805160206125f483398151915281830992506102208e015193506109b483856101c6565b6109bd856101fb565b6102008c015191505f805160206125f483398151915282830990505f805160206125f483398151915281820990505f805160206125f483398151915281830992506102408e01519350610a1083856101c6565b610a19856101fb565b6102208c01515f805160206125f48339815191520392506101a08e01519350610a4283856101c6565b610a4b856101fb565b600192506101c08e01519350610a6183856101c6565b610a6a856101fb565b5f805160206125f48339815191526101c08d01516101a08e01510991505f805160206125f48339815191526101e08d0151830991505f805160206125f48339815191526102008d0151830991505f805160206125f48339815191526102208d0151830992506102608e01519350610ae183856101c6565b610aea856101fb565b87515f805160206125f483398151915203925060c08c01519350610b0e83856101c6565b610b17856101fb565b5f805160206125f48339815191526001895108915060a08a015190505f805160206125f483398151915281820990505f805160206125f48339815191528183099150505f805160206125f4833981519152818309915060e08b01519250610b7e82846101c6565b610b87846101fb565b5f805160206125f483398151915281830991506101008b01519250610bac82846101c6565b610bb5846101fb565b5f805160206125f483398151915281830991506101208b01519250610bda82846101c6565b610be3846101fb565b5f805160206125f483398151915281830991506101408b01519250610c0882846101c6565b610c11846101fb565b50505060c0860151885190805f805160206125f4833981519152869003610c3882856101c6565b610c41856101fb565b5f805160206125f4833981519152806101a08e01518509820890505f805160206125f4833981519152828409925060208c01519350610c8083856101c6565b610c89856101fb565b5f805160206125f4833981519152806101c08e01518509820890505f805160206125f4833981519152828409925060408c01519350610cc883856101c6565b610cd1856101fb565b5f805160206125f4833981519152806101e08e01518509820890505f805160206125f4833981519152828409925060608c01519350610d1083856101c6565b610d19856101fb565b5f805160206125f4833981519152806102008e01518509820890505f805160206125f4833981519152828409925060808c01519350610d5883856101c6565b610d61856101fb565b5f805160206125f4833981519152806102208e01518509820890505f805160206125f4833981519152828409925060408e01519350610da083856101c6565b610da9856101fb565b5f805160206125f4833981519152806102408e01518509820890505f805160206125f4833981519152828409925060608e01519350610de883856101c6565b610df1856101fb565b5f805160206125f4833981519152806102608e01518509820890505f805160206125f4833981519152828409925060808e01519350610e3083856101c6565b610e39856101fb565b5f805160206125f4833981519152806102808e01518509820890505f805160206125f4833981519152828409925060a08e01519350610e7883856101c6565b610e81856101fb565b5f805160206125f4833981519152806102a08e015185098208905060e08a0151925060a08c01519350610eb483856101c6565b610ebd856101fb565b5f805160206125f4833981519152806102c08e015185098208905060a08a015192506101608c01519350610ef183856101c6565b610efa856101fb565b5f805160206125f4833981519152602060408b01510151840991505f805160206125f483398151915260e08b0151830992506101808c01519350610f3e83856101c6565b610f47856101fb565b6040805180820190915293506001845260026020850152610f77815f805160206125f483398151915203856101c6565b50610f81846101fb565b610fb08460200180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47039052565b505050610160880151805183526020908101519083015260e086015161018089015190610fdd81836101c6565b505050610fe9816101fb565b60205f6101808360085afa90508061100357611003610191565b50505f51979650505050505050565b805161101d90611da8565b61102a8160200151611da8565b6110378160400151611da8565b6110448160600151611da8565b6110518160800151611da8565b61105e8160a00151611da8565b61106b8160c00151611da8565b6110788160e00151611da8565b611086816101000151611da8565b611094816101200151611da8565b6110a2816101400151611da8565b6110b0816101600151611da8565b6110be816101800151611da8565b6110cc816101a0015161114d565b6110da816101c0015161114d565b6110e8816101e0015161114d565b6110f681610200015161114d565b61110481610220015161114d565b61111281610240015161114d565b61112081610260015161114d565b61112e81610280015161114d565b61113c816102a0015161114d565b61114a816102c0015161114d565b50565b5f805160206125f48339815191528110806102315760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c64000000000060448201526064015b60405180910390fd5b6111ef6040518061010001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b604051602081015f815260fe60e01b8152855160c01b6004820152602086015160c01b600c82015261028086015160208201526102a08601516040820152600160608201527f2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a60808201527f1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb02560a08201527f2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a60c08201527f2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e88160e082015260e086015180516101008301526020810151610120830152506101008601518051610140830152602081015161016083015250610120860151805161018083015260208101516101a08301525061014086015180516101c083015260208101516101e083015250610160860151805161020083015260208101516102208301525061018086015180516102408301526020810151610260830152506101e0860151805161028083015260208101516102a08301525061020086015180516102c083015260208101516102e083015250610220860151805161030083015260208101516103208301525061024086015180516103408301526020810151610360830152506101a0860151805161038083015260208101516103a0830152506101c086015180516103c083015260208101516103e0830152506102608601518051610400830152602081015161042083015250604086015180516104408301526020810151610460830152506060860151805161048083015260208101516104a083015250608086015180516104c083015260208101516104e08301525060a0860151805161050083015260208101516105208301525060c08601518051610540830152602081015161056083015250845161058082015260208501516105a082015260408501516105c082015260608501516105e0820152608085015161060082015260a085015161062082015260c085015161064082015260e085015161066082015283518051610660830152602081015161068083015250602084015180516106a083015260208101516106c083015250604084015180516106e083015260208101516107008301525060608401518051610720830152602081015161074083015250608084015180516107608301526020810151610780830152505f82526107c082206107c08201526107c0810191506020820190505f805160206125f483398151915282510660608401526020822081528091506020820190505f805160206125f4833981519152825106608084015260a0840151805182526020810151602083015250606082206040820192508083526020830191505f805160206125f4833981519152810684525f805160206125f48339815191528182095f805160206125f48339815191528282099150806020860152508060408501525060c084015180518252602081015160208301525060e084015180516040830152602081015160608301525061010084015180516080830152602081015160a083015250610120840151805160c0830152602081015160e08301525061014084015180516101008301526020810151610120830152506101608220610140820152610140810191506020820190505f805160206125f483398151915282510660a08401526101a084015181526101c084015160208201526101e084015160408201526102008401516060820152610220840151608082015261024084015160a082015261026084015160c082015261028084015160e08201526102a08401516101008201526102c08401516101208201526101608220610140820152610140810191506020820190505f805160206125f483398151915282510660c08401526101608401518051825260208101516020830152506101808401518051604083015260208101516060830152505060a081205f805160206125f4833981519152810660e084015250509392505050565b6117c0612104565b8162010000036118ff576040518060600160405280601081526020017f30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c100181526020016040518060e00160405280600181526020017eeeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b781526020017f2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb81526020017f086812a00ac43ea801669c640171203c41a496671bfbc065ac8db24d52cf31e581526020017f2d965651cdd9e4811f4e51b80ddca8a8b4a93ee17420aae6adaa01c2617c6e8581526020017f12597a56c2e438620b9041b98992ae0d4e705b780057bf7766a2767cece16e1d81526020017f02d94117cd17bcf1290fd67c01155dd40807857dff4a5a0b4dc67befa8aa34fd8152508152509050919050565b816210000003611a3f576040518060600160405280601481526020017f30644b6c9c4a72169e4daa317d25f04512ae15c53b34e8f5acd8e155d0a6c10181526020016040518060e00160405280600181526020017f26125da10a0ed06327508aba06d1e303ac616632dbed349f53422da95333785781526020017f2260e724844bca5251829353968e4915305258418357473a5c1d597f613f6cbd81526020017f2087ea2cd664278608fb0ebdb820907f598502c81b6690c185e2bf15cb935f4281526020017f19ddbcaf3a8d46c15c0176fbb5b95e4dc57088ff13f4d1bd84c6bfa57dcdc0e081526020017f05a2c85cfc591789605cae818e37dd4161eef9aa666bec6fe4288d09e6d2341881526020017f11f70e5363258ff4f0d716a653e1dc41f1c64484d7f4b6e219d6377614a3905c8152508152509050919050565b81602003611b7d576040518060600160405280600581526020017f2ee12bff4a2813286a8dc388cd754d9a3ef2490635eba50cb9c2e5e75080000181526020016040518060e00160405280600181526020017f09c532c6306b93d29678200d47c0b2a99c18d51b838eeb1d3eed4c533bb512d081526020017f21082ca216cbbf4e1c6e4f4594dd508c996dfbe1174efb98b11509c6e306460b81526020017f1277ae6415f0ef18f2ba5fb162c39eb7311f386e2d26d64401f4a25da77c253b81526020017f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8081526020017f2fbd4dd2976be55d1a163aa9820fb88dfac5ddce77e1872e90632027327a5ebe81526020017f107aab49e65a67f9da9cd2abf78be38bd9dc1d5db39f81de36bcfa5b4b0390438152508152509050919050565b60405163e2ef09e560e01b815260040160405180910390fd5b611bb760405180606001604052805f81526020015f81526020015f81525090565b611bc18484611e51565b808252611bd19085908590611ea2565b60208201528051611be790859084908690611f13565b60408201529392505050565b60208101516040820151606085015160808601516101a08601516102408701515f959493600193909290915f805160206125f483398151915280808387095f805160206125f4833981519152868608088609945050506101c08801516102608901515f805160206125f4833981519152805f805160206125f48339815191528387095f805160206125f4833981519152868608088609945050506101e08801516102808901515f805160206125f4833981519152805f805160206125f48339815191528387095f805160206125f4833981519152868608088609945050506102008801516102a08901515f805160206125f4833981519152805f805160206125f48339815191528387095f805160206125f48339815191528686080886099450505061022088015191506102c08801515f805160206125f483398151915280825f805160206125f48339815191528587080985099350505050865160208801515f805160206125f4833981519152808683095f805160206125f48339815191520385089550505f805160206125f4833981519152808383095f805160206125f483398151915203860898975050505050505050565b805160208201515f917f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47911590151615611de157505050565b8251602084015182600384858586098509088382830914838210848410161693505050816101f65760405162461bcd60e51b815260206004820152601760248201527f426e3235343a20696e76616c696420473120706f696e7400000000000000000060448201526064016111a6565b81515f905f805160206125f483398151915290838015611e92578493505f5b82811015611e8657838586099450600101611e70565b50600184039350611e99565b6001830393505b50505092915050565b5f82600103611eb357506001611f0c565b815f03611ec157505f611f0c565b60208401515f805160206125f4833981519152905f90828186099050858015611eef57600187039250611ef6565b6001840392505b50611f0082612063565b91508282820993505050505b9392505050565b5f5f805160206125f4833981519152828203611f8c5760015f5b6007811015611f8157818603611f5e57868160078110611f4f57611f4f6125cb565b6020020151935050505061205b565b8280611f6c57611f6c6125df565b60408901516020015183099150600101611f2d565b505f9250505061205b565b611f94612128565b6040870151600160c0838101828152920190805b6007811015611fd55760208403935085868a85518903088309808552601f19909301929150600101611fa8565b505050505f805f90506001838960408c01515f5b6007811015612029578882518a85518c88518a0909098981880896505088898d84518c030886099450602093840193928301929190910190600101611fe9565b50505050809250505f61203b83612063565b905060208a01518581890996505084818709955084828709955050505050505b949350505050565b5f805f5f805160206125f4833981519152905060405160208152602080820152602060408201528460608201526002820360808201528160a082015260205f60c08360055afa9250505f519250816120fd5760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a20706f7720707265636f6d70696c65206661696c65642100000060448201526064016111a6565b5050919050565b60405180606001604052805f81526020015f8152602001612123612128565b905290565b6040518060e001604052806007906020820280368337509192915050565b634e487b7160e01b5f52604160045260245ffd5b6040516102e0810167ffffffffffffffff8111828210171561217e5761217e612146565b60405290565b6040516102c0810167ffffffffffffffff8111828210171561217e5761217e612146565b5f604082840312156121b8575f80fd5b6040516040810181811067ffffffffffffffff821117156121db576121db612146565b604052823581526020928301359281019290925250919050565b5f82601f830112612204575f80fd5b60405160e0810181811067ffffffffffffffff8211171561222757612227612146565b6040528060e084018581111561223b575f80fd5b845b8181101561225557803583526020928301920161223d565b509195945050505050565b5f6104808284031215612271575f80fd5b61227961215a565b905061228583836121a8565b815261229483604084016121a8565b60208201526122a683608084016121a8565b60408201526122b88360c084016121a8565b60608201526101006122cc848285016121a8565b60808301526101406122e0858286016121a8565b60a08401526101806122f4868287016121a8565b60c08501526101c0612308878288016121a8565b60e086015261020061231c888289016121a8565b858701526102409450612331888689016121a8565b61012087015261028061234689828a016121a8565b858801526102c0945061235b89868a016121a8565b61016088015261236f896103008a016121a8565b848801526103408801356101a0880152610360880135838801526103808801356101e08801526103a0880135828801526103c08801356102208801526103e08801358688015261040088013561026088015261042088013581880152505050506104408401356102a084015261046084013581840152505092915050565b5f805f838503610a60811215612401575f80fd5b61050080821215612410575f80fd5b612418612184565b9150853582526020860135602083015261243587604088016121a8565b604083015261244787608088016121a8565b60608301526124598760c088016121a8565b608083015261010061246d888289016121a8565b60a084015261014061248189828a016121a8565b60c08501526101806124958a828b016121a8565b60e08601526101c06124a98b828c016121a8565b8487015261020093506124be8b858c016121a8565b6101208701526102406124d38c828d016121a8565b8488015261028093506124e88c858d016121a8565b6101608801526124fc8c6102c08d016121a8565b8388015261250e8c6103008d016121a8565b6101a08801526125228c6103408d016121a8565b828801526125348c6103808d016121a8565b6101e08801526125488c6103c08d016121a8565b8588015261255a8c6104008d016121a8565b61022088015261256e8c6104408d016121a8565b81880152505050612583896104808a016121a8565b6102608501526104c08801358185015250506104e08601356102a08301528194506125b0878288016121f5565b935050506125c2856105e08601612260565b90509250925092565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffdfe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a164736f6c6343000817000a - /// ``` - #[rustfmt::skip] - #[allow(clippy::all)] - pub static BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( - b"a& a\x005`\x0B\x82\x82\x829\x80Q_\x1A`s\x14a\0)WcNH{q`\xE0\x1B_R_`\x04R`$_\xFD[0_R`s\x81S\x82\x81\xF3\xFEs\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\x046\x10a\0JW_5`\xE0\x1C\x80c\x1Dq.'\x14a\0NW\x80c\xCESzw\x14a\0\x88W\x80c\xDFnl\xB4\x14a\0\xABW[_\x80\xFD[a\0u\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x81V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\x9Ba\0\x966`\x04a#\xEDV[a\0\xBFV[`@Q\x90\x15\x15\x81R` \x01a\0\x7FV[a\0u_\x80Q` a%\xF4\x839\x81Q\x91R\x81V[_a\0\xC9\x82a\x10\x12V[a\0\xD9\x83_[` \x02\x01Qa\x11MV[a\0\xE4\x83`\x01a\0\xCFV[a\0\xEF\x83`\x02a\0\xCFV[a\0\xFA\x83`\x03a\0\xCFV[a\x01\x05\x83`\x04a\0\xCFV[a\x01\x10\x83`\x05a\0\xCFV[a\x01\x1B\x83`\x06a\0\xCFV[_a\x01'\x85\x85\x85a\x11\xAFV[\x90P_a\x016\x86_\x01Qa\x17\xB8V[\x90P_a\x01H\x82\x84`\xA0\x01Q\x88a\x1B\x96V[\x90P_a\x01V\x84\x87\x84a\x1B\xF3V[\x90Pa\x025V[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0C`$\x82\x01Rkerror verify`\xA0\x1B`D\x82\x01R`d\x81\xFD[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\r`$\x82\x01Rlerror pairing`\x98\x1B`D\x82\x01R`d\x81\xFD[`@Q\x81Q\x81R` \x82\x01Q` \x82\x01R\x82`@\x82\x01R`@_``\x83`\x07Z\xFA\x90P\x80a\x01\xF6Wa\x01\xF6a\x01]V[PPPV[`@\x80Q\x82Q\x81R` \x80\x84\x01Q\x81\x83\x01R_Q\x82\x84\x01RQ``\x82\x01R\x90\x82`\x80\x83`\x06Z\xFA\x90P\x80a\x021Wa\x021a\x01]V[PPV[`@Q`\xC0\x81\x01\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1`@\x83\x01R\x7F\x01\x18\xC4\xD5\xB87\xBC\xC2\xBC\x89\xB5\xB3\x98\xB5\x97N\x9FYD\x07;2\x07\x8B~#\x1F\xEC\x93\x88\x83\xB0``\x83\x01R\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4`\x80\x83\x01R\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U`\xA0\x83\x01R\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2a\x01\0\x83\x01R\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xEDa\x01 \x83\x01R\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[a\x01@\x83\x01R\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAAa\x01`\x83\x01Ra\x01\x80\x82\x01`@R_\x80_\x80`\x80\x8A\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R` \x8A\x01Q` \x8D\x01Q\t\x93P\x8AQ_\x80Q` a%\xF4\x839\x81Q\x91R`\xA0\x8D\x01Q``\x8E\x01Q\t\x93P_\x80Q` a%\xF4\x839\x81Q\x91Ra\x01\xA0\x8F\x01Q\x85\x08\x92P_\x80Q` a%\xF4\x839\x81Q\x91R\x82\x84\x08\x92P_\x80Q` a%\xF4\x839\x81Q\x91R\x81\x84\t\x90P_\x80Q` a%\xF4\x839\x81Q\x91R\x7F/\x8D\xD1\xF1\xA7X\x83\x85a\x01\xC6V[a\x0FG\x85a\x01\xFBV[`@\x80Q\x80\x82\x01\x90\x91R\x93P`\x01\x84R`\x02` \x85\x01Ra\x0Fw\x81_\x80Q` a%\xF4\x839\x81Q\x91R\x03\x85a\x01\xC6V[Pa\x0F\x81\x84a\x01\xFBV[a\x0F\xB0\x84` \x01\x80Q\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x03\x90RV[PPPa\x01`\x88\x01Q\x80Q\x83R` \x90\x81\x01Q\x90\x83\x01R`\xE0\x86\x01Qa\x01\x80\x89\x01Q\x90a\x0F\xDD\x81\x83a\x01\xC6V[PPPa\x0F\xE9\x81a\x01\xFBV[` _a\x01\x80\x83`\x08Z\xFA\x90P\x80a\x10\x03Wa\x10\x03a\x01\x91V[PP_Q\x97\x96PPPPPPPV[\x80Qa\x10\x1D\x90a\x1D\xA8V[a\x10*\x81` \x01Qa\x1D\xA8V[a\x107\x81`@\x01Qa\x1D\xA8V[a\x10D\x81``\x01Qa\x1D\xA8V[a\x10Q\x81`\x80\x01Qa\x1D\xA8V[a\x10^\x81`\xA0\x01Qa\x1D\xA8V[a\x10k\x81`\xC0\x01Qa\x1D\xA8V[a\x10x\x81`\xE0\x01Qa\x1D\xA8V[a\x10\x86\x81a\x01\0\x01Qa\x1D\xA8V[a\x10\x94\x81a\x01 \x01Qa\x1D\xA8V[a\x10\xA2\x81a\x01@\x01Qa\x1D\xA8V[a\x10\xB0\x81a\x01`\x01Qa\x1D\xA8V[a\x10\xBE\x81a\x01\x80\x01Qa\x1D\xA8V[a\x10\xCC\x81a\x01\xA0\x01Qa\x11MV[a\x10\xDA\x81a\x01\xC0\x01Qa\x11MV[a\x10\xE8\x81a\x01\xE0\x01Qa\x11MV[a\x10\xF6\x81a\x02\0\x01Qa\x11MV[a\x11\x04\x81a\x02 \x01Qa\x11MV[a\x11\x12\x81a\x02@\x01Qa\x11MV[a\x11 \x81a\x02`\x01Qa\x11MV[a\x11.\x81a\x02\x80\x01Qa\x11MV[a\x11<\x81a\x02\xA0\x01Qa\x11MV[a\x11J\x81a\x02\xC0\x01Qa\x11MV[PV[_\x80Q` a%\xF4\x839\x81Q\x91R\x81\x10\x80a\x021W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[a\x11\xEF`@Q\x80a\x01\0\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81RP\x90V[`@Q` \x81\x01_\x81R`\xFE`\xE0\x1B\x81R\x85Q`\xC0\x1B`\x04\x82\x01R` \x86\x01Q`\xC0\x1B`\x0C\x82\x01Ra\x02\x80\x86\x01Q` \x82\x01Ra\x02\xA0\x86\x01Q`@\x82\x01R`\x01``\x82\x01R\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85\x81R` \x01\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D\x81R` \x01\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD\x81RP\x81RP\x90P\x91\x90PV[\x81b\x10\0\0\x03a\x1A?W`@Q\x80``\x01`@R\x80`\x14\x81R` \x01\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x81R` \x01`@Q\x80`\xE0\x01`@R\x80`\x01\x81R` \x01\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW\x81R` \x01\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD\x81R` \x01\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B\x81R` \x01\x7F\x19\xDD\xBC\xAF:\x8DF\xC1\\\x01v\xFB\xB5\xB9^M\xC5p\x88\xFF\x13\xF4\xD1\xBD\x84\xC6\xBF\xA5}\xCD\xC0\xE0\x81R` \x01\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18\x81R` \x01\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\\x81RP\x81RP\x90P\x91\x90PV[\x81` \x03a\x1B}W`@Q\x80``\x01`@R\x80`\x05\x81R` \x01\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x81R` \x01`@Q\x80`\xE0\x01`@R\x80`\x01\x81R` \x01\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0\x81R` \x01\x7F!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B\x81R` \x01\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;\x81R` \x01\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80\x81R` \x01\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE\x81R` \x01\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C\x81RP\x81RP\x90P\x91\x90PV[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x1B\xB7`@Q\x80``\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81RP\x90V[a\x1B\xC1\x84\x84a\x1EQV[\x80\x82Ra\x1B\xD1\x90\x85\x90\x85\x90a\x1E\xA2V[` \x82\x01R\x80Qa\x1B\xE7\x90\x85\x90\x84\x90\x86\x90a\x1F\x13V[`@\x82\x01R\x93\x92PPPV[` \x81\x01Q`@\x82\x01Q``\x85\x01Q`\x80\x86\x01Qa\x01\xA0\x86\x01Qa\x02@\x87\x01Q_\x95\x94\x93`\x01\x93\x90\x92\x90\x91_\x80Q` a%\xF4\x839\x81Q\x91R\x80\x80\x83\x87\t_\x80Q` a%\xF4\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x01\xC0\x88\x01Qa\x02`\x89\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R\x80_\x80Q` a%\xF4\x839\x81Q\x91R\x83\x87\t_\x80Q` a%\xF4\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x01\xE0\x88\x01Qa\x02\x80\x89\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R\x80_\x80Q` a%\xF4\x839\x81Q\x91R\x83\x87\t_\x80Q` a%\xF4\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x02\0\x88\x01Qa\x02\xA0\x89\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R\x80_\x80Q` a%\xF4\x839\x81Q\x91R\x83\x87\t_\x80Q` a%\xF4\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x02 \x88\x01Q\x91Pa\x02\xC0\x88\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R\x80\x82_\x80Q` a%\xF4\x839\x81Q\x91R\x85\x87\x08\t\x85\t\x93PPPP\x86Q` \x88\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R\x80\x86\x83\t_\x80Q` a%\xF4\x839\x81Q\x91R\x03\x85\x08\x95PP_\x80Q` a%\xF4\x839\x81Q\x91R\x80\x83\x83\t_\x80Q` a%\xF4\x839\x81Q\x91R\x03\x86\x08\x98\x97PPPPPPPPV[\x80Q` \x82\x01Q_\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x15\x90\x15\x16\x15a\x1D\xE1WPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x01\xF6W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7FBn254: invalid G1 point\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x11\xA6V[\x81Q_\x90_\x80Q` a%\xF4\x839\x81Q\x91R\x90\x83\x80\x15a\x1E\x92W\x84\x93P_[\x82\x81\x10\x15a\x1E\x86W\x83\x85\x86\t\x94P`\x01\x01a\x1EpV[P`\x01\x84\x03\x93Pa\x1E\x99V[`\x01\x83\x03\x93P[PPP\x92\x91PPV[_\x82`\x01\x03a\x1E\xB3WP`\x01a\x1F\x0CV[\x81_\x03a\x1E\xC1WP_a\x1F\x0CV[` \x84\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R\x90_\x90\x82\x81\x86\t\x90P\x85\x80\x15a\x1E\xEFW`\x01\x87\x03\x92Pa\x1E\xF6V[`\x01\x84\x03\x92P[Pa\x1F\0\x82a cV[\x91P\x82\x82\x82\t\x93PPPP[\x93\x92PPPV[__\x80Q` a%\xF4\x839\x81Q\x91R\x82\x82\x03a\x1F\x8CW`\x01_[`\x07\x81\x10\x15a\x1F\x81W\x81\x86\x03a\x1F^W\x86\x81`\x07\x81\x10a\x1FOWa\x1FOa%\xCBV[` \x02\x01Q\x93PPPPa [V[\x82\x80a\x1FlWa\x1Fla%\xDFV[`@\x89\x01Q` \x01Q\x83\t\x91P`\x01\x01a\x1F-V[P_\x92PPPa [V[a\x1F\x94a!(V[`@\x87\x01Q`\x01`\xC0\x83\x81\x01\x82\x81R\x92\x01\x90\x80[`\x07\x81\x10\x15a\x1F\xD5W` \x84\x03\x93P\x85\x86\x8A\x85Q\x89\x03\x08\x83\t\x80\x85R`\x1F\x19\x90\x93\x01\x92\x91P`\x01\x01a\x1F\xA8V[PPPP_\x80_\x90P`\x01\x83\x89`@\x8C\x01Q_[`\x07\x81\x10\x15a )W\x88\x82Q\x8A\x85Q\x8C\x88Q\x8A\t\t\t\x89\x81\x88\x08\x96PP\x88\x89\x8D\x84Q\x8C\x03\x08\x86\t\x94P` \x93\x84\x01\x93\x92\x83\x01\x92\x91\x90\x91\x01\x90`\x01\x01a\x1F\xE9V[PPPP\x80\x92PP_a ;\x83a cV[\x90P` \x8A\x01Q\x85\x81\x89\t\x96PP\x84\x81\x87\t\x95P\x84\x82\x87\t\x95PPPPPP[\x94\x93PPPPV[_\x80__\x80Q` a%\xF4\x839\x81Q\x91R\x90P`@Q` \x81R` \x80\x82\x01R` `@\x82\x01R\x84``\x82\x01R`\x02\x82\x03`\x80\x82\x01R\x81`\xA0\x82\x01R` _`\xC0\x83`\x05Z\xFA\x92PP_Q\x92P\x81a \xFDW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\x11\xA6V[PP\x91\x90PV[`@Q\x80``\x01`@R\x80_\x81R` \x01_\x81R` \x01a!#a!(V[\x90R\x90V[`@Q\x80`\xE0\x01`@R\x80`\x07\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[cNH{q`\xE0\x1B_R`A`\x04R`$_\xFD[`@Qa\x02\xE0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a!~Wa!~a!FV[`@R\x90V[`@Qa\x02\xC0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a!~Wa!~a!FV[_`@\x82\x84\x03\x12\x15a!\xB8W_\x80\xFD[`@Q`@\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a!\xDBWa!\xDBa!FV[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[_\x82`\x1F\x83\x01\x12a\"\x04W_\x80\xFD[`@Q`\xE0\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a\"'Wa\"'a!FV[`@R\x80`\xE0\x84\x01\x85\x81\x11\x15a\";W_\x80\xFD[\x84[\x81\x81\x10\x15a\"UW\x805\x83R` \x92\x83\x01\x92\x01a\"=V[P\x91\x95\x94PPPPPV[_a\x04\x80\x82\x84\x03\x12\x15a\"qW_\x80\xFD[a\"ya!ZV[\x90Pa\"\x85\x83\x83a!\xA8V[\x81Ra\"\x94\x83`@\x84\x01a!\xA8V[` \x82\x01Ra\"\xA6\x83`\x80\x84\x01a!\xA8V[`@\x82\x01Ra\"\xB8\x83`\xC0\x84\x01a!\xA8V[``\x82\x01Ra\x01\0a\"\xCC\x84\x82\x85\x01a!\xA8V[`\x80\x83\x01Ra\x01@a\"\xE0\x85\x82\x86\x01a!\xA8V[`\xA0\x84\x01Ra\x01\x80a\"\xF4\x86\x82\x87\x01a!\xA8V[`\xC0\x85\x01Ra\x01\xC0a#\x08\x87\x82\x88\x01a!\xA8V[`\xE0\x86\x01Ra\x02\0a#\x1C\x88\x82\x89\x01a!\xA8V[\x85\x87\x01Ra\x02@\x94Pa#1\x88\x86\x89\x01a!\xA8V[a\x01 \x87\x01Ra\x02\x80a#F\x89\x82\x8A\x01a!\xA8V[\x85\x88\x01Ra\x02\xC0\x94Pa#[\x89\x86\x8A\x01a!\xA8V[a\x01`\x88\x01Ra#o\x89a\x03\0\x8A\x01a!\xA8V[\x84\x88\x01Ra\x03@\x88\x015a\x01\xA0\x88\x01Ra\x03`\x88\x015\x83\x88\x01Ra\x03\x80\x88\x015a\x01\xE0\x88\x01Ra\x03\xA0\x88\x015\x82\x88\x01Ra\x03\xC0\x88\x015a\x02 \x88\x01Ra\x03\xE0\x88\x015\x86\x88\x01Ra\x04\0\x88\x015a\x02`\x88\x01Ra\x04 \x88\x015\x81\x88\x01RPPPPa\x04@\x84\x015a\x02\xA0\x84\x01Ra\x04`\x84\x015\x81\x84\x01RPP\x92\x91PPV[_\x80_\x83\x85\x03a\n`\x81\x12\x15a$\x01W_\x80\xFD[a\x05\0\x80\x82\x12\x15a$\x10W_\x80\xFD[a$\x18a!\x84V[\x91P\x855\x82R` \x86\x015` \x83\x01Ra$5\x87`@\x88\x01a!\xA8V[`@\x83\x01Ra$G\x87`\x80\x88\x01a!\xA8V[``\x83\x01Ra$Y\x87`\xC0\x88\x01a!\xA8V[`\x80\x83\x01Ra\x01\0a$m\x88\x82\x89\x01a!\xA8V[`\xA0\x84\x01Ra\x01@a$\x81\x89\x82\x8A\x01a!\xA8V[`\xC0\x85\x01Ra\x01\x80a$\x95\x8A\x82\x8B\x01a!\xA8V[`\xE0\x86\x01Ra\x01\xC0a$\xA9\x8B\x82\x8C\x01a!\xA8V[\x84\x87\x01Ra\x02\0\x93Pa$\xBE\x8B\x85\x8C\x01a!\xA8V[a\x01 \x87\x01Ra\x02@a$\xD3\x8C\x82\x8D\x01a!\xA8V[\x84\x88\x01Ra\x02\x80\x93Pa$\xE8\x8C\x85\x8D\x01a!\xA8V[a\x01`\x88\x01Ra$\xFC\x8Ca\x02\xC0\x8D\x01a!\xA8V[\x83\x88\x01Ra%\x0E\x8Ca\x03\0\x8D\x01a!\xA8V[a\x01\xA0\x88\x01Ra%\"\x8Ca\x03@\x8D\x01a!\xA8V[\x82\x88\x01Ra%4\x8Ca\x03\x80\x8D\x01a!\xA8V[a\x01\xE0\x88\x01Ra%H\x8Ca\x03\xC0\x8D\x01a!\xA8V[\x85\x88\x01Ra%Z\x8Ca\x04\0\x8D\x01a!\xA8V[a\x02 \x88\x01Ra%n\x8Ca\x04@\x8D\x01a!\xA8V[\x81\x88\x01RPPPa%\x83\x89a\x04\x80\x8A\x01a!\xA8V[a\x02`\x85\x01Ra\x04\xC0\x88\x015\x81\x85\x01RPPa\x04\xE0\x86\x015a\x02\xA0\x83\x01R\x81\x94Pa%\xB0\x87\x82\x88\x01a!\xF5V[\x93PPPa%\xC2\x85a\x05\xE0\x86\x01a\"`V[\x90P\x92P\x92P\x92V[cNH{q`\xE0\x1B_R`2`\x04R`$_\xFD[cNH{q`\xE0\x1B_R`\x12`\x04R`$_\xFD\xFE0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\xA1dsolcC\0\x08\x17\0\n", - ); - /// The runtime bytecode of the contract, as deployed on the network. - /// - /// ```text - ///0x730000000000000000000000000000000000000000301460806040526004361061004a575f3560e01c80631d712e271461004e578063ce537a7714610088578063df6e6cb4146100ab575b5f80fd5b6100757f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4781565b6040519081526020015b60405180910390f35b61009b6100963660046123ed565b6100bf565b604051901515815260200161007f565b6100755f805160206125f483398151915281565b5f6100c982611012565b6100d9835f5b602002015161114d565b6100e48360016100cf565b6100ef8360026100cf565b6100fa8360036100cf565b6101058360046100cf565b6101108360056100cf565b61011b8360066100cf565b5f6101278585856111af565b90505f610136865f01516117b8565b90505f610148828460a0015188611b96565b90505f610156848784611bf3565b9050610235565b60405162461bcd60e51b815260206004820152600c60248201526b6572726f722076657269667960a01b6044820152606481fd5b60405162461bcd60e51b815260206004820152600d60248201526c6572726f722070616972696e6760981b6044820152606481fd5b604051815181526020820151602082015282604082015260405f60608360075afa9050806101f6576101f661015d565b505050565b6040805182518152602080840151818301525f5182840152516060820152908260808360065afa9050806102315761023161015d565b5050565b60405160c081017f260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c160408301527f0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b060608301527f04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe460808301527f22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e5560a08301527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101008301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101208301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6101408301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa61016083015261018082016040525f805f8060808a01515f805160206125f483398151915260208a015160208d01510993508a515f805160206125f483398151915260a08d015160608e01510993505f805160206125f48339815191526101a08f0151850892505f805160206125f483398151915282840892505f805160206125f483398151915281840990505f805160206125f48339815191527f2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a850992505f805160206125f48339815191526101c08f0151840892505f805160206125f483398151915282840892505f805160206125f483398151915281840990505f805160206125f48339815191527f1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb025850992505f805160206125f48339815191526101e08f0151840892505f805160206125f483398151915282840892505f805160206125f483398151915281840990505f805160206125f48339815191527f2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a850992505f805160206125f48339815191526102008f0151840892505f805160206125f483398151915282840892505f805160206125f483398151915281840990505f805160206125f48339815191527f2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e881850992505f805160206125f48339815191526102208f0151840892505f805160206125f483398151915282840892505f805160206125f483398151915281840990505f805160206125f483398151915281860894505060a08d015194506105e084866101c6565b5f51865260205160208701525f805160206125f483398151915260608c01518c510993505f805160206125f48339815191526102c08e0151850993505f805160206125f48339815191526102408e015160608d01510992505f805160206125f48339815191526101a08e0151840892505f805160206125f483398151915281840892505f805160206125f483398151915283850993505f805160206125f48339815191526102608e015160608d01510992505f805160206125f48339815191526101c08e0151840892505f805160206125f483398151915281840892505f805160206125f483398151915283850993505f805160206125f48339815191526102808e015160608d01510992505f805160206125f48339815191526101e08e0151840892505f805160206125f483398151915281840892505f805160206125f483398151915283850993505f805160206125f48339815191526102a08e015160608d01510992505f805160206125f48339815191526102008e0151840892505f805160206125f48339815191528184089250505f805160206125f48339815191528284095f805160206125f483398151915203925060c08e015193506107a583856101c6565b6107ae856101fb565b6101a08c0151925060e08e015193506107c783856101c6565b6107d0856101fb565b6101c08c015192506101008e015193506107ea83856101c6565b6107f3856101fb565b6101e08c015192506101208e0151935061080d83856101c6565b610816856101fb565b6102008c015192506101408e0151935061083083856101c6565b610839856101fb565b5f805160206125f48339815191526101c08d01516101a08e01510992506101608e0151935061086883856101c6565b610871856101fb565b5f805160206125f48339815191526102008d01516101e08e01510992506101808e015193506108a083856101c6565b6108a9856101fb565b6101a08c015191505f805160206125f483398151915282830990505f805160206125f483398151915281820990505f805160206125f483398151915281830992506101e08e015193506108fc83856101c6565b610905856101fb565b6101c08c015191505f805160206125f483398151915282830990505f805160206125f483398151915281820990505f805160206125f483398151915281830992506102008e0151935061095883856101c6565b610961856101fb565b6101e08c015191505f805160206125f483398151915282830990505f805160206125f483398151915281820990505f805160206125f483398151915281830992506102208e015193506109b483856101c6565b6109bd856101fb565b6102008c015191505f805160206125f483398151915282830990505f805160206125f483398151915281820990505f805160206125f483398151915281830992506102408e01519350610a1083856101c6565b610a19856101fb565b6102208c01515f805160206125f48339815191520392506101a08e01519350610a4283856101c6565b610a4b856101fb565b600192506101c08e01519350610a6183856101c6565b610a6a856101fb565b5f805160206125f48339815191526101c08d01516101a08e01510991505f805160206125f48339815191526101e08d0151830991505f805160206125f48339815191526102008d0151830991505f805160206125f48339815191526102208d0151830992506102608e01519350610ae183856101c6565b610aea856101fb565b87515f805160206125f483398151915203925060c08c01519350610b0e83856101c6565b610b17856101fb565b5f805160206125f48339815191526001895108915060a08a015190505f805160206125f483398151915281820990505f805160206125f48339815191528183099150505f805160206125f4833981519152818309915060e08b01519250610b7e82846101c6565b610b87846101fb565b5f805160206125f483398151915281830991506101008b01519250610bac82846101c6565b610bb5846101fb565b5f805160206125f483398151915281830991506101208b01519250610bda82846101c6565b610be3846101fb565b5f805160206125f483398151915281830991506101408b01519250610c0882846101c6565b610c11846101fb565b50505060c0860151885190805f805160206125f4833981519152869003610c3882856101c6565b610c41856101fb565b5f805160206125f4833981519152806101a08e01518509820890505f805160206125f4833981519152828409925060208c01519350610c8083856101c6565b610c89856101fb565b5f805160206125f4833981519152806101c08e01518509820890505f805160206125f4833981519152828409925060408c01519350610cc883856101c6565b610cd1856101fb565b5f805160206125f4833981519152806101e08e01518509820890505f805160206125f4833981519152828409925060608c01519350610d1083856101c6565b610d19856101fb565b5f805160206125f4833981519152806102008e01518509820890505f805160206125f4833981519152828409925060808c01519350610d5883856101c6565b610d61856101fb565b5f805160206125f4833981519152806102208e01518509820890505f805160206125f4833981519152828409925060408e01519350610da083856101c6565b610da9856101fb565b5f805160206125f4833981519152806102408e01518509820890505f805160206125f4833981519152828409925060608e01519350610de883856101c6565b610df1856101fb565b5f805160206125f4833981519152806102608e01518509820890505f805160206125f4833981519152828409925060808e01519350610e3083856101c6565b610e39856101fb565b5f805160206125f4833981519152806102808e01518509820890505f805160206125f4833981519152828409925060a08e01519350610e7883856101c6565b610e81856101fb565b5f805160206125f4833981519152806102a08e015185098208905060e08a0151925060a08c01519350610eb483856101c6565b610ebd856101fb565b5f805160206125f4833981519152806102c08e015185098208905060a08a015192506101608c01519350610ef183856101c6565b610efa856101fb565b5f805160206125f4833981519152602060408b01510151840991505f805160206125f483398151915260e08b0151830992506101808c01519350610f3e83856101c6565b610f47856101fb565b6040805180820190915293506001845260026020850152610f77815f805160206125f483398151915203856101c6565b50610f81846101fb565b610fb08460200180517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47039052565b505050610160880151805183526020908101519083015260e086015161018089015190610fdd81836101c6565b505050610fe9816101fb565b60205f6101808360085afa90508061100357611003610191565b50505f51979650505050505050565b805161101d90611da8565b61102a8160200151611da8565b6110378160400151611da8565b6110448160600151611da8565b6110518160800151611da8565b61105e8160a00151611da8565b61106b8160c00151611da8565b6110788160e00151611da8565b611086816101000151611da8565b611094816101200151611da8565b6110a2816101400151611da8565b6110b0816101600151611da8565b6110be816101800151611da8565b6110cc816101a0015161114d565b6110da816101c0015161114d565b6110e8816101e0015161114d565b6110f681610200015161114d565b61110481610220015161114d565b61111281610240015161114d565b61112081610260015161114d565b61112e81610280015161114d565b61113c816102a0015161114d565b61114a816102c0015161114d565b50565b5f805160206125f48339815191528110806102315760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c64000000000060448201526064015b60405180910390fd5b6111ef6040518061010001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b604051602081015f815260fe60e01b8152855160c01b6004820152602086015160c01b600c82015261028086015160208201526102a08601516040820152600160608201527f2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a60808201527f1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb02560a08201527f2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a60c08201527f2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e88160e082015260e086015180516101008301526020810151610120830152506101008601518051610140830152602081015161016083015250610120860151805161018083015260208101516101a08301525061014086015180516101c083015260208101516101e083015250610160860151805161020083015260208101516102208301525061018086015180516102408301526020810151610260830152506101e0860151805161028083015260208101516102a08301525061020086015180516102c083015260208101516102e083015250610220860151805161030083015260208101516103208301525061024086015180516103408301526020810151610360830152506101a0860151805161038083015260208101516103a0830152506101c086015180516103c083015260208101516103e0830152506102608601518051610400830152602081015161042083015250604086015180516104408301526020810151610460830152506060860151805161048083015260208101516104a083015250608086015180516104c083015260208101516104e08301525060a0860151805161050083015260208101516105208301525060c08601518051610540830152602081015161056083015250845161058082015260208501516105a082015260408501516105c082015260608501516105e0820152608085015161060082015260a085015161062082015260c085015161064082015260e085015161066082015283518051610660830152602081015161068083015250602084015180516106a083015260208101516106c083015250604084015180516106e083015260208101516107008301525060608401518051610720830152602081015161074083015250608084015180516107608301526020810151610780830152505f82526107c082206107c08201526107c0810191506020820190505f805160206125f483398151915282510660608401526020822081528091506020820190505f805160206125f4833981519152825106608084015260a0840151805182526020810151602083015250606082206040820192508083526020830191505f805160206125f4833981519152810684525f805160206125f48339815191528182095f805160206125f48339815191528282099150806020860152508060408501525060c084015180518252602081015160208301525060e084015180516040830152602081015160608301525061010084015180516080830152602081015160a083015250610120840151805160c0830152602081015160e08301525061014084015180516101008301526020810151610120830152506101608220610140820152610140810191506020820190505f805160206125f483398151915282510660a08401526101a084015181526101c084015160208201526101e084015160408201526102008401516060820152610220840151608082015261024084015160a082015261026084015160c082015261028084015160e08201526102a08401516101008201526102c08401516101208201526101608220610140820152610140810191506020820190505f805160206125f483398151915282510660c08401526101608401518051825260208101516020830152506101808401518051604083015260208101516060830152505060a081205f805160206125f4833981519152810660e084015250509392505050565b6117c0612104565b8162010000036118ff576040518060600160405280601081526020017f30641e0e92bebef818268d663bcad6dbcfd6c0149170f6d7d350b1b1fa6c100181526020016040518060e00160405280600181526020017eeeb2cb5981ed45649abebde081dcff16c8601de4347e7dd1628ba2daac43b781526020017f2d1ba66f5941dc91017171fa69ec2bd0022a2a2d4115a009a93458fd4e26ecfb81526020017f086812a00ac43ea801669c640171203c41a496671bfbc065ac8db24d52cf31e581526020017f2d965651cdd9e4811f4e51b80ddca8a8b4a93ee17420aae6adaa01c2617c6e8581526020017f12597a56c2e438620b9041b98992ae0d4e705b780057bf7766a2767cece16e1d81526020017f02d94117cd17bcf1290fd67c01155dd40807857dff4a5a0b4dc67befa8aa34fd8152508152509050919050565b816210000003611a3f576040518060600160405280601481526020017f30644b6c9c4a72169e4daa317d25f04512ae15c53b34e8f5acd8e155d0a6c10181526020016040518060e00160405280600181526020017f26125da10a0ed06327508aba06d1e303ac616632dbed349f53422da95333785781526020017f2260e724844bca5251829353968e4915305258418357473a5c1d597f613f6cbd81526020017f2087ea2cd664278608fb0ebdb820907f598502c81b6690c185e2bf15cb935f4281526020017f19ddbcaf3a8d46c15c0176fbb5b95e4dc57088ff13f4d1bd84c6bfa57dcdc0e081526020017f05a2c85cfc591789605cae818e37dd4161eef9aa666bec6fe4288d09e6d2341881526020017f11f70e5363258ff4f0d716a653e1dc41f1c64484d7f4b6e219d6377614a3905c8152508152509050919050565b81602003611b7d576040518060600160405280600581526020017f2ee12bff4a2813286a8dc388cd754d9a3ef2490635eba50cb9c2e5e75080000181526020016040518060e00160405280600181526020017f09c532c6306b93d29678200d47c0b2a99c18d51b838eeb1d3eed4c533bb512d081526020017f21082ca216cbbf4e1c6e4f4594dd508c996dfbe1174efb98b11509c6e306460b81526020017f1277ae6415f0ef18f2ba5fb162c39eb7311f386e2d26d64401f4a25da77c253b81526020017f2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e8081526020017f2fbd4dd2976be55d1a163aa9820fb88dfac5ddce77e1872e90632027327a5ebe81526020017f107aab49e65a67f9da9cd2abf78be38bd9dc1d5db39f81de36bcfa5b4b0390438152508152509050919050565b60405163e2ef09e560e01b815260040160405180910390fd5b611bb760405180606001604052805f81526020015f81526020015f81525090565b611bc18484611e51565b808252611bd19085908590611ea2565b60208201528051611be790859084908690611f13565b60408201529392505050565b60208101516040820151606085015160808601516101a08601516102408701515f959493600193909290915f805160206125f483398151915280808387095f805160206125f4833981519152868608088609945050506101c08801516102608901515f805160206125f4833981519152805f805160206125f48339815191528387095f805160206125f4833981519152868608088609945050506101e08801516102808901515f805160206125f4833981519152805f805160206125f48339815191528387095f805160206125f4833981519152868608088609945050506102008801516102a08901515f805160206125f4833981519152805f805160206125f48339815191528387095f805160206125f48339815191528686080886099450505061022088015191506102c08801515f805160206125f483398151915280825f805160206125f48339815191528587080985099350505050865160208801515f805160206125f4833981519152808683095f805160206125f48339815191520385089550505f805160206125f4833981519152808383095f805160206125f483398151915203860898975050505050505050565b805160208201515f917f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47911590151615611de157505050565b8251602084015182600384858586098509088382830914838210848410161693505050816101f65760405162461bcd60e51b815260206004820152601760248201527f426e3235343a20696e76616c696420473120706f696e7400000000000000000060448201526064016111a6565b81515f905f805160206125f483398151915290838015611e92578493505f5b82811015611e8657838586099450600101611e70565b50600184039350611e99565b6001830393505b50505092915050565b5f82600103611eb357506001611f0c565b815f03611ec157505f611f0c565b60208401515f805160206125f4833981519152905f90828186099050858015611eef57600187039250611ef6565b6001840392505b50611f0082612063565b91508282820993505050505b9392505050565b5f5f805160206125f4833981519152828203611f8c5760015f5b6007811015611f8157818603611f5e57868160078110611f4f57611f4f6125cb565b6020020151935050505061205b565b8280611f6c57611f6c6125df565b60408901516020015183099150600101611f2d565b505f9250505061205b565b611f94612128565b6040870151600160c0838101828152920190805b6007811015611fd55760208403935085868a85518903088309808552601f19909301929150600101611fa8565b505050505f805f90506001838960408c01515f5b6007811015612029578882518a85518c88518a0909098981880896505088898d84518c030886099450602093840193928301929190910190600101611fe9565b50505050809250505f61203b83612063565b905060208a01518581890996505084818709955084828709955050505050505b949350505050565b5f805f5f805160206125f4833981519152905060405160208152602080820152602060408201528460608201526002820360808201528160a082015260205f60c08360055afa9250505f519250816120fd5760405162461bcd60e51b815260206004820152601d60248201527f426e3235343a20706f7720707265636f6d70696c65206661696c65642100000060448201526064016111a6565b5050919050565b60405180606001604052805f81526020015f8152602001612123612128565b905290565b6040518060e001604052806007906020820280368337509192915050565b634e487b7160e01b5f52604160045260245ffd5b6040516102e0810167ffffffffffffffff8111828210171561217e5761217e612146565b60405290565b6040516102c0810167ffffffffffffffff8111828210171561217e5761217e612146565b5f604082840312156121b8575f80fd5b6040516040810181811067ffffffffffffffff821117156121db576121db612146565b604052823581526020928301359281019290925250919050565b5f82601f830112612204575f80fd5b60405160e0810181811067ffffffffffffffff8211171561222757612227612146565b6040528060e084018581111561223b575f80fd5b845b8181101561225557803583526020928301920161223d565b509195945050505050565b5f6104808284031215612271575f80fd5b61227961215a565b905061228583836121a8565b815261229483604084016121a8565b60208201526122a683608084016121a8565b60408201526122b88360c084016121a8565b60608201526101006122cc848285016121a8565b60808301526101406122e0858286016121a8565b60a08401526101806122f4868287016121a8565b60c08501526101c0612308878288016121a8565b60e086015261020061231c888289016121a8565b858701526102409450612331888689016121a8565b61012087015261028061234689828a016121a8565b858801526102c0945061235b89868a016121a8565b61016088015261236f896103008a016121a8565b848801526103408801356101a0880152610360880135838801526103808801356101e08801526103a0880135828801526103c08801356102208801526103e08801358688015261040088013561026088015261042088013581880152505050506104408401356102a084015261046084013581840152505092915050565b5f805f838503610a60811215612401575f80fd5b61050080821215612410575f80fd5b612418612184565b9150853582526020860135602083015261243587604088016121a8565b604083015261244787608088016121a8565b60608301526124598760c088016121a8565b608083015261010061246d888289016121a8565b60a084015261014061248189828a016121a8565b60c08501526101806124958a828b016121a8565b60e08601526101c06124a98b828c016121a8565b8487015261020093506124be8b858c016121a8565b6101208701526102406124d38c828d016121a8565b8488015261028093506124e88c858d016121a8565b6101608801526124fc8c6102c08d016121a8565b8388015261250e8c6103008d016121a8565b6101a08801526125228c6103408d016121a8565b828801526125348c6103808d016121a8565b6101e08801526125488c6103c08d016121a8565b8588015261255a8c6104008d016121a8565b61022088015261256e8c6104408d016121a8565b81880152505050612583896104808a016121a8565b6102608501526104c08801358185015250506104e08601356102a08301528194506125b0878288016121f5565b935050506125c2856105e08601612260565b90509250925092565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffdfe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a164736f6c6343000817000a - /// ``` - #[rustfmt::skip] - #[allow(clippy::all)] - pub static DEPLOYED_BYTECODE: alloy_sol_types::private::Bytes = alloy_sol_types::private::Bytes::from_static( - b"s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\x046\x10a\0JW_5`\xE0\x1C\x80c\x1Dq.'\x14a\0NW\x80c\xCESzw\x14a\0\x88W\x80c\xDFnl\xB4\x14a\0\xABW[_\x80\xFD[a\0u\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x81V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\x9Ba\0\x966`\x04a#\xEDV[a\0\xBFV[`@Q\x90\x15\x15\x81R` \x01a\0\x7FV[a\0u_\x80Q` a%\xF4\x839\x81Q\x91R\x81V[_a\0\xC9\x82a\x10\x12V[a\0\xD9\x83_[` \x02\x01Qa\x11MV[a\0\xE4\x83`\x01a\0\xCFV[a\0\xEF\x83`\x02a\0\xCFV[a\0\xFA\x83`\x03a\0\xCFV[a\x01\x05\x83`\x04a\0\xCFV[a\x01\x10\x83`\x05a\0\xCFV[a\x01\x1B\x83`\x06a\0\xCFV[_a\x01'\x85\x85\x85a\x11\xAFV[\x90P_a\x016\x86_\x01Qa\x17\xB8V[\x90P_a\x01H\x82\x84`\xA0\x01Q\x88a\x1B\x96V[\x90P_a\x01V\x84\x87\x84a\x1B\xF3V[\x90Pa\x025V[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0C`$\x82\x01Rkerror verify`\xA0\x1B`D\x82\x01R`d\x81\xFD[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\r`$\x82\x01Rlerror pairing`\x98\x1B`D\x82\x01R`d\x81\xFD[`@Q\x81Q\x81R` \x82\x01Q` \x82\x01R\x82`@\x82\x01R`@_``\x83`\x07Z\xFA\x90P\x80a\x01\xF6Wa\x01\xF6a\x01]V[PPPV[`@\x80Q\x82Q\x81R` \x80\x84\x01Q\x81\x83\x01R_Q\x82\x84\x01RQ``\x82\x01R\x90\x82`\x80\x83`\x06Z\xFA\x90P\x80a\x021Wa\x021a\x01]V[PPV[`@Q`\xC0\x81\x01\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1`@\x83\x01R\x7F\x01\x18\xC4\xD5\xB87\xBC\xC2\xBC\x89\xB5\xB3\x98\xB5\x97N\x9FYD\x07;2\x07\x8B~#\x1F\xEC\x93\x88\x83\xB0``\x83\x01R\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4`\x80\x83\x01R\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U`\xA0\x83\x01R\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2a\x01\0\x83\x01R\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xEDa\x01 \x83\x01R\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[a\x01@\x83\x01R\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAAa\x01`\x83\x01Ra\x01\x80\x82\x01`@R_\x80_\x80`\x80\x8A\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R` \x8A\x01Q` \x8D\x01Q\t\x93P\x8AQ_\x80Q` a%\xF4\x839\x81Q\x91R`\xA0\x8D\x01Q``\x8E\x01Q\t\x93P_\x80Q` a%\xF4\x839\x81Q\x91Ra\x01\xA0\x8F\x01Q\x85\x08\x92P_\x80Q` a%\xF4\x839\x81Q\x91R\x82\x84\x08\x92P_\x80Q` a%\xF4\x839\x81Q\x91R\x81\x84\t\x90P_\x80Q` a%\xF4\x839\x81Q\x91R\x7F/\x8D\xD1\xF1\xA7X\x83\x85a\x01\xC6V[a\x0FG\x85a\x01\xFBV[`@\x80Q\x80\x82\x01\x90\x91R\x93P`\x01\x84R`\x02` \x85\x01Ra\x0Fw\x81_\x80Q` a%\xF4\x839\x81Q\x91R\x03\x85a\x01\xC6V[Pa\x0F\x81\x84a\x01\xFBV[a\x0F\xB0\x84` \x01\x80Q\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x03\x90RV[PPPa\x01`\x88\x01Q\x80Q\x83R` \x90\x81\x01Q\x90\x83\x01R`\xE0\x86\x01Qa\x01\x80\x89\x01Q\x90a\x0F\xDD\x81\x83a\x01\xC6V[PPPa\x0F\xE9\x81a\x01\xFBV[` _a\x01\x80\x83`\x08Z\xFA\x90P\x80a\x10\x03Wa\x10\x03a\x01\x91V[PP_Q\x97\x96PPPPPPPV[\x80Qa\x10\x1D\x90a\x1D\xA8V[a\x10*\x81` \x01Qa\x1D\xA8V[a\x107\x81`@\x01Qa\x1D\xA8V[a\x10D\x81``\x01Qa\x1D\xA8V[a\x10Q\x81`\x80\x01Qa\x1D\xA8V[a\x10^\x81`\xA0\x01Qa\x1D\xA8V[a\x10k\x81`\xC0\x01Qa\x1D\xA8V[a\x10x\x81`\xE0\x01Qa\x1D\xA8V[a\x10\x86\x81a\x01\0\x01Qa\x1D\xA8V[a\x10\x94\x81a\x01 \x01Qa\x1D\xA8V[a\x10\xA2\x81a\x01@\x01Qa\x1D\xA8V[a\x10\xB0\x81a\x01`\x01Qa\x1D\xA8V[a\x10\xBE\x81a\x01\x80\x01Qa\x1D\xA8V[a\x10\xCC\x81a\x01\xA0\x01Qa\x11MV[a\x10\xDA\x81a\x01\xC0\x01Qa\x11MV[a\x10\xE8\x81a\x01\xE0\x01Qa\x11MV[a\x10\xF6\x81a\x02\0\x01Qa\x11MV[a\x11\x04\x81a\x02 \x01Qa\x11MV[a\x11\x12\x81a\x02@\x01Qa\x11MV[a\x11 \x81a\x02`\x01Qa\x11MV[a\x11.\x81a\x02\x80\x01Qa\x11MV[a\x11<\x81a\x02\xA0\x01Qa\x11MV[a\x11J\x81a\x02\xC0\x01Qa\x11MV[PV[_\x80Q` a%\xF4\x839\x81Q\x91R\x81\x10\x80a\x021W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[a\x11\xEF`@Q\x80a\x01\0\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81RP\x90V[`@Q` \x81\x01_\x81R`\xFE`\xE0\x1B\x81R\x85Q`\xC0\x1B`\x04\x82\x01R` \x86\x01Q`\xC0\x1B`\x0C\x82\x01Ra\x02\x80\x86\x01Q` \x82\x01Ra\x02\xA0\x86\x01Q`@\x82\x01R`\x01``\x82\x01R\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85\x81R` \x01\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D\x81R` \x01\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD\x81RP\x81RP\x90P\x91\x90PV[\x81b\x10\0\0\x03a\x1A?W`@Q\x80``\x01`@R\x80`\x14\x81R` \x01\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x81R` \x01`@Q\x80`\xE0\x01`@R\x80`\x01\x81R` \x01\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW\x81R` \x01\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD\x81R` \x01\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B\x81R` \x01\x7F\x19\xDD\xBC\xAF:\x8DF\xC1\\\x01v\xFB\xB5\xB9^M\xC5p\x88\xFF\x13\xF4\xD1\xBD\x84\xC6\xBF\xA5}\xCD\xC0\xE0\x81R` \x01\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18\x81R` \x01\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\\x81RP\x81RP\x90P\x91\x90PV[\x81` \x03a\x1B}W`@Q\x80``\x01`@R\x80`\x05\x81R` \x01\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x81R` \x01`@Q\x80`\xE0\x01`@R\x80`\x01\x81R` \x01\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0\x81R` \x01\x7F!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B\x81R` \x01\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;\x81R` \x01\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80\x81R` \x01\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE\x81R` \x01\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C\x81RP\x81RP\x90P\x91\x90PV[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x1B\xB7`@Q\x80``\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81RP\x90V[a\x1B\xC1\x84\x84a\x1EQV[\x80\x82Ra\x1B\xD1\x90\x85\x90\x85\x90a\x1E\xA2V[` \x82\x01R\x80Qa\x1B\xE7\x90\x85\x90\x84\x90\x86\x90a\x1F\x13V[`@\x82\x01R\x93\x92PPPV[` \x81\x01Q`@\x82\x01Q``\x85\x01Q`\x80\x86\x01Qa\x01\xA0\x86\x01Qa\x02@\x87\x01Q_\x95\x94\x93`\x01\x93\x90\x92\x90\x91_\x80Q` a%\xF4\x839\x81Q\x91R\x80\x80\x83\x87\t_\x80Q` a%\xF4\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x01\xC0\x88\x01Qa\x02`\x89\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R\x80_\x80Q` a%\xF4\x839\x81Q\x91R\x83\x87\t_\x80Q` a%\xF4\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x01\xE0\x88\x01Qa\x02\x80\x89\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R\x80_\x80Q` a%\xF4\x839\x81Q\x91R\x83\x87\t_\x80Q` a%\xF4\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x02\0\x88\x01Qa\x02\xA0\x89\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R\x80_\x80Q` a%\xF4\x839\x81Q\x91R\x83\x87\t_\x80Q` a%\xF4\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x02 \x88\x01Q\x91Pa\x02\xC0\x88\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R\x80\x82_\x80Q` a%\xF4\x839\x81Q\x91R\x85\x87\x08\t\x85\t\x93PPPP\x86Q` \x88\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R\x80\x86\x83\t_\x80Q` a%\xF4\x839\x81Q\x91R\x03\x85\x08\x95PP_\x80Q` a%\xF4\x839\x81Q\x91R\x80\x83\x83\t_\x80Q` a%\xF4\x839\x81Q\x91R\x03\x86\x08\x98\x97PPPPPPPPV[\x80Q` \x82\x01Q_\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x15\x90\x15\x16\x15a\x1D\xE1WPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x01\xF6W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7FBn254: invalid G1 point\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x11\xA6V[\x81Q_\x90_\x80Q` a%\xF4\x839\x81Q\x91R\x90\x83\x80\x15a\x1E\x92W\x84\x93P_[\x82\x81\x10\x15a\x1E\x86W\x83\x85\x86\t\x94P`\x01\x01a\x1EpV[P`\x01\x84\x03\x93Pa\x1E\x99V[`\x01\x83\x03\x93P[PPP\x92\x91PPV[_\x82`\x01\x03a\x1E\xB3WP`\x01a\x1F\x0CV[\x81_\x03a\x1E\xC1WP_a\x1F\x0CV[` \x84\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R\x90_\x90\x82\x81\x86\t\x90P\x85\x80\x15a\x1E\xEFW`\x01\x87\x03\x92Pa\x1E\xF6V[`\x01\x84\x03\x92P[Pa\x1F\0\x82a cV[\x91P\x82\x82\x82\t\x93PPPP[\x93\x92PPPV[__\x80Q` a%\xF4\x839\x81Q\x91R\x82\x82\x03a\x1F\x8CW`\x01_[`\x07\x81\x10\x15a\x1F\x81W\x81\x86\x03a\x1F^W\x86\x81`\x07\x81\x10a\x1FOWa\x1FOa%\xCBV[` \x02\x01Q\x93PPPPa [V[\x82\x80a\x1FlWa\x1Fla%\xDFV[`@\x89\x01Q` \x01Q\x83\t\x91P`\x01\x01a\x1F-V[P_\x92PPPa [V[a\x1F\x94a!(V[`@\x87\x01Q`\x01`\xC0\x83\x81\x01\x82\x81R\x92\x01\x90\x80[`\x07\x81\x10\x15a\x1F\xD5W` \x84\x03\x93P\x85\x86\x8A\x85Q\x89\x03\x08\x83\t\x80\x85R`\x1F\x19\x90\x93\x01\x92\x91P`\x01\x01a\x1F\xA8V[PPPP_\x80_\x90P`\x01\x83\x89`@\x8C\x01Q_[`\x07\x81\x10\x15a )W\x88\x82Q\x8A\x85Q\x8C\x88Q\x8A\t\t\t\x89\x81\x88\x08\x96PP\x88\x89\x8D\x84Q\x8C\x03\x08\x86\t\x94P` \x93\x84\x01\x93\x92\x83\x01\x92\x91\x90\x91\x01\x90`\x01\x01a\x1F\xE9V[PPPP\x80\x92PP_a ;\x83a cV[\x90P` \x8A\x01Q\x85\x81\x89\t\x96PP\x84\x81\x87\t\x95P\x84\x82\x87\t\x95PPPPPP[\x94\x93PPPPV[_\x80__\x80Q` a%\xF4\x839\x81Q\x91R\x90P`@Q` \x81R` \x80\x82\x01R` `@\x82\x01R\x84``\x82\x01R`\x02\x82\x03`\x80\x82\x01R\x81`\xA0\x82\x01R` _`\xC0\x83`\x05Z\xFA\x92PP_Q\x92P\x81a \xFDW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\x11\xA6V[PP\x91\x90PV[`@Q\x80``\x01`@R\x80_\x81R` \x01_\x81R` \x01a!#a!(V[\x90R\x90V[`@Q\x80`\xE0\x01`@R\x80`\x07\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[cNH{q`\xE0\x1B_R`A`\x04R`$_\xFD[`@Qa\x02\xE0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a!~Wa!~a!FV[`@R\x90V[`@Qa\x02\xC0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a!~Wa!~a!FV[_`@\x82\x84\x03\x12\x15a!\xB8W_\x80\xFD[`@Q`@\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a!\xDBWa!\xDBa!FV[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[_\x82`\x1F\x83\x01\x12a\"\x04W_\x80\xFD[`@Q`\xE0\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a\"'Wa\"'a!FV[`@R\x80`\xE0\x84\x01\x85\x81\x11\x15a\";W_\x80\xFD[\x84[\x81\x81\x10\x15a\"UW\x805\x83R` \x92\x83\x01\x92\x01a\"=V[P\x91\x95\x94PPPPPV[_a\x04\x80\x82\x84\x03\x12\x15a\"qW_\x80\xFD[a\"ya!ZV[\x90Pa\"\x85\x83\x83a!\xA8V[\x81Ra\"\x94\x83`@\x84\x01a!\xA8V[` \x82\x01Ra\"\xA6\x83`\x80\x84\x01a!\xA8V[`@\x82\x01Ra\"\xB8\x83`\xC0\x84\x01a!\xA8V[``\x82\x01Ra\x01\0a\"\xCC\x84\x82\x85\x01a!\xA8V[`\x80\x83\x01Ra\x01@a\"\xE0\x85\x82\x86\x01a!\xA8V[`\xA0\x84\x01Ra\x01\x80a\"\xF4\x86\x82\x87\x01a!\xA8V[`\xC0\x85\x01Ra\x01\xC0a#\x08\x87\x82\x88\x01a!\xA8V[`\xE0\x86\x01Ra\x02\0a#\x1C\x88\x82\x89\x01a!\xA8V[\x85\x87\x01Ra\x02@\x94Pa#1\x88\x86\x89\x01a!\xA8V[a\x01 \x87\x01Ra\x02\x80a#F\x89\x82\x8A\x01a!\xA8V[\x85\x88\x01Ra\x02\xC0\x94Pa#[\x89\x86\x8A\x01a!\xA8V[a\x01`\x88\x01Ra#o\x89a\x03\0\x8A\x01a!\xA8V[\x84\x88\x01Ra\x03@\x88\x015a\x01\xA0\x88\x01Ra\x03`\x88\x015\x83\x88\x01Ra\x03\x80\x88\x015a\x01\xE0\x88\x01Ra\x03\xA0\x88\x015\x82\x88\x01Ra\x03\xC0\x88\x015a\x02 \x88\x01Ra\x03\xE0\x88\x015\x86\x88\x01Ra\x04\0\x88\x015a\x02`\x88\x01Ra\x04 \x88\x015\x81\x88\x01RPPPPa\x04@\x84\x015a\x02\xA0\x84\x01Ra\x04`\x84\x015\x81\x84\x01RPP\x92\x91PPV[_\x80_\x83\x85\x03a\n`\x81\x12\x15a$\x01W_\x80\xFD[a\x05\0\x80\x82\x12\x15a$\x10W_\x80\xFD[a$\x18a!\x84V[\x91P\x855\x82R` \x86\x015` \x83\x01Ra$5\x87`@\x88\x01a!\xA8V[`@\x83\x01Ra$G\x87`\x80\x88\x01a!\xA8V[``\x83\x01Ra$Y\x87`\xC0\x88\x01a!\xA8V[`\x80\x83\x01Ra\x01\0a$m\x88\x82\x89\x01a!\xA8V[`\xA0\x84\x01Ra\x01@a$\x81\x89\x82\x8A\x01a!\xA8V[`\xC0\x85\x01Ra\x01\x80a$\x95\x8A\x82\x8B\x01a!\xA8V[`\xE0\x86\x01Ra\x01\xC0a$\xA9\x8B\x82\x8C\x01a!\xA8V[\x84\x87\x01Ra\x02\0\x93Pa$\xBE\x8B\x85\x8C\x01a!\xA8V[a\x01 \x87\x01Ra\x02@a$\xD3\x8C\x82\x8D\x01a!\xA8V[\x84\x88\x01Ra\x02\x80\x93Pa$\xE8\x8C\x85\x8D\x01a!\xA8V[a\x01`\x88\x01Ra$\xFC\x8Ca\x02\xC0\x8D\x01a!\xA8V[\x83\x88\x01Ra%\x0E\x8Ca\x03\0\x8D\x01a!\xA8V[a\x01\xA0\x88\x01Ra%\"\x8Ca\x03@\x8D\x01a!\xA8V[\x82\x88\x01Ra%4\x8Ca\x03\x80\x8D\x01a!\xA8V[a\x01\xE0\x88\x01Ra%H\x8Ca\x03\xC0\x8D\x01a!\xA8V[\x85\x88\x01Ra%Z\x8Ca\x04\0\x8D\x01a!\xA8V[a\x02 \x88\x01Ra%n\x8Ca\x04@\x8D\x01a!\xA8V[\x81\x88\x01RPPPa%\x83\x89a\x04\x80\x8A\x01a!\xA8V[a\x02`\x85\x01Ra\x04\xC0\x88\x015\x81\x85\x01RPPa\x04\xE0\x86\x015a\x02\xA0\x83\x01R\x81\x94Pa%\xB0\x87\x82\x88\x01a!\xF5V[\x93PPPa%\xC2\x85a\x05\xE0\x86\x01a\"`V[\x90P\x92P\x92P\x92V[cNH{q`\xE0\x1B_R`2`\x04R`$_\xFD[cNH{q`\xE0\x1B_R`\x12`\x04R`$_\xFD\xFE0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\xA1dsolcC\0\x08\x17\0\n", - ); - /**Custom error with signature `UnsupportedDegree()` and selector `0xe2ef09e5`. - ```solidity - error UnsupportedDegree(); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct UnsupportedDegree {} - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: UnsupportedDegree) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for UnsupportedDegree { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self {} - } - } - #[automatically_derived] - impl alloy_sol_types::SolError for UnsupportedDegree { - type Parameters<'a> = UnderlyingSolTuple<'a>; - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "UnsupportedDegree()"; - const SELECTOR: [u8; 4] = [226u8, 239u8, 9u8, 229u8]; - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - } - }; - /**Function with signature `P_MOD()` and selector `0x1d712e27`. - ```solidity - function P_MOD() external view returns (uint256); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct P_MODCall {} - ///Container type for the return parameters of the [`P_MOD()`](P_MODCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct P_MODReturn { - pub _0: alloy::sol_types::private::primitives::aliases::U256, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: P_MODCall) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for P_MODCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self {} - } - } - } - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::primitives::aliases::U256,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: P_MODReturn) -> Self { - (value._0,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for P_MODReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _0: tuple.0 } - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for P_MODCall { - type Parameters<'a> = (); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = P_MODReturn; - type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "P_MOD()"; - const SELECTOR: [u8; 4] = [29u8, 113u8, 46u8, 39u8]; - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - #[inline] - fn abi_decode_returns( - data: &[u8], - validate: bool, - ) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence( - data, validate, - ) - .map(Into::into) - } - } - }; - /**Function with signature `R_MOD()` and selector `0xdf6e6cb4`. - ```solidity - function R_MOD() external view returns (uint256); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct R_MODCall {} - ///Container type for the return parameters of the [`R_MOD()`](R_MODCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct R_MODReturn { - pub _0: alloy::sol_types::private::primitives::aliases::U256, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: R_MODCall) -> Self { - () - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for R_MODCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self {} - } - } - } - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (alloy::sol_types::private::primitives::aliases::U256,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: R_MODReturn) -> Self { - (value._0,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for R_MODReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { _0: tuple.0 } - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for R_MODCall { - type Parameters<'a> = (); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = R_MODReturn; - type ReturnTuple<'a> = (alloy::sol_types::sol_data::Uint<256>,); - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "R_MOD()"; - const SELECTOR: [u8; 4] = [223u8, 110u8, 108u8, 180u8]; - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - () - } - #[inline] - fn abi_decode_returns( - data: &[u8], - validate: bool, - ) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence( - data, validate, - ) - .map(Into::into) - } - } - }; - /**Function with signature `verify((uint256,uint256,(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),bytes32,bytes32),uint256[7],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0x77ae3f07`. - ```solidity - function verify(IPlonkVerifier.VerifyingKey memory vk, uint256[7] memory publicInput, IPlonkVerifier.PlonkProof memory proof) external view returns (bool success); - ```*/ - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct verifyCall { - pub vk: ::RustType, - pub publicInput: [alloy::sol_types::private::primitives::aliases::U256; 7usize], - pub proof: ::RustType, - } - ///Container type for the return parameters of the [`verify((uint256,uint256,(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),bytes32,bytes32),uint256[7],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))`](verifyCall) function. - #[allow(non_camel_case_types, non_snake_case, clippy::pub_underscore_fields)] - #[derive(Clone)] - pub struct verifyReturn { - pub success: bool, - } - #[allow( - non_camel_case_types, - non_snake_case, - clippy::pub_underscore_fields, - clippy::style - )] - const _: () = { - use alloy::sol_types as alloy_sol_types; - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = ( - IPlonkVerifier::VerifyingKey, - alloy::sol_types::sol_data::FixedArray< - alloy::sol_types::sol_data::Uint<256>, - 7usize, - >, - IPlonkVerifier::PlonkProof, - ); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = ( - ::RustType, - [alloy::sol_types::private::primitives::aliases::U256; 7usize], - ::RustType, - ); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: verifyCall) -> Self { - (value.vk, value.publicInput, value.proof) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for verifyCall { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { - vk: tuple.0, - publicInput: tuple.1, - proof: tuple.2, - } - } - } - } - { - #[doc(hidden)] - type UnderlyingSolTuple<'a> = (alloy::sol_types::sol_data::Bool,); - #[doc(hidden)] - type UnderlyingRustTuple<'a> = (bool,); - #[cfg(test)] - #[allow(dead_code, unreachable_patterns)] - fn _type_assertion(_t: alloy_sol_types::private::AssertTypeEq) { - match _t { - alloy_sol_types::private::AssertTypeEq::< - ::RustType, - >(_) => {} - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From for UnderlyingRustTuple<'_> { - fn from(value: verifyReturn) -> Self { - (value.success,) - } - } - #[automatically_derived] - #[doc(hidden)] - impl ::core::convert::From> for verifyReturn { - fn from(tuple: UnderlyingRustTuple<'_>) -> Self { - Self { success: tuple.0 } - } - } - } - #[automatically_derived] - impl alloy_sol_types::SolCall for verifyCall { - type Parameters<'a> = ( - IPlonkVerifier::VerifyingKey, - alloy::sol_types::sol_data::FixedArray< - alloy::sol_types::sol_data::Uint<256>, - 7usize, - >, - IPlonkVerifier::PlonkProof, - ); - type Token<'a> = as alloy_sol_types::SolType>::Token<'a>; - type Return = verifyReturn; - type ReturnTuple<'a> = (alloy::sol_types::sol_data::Bool,); - type ReturnToken<'a> = as alloy_sol_types::SolType>::Token<'a>; - const SIGNATURE: &'static str = "verify((uint256,uint256,(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),bytes32,bytes32),uint256[7],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))"; - const SELECTOR: [u8; 4] = [119u8, 174u8, 63u8, 7u8]; - #[inline] - fn new<'a>( - tuple: as alloy_sol_types::SolType>::RustType, - ) -> Self { - tuple.into() - } - #[inline] - fn tokenize(&self) -> Self::Token<'_> { - ( - ::tokenize(&self.vk), - , - 7usize, - > as alloy_sol_types::SolType>::tokenize(&self.publicInput), - ::tokenize(&self.proof), - ) - } - #[inline] - fn abi_decode_returns( - data: &[u8], - validate: bool, - ) -> alloy_sol_types::Result { - as alloy_sol_types::SolType>::abi_decode_sequence( - data, validate, - ) - .map(Into::into) - } - } - }; - ///Container for all the [`PlonkVerifier2`](self) function calls. - pub enum PlonkVerifier2Calls { - P_MOD(P_MODCall), - R_MOD(R_MODCall), - verify(verifyCall), - } - #[automatically_derived] - impl PlonkVerifier2Calls { - /// All the selectors of this enum. - /// - /// Note that the selectors might not be in the same order as the variants. - /// No guarantees are made about the order of the selectors. - /// - /// Prefer using `SolInterface` methods instead. - pub const SELECTORS: &'static [[u8; 4usize]] = &[ - [29u8, 113u8, 46u8, 39u8], - [119u8, 174u8, 63u8, 7u8], - [223u8, 110u8, 108u8, 180u8], - ]; - } - #[automatically_derived] - impl alloy_sol_types::SolInterface for PlonkVerifier2Calls { - const NAME: &'static str = "PlonkVerifier2Calls"; - const MIN_DATA_LENGTH: usize = 0usize; - const COUNT: usize = 3usize; - #[inline] - fn selector(&self) -> [u8; 4] { - match self { - Self::P_MOD(_) => ::SELECTOR, - Self::R_MOD(_) => ::SELECTOR, - Self::verify(_) => ::SELECTOR, - } - } - #[inline] - fn selector_at(i: usize) -> ::core::option::Option<[u8; 4]> { - Self::SELECTORS.get(i).copied() - } - #[inline] - fn valid_selector(selector: [u8; 4]) -> bool { - Self::SELECTORS.binary_search(&selector).is_ok() - } - #[inline] - #[allow(non_snake_case)] - fn abi_decode_raw( - selector: [u8; 4], - data: &[u8], - validate: bool, - ) -> alloy_sol_types::Result { - static DECODE_SHIMS: &[fn( - &[u8], - bool, - ) - -> alloy_sol_types::Result] = &[ - { - fn P_MOD( - data: &[u8], - validate: bool, - ) -> alloy_sol_types::Result { - ::abi_decode_raw(data, validate) - .map(PlonkVerifier2Calls::P_MOD) - } - P_MOD - }, - { - fn verify( - data: &[u8], - validate: bool, - ) -> alloy_sol_types::Result { - ::abi_decode_raw(data, validate) - .map(PlonkVerifier2Calls::verify) - } - verify - }, - { - fn R_MOD( - data: &[u8], - validate: bool, - ) -> alloy_sol_types::Result { - ::abi_decode_raw(data, validate) - .map(PlonkVerifier2Calls::R_MOD) - } - R_MOD - }, - ]; - let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { - return Err(alloy_sol_types::Error::unknown_selector( - ::NAME, - selector, - )); - }; - DECODE_SHIMS[idx](data, validate) - } - #[inline] - fn abi_encoded_size(&self) -> usize { - match self { - Self::P_MOD(inner) => { - ::abi_encoded_size(inner) - } - Self::R_MOD(inner) => { - ::abi_encoded_size(inner) - } - Self::verify(inner) => { - ::abi_encoded_size(inner) - } - } - } - #[inline] - fn abi_encode_raw(&self, out: &mut alloy_sol_types::private::Vec) { - match self { - Self::P_MOD(inner) => { - ::abi_encode_raw(inner, out) - } - Self::R_MOD(inner) => { - ::abi_encode_raw(inner, out) - } - Self::verify(inner) => { - ::abi_encode_raw(inner, out) - } - } - } - } - ///Container for all the [`PlonkVerifier2`](self) custom errors. - pub enum PlonkVerifier2Errors { - UnsupportedDegree(UnsupportedDegree), - } - #[automatically_derived] - impl PlonkVerifier2Errors { - /// All the selectors of this enum. - /// - /// Note that the selectors might not be in the same order as the variants. - /// No guarantees are made about the order of the selectors. - /// - /// Prefer using `SolInterface` methods instead. - pub const SELECTORS: &'static [[u8; 4usize]] = &[[226u8, 239u8, 9u8, 229u8]]; - } - #[automatically_derived] - impl alloy_sol_types::SolInterface for PlonkVerifier2Errors { - const NAME: &'static str = "PlonkVerifier2Errors"; - const MIN_DATA_LENGTH: usize = 0usize; - const COUNT: usize = 1usize; - #[inline] - fn selector(&self) -> [u8; 4] { - match self { - Self::UnsupportedDegree(_) => { - ::SELECTOR - } - } - } - #[inline] - fn selector_at(i: usize) -> ::core::option::Option<[u8; 4]> { - Self::SELECTORS.get(i).copied() - } - #[inline] - fn valid_selector(selector: [u8; 4]) -> bool { - Self::SELECTORS.binary_search(&selector).is_ok() - } - #[inline] - #[allow(non_snake_case)] - fn abi_decode_raw( - selector: [u8; 4], - data: &[u8], - validate: bool, - ) -> alloy_sol_types::Result { - static DECODE_SHIMS: &[fn( - &[u8], - bool, - ) - -> alloy_sol_types::Result] = &[{ - fn UnsupportedDegree( - data: &[u8], - validate: bool, - ) -> alloy_sol_types::Result { - ::abi_decode_raw(data, validate) - .map(PlonkVerifier2Errors::UnsupportedDegree) - } - UnsupportedDegree - }]; - let Ok(idx) = Self::SELECTORS.binary_search(&selector) else { - return Err(alloy_sol_types::Error::unknown_selector( - ::NAME, - selector, - )); - }; - DECODE_SHIMS[idx](data, validate) - } - #[inline] - fn abi_encoded_size(&self) -> usize { - match self { - Self::UnsupportedDegree(inner) => { - ::abi_encoded_size(inner) - } - } - } - #[inline] - fn abi_encode_raw(&self, out: &mut alloy_sol_types::private::Vec) { - match self { - Self::UnsupportedDegree(inner) => { - ::abi_encode_raw(inner, out) - } - } - } - } - use alloy::contract as alloy_contract; - /**Creates a new wrapper around an on-chain [`PlonkVerifier2`](self) contract instance. - - See the [wrapper's documentation](`PlonkVerifier2Instance`) for more details.*/ - #[inline] - pub const fn new< - T: alloy_contract::private::Transport + ::core::clone::Clone, - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - >( - address: alloy_sol_types::private::Address, - provider: P, - ) -> PlonkVerifier2Instance { - PlonkVerifier2Instance::::new(address, provider) - } - /**Deploys this contract using the given `provider` and constructor arguments, if any. - - Returns a new instance of the contract, if the deployment was successful. - - For more fine-grained control over the deployment process, use [`deploy_builder`] instead.*/ - #[inline] - pub fn deploy< - T: alloy_contract::private::Transport + ::core::clone::Clone, - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - >( - provider: P, - ) -> impl ::core::future::Future>> - { - PlonkVerifier2Instance::::deploy(provider) - } - /**Creates a `RawCallBuilder` for deploying this contract using the given `provider` - and constructor arguments, if any. - - This is a simple wrapper around creating a `RawCallBuilder` with the data set to - the bytecode concatenated with the constructor's ABI-encoded arguments.*/ - #[inline] - pub fn deploy_builder< - T: alloy_contract::private::Transport + ::core::clone::Clone, - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - >( - provider: P, - ) -> alloy_contract::RawCallBuilder { - PlonkVerifier2Instance::::deploy_builder(provider) - } - /**A [`PlonkVerifier2`](self) instance. - - Contains type-safe methods for interacting with an on-chain instance of the - [`PlonkVerifier2`](self) contract located at a given `address`, using a given - provider `P`. - - If the contract bytecode is available (see the [`sol!`](alloy_sol_types::sol!) - documentation on how to provide it), the `deploy` and `deploy_builder` methods can - be used to deploy a new instance of the contract. - - See the [module-level documentation](self) for all the available methods.*/ - #[derive(Clone)] - pub struct PlonkVerifier2Instance { - address: alloy_sol_types::private::Address, - provider: P, - _network_transport: ::core::marker::PhantomData<(N, T)>, - } - #[automatically_derived] - impl ::core::fmt::Debug for PlonkVerifier2Instance { - #[inline] - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple("PlonkVerifier2Instance") - .field(&self.address) - .finish() - } - } - /// Instantiation and getters/setters. - #[automatically_derived] - impl< - T: alloy_contract::private::Transport + ::core::clone::Clone, - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - > PlonkVerifier2Instance - { - /**Creates a new wrapper around an on-chain [`PlonkVerifier2`](self) contract instance. - - See the [wrapper's documentation](`PlonkVerifier2Instance`) for more details.*/ - #[inline] - pub const fn new(address: alloy_sol_types::private::Address, provider: P) -> Self { - Self { - address, - provider, - _network_transport: ::core::marker::PhantomData, - } - } - /**Deploys this contract using the given `provider` and constructor arguments, if any. - - Returns a new instance of the contract, if the deployment was successful. - - For more fine-grained control over the deployment process, use [`deploy_builder`] instead.*/ - #[inline] - pub async fn deploy( - provider: P, - ) -> alloy_contract::Result> { - let call_builder = Self::deploy_builder(provider); - let contract_address = call_builder.deploy().await?; - Ok(Self::new(contract_address, call_builder.provider)) - } - /**Creates a `RawCallBuilder` for deploying this contract using the given `provider` - and constructor arguments, if any. - - This is a simple wrapper around creating a `RawCallBuilder` with the data set to - the bytecode concatenated with the constructor's ABI-encoded arguments.*/ - #[inline] - pub fn deploy_builder(provider: P) -> alloy_contract::RawCallBuilder { - alloy_contract::RawCallBuilder::new_raw_deploy( - provider, - ::core::clone::Clone::clone(&BYTECODE), - ) - } - /// Returns a reference to the address. - #[inline] - pub const fn address(&self) -> &alloy_sol_types::private::Address { - &self.address - } - /// Sets the address. - #[inline] - pub fn set_address(&mut self, address: alloy_sol_types::private::Address) { - self.address = address; - } - /// Sets the address and returns `self`. - pub fn at(mut self, address: alloy_sol_types::private::Address) -> Self { - self.set_address(address); - self - } - /// Returns a reference to the provider. - #[inline] - pub const fn provider(&self) -> &P { - &self.provider - } - } - impl PlonkVerifier2Instance { - /// Clones the provider and returns a new instance with the cloned provider. - #[inline] - pub fn with_cloned_provider(self) -> PlonkVerifier2Instance { - PlonkVerifier2Instance { - address: self.address, - provider: ::core::clone::Clone::clone(&self.provider), - _network_transport: ::core::marker::PhantomData, - } - } - } - /// Function calls. - #[automatically_derived] - impl< - T: alloy_contract::private::Transport + ::core::clone::Clone, - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - > PlonkVerifier2Instance - { - /// Creates a new call builder using this contract instance's provider and address. - /// - /// Note that the call can be any function call, not just those defined in this - /// contract. Prefer using the other methods for building type-safe contract calls. - pub fn call_builder( - &self, - call: &C, - ) -> alloy_contract::SolCallBuilder { - alloy_contract::SolCallBuilder::new_sol(&self.provider, &self.address, call) - } - ///Creates a new call builder for the [`P_MOD`] function. - pub fn P_MOD(&self) -> alloy_contract::SolCallBuilder { - self.call_builder(&P_MODCall {}) - } - ///Creates a new call builder for the [`R_MOD`] function. - pub fn R_MOD(&self) -> alloy_contract::SolCallBuilder { - self.call_builder(&R_MODCall {}) - } - ///Creates a new call builder for the [`verify`] function. - pub fn verify( - &self, - vk: ::RustType, - publicInput: [alloy::sol_types::private::primitives::aliases::U256; 7usize], - proof: ::RustType, - ) -> alloy_contract::SolCallBuilder { - self.call_builder(&verifyCall { - vk, - publicInput, - proof, - }) - } - } - /// Event filters. - #[automatically_derived] - impl< - T: alloy_contract::private::Transport + ::core::clone::Clone, - P: alloy_contract::private::Provider, - N: alloy_contract::private::Network, - > PlonkVerifier2Instance - { - /// Creates a new event filter using this contract instance's provider and address. - /// - /// Note that the type can be any event, not just those defined in this contract. - /// Prefer using the other methods for building type-safe event filters. - pub fn event_filter( - &self, - ) -> alloy_contract::Event { - alloy_contract::Event::new_sol(&self.provider, &self.address) - } - } -} diff --git a/contract-bindings-ethers/src/lib.rs b/contract-bindings-ethers/src/lib.rs index 6be6f53764..f0a17c0e01 100644 --- a/contract-bindings-ethers/src/lib.rs +++ b/contract-bindings-ethers/src/lib.rs @@ -11,5 +11,4 @@ pub mod light_client_arbitrum; pub mod light_client_mock; pub mod permissioned_stake_table; pub mod plonk_verifier; -pub mod plonk_verifier_2; pub mod shared_types; diff --git a/contract-bindings-ethers/src/light_client.rs b/contract-bindings-ethers/src/light_client.rs index 32daa6fc12..62005f94d8 100644 --- a/contract-bindings-ethers/src/light_client.rs +++ b/contract-bindings-ethers/src/light_client.rs @@ -34,6 +34,22 @@ pub mod light_client { state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, },], ), + ( + ::std::borrow::ToOwned::to_owned("_blocksPerEpoch"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("_blocksPerEpoch"), + inputs: ::std::vec![], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), ( ::std::borrow::ToOwned::to_owned("currentBlockNumber"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -50,6 +66,22 @@ pub mod light_client { state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, },], ), + ( + ::std::borrow::ToOwned::to_owned("currentEpoch"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("currentEpoch"), + inputs: ::std::vec![], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), ( ::std::borrow::ToOwned::to_owned("disablePermissionedProverMode"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -60,6 +92,37 @@ pub mod light_client { state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, },], ), + ( + ::std::borrow::ToOwned::to_owned("epochFromBlockNumber"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("epochFromBlockNumber",), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("blockNum"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("blocksPerEpoch"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + }, + ], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, + },], + ), ( ::std::borrow::ToOwned::to_owned("finalizedState"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -290,12 +353,41 @@ pub mod light_client { ::std::borrow::ToOwned::to_owned("address"), ), }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("blocksPerEpoch"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + }, ], outputs: ::std::vec![], constant: ::core::option::Option::None, state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, },], ), + ( + ::std::borrow::ToOwned::to_owned("isLastBlockInEpoch"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("isLastBlockInEpoch"), + inputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("blockHeight"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + },], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Bool, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bool"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), ( ::std::borrow::ToOwned::to_owned("isPermissionedProverEnabled"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -361,6 +453,20 @@ pub mod light_client { ), ), }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("nextStakeTable"), + kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ],), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned( + "struct LightClient.StakeTableState", + ), + ), + }, ::ethers::core::abi::ethabi::Param { name: ::std::borrow::ToOwned::to_owned("proof"), kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ @@ -647,6 +753,45 @@ pub mod light_client { state_mutability: ::ethers::core::abi::ethabi::StateMutability::Payable, },], ), + ( + ::std::borrow::ToOwned::to_owned("votingStakeTableState"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("votingStakeTableState",), + inputs: ::std::vec![], + outputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("threshold"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("blsKeyComm"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("BN254.ScalarField"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("schnorrKeyComm"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("BN254.ScalarField"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("amountComm"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("BN254.ScalarField"), + ), + }, + ], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), ]), events: ::core::convert::From::from([ ( @@ -661,6 +806,18 @@ pub mod light_client { anonymous: false, },], ), + ( + ::std::borrow::ToOwned::to_owned("NewEpoch"), + ::std::vec![::ethers::core::abi::ethabi::Event { + name: ::std::borrow::ToOwned::to_owned("NewEpoch"), + inputs: ::std::vec![::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("epoch"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + indexed: false, + },], + anonymous: false, + },], + ), ( ::std::borrow::ToOwned::to_owned("NewState"), ::std::vec![::ethers::core::abi::ethabi::Event { @@ -841,6 +998,13 @@ pub mod light_client { inputs: ::std::vec![], },], ), + ( + ::std::borrow::ToOwned::to_owned("MissingLastBlockInEpochUpdate"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("MissingLastBlockInEpochUpdate",), + inputs: ::std::vec![], + },], + ), ( ::std::borrow::ToOwned::to_owned("NoChangeRequired"), ::std::vec![::ethers::core::abi::ethabi::AbiError { @@ -975,6 +1139,12 @@ pub mod light_client { .method_hash([173, 60, 177, 204], ()) .expect("method not found (this should never happen)") } + ///Calls the contract's `_blocksPerEpoch` (0xb2424e3f) function + pub fn blocks_per_epoch(&self) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([178, 66, 78, 63], ()) + .expect("method not found (this should never happen)") + } ///Calls the contract's `currentBlockNumber` (0x378ec23b) function pub fn current_block_number( &self, @@ -983,6 +1153,12 @@ pub mod light_client { .method_hash([55, 142, 194, 59], ()) .expect("method not found (this should never happen)") } + ///Calls the contract's `currentEpoch` (0x76671808) function + pub fn current_epoch(&self) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([118, 103, 24, 8], ()) + .expect("method not found (this should never happen)") + } ///Calls the contract's `disablePermissionedProverMode` (0x69cc6a04) function pub fn disable_permissioned_prover_mode( &self, @@ -991,6 +1167,16 @@ pub mod light_client { .method_hash([105, 204, 106, 4], ()) .expect("method not found (this should never happen)") } + ///Calls the contract's `epochFromBlockNumber` (0x90c14390) function + pub fn epoch_from_block_number( + &self, + block_num: u64, + blocks_per_epoch: u64, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([144, 193, 67, 144], (block_num, blocks_per_epoch)) + .expect("method not found (this should never happen)") + } ///Calls the contract's `finalizedState` (0x9fdb54a7) function pub fn finalized_state( &self, @@ -1049,26 +1235,37 @@ pub mod light_client { .method_hash([13, 142, 110, 44], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `initialize` (0x9baa3cc9) function + ///Calls the contract's `initialize` (0x811f853f) function pub fn initialize( &self, genesis: LightClientState, genesis_stake_table_state: StakeTableState, state_history_retention_period: u32, owner: ::ethers::core::types::Address, + blocks_per_epoch: u64, ) -> ::ethers::contract::builders::ContractCall { self.0 .method_hash( - [155, 170, 60, 201], + [129, 31, 133, 63], ( genesis, genesis_stake_table_state, state_history_retention_period, owner, + blocks_per_epoch, ), ) .expect("method not found (this should never happen)") } + ///Calls the contract's `isLastBlockInEpoch` (0xa1be8d52) function + pub fn is_last_block_in_epoch( + &self, + block_height: u64, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([161, 190, 141, 82], block_height) + .expect("method not found (this should never happen)") + } ///Calls the contract's `isPermissionedProverEnabled` (0x826e41fc) function pub fn is_permissioned_prover_enabled( &self, @@ -1087,14 +1284,15 @@ pub mod light_client { .method_hash([224, 48, 51, 1], (block_number, block_threshold)) .expect("method not found (this should never happen)") } - ///Calls the contract's `newFinalizedState` (0x2063d4f7) function + ///Calls the contract's `newFinalizedState` (0x757c37ad) function pub fn new_finalized_state( &self, new_state: LightClientState, + next_stake_table: StakeTableState, proof: PlonkProof, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([32, 99, 212, 247], (new_state, proof)) + .method_hash([117, 124, 55, 173], (new_state, next_stake_table, proof)) .expect("method not found (this should never happen)") } ///Calls the contract's `owner` (0x8da5cb5b) function @@ -1190,6 +1388,22 @@ pub mod light_client { .method_hash([79, 30, 242, 134], (new_implementation, data)) .expect("method not found (this should never happen)") } + ///Calls the contract's `votingStakeTableState` (0x0625e19b) function + pub fn voting_stake_table_state( + &self, + ) -> ::ethers::contract::builders::ContractCall< + M, + ( + ::ethers::core::types::U256, + ::ethers::core::types::U256, + ::ethers::core::types::U256, + ::ethers::core::types::U256, + ), + > { + self.0 + .method_hash([6, 37, 225, 155], ()) + .expect("method not found (this should never happen)") + } ///Gets the contract's `Initialized` event pub fn initialized_filter( &self, @@ -1197,6 +1411,12 @@ pub mod light_client { { self.0.event() } + ///Gets the contract's `NewEpoch` event + pub fn new_epoch_filter( + &self, + ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, NewEpochFilter> { + self.0.event() + } ///Gets the contract's `NewState` event pub fn new_state_filter( &self, @@ -1434,6 +1654,24 @@ pub mod light_client { )] #[etherror(name = "InvalidProof", abi = "InvalidProof()")] pub struct InvalidProof; + ///Custom Error type `MissingLastBlockInEpochUpdate` with signature `MissingLastBlockInEpochUpdate()` and selector `0x7150de45` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror( + name = "MissingLastBlockInEpochUpdate", + abi = "MissingLastBlockInEpochUpdate()" + )] + pub struct MissingLastBlockInEpochUpdate; ///Custom Error type `NoChangeRequired` with signature `NoChangeRequired()` and selector `0xa863aec9` #[derive( Clone, @@ -1607,6 +1845,7 @@ pub mod light_client { InvalidInitialization(InvalidInitialization), InvalidMaxStateHistory(InvalidMaxStateHistory), InvalidProof(InvalidProof), + MissingLastBlockInEpochUpdate(MissingLastBlockInEpochUpdate), NoChangeRequired(NoChangeRequired), NotInitializing(NotInitializing), OutdatedState(OutdatedState), @@ -1677,6 +1916,11 @@ pub mod light_client { if let Ok(decoded) = ::decode(data) { return Ok(Self::InvalidProof(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::MissingLastBlockInEpochUpdate(decoded)); + } if let Ok(decoded) = ::decode(data) { return Ok(Self::NoChangeRequired(decoded)); @@ -1744,6 +1988,9 @@ pub mod light_client { ::ethers::core::abi::AbiEncode::encode(element) } Self::InvalidProof(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::MissingLastBlockInEpochUpdate(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::NoChangeRequired(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::NotInitializing(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::OutdatedState(element) => ::ethers::core::abi::AbiEncode::encode(element), @@ -1813,6 +2060,10 @@ pub mod light_client { } _ if selector == ::selector() => true, + _ if selector + == ::selector() => { + true + } _ if selector == ::selector() => { true @@ -1871,6 +2122,9 @@ pub mod light_client { Self::InvalidInitialization(element) => ::core::fmt::Display::fmt(element, f), Self::InvalidMaxStateHistory(element) => ::core::fmt::Display::fmt(element, f), Self::InvalidProof(element) => ::core::fmt::Display::fmt(element, f), + Self::MissingLastBlockInEpochUpdate(element) => { + ::core::fmt::Display::fmt(element, f) + } Self::NoChangeRequired(element) => ::core::fmt::Display::fmt(element, f), Self::NotInitializing(element) => ::core::fmt::Display::fmt(element, f), Self::OutdatedState(element) => ::core::fmt::Display::fmt(element, f), @@ -1946,6 +2200,11 @@ pub mod light_client { Self::InvalidProof(value) } } + impl ::core::convert::From for LightClientErrors { + fn from(value: MissingLastBlockInEpochUpdate) -> Self { + Self::MissingLastBlockInEpochUpdate(value) + } + } impl ::core::convert::From for LightClientErrors { fn from(value: NoChangeRequired) -> Self { Self::NoChangeRequired(value) @@ -2019,6 +2278,22 @@ pub mod light_client { Eq, Hash, )] + #[ethevent(name = "NewEpoch", abi = "NewEpoch(uint64)")] + pub struct NewEpochFilter { + pub epoch: u64, + } + #[derive( + Clone, + ::ethers::contract::EthEvent, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] #[ethevent(name = "NewState", abi = "NewState(uint64,uint64,uint256)")] pub struct NewStateFilter { #[ethevent(indexed)] @@ -2131,6 +2406,7 @@ pub mod light_client { )] pub enum LightClientEvents { InitializedFilter(InitializedFilter), + NewEpochFilter(NewEpochFilter), NewStateFilter(NewStateFilter), OwnershipTransferredFilter(OwnershipTransferredFilter), PermissionedProverNotRequiredFilter(PermissionedProverNotRequiredFilter), @@ -2145,6 +2421,9 @@ pub mod light_client { if let Ok(decoded) = InitializedFilter::decode_log(log) { return Ok(LightClientEvents::InitializedFilter(decoded)); } + if let Ok(decoded) = NewEpochFilter::decode_log(log) { + return Ok(LightClientEvents::NewEpochFilter(decoded)); + } if let Ok(decoded) = NewStateFilter::decode_log(log) { return Ok(LightClientEvents::NewStateFilter(decoded)); } @@ -2172,6 +2451,7 @@ pub mod light_client { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { match self { Self::InitializedFilter(element) => ::core::fmt::Display::fmt(element, f), + Self::NewEpochFilter(element) => ::core::fmt::Display::fmt(element, f), Self::NewStateFilter(element) => ::core::fmt::Display::fmt(element, f), Self::OwnershipTransferredFilter(element) => ::core::fmt::Display::fmt(element, f), Self::PermissionedProverNotRequiredFilter(element) => { @@ -2190,6 +2470,11 @@ pub mod light_client { Self::InitializedFilter(value) } } + impl ::core::convert::From for LightClientEvents { + fn from(value: NewEpochFilter) -> Self { + Self::NewEpochFilter(value) + } + } impl ::core::convert::From for LightClientEvents { fn from(value: NewStateFilter) -> Self { Self::NewStateFilter(value) @@ -2238,6 +2523,21 @@ pub mod light_client { abi = "UPGRADE_INTERFACE_VERSION()" )] pub struct UpgradeInterfaceVersionCall; + ///Container type for all input parameters for the `_blocksPerEpoch` function with signature `_blocksPerEpoch()` and selector `0xb2424e3f` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "_blocksPerEpoch", abi = "_blocksPerEpoch()")] + pub struct BlocksPerEpochCall; ///Container type for all input parameters for the `currentBlockNumber` function with signature `currentBlockNumber()` and selector `0x378ec23b` #[derive( Clone, @@ -2253,6 +2553,21 @@ pub mod light_client { )] #[ethcall(name = "currentBlockNumber", abi = "currentBlockNumber()")] pub struct CurrentBlockNumberCall; + ///Container type for all input parameters for the `currentEpoch` function with signature `currentEpoch()` and selector `0x76671808` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "currentEpoch", abi = "currentEpoch()")] + pub struct CurrentEpochCall; ///Container type for all input parameters for the `disablePermissionedProverMode` function with signature `disablePermissionedProverMode()` and selector `0x69cc6a04` #[derive( Clone, @@ -2271,6 +2586,27 @@ pub mod light_client { abi = "disablePermissionedProverMode()" )] pub struct DisablePermissionedProverModeCall; + ///Container type for all input parameters for the `epochFromBlockNumber` function with signature `epochFromBlockNumber(uint64,uint64)` and selector `0x90c14390` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall( + name = "epochFromBlockNumber", + abi = "epochFromBlockNumber(uint64,uint64)" + )] + pub struct EpochFromBlockNumberCall { + pub block_num: u64, + pub blocks_per_epoch: u64, + } ///Container type for all input parameters for the `finalizedState` function with signature `finalizedState()` and selector `0x9fdb54a7` #[derive( Clone, @@ -2363,7 +2699,7 @@ pub mod light_client { )] #[ethcall(name = "getVersion", abi = "getVersion()")] pub struct GetVersionCall; - ///Container type for all input parameters for the `initialize` function with signature `initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address)` and selector `0x9baa3cc9` + ///Container type for all input parameters for the `initialize` function with signature `initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address,uint64)` and selector `0x811f853f` #[derive( Clone, ::ethers::contract::EthCall, @@ -2378,13 +2714,31 @@ pub mod light_client { )] #[ethcall( name = "initialize", - abi = "initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address)" + abi = "initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address,uint64)" )] pub struct InitializeCall { pub genesis: LightClientState, pub genesis_stake_table_state: StakeTableState, pub state_history_retention_period: u32, pub owner: ::ethers::core::types::Address, + pub blocks_per_epoch: u64, + } + ///Container type for all input parameters for the `isLastBlockInEpoch` function with signature `isLastBlockInEpoch(uint64)` and selector `0xa1be8d52` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "isLastBlockInEpoch", abi = "isLastBlockInEpoch(uint64)")] + pub struct IsLastBlockInEpochCall { + pub block_height: u64, } ///Container type for all input parameters for the `isPermissionedProverEnabled` function with signature `isPermissionedProverEnabled()` and selector `0x826e41fc` #[derive( @@ -2425,7 +2779,7 @@ pub mod light_client { pub block_number: ::ethers::core::types::U256, pub block_threshold: ::ethers::core::types::U256, } - ///Container type for all input parameters for the `newFinalizedState` function with signature `newFinalizedState((uint64,uint64,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0x2063d4f7` + ///Container type for all input parameters for the `newFinalizedState` function with signature `newFinalizedState((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0x757c37ad` #[derive( Clone, ::ethers::contract::EthCall, @@ -2435,10 +2789,11 @@ pub mod light_client { )] #[ethcall( name = "newFinalizedState", - abi = "newFinalizedState((uint64,uint64,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))" + abi = "newFinalizedState((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))" )] pub struct NewFinalizedStateCall { pub new_state: LightClientState, + pub next_stake_table: StakeTableState, pub proof: PlonkProof, } ///Container type for all input parameters for the `owner` function with signature `owner()` and selector `0x8da5cb5b` @@ -2624,12 +2979,30 @@ pub mod light_client { pub new_implementation: ::ethers::core::types::Address, pub data: ::ethers::core::types::Bytes, } + ///Container type for all input parameters for the `votingStakeTableState` function with signature `votingStakeTableState()` and selector `0x0625e19b` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "votingStakeTableState", abi = "votingStakeTableState()")] + pub struct VotingStakeTableStateCall; ///Container type for all of the contract's call #[derive(Clone, ::ethers::contract::EthAbiType, serde::Serialize, serde::Deserialize)] pub enum LightClientCalls { UpgradeInterfaceVersion(UpgradeInterfaceVersionCall), + BlocksPerEpoch(BlocksPerEpochCall), CurrentBlockNumber(CurrentBlockNumberCall), + CurrentEpoch(CurrentEpochCall), DisablePermissionedProverMode(DisablePermissionedProverModeCall), + EpochFromBlockNumber(EpochFromBlockNumberCall), FinalizedState(FinalizedStateCall), GenesisStakeTableState(GenesisStakeTableStateCall), GenesisState(GenesisStateCall), @@ -2637,6 +3010,7 @@ pub mod light_client { GetStateHistoryCount(GetStateHistoryCountCall), GetVersion(GetVersionCall), Initialize(InitializeCall), + IsLastBlockInEpoch(IsLastBlockInEpochCall), IsPermissionedProverEnabled(IsPermissionedProverEnabledCall), LagOverEscapeHatchThreshold(LagOverEscapeHatchThresholdCall), NewFinalizedState(NewFinalizedStateCall), @@ -2651,6 +3025,7 @@ pub mod light_client { StateHistoryRetentionPeriod(StateHistoryRetentionPeriodCall), TransferOwnership(TransferOwnershipCall), UpgradeToAndCall(UpgradeToAndCallCall), + VotingStakeTableState(VotingStakeTableStateCall), } impl ::ethers::core::abi::AbiDecode for LightClientCalls { fn decode( @@ -2662,16 +3037,30 @@ pub mod light_client { { return Ok(Self::UpgradeInterfaceVersion(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::BlocksPerEpoch(decoded)); + } if let Ok(decoded) = ::decode(data) { return Ok(Self::CurrentBlockNumber(decoded)); } + if let Ok(decoded) = ::decode(data) + { + return Ok(Self::CurrentEpoch(decoded)); + } if let Ok(decoded) = ::decode(data) { return Ok(Self::DisablePermissionedProverMode(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::EpochFromBlockNumber(decoded)); + } if let Ok(decoded) = ::decode(data) { @@ -2702,6 +3091,11 @@ pub mod light_client { if let Ok(decoded) = ::decode(data) { return Ok(Self::Initialize(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::IsLastBlockInEpoch(decoded)); + } if let Ok(decoded) = ::decode(data) { @@ -2769,6 +3163,11 @@ pub mod light_client { { return Ok(Self::UpgradeToAndCall(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::VotingStakeTableState(decoded)); + } Err(::ethers::core::abi::Error::InvalidData.into()) } } @@ -2778,12 +3177,17 @@ pub mod light_client { Self::UpgradeInterfaceVersion(element) => { ::ethers::core::abi::AbiEncode::encode(element) } + Self::BlocksPerEpoch(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::CurrentBlockNumber(element) => { ::ethers::core::abi::AbiEncode::encode(element) } + Self::CurrentEpoch(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::DisablePermissionedProverMode(element) => { ::ethers::core::abi::AbiEncode::encode(element) } + Self::EpochFromBlockNumber(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::FinalizedState(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::GenesisStakeTableState(element) => { ::ethers::core::abi::AbiEncode::encode(element) @@ -2797,6 +3201,9 @@ pub mod light_client { } Self::GetVersion(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::Initialize(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::IsLastBlockInEpoch(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::IsPermissionedProverEnabled(element) => { ::ethers::core::abi::AbiEncode::encode(element) } @@ -2827,6 +3234,9 @@ pub mod light_client { } Self::TransferOwnership(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::UpgradeToAndCall(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::VotingStakeTableState(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } } } } @@ -2834,10 +3244,13 @@ pub mod light_client { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { match self { Self::UpgradeInterfaceVersion(element) => ::core::fmt::Display::fmt(element, f), + Self::BlocksPerEpoch(element) => ::core::fmt::Display::fmt(element, f), Self::CurrentBlockNumber(element) => ::core::fmt::Display::fmt(element, f), + Self::CurrentEpoch(element) => ::core::fmt::Display::fmt(element, f), Self::DisablePermissionedProverMode(element) => { ::core::fmt::Display::fmt(element, f) } + Self::EpochFromBlockNumber(element) => ::core::fmt::Display::fmt(element, f), Self::FinalizedState(element) => ::core::fmt::Display::fmt(element, f), Self::GenesisStakeTableState(element) => ::core::fmt::Display::fmt(element, f), Self::GenesisState(element) => ::core::fmt::Display::fmt(element, f), @@ -2845,6 +3258,7 @@ pub mod light_client { Self::GetStateHistoryCount(element) => ::core::fmt::Display::fmt(element, f), Self::GetVersion(element) => ::core::fmt::Display::fmt(element, f), Self::Initialize(element) => ::core::fmt::Display::fmt(element, f), + Self::IsLastBlockInEpoch(element) => ::core::fmt::Display::fmt(element, f), Self::IsPermissionedProverEnabled(element) => ::core::fmt::Display::fmt(element, f), Self::LagOverEscapeHatchThreshold(element) => ::core::fmt::Display::fmt(element, f), Self::NewFinalizedState(element) => ::core::fmt::Display::fmt(element, f), @@ -2861,6 +3275,7 @@ pub mod light_client { Self::StateHistoryRetentionPeriod(element) => ::core::fmt::Display::fmt(element, f), Self::TransferOwnership(element) => ::core::fmt::Display::fmt(element, f), Self::UpgradeToAndCall(element) => ::core::fmt::Display::fmt(element, f), + Self::VotingStakeTableState(element) => ::core::fmt::Display::fmt(element, f), } } } @@ -2869,16 +3284,31 @@ pub mod light_client { Self::UpgradeInterfaceVersion(value) } } + impl ::core::convert::From for LightClientCalls { + fn from(value: BlocksPerEpochCall) -> Self { + Self::BlocksPerEpoch(value) + } + } impl ::core::convert::From for LightClientCalls { fn from(value: CurrentBlockNumberCall) -> Self { Self::CurrentBlockNumber(value) } } + impl ::core::convert::From for LightClientCalls { + fn from(value: CurrentEpochCall) -> Self { + Self::CurrentEpoch(value) + } + } impl ::core::convert::From for LightClientCalls { fn from(value: DisablePermissionedProverModeCall) -> Self { Self::DisablePermissionedProverMode(value) } } + impl ::core::convert::From for LightClientCalls { + fn from(value: EpochFromBlockNumberCall) -> Self { + Self::EpochFromBlockNumber(value) + } + } impl ::core::convert::From for LightClientCalls { fn from(value: FinalizedStateCall) -> Self { Self::FinalizedState(value) @@ -2914,6 +3344,11 @@ pub mod light_client { Self::Initialize(value) } } + impl ::core::convert::From for LightClientCalls { + fn from(value: IsLastBlockInEpochCall) -> Self { + Self::IsLastBlockInEpoch(value) + } + } impl ::core::convert::From for LightClientCalls { fn from(value: IsPermissionedProverEnabledCall) -> Self { Self::IsPermissionedProverEnabled(value) @@ -2984,6 +3419,11 @@ pub mod light_client { Self::UpgradeToAndCall(value) } } + impl ::core::convert::From for LightClientCalls { + fn from(value: VotingStakeTableStateCall) -> Self { + Self::VotingStakeTableState(value) + } + } ///Container type for all return fields from the `UPGRADE_INTERFACE_VERSION` function with signature `UPGRADE_INTERFACE_VERSION()` and selector `0xad3cb1cc` #[derive( Clone, @@ -2998,6 +3438,20 @@ pub mod light_client { Hash, )] pub struct UpgradeInterfaceVersionReturn(pub ::std::string::String); + ///Container type for all return fields from the `_blocksPerEpoch` function with signature `_blocksPerEpoch()` and selector `0xb2424e3f` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct BlocksPerEpochReturn(pub u64); ///Container type for all return fields from the `currentBlockNumber` function with signature `currentBlockNumber()` and selector `0x378ec23b` #[derive( Clone, @@ -3012,6 +3466,34 @@ pub mod light_client { Hash, )] pub struct CurrentBlockNumberReturn(pub ::ethers::core::types::U256); + ///Container type for all return fields from the `currentEpoch` function with signature `currentEpoch()` and selector `0x76671808` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct CurrentEpochReturn(pub u64); + ///Container type for all return fields from the `epochFromBlockNumber` function with signature `epochFromBlockNumber(uint64,uint64)` and selector `0x90c14390` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct EpochFromBlockNumberReturn(pub u64); ///Container type for all return fields from the `finalizedState` function with signature `finalizedState()` and selector `0x9fdb54a7` #[derive( Clone, @@ -3116,6 +3598,20 @@ pub mod light_client { pub minor_version: u8, pub patch_version: u8, } + ///Container type for all return fields from the `isLastBlockInEpoch` function with signature `isLastBlockInEpoch(uint64)` and selector `0xa1be8d52` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct IsLastBlockInEpochReturn(pub bool); ///Container type for all return fields from the `isPermissionedProverEnabled` function with signature `isPermissionedProverEnabled()` and selector `0x826e41fc` #[derive( Clone, @@ -3233,4 +3729,23 @@ pub mod light_client { Hash, )] pub struct StateHistoryRetentionPeriodReturn(pub u32); + ///Container type for all return fields from the `votingStakeTableState` function with signature `votingStakeTableState()` and selector `0x0625e19b` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct VotingStakeTableStateReturn { + pub threshold: ::ethers::core::types::U256, + pub bls_key_comm: ::ethers::core::types::U256, + pub schnorr_key_comm: ::ethers::core::types::U256, + pub amount_comm: ::ethers::core::types::U256, + } } diff --git a/contract-bindings-ethers/src/light_client_arbitrum.rs b/contract-bindings-ethers/src/light_client_arbitrum.rs index df441f0a6d..d36a5cab5f 100644 --- a/contract-bindings-ethers/src/light_client_arbitrum.rs +++ b/contract-bindings-ethers/src/light_client_arbitrum.rs @@ -32,6 +32,22 @@ pub mod light_client_arbitrum { state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, },], ), + ( + ::std::borrow::ToOwned::to_owned("_blocksPerEpoch"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("_blocksPerEpoch"), + inputs: ::std::vec![], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), ( ::std::borrow::ToOwned::to_owned("currentBlockNumber"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -48,6 +64,22 @@ pub mod light_client_arbitrum { state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, },], ), + ( + ::std::borrow::ToOwned::to_owned("currentEpoch"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("currentEpoch"), + inputs: ::std::vec![], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), ( ::std::borrow::ToOwned::to_owned("disablePermissionedProverMode"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -58,6 +90,37 @@ pub mod light_client_arbitrum { state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, },], ), + ( + ::std::borrow::ToOwned::to_owned("epochFromBlockNumber"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("epochFromBlockNumber",), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("blockNum"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("blocksPerEpoch"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + }, + ], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, + },], + ), ( ::std::borrow::ToOwned::to_owned("finalizedState"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -288,12 +351,41 @@ pub mod light_client_arbitrum { ::std::borrow::ToOwned::to_owned("address"), ), }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("blocksPerEpoch"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + }, ], outputs: ::std::vec![], constant: ::core::option::Option::None, state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, },], ), + ( + ::std::borrow::ToOwned::to_owned("isLastBlockInEpoch"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("isLastBlockInEpoch"), + inputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("blockHeight"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + },], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Bool, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bool"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), ( ::std::borrow::ToOwned::to_owned("isPermissionedProverEnabled"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -359,6 +451,20 @@ pub mod light_client_arbitrum { ), ), }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("nextStakeTable"), + kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ],), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned( + "struct LightClient.StakeTableState", + ), + ), + }, ::ethers::core::abi::ethabi::Param { name: ::std::borrow::ToOwned::to_owned("proof"), kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ @@ -645,6 +751,45 @@ pub mod light_client_arbitrum { state_mutability: ::ethers::core::abi::ethabi::StateMutability::Payable, },], ), + ( + ::std::borrow::ToOwned::to_owned("votingStakeTableState"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("votingStakeTableState",), + inputs: ::std::vec![], + outputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("threshold"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("blsKeyComm"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("BN254.ScalarField"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("schnorrKeyComm"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("BN254.ScalarField"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("amountComm"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("BN254.ScalarField"), + ), + }, + ], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), ]), events: ::core::convert::From::from([ ( @@ -659,6 +804,18 @@ pub mod light_client_arbitrum { anonymous: false, },], ), + ( + ::std::borrow::ToOwned::to_owned("NewEpoch"), + ::std::vec![::ethers::core::abi::ethabi::Event { + name: ::std::borrow::ToOwned::to_owned("NewEpoch"), + inputs: ::std::vec![::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("epoch"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + indexed: false, + },], + anonymous: false, + },], + ), ( ::std::borrow::ToOwned::to_owned("NewState"), ::std::vec![::ethers::core::abi::ethabi::Event { @@ -839,6 +996,13 @@ pub mod light_client_arbitrum { inputs: ::std::vec![], },], ), + ( + ::std::borrow::ToOwned::to_owned("MissingLastBlockInEpochUpdate"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("MissingLastBlockInEpochUpdate",), + inputs: ::std::vec![], + },], + ), ( ::std::borrow::ToOwned::to_owned("NoChangeRequired"), ::std::vec![::ethers::core::abi::ethabi::AbiError { @@ -973,6 +1137,12 @@ pub mod light_client_arbitrum { .method_hash([173, 60, 177, 204], ()) .expect("method not found (this should never happen)") } + ///Calls the contract's `_blocksPerEpoch` (0xb2424e3f) function + pub fn blocks_per_epoch(&self) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([178, 66, 78, 63], ()) + .expect("method not found (this should never happen)") + } ///Calls the contract's `currentBlockNumber` (0x378ec23b) function pub fn current_block_number( &self, @@ -981,6 +1151,12 @@ pub mod light_client_arbitrum { .method_hash([55, 142, 194, 59], ()) .expect("method not found (this should never happen)") } + ///Calls the contract's `currentEpoch` (0x76671808) function + pub fn current_epoch(&self) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([118, 103, 24, 8], ()) + .expect("method not found (this should never happen)") + } ///Calls the contract's `disablePermissionedProverMode` (0x69cc6a04) function pub fn disable_permissioned_prover_mode( &self, @@ -989,6 +1165,16 @@ pub mod light_client_arbitrum { .method_hash([105, 204, 106, 4], ()) .expect("method not found (this should never happen)") } + ///Calls the contract's `epochFromBlockNumber` (0x90c14390) function + pub fn epoch_from_block_number( + &self, + block_num: u64, + blocks_per_epoch: u64, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([144, 193, 67, 144], (block_num, blocks_per_epoch)) + .expect("method not found (this should never happen)") + } ///Calls the contract's `finalizedState` (0x9fdb54a7) function pub fn finalized_state( &self, @@ -1047,26 +1233,37 @@ pub mod light_client_arbitrum { .method_hash([13, 142, 110, 44], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `initialize` (0x9baa3cc9) function + ///Calls the contract's `initialize` (0x811f853f) function pub fn initialize( &self, genesis: LightClientState, genesis_stake_table_state: StakeTableState, state_history_retention_period: u32, owner: ::ethers::core::types::Address, + blocks_per_epoch: u64, ) -> ::ethers::contract::builders::ContractCall { self.0 .method_hash( - [155, 170, 60, 201], + [129, 31, 133, 63], ( genesis, genesis_stake_table_state, state_history_retention_period, owner, + blocks_per_epoch, ), ) .expect("method not found (this should never happen)") } + ///Calls the contract's `isLastBlockInEpoch` (0xa1be8d52) function + pub fn is_last_block_in_epoch( + &self, + block_height: u64, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([161, 190, 141, 82], block_height) + .expect("method not found (this should never happen)") + } ///Calls the contract's `isPermissionedProverEnabled` (0x826e41fc) function pub fn is_permissioned_prover_enabled( &self, @@ -1085,14 +1282,15 @@ pub mod light_client_arbitrum { .method_hash([224, 48, 51, 1], (block_number, block_threshold)) .expect("method not found (this should never happen)") } - ///Calls the contract's `newFinalizedState` (0x2063d4f7) function + ///Calls the contract's `newFinalizedState` (0x757c37ad) function pub fn new_finalized_state( &self, new_state: LightClientState, + next_stake_table: StakeTableState, proof: PlonkProof, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([32, 99, 212, 247], (new_state, proof)) + .method_hash([117, 124, 55, 173], (new_state, next_stake_table, proof)) .expect("method not found (this should never happen)") } ///Calls the contract's `owner` (0x8da5cb5b) function @@ -1188,6 +1386,22 @@ pub mod light_client_arbitrum { .method_hash([79, 30, 242, 134], (new_implementation, data)) .expect("method not found (this should never happen)") } + ///Calls the contract's `votingStakeTableState` (0x0625e19b) function + pub fn voting_stake_table_state( + &self, + ) -> ::ethers::contract::builders::ContractCall< + M, + ( + ::ethers::core::types::U256, + ::ethers::core::types::U256, + ::ethers::core::types::U256, + ::ethers::core::types::U256, + ), + > { + self.0 + .method_hash([6, 37, 225, 155], ()) + .expect("method not found (this should never happen)") + } ///Gets the contract's `Initialized` event pub fn initialized_filter( &self, @@ -1195,6 +1409,12 @@ pub mod light_client_arbitrum { { self.0.event() } + ///Gets the contract's `NewEpoch` event + pub fn new_epoch_filter( + &self, + ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, NewEpochFilter> { + self.0.event() + } ///Gets the contract's `NewState` event pub fn new_state_filter( &self, @@ -1434,6 +1654,24 @@ pub mod light_client_arbitrum { )] #[etherror(name = "InvalidProof", abi = "InvalidProof()")] pub struct InvalidProof; + ///Custom Error type `MissingLastBlockInEpochUpdate` with signature `MissingLastBlockInEpochUpdate()` and selector `0x7150de45` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror( + name = "MissingLastBlockInEpochUpdate", + abi = "MissingLastBlockInEpochUpdate()" + )] + pub struct MissingLastBlockInEpochUpdate; ///Custom Error type `NoChangeRequired` with signature `NoChangeRequired()` and selector `0xa863aec9` #[derive( Clone, @@ -1607,6 +1845,7 @@ pub mod light_client_arbitrum { InvalidInitialization(InvalidInitialization), InvalidMaxStateHistory(InvalidMaxStateHistory), InvalidProof(InvalidProof), + MissingLastBlockInEpochUpdate(MissingLastBlockInEpochUpdate), NoChangeRequired(NoChangeRequired), NotInitializing(NotInitializing), OutdatedState(OutdatedState), @@ -1677,6 +1916,11 @@ pub mod light_client_arbitrum { if let Ok(decoded) = ::decode(data) { return Ok(Self::InvalidProof(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::MissingLastBlockInEpochUpdate(decoded)); + } if let Ok(decoded) = ::decode(data) { return Ok(Self::NoChangeRequired(decoded)); @@ -1744,6 +1988,9 @@ pub mod light_client_arbitrum { ::ethers::core::abi::AbiEncode::encode(element) } Self::InvalidProof(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::MissingLastBlockInEpochUpdate(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::NoChangeRequired(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::NotInitializing(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::OutdatedState(element) => ::ethers::core::abi::AbiEncode::encode(element), @@ -1813,6 +2060,10 @@ pub mod light_client_arbitrum { } _ if selector == ::selector() => true, + _ if selector + == ::selector() => { + true + } _ if selector == ::selector() => { true @@ -1871,6 +2122,9 @@ pub mod light_client_arbitrum { Self::InvalidInitialization(element) => ::core::fmt::Display::fmt(element, f), Self::InvalidMaxStateHistory(element) => ::core::fmt::Display::fmt(element, f), Self::InvalidProof(element) => ::core::fmt::Display::fmt(element, f), + Self::MissingLastBlockInEpochUpdate(element) => { + ::core::fmt::Display::fmt(element, f) + } Self::NoChangeRequired(element) => ::core::fmt::Display::fmt(element, f), Self::NotInitializing(element) => ::core::fmt::Display::fmt(element, f), Self::OutdatedState(element) => ::core::fmt::Display::fmt(element, f), @@ -1946,6 +2200,11 @@ pub mod light_client_arbitrum { Self::InvalidProof(value) } } + impl ::core::convert::From for LightClientArbitrumErrors { + fn from(value: MissingLastBlockInEpochUpdate) -> Self { + Self::MissingLastBlockInEpochUpdate(value) + } + } impl ::core::convert::From for LightClientArbitrumErrors { fn from(value: NoChangeRequired) -> Self { Self::NoChangeRequired(value) @@ -2019,6 +2278,22 @@ pub mod light_client_arbitrum { Eq, Hash, )] + #[ethevent(name = "NewEpoch", abi = "NewEpoch(uint64)")] + pub struct NewEpochFilter { + pub epoch: u64, + } + #[derive( + Clone, + ::ethers::contract::EthEvent, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] #[ethevent(name = "NewState", abi = "NewState(uint64,uint64,uint256)")] pub struct NewStateFilter { #[ethevent(indexed)] @@ -2131,6 +2406,7 @@ pub mod light_client_arbitrum { )] pub enum LightClientArbitrumEvents { InitializedFilter(InitializedFilter), + NewEpochFilter(NewEpochFilter), NewStateFilter(NewStateFilter), OwnershipTransferredFilter(OwnershipTransferredFilter), PermissionedProverNotRequiredFilter(PermissionedProverNotRequiredFilter), @@ -2145,6 +2421,9 @@ pub mod light_client_arbitrum { if let Ok(decoded) = InitializedFilter::decode_log(log) { return Ok(LightClientArbitrumEvents::InitializedFilter(decoded)); } + if let Ok(decoded) = NewEpochFilter::decode_log(log) { + return Ok(LightClientArbitrumEvents::NewEpochFilter(decoded)); + } if let Ok(decoded) = NewStateFilter::decode_log(log) { return Ok(LightClientArbitrumEvents::NewStateFilter(decoded)); } @@ -2174,6 +2453,7 @@ pub mod light_client_arbitrum { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { match self { Self::InitializedFilter(element) => ::core::fmt::Display::fmt(element, f), + Self::NewEpochFilter(element) => ::core::fmt::Display::fmt(element, f), Self::NewStateFilter(element) => ::core::fmt::Display::fmt(element, f), Self::OwnershipTransferredFilter(element) => ::core::fmt::Display::fmt(element, f), Self::PermissionedProverNotRequiredFilter(element) => { @@ -2192,6 +2472,11 @@ pub mod light_client_arbitrum { Self::InitializedFilter(value) } } + impl ::core::convert::From for LightClientArbitrumEvents { + fn from(value: NewEpochFilter) -> Self { + Self::NewEpochFilter(value) + } + } impl ::core::convert::From for LightClientArbitrumEvents { fn from(value: NewStateFilter) -> Self { Self::NewStateFilter(value) @@ -2240,6 +2525,21 @@ pub mod light_client_arbitrum { abi = "UPGRADE_INTERFACE_VERSION()" )] pub struct UpgradeInterfaceVersionCall; + ///Container type for all input parameters for the `_blocksPerEpoch` function with signature `_blocksPerEpoch()` and selector `0xb2424e3f` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "_blocksPerEpoch", abi = "_blocksPerEpoch()")] + pub struct BlocksPerEpochCall; ///Container type for all input parameters for the `currentBlockNumber` function with signature `currentBlockNumber()` and selector `0x378ec23b` #[derive( Clone, @@ -2255,6 +2555,21 @@ pub mod light_client_arbitrum { )] #[ethcall(name = "currentBlockNumber", abi = "currentBlockNumber()")] pub struct CurrentBlockNumberCall; + ///Container type for all input parameters for the `currentEpoch` function with signature `currentEpoch()` and selector `0x76671808` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "currentEpoch", abi = "currentEpoch()")] + pub struct CurrentEpochCall; ///Container type for all input parameters for the `disablePermissionedProverMode` function with signature `disablePermissionedProverMode()` and selector `0x69cc6a04` #[derive( Clone, @@ -2273,6 +2588,27 @@ pub mod light_client_arbitrum { abi = "disablePermissionedProverMode()" )] pub struct DisablePermissionedProverModeCall; + ///Container type for all input parameters for the `epochFromBlockNumber` function with signature `epochFromBlockNumber(uint64,uint64)` and selector `0x90c14390` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall( + name = "epochFromBlockNumber", + abi = "epochFromBlockNumber(uint64,uint64)" + )] + pub struct EpochFromBlockNumberCall { + pub block_num: u64, + pub blocks_per_epoch: u64, + } ///Container type for all input parameters for the `finalizedState` function with signature `finalizedState()` and selector `0x9fdb54a7` #[derive( Clone, @@ -2365,7 +2701,7 @@ pub mod light_client_arbitrum { )] #[ethcall(name = "getVersion", abi = "getVersion()")] pub struct GetVersionCall; - ///Container type for all input parameters for the `initialize` function with signature `initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address)` and selector `0x9baa3cc9` + ///Container type for all input parameters for the `initialize` function with signature `initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address,uint64)` and selector `0x811f853f` #[derive( Clone, ::ethers::contract::EthCall, @@ -2380,13 +2716,31 @@ pub mod light_client_arbitrum { )] #[ethcall( name = "initialize", - abi = "initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address)" + abi = "initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address,uint64)" )] pub struct InitializeCall { pub genesis: LightClientState, pub genesis_stake_table_state: StakeTableState, pub state_history_retention_period: u32, pub owner: ::ethers::core::types::Address, + pub blocks_per_epoch: u64, + } + ///Container type for all input parameters for the `isLastBlockInEpoch` function with signature `isLastBlockInEpoch(uint64)` and selector `0xa1be8d52` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "isLastBlockInEpoch", abi = "isLastBlockInEpoch(uint64)")] + pub struct IsLastBlockInEpochCall { + pub block_height: u64, } ///Container type for all input parameters for the `isPermissionedProverEnabled` function with signature `isPermissionedProverEnabled()` and selector `0x826e41fc` #[derive( @@ -2427,7 +2781,7 @@ pub mod light_client_arbitrum { pub block_number: ::ethers::core::types::U256, pub block_threshold: ::ethers::core::types::U256, } - ///Container type for all input parameters for the `newFinalizedState` function with signature `newFinalizedState((uint64,uint64,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0x2063d4f7` + ///Container type for all input parameters for the `newFinalizedState` function with signature `newFinalizedState((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0x757c37ad` #[derive( Clone, ::ethers::contract::EthCall, @@ -2437,10 +2791,11 @@ pub mod light_client_arbitrum { )] #[ethcall( name = "newFinalizedState", - abi = "newFinalizedState((uint64,uint64,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))" + abi = "newFinalizedState((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))" )] pub struct NewFinalizedStateCall { pub new_state: LightClientState, + pub next_stake_table: StakeTableState, pub proof: PlonkProof, } ///Container type for all input parameters for the `owner` function with signature `owner()` and selector `0x8da5cb5b` @@ -2626,12 +2981,30 @@ pub mod light_client_arbitrum { pub new_implementation: ::ethers::core::types::Address, pub data: ::ethers::core::types::Bytes, } + ///Container type for all input parameters for the `votingStakeTableState` function with signature `votingStakeTableState()` and selector `0x0625e19b` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "votingStakeTableState", abi = "votingStakeTableState()")] + pub struct VotingStakeTableStateCall; ///Container type for all of the contract's call #[derive(Clone, ::ethers::contract::EthAbiType, serde::Serialize, serde::Deserialize)] pub enum LightClientArbitrumCalls { UpgradeInterfaceVersion(UpgradeInterfaceVersionCall), + BlocksPerEpoch(BlocksPerEpochCall), CurrentBlockNumber(CurrentBlockNumberCall), + CurrentEpoch(CurrentEpochCall), DisablePermissionedProverMode(DisablePermissionedProverModeCall), + EpochFromBlockNumber(EpochFromBlockNumberCall), FinalizedState(FinalizedStateCall), GenesisStakeTableState(GenesisStakeTableStateCall), GenesisState(GenesisStateCall), @@ -2639,6 +3012,7 @@ pub mod light_client_arbitrum { GetStateHistoryCount(GetStateHistoryCountCall), GetVersion(GetVersionCall), Initialize(InitializeCall), + IsLastBlockInEpoch(IsLastBlockInEpochCall), IsPermissionedProverEnabled(IsPermissionedProverEnabledCall), LagOverEscapeHatchThreshold(LagOverEscapeHatchThresholdCall), NewFinalizedState(NewFinalizedStateCall), @@ -2653,6 +3027,7 @@ pub mod light_client_arbitrum { StateHistoryRetentionPeriod(StateHistoryRetentionPeriodCall), TransferOwnership(TransferOwnershipCall), UpgradeToAndCall(UpgradeToAndCallCall), + VotingStakeTableState(VotingStakeTableStateCall), } impl ::ethers::core::abi::AbiDecode for LightClientArbitrumCalls { fn decode( @@ -2664,16 +3039,30 @@ pub mod light_client_arbitrum { { return Ok(Self::UpgradeInterfaceVersion(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::BlocksPerEpoch(decoded)); + } if let Ok(decoded) = ::decode(data) { return Ok(Self::CurrentBlockNumber(decoded)); } + if let Ok(decoded) = ::decode(data) + { + return Ok(Self::CurrentEpoch(decoded)); + } if let Ok(decoded) = ::decode(data) { return Ok(Self::DisablePermissionedProverMode(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::EpochFromBlockNumber(decoded)); + } if let Ok(decoded) = ::decode(data) { @@ -2704,6 +3093,11 @@ pub mod light_client_arbitrum { if let Ok(decoded) = ::decode(data) { return Ok(Self::Initialize(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::IsLastBlockInEpoch(decoded)); + } if let Ok(decoded) = ::decode(data) { @@ -2771,6 +3165,11 @@ pub mod light_client_arbitrum { { return Ok(Self::UpgradeToAndCall(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::VotingStakeTableState(decoded)); + } Err(::ethers::core::abi::Error::InvalidData.into()) } } @@ -2780,12 +3179,17 @@ pub mod light_client_arbitrum { Self::UpgradeInterfaceVersion(element) => { ::ethers::core::abi::AbiEncode::encode(element) } + Self::BlocksPerEpoch(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::CurrentBlockNumber(element) => { ::ethers::core::abi::AbiEncode::encode(element) } + Self::CurrentEpoch(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::DisablePermissionedProverMode(element) => { ::ethers::core::abi::AbiEncode::encode(element) } + Self::EpochFromBlockNumber(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::FinalizedState(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::GenesisStakeTableState(element) => { ::ethers::core::abi::AbiEncode::encode(element) @@ -2799,6 +3203,9 @@ pub mod light_client_arbitrum { } Self::GetVersion(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::Initialize(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::IsLastBlockInEpoch(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::IsPermissionedProverEnabled(element) => { ::ethers::core::abi::AbiEncode::encode(element) } @@ -2829,6 +3236,9 @@ pub mod light_client_arbitrum { } Self::TransferOwnership(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::UpgradeToAndCall(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::VotingStakeTableState(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } } } } @@ -2836,10 +3246,13 @@ pub mod light_client_arbitrum { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { match self { Self::UpgradeInterfaceVersion(element) => ::core::fmt::Display::fmt(element, f), + Self::BlocksPerEpoch(element) => ::core::fmt::Display::fmt(element, f), Self::CurrentBlockNumber(element) => ::core::fmt::Display::fmt(element, f), + Self::CurrentEpoch(element) => ::core::fmt::Display::fmt(element, f), Self::DisablePermissionedProverMode(element) => { ::core::fmt::Display::fmt(element, f) } + Self::EpochFromBlockNumber(element) => ::core::fmt::Display::fmt(element, f), Self::FinalizedState(element) => ::core::fmt::Display::fmt(element, f), Self::GenesisStakeTableState(element) => ::core::fmt::Display::fmt(element, f), Self::GenesisState(element) => ::core::fmt::Display::fmt(element, f), @@ -2847,6 +3260,7 @@ pub mod light_client_arbitrum { Self::GetStateHistoryCount(element) => ::core::fmt::Display::fmt(element, f), Self::GetVersion(element) => ::core::fmt::Display::fmt(element, f), Self::Initialize(element) => ::core::fmt::Display::fmt(element, f), + Self::IsLastBlockInEpoch(element) => ::core::fmt::Display::fmt(element, f), Self::IsPermissionedProverEnabled(element) => ::core::fmt::Display::fmt(element, f), Self::LagOverEscapeHatchThreshold(element) => ::core::fmt::Display::fmt(element, f), Self::NewFinalizedState(element) => ::core::fmt::Display::fmt(element, f), @@ -2863,6 +3277,7 @@ pub mod light_client_arbitrum { Self::StateHistoryRetentionPeriod(element) => ::core::fmt::Display::fmt(element, f), Self::TransferOwnership(element) => ::core::fmt::Display::fmt(element, f), Self::UpgradeToAndCall(element) => ::core::fmt::Display::fmt(element, f), + Self::VotingStakeTableState(element) => ::core::fmt::Display::fmt(element, f), } } } @@ -2871,16 +3286,31 @@ pub mod light_client_arbitrum { Self::UpgradeInterfaceVersion(value) } } + impl ::core::convert::From for LightClientArbitrumCalls { + fn from(value: BlocksPerEpochCall) -> Self { + Self::BlocksPerEpoch(value) + } + } impl ::core::convert::From for LightClientArbitrumCalls { fn from(value: CurrentBlockNumberCall) -> Self { Self::CurrentBlockNumber(value) } } + impl ::core::convert::From for LightClientArbitrumCalls { + fn from(value: CurrentEpochCall) -> Self { + Self::CurrentEpoch(value) + } + } impl ::core::convert::From for LightClientArbitrumCalls { fn from(value: DisablePermissionedProverModeCall) -> Self { Self::DisablePermissionedProverMode(value) } } + impl ::core::convert::From for LightClientArbitrumCalls { + fn from(value: EpochFromBlockNumberCall) -> Self { + Self::EpochFromBlockNumber(value) + } + } impl ::core::convert::From for LightClientArbitrumCalls { fn from(value: FinalizedStateCall) -> Self { Self::FinalizedState(value) @@ -2916,6 +3346,11 @@ pub mod light_client_arbitrum { Self::Initialize(value) } } + impl ::core::convert::From for LightClientArbitrumCalls { + fn from(value: IsLastBlockInEpochCall) -> Self { + Self::IsLastBlockInEpoch(value) + } + } impl ::core::convert::From for LightClientArbitrumCalls { fn from(value: IsPermissionedProverEnabledCall) -> Self { Self::IsPermissionedProverEnabled(value) @@ -2986,6 +3421,11 @@ pub mod light_client_arbitrum { Self::UpgradeToAndCall(value) } } + impl ::core::convert::From for LightClientArbitrumCalls { + fn from(value: VotingStakeTableStateCall) -> Self { + Self::VotingStakeTableState(value) + } + } ///Container type for all return fields from the `UPGRADE_INTERFACE_VERSION` function with signature `UPGRADE_INTERFACE_VERSION()` and selector `0xad3cb1cc` #[derive( Clone, @@ -3000,6 +3440,20 @@ pub mod light_client_arbitrum { Hash, )] pub struct UpgradeInterfaceVersionReturn(pub ::std::string::String); + ///Container type for all return fields from the `_blocksPerEpoch` function with signature `_blocksPerEpoch()` and selector `0xb2424e3f` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct BlocksPerEpochReturn(pub u64); ///Container type for all return fields from the `currentBlockNumber` function with signature `currentBlockNumber()` and selector `0x378ec23b` #[derive( Clone, @@ -3014,6 +3468,34 @@ pub mod light_client_arbitrum { Hash, )] pub struct CurrentBlockNumberReturn(pub ::ethers::core::types::U256); + ///Container type for all return fields from the `currentEpoch` function with signature `currentEpoch()` and selector `0x76671808` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct CurrentEpochReturn(pub u64); + ///Container type for all return fields from the `epochFromBlockNumber` function with signature `epochFromBlockNumber(uint64,uint64)` and selector `0x90c14390` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct EpochFromBlockNumberReturn(pub u64); ///Container type for all return fields from the `finalizedState` function with signature `finalizedState()` and selector `0x9fdb54a7` #[derive( Clone, @@ -3118,6 +3600,20 @@ pub mod light_client_arbitrum { pub minor_version: u8, pub patch_version: u8, } + ///Container type for all return fields from the `isLastBlockInEpoch` function with signature `isLastBlockInEpoch(uint64)` and selector `0xa1be8d52` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct IsLastBlockInEpochReturn(pub bool); ///Container type for all return fields from the `isPermissionedProverEnabled` function with signature `isPermissionedProverEnabled()` and selector `0x826e41fc` #[derive( Clone, @@ -3235,4 +3731,23 @@ pub mod light_client_arbitrum { Hash, )] pub struct StateHistoryRetentionPeriodReturn(pub u32); + ///Container type for all return fields from the `votingStakeTableState` function with signature `votingStakeTableState()` and selector `0x0625e19b` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct VotingStakeTableStateReturn { + pub threshold: ::ethers::core::types::U256, + pub bls_key_comm: ::ethers::core::types::U256, + pub schnorr_key_comm: ::ethers::core::types::U256, + pub amount_comm: ::ethers::core::types::U256, + } } diff --git a/contract-bindings-ethers/src/light_client_mock.rs b/contract-bindings-ethers/src/light_client_mock.rs index 951f036d38..a0311fe1f0 100644 --- a/contract-bindings-ethers/src/light_client_mock.rs +++ b/contract-bindings-ethers/src/light_client_mock.rs @@ -46,6 +46,13 @@ pub mod light_client_mock { ::std::borrow::ToOwned::to_owned("uint32"), ), }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("blocksPerEpoch"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + }, ], }), functions: ::core::convert::From::from([ @@ -65,6 +72,22 @@ pub mod light_client_mock { state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, },], ), + ( + ::std::borrow::ToOwned::to_owned("_blocksPerEpoch"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("_blocksPerEpoch"), + inputs: ::std::vec![], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), ( ::std::borrow::ToOwned::to_owned("currentBlockNumber"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -81,6 +104,22 @@ pub mod light_client_mock { state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, },], ), + ( + ::std::borrow::ToOwned::to_owned("currentEpoch"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("currentEpoch"), + inputs: ::std::vec![], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), ( ::std::borrow::ToOwned::to_owned("disablePermissionedProverMode"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -91,6 +130,37 @@ pub mod light_client_mock { state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, },], ), + ( + ::std::borrow::ToOwned::to_owned("epochFromBlockNumber"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("epochFromBlockNumber",), + inputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("blockNum"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("blocksPerEpoch"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + }, + ], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::Pure, + },], + ), ( ::std::borrow::ToOwned::to_owned("finalizedState"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -321,12 +391,41 @@ pub mod light_client_mock { ::std::borrow::ToOwned::to_owned("address"), ), }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("blocksPerEpoch"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + }, ], outputs: ::std::vec![], constant: ::core::option::Option::None, state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, },], ), + ( + ::std::borrow::ToOwned::to_owned("isLastBlockInEpoch"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("isLastBlockInEpoch"), + inputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("blockHeight"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + },], + outputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::string::String::new(), + kind: ::ethers::core::abi::ethabi::ParamType::Bool, + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("bool"), + ), + },], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), ( ::std::borrow::ToOwned::to_owned("isPermissionedProverEnabled"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -392,6 +491,20 @@ pub mod light_client_mock { ), ), }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("nextStakeTable"), + kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ::ethers::core::abi::ethabi::ParamType::Uint(256usize), + ],), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned( + "struct LightClient.StakeTableState", + ), + ), + }, ::ethers::core::abi::ethabi::Param { name: ::std::borrow::ToOwned::to_owned("proof"), kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ @@ -528,6 +641,22 @@ pub mod light_client_mock { state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, },], ), + ( + ::std::borrow::ToOwned::to_owned("setBlocksPerEpoch"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("setBlocksPerEpoch"), + inputs: ::std::vec![::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("newBlocksPerEpoch"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint64"), + ), + },], + outputs: ::std::vec![], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::NonPayable, + },], + ), ( ::std::borrow::ToOwned::to_owned("setFinalizedState"), ::std::vec![::ethers::core::abi::ethabi::Function { @@ -753,6 +882,45 @@ pub mod light_client_mock { state_mutability: ::ethers::core::abi::ethabi::StateMutability::Payable, },], ), + ( + ::std::borrow::ToOwned::to_owned("votingStakeTableState"), + ::std::vec![::ethers::core::abi::ethabi::Function { + name: ::std::borrow::ToOwned::to_owned("votingStakeTableState",), + inputs: ::std::vec![], + outputs: ::std::vec![ + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("threshold"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("uint256"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("blsKeyComm"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("BN254.ScalarField"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("schnorrKeyComm"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("BN254.ScalarField"), + ), + }, + ::ethers::core::abi::ethabi::Param { + name: ::std::borrow::ToOwned::to_owned("amountComm"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), + internal_type: ::core::option::Option::Some( + ::std::borrow::ToOwned::to_owned("BN254.ScalarField"), + ), + }, + ], + constant: ::core::option::Option::None, + state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, + },], + ), ]), events: ::core::convert::From::from([ ( @@ -767,6 +935,18 @@ pub mod light_client_mock { anonymous: false, },], ), + ( + ::std::borrow::ToOwned::to_owned("NewEpoch"), + ::std::vec![::ethers::core::abi::ethabi::Event { + name: ::std::borrow::ToOwned::to_owned("NewEpoch"), + inputs: ::std::vec![::ethers::core::abi::ethabi::EventParam { + name: ::std::borrow::ToOwned::to_owned("epoch"), + kind: ::ethers::core::abi::ethabi::ParamType::Uint(64usize), + indexed: false, + },], + anonymous: false, + },], + ), ( ::std::borrow::ToOwned::to_owned("NewState"), ::std::vec![::ethers::core::abi::ethabi::Event { @@ -947,6 +1127,13 @@ pub mod light_client_mock { inputs: ::std::vec![], },], ), + ( + ::std::borrow::ToOwned::to_owned("MissingLastBlockInEpochUpdate"), + ::std::vec![::ethers::core::abi::ethabi::AbiError { + name: ::std::borrow::ToOwned::to_owned("MissingLastBlockInEpochUpdate",), + inputs: ::std::vec![], + },], + ), ( ::std::borrow::ToOwned::to_owned("NoChangeRequired"), ::std::vec![::ethers::core::abi::ethabi::AbiError { @@ -1081,6 +1268,12 @@ pub mod light_client_mock { .method_hash([173, 60, 177, 204], ()) .expect("method not found (this should never happen)") } + ///Calls the contract's `_blocksPerEpoch` (0xb2424e3f) function + pub fn blocks_per_epoch(&self) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([178, 66, 78, 63], ()) + .expect("method not found (this should never happen)") + } ///Calls the contract's `currentBlockNumber` (0x378ec23b) function pub fn current_block_number( &self, @@ -1089,6 +1282,12 @@ pub mod light_client_mock { .method_hash([55, 142, 194, 59], ()) .expect("method not found (this should never happen)") } + ///Calls the contract's `currentEpoch` (0x76671808) function + pub fn current_epoch(&self) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([118, 103, 24, 8], ()) + .expect("method not found (this should never happen)") + } ///Calls the contract's `disablePermissionedProverMode` (0x69cc6a04) function pub fn disable_permissioned_prover_mode( &self, @@ -1097,6 +1296,16 @@ pub mod light_client_mock { .method_hash([105, 204, 106, 4], ()) .expect("method not found (this should never happen)") } + ///Calls the contract's `epochFromBlockNumber` (0x90c14390) function + pub fn epoch_from_block_number( + &self, + block_num: u64, + blocks_per_epoch: u64, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([144, 193, 67, 144], (block_num, blocks_per_epoch)) + .expect("method not found (this should never happen)") + } ///Calls the contract's `finalizedState` (0x9fdb54a7) function pub fn finalized_state( &self, @@ -1155,26 +1364,37 @@ pub mod light_client_mock { .method_hash([13, 142, 110, 44], ()) .expect("method not found (this should never happen)") } - ///Calls the contract's `initialize` (0x9baa3cc9) function + ///Calls the contract's `initialize` (0x811f853f) function pub fn initialize( &self, genesis: LightClientState, genesis_stake_table_state: StakeTableState, state_history_retention_period: u32, owner: ::ethers::core::types::Address, + blocks_per_epoch: u64, ) -> ::ethers::contract::builders::ContractCall { self.0 .method_hash( - [155, 170, 60, 201], + [129, 31, 133, 63], ( genesis, genesis_stake_table_state, state_history_retention_period, owner, + blocks_per_epoch, ), ) .expect("method not found (this should never happen)") } + ///Calls the contract's `isLastBlockInEpoch` (0xa1be8d52) function + pub fn is_last_block_in_epoch( + &self, + block_height: u64, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([161, 190, 141, 82], block_height) + .expect("method not found (this should never happen)") + } ///Calls the contract's `isPermissionedProverEnabled` (0x826e41fc) function pub fn is_permissioned_prover_enabled( &self, @@ -1193,14 +1413,15 @@ pub mod light_client_mock { .method_hash([224, 48, 51, 1], (block_number, threshold)) .expect("method not found (this should never happen)") } - ///Calls the contract's `newFinalizedState` (0x2063d4f7) function + ///Calls the contract's `newFinalizedState` (0x757c37ad) function pub fn new_finalized_state( &self, new_state: LightClientState, + next_stake_table: StakeTableState, proof: PlonkProof, ) -> ::ethers::contract::builders::ContractCall { self.0 - .method_hash([32, 99, 212, 247], (new_state, proof)) + .method_hash([117, 124, 55, 173], (new_state, next_stake_table, proof)) .expect("method not found (this should never happen)") } ///Calls the contract's `owner` (0x8da5cb5b) function @@ -1231,6 +1452,15 @@ pub mod light_client_mock { .method_hash([113, 80, 24, 166], ()) .expect("method not found (this should never happen)") } + ///Calls the contract's `setBlocksPerEpoch` (0x3c23b6db) function + pub fn set_blocks_per_epoch( + &self, + new_blocks_per_epoch: u64, + ) -> ::ethers::contract::builders::ContractCall { + self.0 + .method_hash([60, 35, 182, 219], new_blocks_per_epoch) + .expect("method not found (this should never happen)") + } ///Calls the contract's `setFinalizedState` (0xb5adea3c) function pub fn set_finalized_state( &self, @@ -1329,6 +1559,22 @@ pub mod light_client_mock { .method_hash([79, 30, 242, 134], (new_implementation, data)) .expect("method not found (this should never happen)") } + ///Calls the contract's `votingStakeTableState` (0x0625e19b) function + pub fn voting_stake_table_state( + &self, + ) -> ::ethers::contract::builders::ContractCall< + M, + ( + ::ethers::core::types::U256, + ::ethers::core::types::U256, + ::ethers::core::types::U256, + ::ethers::core::types::U256, + ), + > { + self.0 + .method_hash([6, 37, 225, 155], ()) + .expect("method not found (this should never happen)") + } ///Gets the contract's `Initialized` event pub fn initialized_filter( &self, @@ -1336,6 +1582,12 @@ pub mod light_client_mock { { self.0.event() } + ///Gets the contract's `NewEpoch` event + pub fn new_epoch_filter( + &self, + ) -> ::ethers::contract::builders::Event<::std::sync::Arc, M, NewEpochFilter> { + self.0.event() + } ///Gets the contract's `NewState` event pub fn new_state_filter( &self, @@ -1575,6 +1827,24 @@ pub mod light_client_mock { )] #[etherror(name = "InvalidProof", abi = "InvalidProof()")] pub struct InvalidProof; + ///Custom Error type `MissingLastBlockInEpochUpdate` with signature `MissingLastBlockInEpochUpdate()` and selector `0x7150de45` + #[derive( + Clone, + ::ethers::contract::EthError, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[etherror( + name = "MissingLastBlockInEpochUpdate", + abi = "MissingLastBlockInEpochUpdate()" + )] + pub struct MissingLastBlockInEpochUpdate; ///Custom Error type `NoChangeRequired` with signature `NoChangeRequired()` and selector `0xa863aec9` #[derive( Clone, @@ -1748,6 +2018,7 @@ pub mod light_client_mock { InvalidInitialization(InvalidInitialization), InvalidMaxStateHistory(InvalidMaxStateHistory), InvalidProof(InvalidProof), + MissingLastBlockInEpochUpdate(MissingLastBlockInEpochUpdate), NoChangeRequired(NoChangeRequired), NotInitializing(NotInitializing), OutdatedState(OutdatedState), @@ -1818,6 +2089,11 @@ pub mod light_client_mock { if let Ok(decoded) = ::decode(data) { return Ok(Self::InvalidProof(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::MissingLastBlockInEpochUpdate(decoded)); + } if let Ok(decoded) = ::decode(data) { return Ok(Self::NoChangeRequired(decoded)); @@ -1885,6 +2161,9 @@ pub mod light_client_mock { ::ethers::core::abi::AbiEncode::encode(element) } Self::InvalidProof(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::MissingLastBlockInEpochUpdate(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::NoChangeRequired(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::NotInitializing(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::OutdatedState(element) => ::ethers::core::abi::AbiEncode::encode(element), @@ -1954,6 +2233,10 @@ pub mod light_client_mock { } _ if selector == ::selector() => true, + _ if selector + == ::selector() => { + true + } _ if selector == ::selector() => { true @@ -2012,6 +2295,9 @@ pub mod light_client_mock { Self::InvalidInitialization(element) => ::core::fmt::Display::fmt(element, f), Self::InvalidMaxStateHistory(element) => ::core::fmt::Display::fmt(element, f), Self::InvalidProof(element) => ::core::fmt::Display::fmt(element, f), + Self::MissingLastBlockInEpochUpdate(element) => { + ::core::fmt::Display::fmt(element, f) + } Self::NoChangeRequired(element) => ::core::fmt::Display::fmt(element, f), Self::NotInitializing(element) => ::core::fmt::Display::fmt(element, f), Self::OutdatedState(element) => ::core::fmt::Display::fmt(element, f), @@ -2087,6 +2373,11 @@ pub mod light_client_mock { Self::InvalidProof(value) } } + impl ::core::convert::From for LightClientMockErrors { + fn from(value: MissingLastBlockInEpochUpdate) -> Self { + Self::MissingLastBlockInEpochUpdate(value) + } + } impl ::core::convert::From for LightClientMockErrors { fn from(value: NoChangeRequired) -> Self { Self::NoChangeRequired(value) @@ -2160,6 +2451,22 @@ pub mod light_client_mock { Eq, Hash, )] + #[ethevent(name = "NewEpoch", abi = "NewEpoch(uint64)")] + pub struct NewEpochFilter { + pub epoch: u64, + } + #[derive( + Clone, + ::ethers::contract::EthEvent, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] #[ethevent(name = "NewState", abi = "NewState(uint64,uint64,uint256)")] pub struct NewStateFilter { #[ethevent(indexed)] @@ -2272,6 +2579,7 @@ pub mod light_client_mock { )] pub enum LightClientMockEvents { InitializedFilter(InitializedFilter), + NewEpochFilter(NewEpochFilter), NewStateFilter(NewStateFilter), OwnershipTransferredFilter(OwnershipTransferredFilter), PermissionedProverNotRequiredFilter(PermissionedProverNotRequiredFilter), @@ -2286,6 +2594,9 @@ pub mod light_client_mock { if let Ok(decoded) = InitializedFilter::decode_log(log) { return Ok(LightClientMockEvents::InitializedFilter(decoded)); } + if let Ok(decoded) = NewEpochFilter::decode_log(log) { + return Ok(LightClientMockEvents::NewEpochFilter(decoded)); + } if let Ok(decoded) = NewStateFilter::decode_log(log) { return Ok(LightClientMockEvents::NewStateFilter(decoded)); } @@ -2315,6 +2626,7 @@ pub mod light_client_mock { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { match self { Self::InitializedFilter(element) => ::core::fmt::Display::fmt(element, f), + Self::NewEpochFilter(element) => ::core::fmt::Display::fmt(element, f), Self::NewStateFilter(element) => ::core::fmt::Display::fmt(element, f), Self::OwnershipTransferredFilter(element) => ::core::fmt::Display::fmt(element, f), Self::PermissionedProverNotRequiredFilter(element) => { @@ -2333,6 +2645,11 @@ pub mod light_client_mock { Self::InitializedFilter(value) } } + impl ::core::convert::From for LightClientMockEvents { + fn from(value: NewEpochFilter) -> Self { + Self::NewEpochFilter(value) + } + } impl ::core::convert::From for LightClientMockEvents { fn from(value: NewStateFilter) -> Self { Self::NewStateFilter(value) @@ -2381,6 +2698,21 @@ pub mod light_client_mock { abi = "UPGRADE_INTERFACE_VERSION()" )] pub struct UpgradeInterfaceVersionCall; + ///Container type for all input parameters for the `_blocksPerEpoch` function with signature `_blocksPerEpoch()` and selector `0xb2424e3f` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "_blocksPerEpoch", abi = "_blocksPerEpoch()")] + pub struct BlocksPerEpochCall; ///Container type for all input parameters for the `currentBlockNumber` function with signature `currentBlockNumber()` and selector `0x378ec23b` #[derive( Clone, @@ -2396,6 +2728,21 @@ pub mod light_client_mock { )] #[ethcall(name = "currentBlockNumber", abi = "currentBlockNumber()")] pub struct CurrentBlockNumberCall; + ///Container type for all input parameters for the `currentEpoch` function with signature `currentEpoch()` and selector `0x76671808` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "currentEpoch", abi = "currentEpoch()")] + pub struct CurrentEpochCall; ///Container type for all input parameters for the `disablePermissionedProverMode` function with signature `disablePermissionedProverMode()` and selector `0x69cc6a04` #[derive( Clone, @@ -2414,6 +2761,27 @@ pub mod light_client_mock { abi = "disablePermissionedProverMode()" )] pub struct DisablePermissionedProverModeCall; + ///Container type for all input parameters for the `epochFromBlockNumber` function with signature `epochFromBlockNumber(uint64,uint64)` and selector `0x90c14390` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall( + name = "epochFromBlockNumber", + abi = "epochFromBlockNumber(uint64,uint64)" + )] + pub struct EpochFromBlockNumberCall { + pub block_num: u64, + pub blocks_per_epoch: u64, + } ///Container type for all input parameters for the `finalizedState` function with signature `finalizedState()` and selector `0x9fdb54a7` #[derive( Clone, @@ -2506,7 +2874,7 @@ pub mod light_client_mock { )] #[ethcall(name = "getVersion", abi = "getVersion()")] pub struct GetVersionCall; - ///Container type for all input parameters for the `initialize` function with signature `initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address)` and selector `0x9baa3cc9` + ///Container type for all input parameters for the `initialize` function with signature `initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address,uint64)` and selector `0x811f853f` #[derive( Clone, ::ethers::contract::EthCall, @@ -2521,13 +2889,31 @@ pub mod light_client_mock { )] #[ethcall( name = "initialize", - abi = "initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address)" + abi = "initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address,uint64)" )] pub struct InitializeCall { pub genesis: LightClientState, pub genesis_stake_table_state: StakeTableState, pub state_history_retention_period: u32, pub owner: ::ethers::core::types::Address, + pub blocks_per_epoch: u64, + } + ///Container type for all input parameters for the `isLastBlockInEpoch` function with signature `isLastBlockInEpoch(uint64)` and selector `0xa1be8d52` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "isLastBlockInEpoch", abi = "isLastBlockInEpoch(uint64)")] + pub struct IsLastBlockInEpochCall { + pub block_height: u64, } ///Container type for all input parameters for the `isPermissionedProverEnabled` function with signature `isPermissionedProverEnabled()` and selector `0x826e41fc` #[derive( @@ -2568,7 +2954,7 @@ pub mod light_client_mock { pub block_number: ::ethers::core::types::U256, pub threshold: ::ethers::core::types::U256, } - ///Container type for all input parameters for the `newFinalizedState` function with signature `newFinalizedState((uint64,uint64,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0x2063d4f7` + ///Container type for all input parameters for the `newFinalizedState` function with signature `newFinalizedState((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0x757c37ad` #[derive( Clone, ::ethers::contract::EthCall, @@ -2578,10 +2964,11 @@ pub mod light_client_mock { )] #[ethcall( name = "newFinalizedState", - abi = "newFinalizedState((uint64,uint64,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))" + abi = "newFinalizedState((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))" )] pub struct NewFinalizedStateCall { pub new_state: LightClientState, + pub next_stake_table: StakeTableState, pub proof: PlonkProof, } ///Container type for all input parameters for the `owner` function with signature `owner()` and selector `0x8da5cb5b` @@ -2644,6 +3031,23 @@ pub mod light_client_mock { )] #[ethcall(name = "renounceOwnership", abi = "renounceOwnership()")] pub struct RenounceOwnershipCall; + ///Container type for all input parameters for the `setBlocksPerEpoch` function with signature `setBlocksPerEpoch(uint64)` and selector `0x3c23b6db` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "setBlocksPerEpoch", abi = "setBlocksPerEpoch(uint64)")] + pub struct SetBlocksPerEpochCall { + pub new_blocks_per_epoch: u64, + } ///Container type for all input parameters for the `setFinalizedState` function with signature `setFinalizedState((uint64,uint64,uint256))` and selector `0xb5adea3c` #[derive( Clone, @@ -2839,12 +3243,30 @@ pub mod light_client_mock { pub new_implementation: ::ethers::core::types::Address, pub data: ::ethers::core::types::Bytes, } + ///Container type for all input parameters for the `votingStakeTableState` function with signature `votingStakeTableState()` and selector `0x0625e19b` + #[derive( + Clone, + ::ethers::contract::EthCall, + ::ethers::contract::EthDisplay, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + #[ethcall(name = "votingStakeTableState", abi = "votingStakeTableState()")] + pub struct VotingStakeTableStateCall; ///Container type for all of the contract's call #[derive(Clone, ::ethers::contract::EthAbiType, serde::Serialize, serde::Deserialize)] pub enum LightClientMockCalls { UpgradeInterfaceVersion(UpgradeInterfaceVersionCall), + BlocksPerEpoch(BlocksPerEpochCall), CurrentBlockNumber(CurrentBlockNumberCall), + CurrentEpoch(CurrentEpochCall), DisablePermissionedProverMode(DisablePermissionedProverModeCall), + EpochFromBlockNumber(EpochFromBlockNumberCall), FinalizedState(FinalizedStateCall), GenesisStakeTableState(GenesisStakeTableStateCall), GenesisState(GenesisStateCall), @@ -2852,6 +3274,7 @@ pub mod light_client_mock { GetStateHistoryCount(GetStateHistoryCountCall), GetVersion(GetVersionCall), Initialize(InitializeCall), + IsLastBlockInEpoch(IsLastBlockInEpochCall), IsPermissionedProverEnabled(IsPermissionedProverEnabledCall), LagOverEscapeHatchThreshold(LagOverEscapeHatchThresholdCall), NewFinalizedState(NewFinalizedStateCall), @@ -2859,6 +3282,7 @@ pub mod light_client_mock { PermissionedProver(PermissionedProverCall), ProxiableUUID(ProxiableUUIDCall), RenounceOwnership(RenounceOwnershipCall), + SetBlocksPerEpoch(SetBlocksPerEpochCall), SetFinalizedState(SetFinalizedStateCall), SetHotShotDownSince(SetHotShotDownSinceCall), SetHotShotUp(SetHotShotUpCall), @@ -2870,6 +3294,7 @@ pub mod light_client_mock { StateHistoryRetentionPeriod(StateHistoryRetentionPeriodCall), TransferOwnership(TransferOwnershipCall), UpgradeToAndCall(UpgradeToAndCallCall), + VotingStakeTableState(VotingStakeTableStateCall), } impl ::ethers::core::abi::AbiDecode for LightClientMockCalls { fn decode( @@ -2881,16 +3306,30 @@ pub mod light_client_mock { { return Ok(Self::UpgradeInterfaceVersion(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::BlocksPerEpoch(decoded)); + } if let Ok(decoded) = ::decode(data) { return Ok(Self::CurrentBlockNumber(decoded)); } + if let Ok(decoded) = ::decode(data) + { + return Ok(Self::CurrentEpoch(decoded)); + } if let Ok(decoded) = ::decode(data) { return Ok(Self::DisablePermissionedProverMode(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::EpochFromBlockNumber(decoded)); + } if let Ok(decoded) = ::decode(data) { @@ -2921,6 +3360,11 @@ pub mod light_client_mock { if let Ok(decoded) = ::decode(data) { return Ok(Self::Initialize(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::IsLastBlockInEpoch(decoded)); + } if let Ok(decoded) = ::decode(data) { @@ -2953,6 +3397,11 @@ pub mod light_client_mock { { return Ok(Self::RenounceOwnership(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::SetBlocksPerEpoch(decoded)); + } if let Ok(decoded) = ::decode(data) { @@ -3007,6 +3456,11 @@ pub mod light_client_mock { { return Ok(Self::UpgradeToAndCall(decoded)); } + if let Ok(decoded) = + ::decode(data) + { + return Ok(Self::VotingStakeTableState(decoded)); + } Err(::ethers::core::abi::Error::InvalidData.into()) } } @@ -3016,12 +3470,17 @@ pub mod light_client_mock { Self::UpgradeInterfaceVersion(element) => { ::ethers::core::abi::AbiEncode::encode(element) } + Self::BlocksPerEpoch(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::CurrentBlockNumber(element) => { ::ethers::core::abi::AbiEncode::encode(element) } + Self::CurrentEpoch(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::DisablePermissionedProverMode(element) => { ::ethers::core::abi::AbiEncode::encode(element) } + Self::EpochFromBlockNumber(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::FinalizedState(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::GenesisStakeTableState(element) => { ::ethers::core::abi::AbiEncode::encode(element) @@ -3035,6 +3494,9 @@ pub mod light_client_mock { } Self::GetVersion(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::Initialize(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::IsLastBlockInEpoch(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } Self::IsPermissionedProverEnabled(element) => { ::ethers::core::abi::AbiEncode::encode(element) } @@ -3048,6 +3510,7 @@ pub mod light_client_mock { } Self::ProxiableUUID(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::RenounceOwnership(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::SetBlocksPerEpoch(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::SetFinalizedState(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::SetHotShotDownSince(element) => { ::ethers::core::abi::AbiEncode::encode(element) @@ -3071,6 +3534,9 @@ pub mod light_client_mock { } Self::TransferOwnership(element) => ::ethers::core::abi::AbiEncode::encode(element), Self::UpgradeToAndCall(element) => ::ethers::core::abi::AbiEncode::encode(element), + Self::VotingStakeTableState(element) => { + ::ethers::core::abi::AbiEncode::encode(element) + } } } } @@ -3078,10 +3544,13 @@ pub mod light_client_mock { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { match self { Self::UpgradeInterfaceVersion(element) => ::core::fmt::Display::fmt(element, f), + Self::BlocksPerEpoch(element) => ::core::fmt::Display::fmt(element, f), Self::CurrentBlockNumber(element) => ::core::fmt::Display::fmt(element, f), + Self::CurrentEpoch(element) => ::core::fmt::Display::fmt(element, f), Self::DisablePermissionedProverMode(element) => { ::core::fmt::Display::fmt(element, f) } + Self::EpochFromBlockNumber(element) => ::core::fmt::Display::fmt(element, f), Self::FinalizedState(element) => ::core::fmt::Display::fmt(element, f), Self::GenesisStakeTableState(element) => ::core::fmt::Display::fmt(element, f), Self::GenesisState(element) => ::core::fmt::Display::fmt(element, f), @@ -3089,6 +3558,7 @@ pub mod light_client_mock { Self::GetStateHistoryCount(element) => ::core::fmt::Display::fmt(element, f), Self::GetVersion(element) => ::core::fmt::Display::fmt(element, f), Self::Initialize(element) => ::core::fmt::Display::fmt(element, f), + Self::IsLastBlockInEpoch(element) => ::core::fmt::Display::fmt(element, f), Self::IsPermissionedProverEnabled(element) => ::core::fmt::Display::fmt(element, f), Self::LagOverEscapeHatchThreshold(element) => ::core::fmt::Display::fmt(element, f), Self::NewFinalizedState(element) => ::core::fmt::Display::fmt(element, f), @@ -3096,6 +3566,7 @@ pub mod light_client_mock { Self::PermissionedProver(element) => ::core::fmt::Display::fmt(element, f), Self::ProxiableUUID(element) => ::core::fmt::Display::fmt(element, f), Self::RenounceOwnership(element) => ::core::fmt::Display::fmt(element, f), + Self::SetBlocksPerEpoch(element) => ::core::fmt::Display::fmt(element, f), Self::SetFinalizedState(element) => ::core::fmt::Display::fmt(element, f), Self::SetHotShotDownSince(element) => ::core::fmt::Display::fmt(element, f), Self::SetHotShotUp(element) => ::core::fmt::Display::fmt(element, f), @@ -3109,6 +3580,7 @@ pub mod light_client_mock { Self::StateHistoryRetentionPeriod(element) => ::core::fmt::Display::fmt(element, f), Self::TransferOwnership(element) => ::core::fmt::Display::fmt(element, f), Self::UpgradeToAndCall(element) => ::core::fmt::Display::fmt(element, f), + Self::VotingStakeTableState(element) => ::core::fmt::Display::fmt(element, f), } } } @@ -3117,16 +3589,31 @@ pub mod light_client_mock { Self::UpgradeInterfaceVersion(value) } } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: BlocksPerEpochCall) -> Self { + Self::BlocksPerEpoch(value) + } + } impl ::core::convert::From for LightClientMockCalls { fn from(value: CurrentBlockNumberCall) -> Self { Self::CurrentBlockNumber(value) } } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: CurrentEpochCall) -> Self { + Self::CurrentEpoch(value) + } + } impl ::core::convert::From for LightClientMockCalls { fn from(value: DisablePermissionedProverModeCall) -> Self { Self::DisablePermissionedProverMode(value) } } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: EpochFromBlockNumberCall) -> Self { + Self::EpochFromBlockNumber(value) + } + } impl ::core::convert::From for LightClientMockCalls { fn from(value: FinalizedStateCall) -> Self { Self::FinalizedState(value) @@ -3162,6 +3649,11 @@ pub mod light_client_mock { Self::Initialize(value) } } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: IsLastBlockInEpochCall) -> Self { + Self::IsLastBlockInEpoch(value) + } + } impl ::core::convert::From for LightClientMockCalls { fn from(value: IsPermissionedProverEnabledCall) -> Self { Self::IsPermissionedProverEnabled(value) @@ -3197,6 +3689,11 @@ pub mod light_client_mock { Self::RenounceOwnership(value) } } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: SetBlocksPerEpochCall) -> Self { + Self::SetBlocksPerEpoch(value) + } + } impl ::core::convert::From for LightClientMockCalls { fn from(value: SetFinalizedStateCall) -> Self { Self::SetFinalizedState(value) @@ -3252,6 +3749,11 @@ pub mod light_client_mock { Self::UpgradeToAndCall(value) } } + impl ::core::convert::From for LightClientMockCalls { + fn from(value: VotingStakeTableStateCall) -> Self { + Self::VotingStakeTableState(value) + } + } ///Container type for all return fields from the `UPGRADE_INTERFACE_VERSION` function with signature `UPGRADE_INTERFACE_VERSION()` and selector `0xad3cb1cc` #[derive( Clone, @@ -3266,6 +3768,20 @@ pub mod light_client_mock { Hash, )] pub struct UpgradeInterfaceVersionReturn(pub ::std::string::String); + ///Container type for all return fields from the `_blocksPerEpoch` function with signature `_blocksPerEpoch()` and selector `0xb2424e3f` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct BlocksPerEpochReturn(pub u64); ///Container type for all return fields from the `currentBlockNumber` function with signature `currentBlockNumber()` and selector `0x378ec23b` #[derive( Clone, @@ -3280,6 +3796,34 @@ pub mod light_client_mock { Hash, )] pub struct CurrentBlockNumberReturn(pub ::ethers::core::types::U256); + ///Container type for all return fields from the `currentEpoch` function with signature `currentEpoch()` and selector `0x76671808` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct CurrentEpochReturn(pub u64); + ///Container type for all return fields from the `epochFromBlockNumber` function with signature `epochFromBlockNumber(uint64,uint64)` and selector `0x90c14390` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct EpochFromBlockNumberReturn(pub u64); ///Container type for all return fields from the `finalizedState` function with signature `finalizedState()` and selector `0x9fdb54a7` #[derive( Clone, @@ -3384,6 +3928,20 @@ pub mod light_client_mock { pub minor_version: u8, pub patch_version: u8, } + ///Container type for all return fields from the `isLastBlockInEpoch` function with signature `isLastBlockInEpoch(uint64)` and selector `0xa1be8d52` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct IsLastBlockInEpochReturn(pub bool); ///Container type for all return fields from the `isPermissionedProverEnabled` function with signature `isPermissionedProverEnabled()` and selector `0x826e41fc` #[derive( Clone, @@ -3501,6 +4059,25 @@ pub mod light_client_mock { Hash, )] pub struct StateHistoryRetentionPeriodReturn(pub u32); + ///Container type for all return fields from the `votingStakeTableState` function with signature `votingStakeTableState()` and selector `0x0625e19b` + #[derive( + Clone, + ::ethers::contract::EthAbiType, + ::ethers::contract::EthAbiCodec, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + PartialEq, + Eq, + Hash, + )] + pub struct VotingStakeTableStateReturn { + pub threshold: ::ethers::core::types::U256, + pub bls_key_comm: ::ethers::core::types::U256, + pub schnorr_key_comm: ::ethers::core::types::U256, + pub amount_comm: ::ethers::core::types::U256, + } ///`StateHistoryCommitment(uint64,uint64,uint64,uint256)` #[derive( Clone, diff --git a/contract-bindings-ethers/src/plonk_verifier.rs b/contract-bindings-ethers/src/plonk_verifier.rs index 9f5ae4cd72..2b8f685076 100644 --- a/contract-bindings-ethers/src/plonk_verifier.rs +++ b/contract-bindings-ethers/src/plonk_verifier.rs @@ -112,10 +112,10 @@ pub mod plonk_verifier { ::std::boxed::Box::new( ::ethers::core::abi::ethabi::ParamType::Uint(256usize), ), - 7usize, + 11usize, ), internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[7]"), + ::std::borrow::ToOwned::to_owned("uint256[11]"), ), }, ::ethers::core::abi::ethabi::Param { @@ -234,12 +234,12 @@ pub mod plonk_verifier { pub static PLONKVERIFIER_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = ::ethers::contract::Lazy::new(__abi); #[rustfmt::skip] - const __BYTECODE: &[u8] = b"a\"\xA4a\x005`\x0B\x82\x82\x829\x80Q_\x1A`s\x14a\0)WcNH{q`\xE0\x1B_R_`\x04R`$_\xFD[0_R`s\x81S\x82\x81\xF3\xFEs\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\x046\x10a\x004W_5`\xE0\x1C\x80c\xCESzw\x14a\08W[_\x80\xFD[a\0Ka\0F6`\x04a 3V[a\0_V[`@Q\x90\x15\x15\x81R` \x01`@Q\x80\x91\x03\x90\xF3[_a\0i\x82a\0\xD0V[a\0y\x83_[` \x02\x01Qa\x02\x0BV[a\0\x84\x83`\x01a\0oV[a\0\x8F\x83`\x02a\0oV[a\0\x9A\x83`\x03a\0oV[a\0\xA5\x83`\x04a\0oV[a\0\xB0\x83`\x05a\0oV[a\0\xBB\x83`\x06a\0oV[a\0\xC6\x84\x84\x84a\x02qV[\x90P[\x93\x92PPPV[\x80Qa\0\xDB\x90a\x04eV[a\0\xE8\x81` \x01Qa\x04eV[a\0\xF5\x81`@\x01Qa\x04eV[a\x01\x02\x81``\x01Qa\x04eV[a\x01\x0F\x81`\x80\x01Qa\x04eV[a\x01\x1C\x81`\xA0\x01Qa\x04eV[a\x01)\x81`\xC0\x01Qa\x04eV[a\x016\x81`\xE0\x01Qa\x04eV[a\x01D\x81a\x01\0\x01Qa\x04eV[a\x01R\x81a\x01 \x01Qa\x04eV[a\x01`\x81a\x01@\x01Qa\x04eV[a\x01n\x81a\x01`\x01Qa\x04eV[a\x01|\x81a\x01\x80\x01Qa\x04eV[a\x01\x8A\x81a\x01\xA0\x01Qa\x02\x0BV[a\x01\x98\x81a\x01\xC0\x01Qa\x02\x0BV[a\x01\xA6\x81a\x01\xE0\x01Qa\x02\x0BV[a\x01\xB4\x81a\x02\0\x01Qa\x02\x0BV[a\x01\xC2\x81a\x02 \x01Qa\x02\x0BV[a\x01\xD0\x81a\x02@\x01Qa\x02\x0BV[a\x01\xDE\x81a\x02`\x01Qa\x02\x0BV[a\x01\xEC\x81a\x02\x80\x01Qa\x02\x0BV[a\x01\xFA\x81a\x02\xA0\x01Qa\x02\x0BV[a\x02\x08\x81a\x02\xC0\x01Qa\x02\x0BV[PV[_\x80Q` a\"x\x839\x81Q\x91R\x81\x10\x80a\x02mW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[PPV[_\x83` \x01Q`\x07\x14a\x02\x97W`@Qc \xFA\x9D\x89`\xE1\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[_a\x02\xA3\x85\x85\x85a\x05\x13V[\x90P_a\x02\xB2\x86_\x01Qa\nsV[\x90P_a\x02\xC4\x82\x84`\xA0\x01Q\x88a\x0EQV[\x90Pa\x02\xE1`@Q\x80`@\x01`@R\x80_\x81R` \x01_\x81RP\x90V[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01Ra\x03\x15\x87a\x01`\x01Qa\x03\x10\x89a\x01\x80\x01Q\x88`\xE0\x01Qa\x0E\xAEV[a\x0FOV[\x91P_\x80a\x03%\x8B\x88\x87\x8Ca\x0F\xF3V[\x91P\x91Pa\x036\x81a\x03\x10\x84a\x12+V[\x92Pa\x03O\x83a\x03\x10\x8Ba\x01`\x01Q\x8A`\xA0\x01Qa\x0E\xAEV[`\xA0\x88\x01Q`@\x88\x01Q` \x01Q\x91\x94P_\x80Q` a\"x\x839\x81Q\x91R\x91\x82\x90\x82\t\x90P\x81`\xE0\x8A\x01Q\x82\t\x90Pa\x03\x92\x85a\x03\x10\x8Da\x01\x80\x01Q\x84a\x0E\xAEV[\x94P_`@Q\x80`\x80\x01`@R\x80\x7F\x01\x18\xC4\xD5\xB87\xBC\xC2\xBC\x89\xB5\xB3\x98\xB5\x97N\x9FYD\x07;2\x07\x8B~#\x1F\xEC\x93\x88\x83\xB0\x81R` \x01\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1\x81R` \x01\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U\x81R` \x01\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4\x81RP\x90Pa\x04S\x87\x82a\x04F\x89a\x12+V[a\x04Na\x12\xC8V[a\x13\x95V[\x9E\x9DPPPPPPPPPPPPPPV[\x80Q` \x82\x01Q_\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x15\x90\x15\x16\x15a\x04\x9EWPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x05\x0EW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7FBn254: invalid G1 point\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x02dV[PPPV[a\x05S`@Q\x80a\x01\0\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81RP\x90V[__\x80Q` a\"x\x839\x81Q\x91R\x90P`@Q` \x81\x01_\x81R`\xFE`\xE0\x1B\x81R\x86Q`\xC0\x1B`\x04\x82\x01R` \x87\x01Q`\xC0\x1B`\x0C\x82\x01Ra\x02\x80\x87\x01Q` \x82\x01Ra\x02\xA0\x87\x01Q`@\x82\x01R`\x01``\x82\x01R\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85\x81R` \x01\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D\x81R` \x01\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD\x81RP\x81RP\x90P\x91\x90PV[\x81b\x10\0\0\x03a\x0C\xFAW`@Q\x80``\x01`@R\x80`\x14\x81R` \x01\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x81R` \x01`@Q\x80`\xE0\x01`@R\x80`\x01\x81R` \x01\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW\x81R` \x01\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD\x81R` \x01\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B\x81R` \x01\x7F\x19\xDD\xBC\xAF:\x8DF\xC1\\\x01v\xFB\xB5\xB9^M\xC5p\x88\xFF\x13\xF4\xD1\xBD\x84\xC6\xBF\xA5}\xCD\xC0\xE0\x81R` \x01\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18\x81R` \x01\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\\x81RP\x81RP\x90P\x91\x90PV[\x81` \x03a\x0E8W`@Q\x80``\x01`@R\x80`\x05\x81R` \x01\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x81R` \x01`@Q\x80`\xE0\x01`@R\x80`\x01\x81R` \x01\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0\x81R` \x01\x7F!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B\x81R` \x01\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;\x81R` \x01\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80\x81R` \x01\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE\x81R` \x01\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C\x81RP\x81RP\x90P\x91\x90PV[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0Er`@Q\x80``\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81RP\x90V[a\x0E|\x84\x84a\x14uV[\x80\x82Ra\x0E\x8C\x90\x85\x90\x85\x90a\x14\xC6V[` \x82\x01R\x80Qa\x0E\xA2\x90\x85\x90\x84\x90\x86\x90a\x155V[`@\x82\x01R\x93\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01Ra\x0E\xC9a\x1D2V[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R_``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80a\x0E\xF9W_\x80\xFD[P\x80a\x0FGW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x19`$\x82\x01R\x7FBn254: scalar mul failed!\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x02dV[PP\x92\x91PPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01Ra\x0Fja\x1DPV[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R_\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80a\x0F\xA5W_\x80\xFD[P\x80a\x0FGW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\x02dV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R_a\x10&\x87\x87\x87\x87a\x16\x83V[\x90P_\x80Q` a\"x\x839\x81Q\x91R_a\x10B\x88\x87\x89a\x1BMV[\x90Pa\x10N\x81\x83a\"%V[`\xC0\x89\x01Qa\x01\xA0\x88\x01Q\x91\x92P\x90\x81\x90\x84\x90\x81\x90\x83\t\x84\x08\x92Pa\x10z\x85a\x03\x10\x8A_\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xC0\x8A\x01Q\x83\t\x84\x08\x92Pa\x10\xA2\x86a\x03\x10\x8A` \x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xE0\x8A\x01Q\x83\t\x84\x08\x92Pa\x10\xCA\x86a\x03\x10\x8A`@\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\0\x8A\x01Q\x83\t\x84\x08\x92Pa\x10\xF2\x86a\x03\x10\x8A``\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02 \x8A\x01Q\x83\t\x84\x08\x92Pa\x11\x1A\x86a\x03\x10\x8A`\x80\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02@\x8A\x01Q\x83\t\x84\x08\x92Pa\x11B\x86a\x03\x10\x8D`@\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02`\x8A\x01Q\x83\t\x84\x08\x92Pa\x11j\x86a\x03\x10\x8D``\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\x80\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\x92\x86a\x03\x10\x8D`\x80\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\xA0\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\xBA\x86a\x03\x10\x8D`\xA0\x01Q\x84a\x0E\xAEV[\x95P_\x8A`\xE0\x01Q\x90P\x84\x85a\x02\xC0\x8B\x01Q\x83\t\x85\x08\x93Pa\x11\xE4\x87a\x03\x10\x8B`\xA0\x01Q\x84a\x0E\xAEV[\x96Pa\x12\x1Aa\x12\x14`@\x80Q\x80\x82\x01\x82R_\x80\x82R` \x91\x82\x01R\x81Q\x80\x83\x01\x90\x92R`\x01\x82R`\x02\x90\x82\x01R\x90V[\x85a\x0E\xAEV[\x97PPPPPPP\x94P\x94\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a\x12RWP\x90V[`@Q\x80`@\x01`@R\x80\x83_\x01Q\x81R` \x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x84` \x01Qa\x12\x96\x91\x90a\"XV[a\x12\xC0\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDGa\"%V[\x90R\x92\x91PPV[a\x12\xEF`@Q\x80`\x80\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[_\x80_`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` _a\x01\x80\x83`\x08Z\xFA\x91PP_Q\x91P\x80a\x14gW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R\x7FBn254: Pairing check failed!\0\0\0\0`D\x82\x01R`d\x01a\x02dV[P\x15\x15\x90P[\x94\x93PPPPV[\x81Q_\x90_\x80Q` a\"x\x839\x81Q\x91R\x90\x83\x80\x15a\x14\xB6W\x84\x93P_[\x82\x81\x10\x15a\x14\xAAW\x83\x85\x86\t\x94P`\x01\x01a\x14\x94V[P`\x01\x84\x03\x93Pa\x14\xBDV[`\x01\x83\x03\x93P[PPP\x92\x91PPV[_\x82`\x01\x03a\x14\xD7WP`\x01a\0\xC9V[\x81_\x03a\x14\xE5WP_a\0\xC9V[` \x84\x01Q_\x80Q` a\"x\x839\x81Q\x91R\x90_\x90\x82\x81\x86\t\x90P\x85\x80\x15a\x15\x13W`\x01\x87\x03\x92Pa\x15\x1AV[`\x01\x84\x03\x92P[Pa\x15$\x82a\x1C8V[\x91P\x82\x82\x82\t\x97\x96PPPPPPPV[__\x80Q` a\"x\x839\x81Q\x91R\x82\x82\x03a\x15\xAEW`\x01_[`\x07\x81\x10\x15a\x15\xA3W\x81\x86\x03a\x15\x80W\x86\x81`\x07\x81\x10a\x15qWa\x15qa\"\x11V[` \x02\x01Q\x93PPPPa\x14mV[\x82\x80a\x15\x8EWa\x15\x8Ea\"DV[`@\x89\x01Q` \x01Q\x83\t\x91P`\x01\x01a\x15OV[P_\x92PPPa\x14mV[a\x15\xB6a\x1DnV[`@\x87\x01Q`\x01`\xC0\x83\x81\x01\x82\x81R\x92\x01\x90\x80[`\x07\x81\x10\x15a\x15\xF7W` \x84\x03\x93P\x85\x86\x8A\x85Q\x89\x03\x08\x83\t\x80\x85R`\x1F\x19\x90\x93\x01\x92\x91P`\x01\x01a\x15\xCAV[PPPP_\x80_\x90P`\x01\x83\x89`@\x8C\x01Q_[`\x07\x81\x10\x15a\x16KW\x88\x82Q\x8A\x85Q\x8C\x88Q\x8A\t\t\t\x89\x81\x88\x08\x96PP\x88\x89\x8D\x84Q\x8C\x03\x08\x86\t\x94P` \x93\x84\x01\x93\x92\x83\x01\x92\x91\x90\x91\x01\x90`\x01\x01a\x16\x0BV[PPPP\x80\x92PP_a\x16]\x83a\x1C8V[\x90P` \x8A\x01Q\x85\x81\x89\t\x96PP\x84\x81\x87\t\x95P\x84\x82\x87\t\x9A\x99PPPPPPPPPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R_\x80_\x80__\x80Q` a\"x\x839\x81Q\x91R\x90P`\x80\x89\x01Q\x81` \x8A\x01Q` \x8C\x01Q\t\x95P\x89Q\x94P\x81`\xA0\x8B\x01Q``\x8C\x01Q\t\x93P\x81a\x01\xA0\x89\x01Q\x85\x08\x92P\x81\x81\x84\x08\x92P\x81\x85\x84\t\x94P\x81\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85\x81R` \x01\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D\x81R` \x01\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD\x81R` \x01\x7F\x15\xEE$u\xBE\xE5\x17\xC4\xEE\x05\xE5\x1F\xA1\xEEs\x12\xA87:\x0B\x13\xDB\x8CQ\xBA\xF0L\xB2\xE9\x9B\xD2\xBD\x81R` \x01~o\xABI\xB8i\xAEb\0\x1D\xEA\xC8x\xB2f{\xD3\x1B\xF3\xE2\x8E:-vJ\xA4\x9B\x8D\x9B\xBD\xD3\x10\x81R` \x01\x7F.\x85k\xF6\xD07p\x8F\xFAL\x06\xD4\xD8\x82\x0FE\xCC\xAD\xCE\x9CZm\x17\x8C\xBDW?\x82\xE0\xF9p\x11\x81R` \x01\x7F\x14\x07\xEE\xE3Y\x93\xF2\xB1\xAD^\xC6\xD9\xB8\x95\x0C\xA3\xAF3\x13]\x06\x03\x7F\x87\x1C^3\xBFVm\xD7\xB4\x81RP\x81RP\x90P\x91\x90PV[\x81b\x10\0\0\x03a\x0E\x86W`@Q\x80``\x01`@R\x80`\x14\x81R` \x01\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x81R` \x01`@Q\x80a\x01`\x01`@R\x80`\x01\x81R` \x01\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW\x81R` \x01\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD\x81R` \x01\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B\x81R` \x01\x7F\x19\xDD\xBC\xAF:\x8DF\xC1\\\x01v\xFB\xB5\xB9^M\xC5p\x88\xFF\x13\xF4\xD1\xBD\x84\xC6\xBF\xA5}\xCD\xC0\xE0\x81R` \x01\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18\x81R` \x01\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\\x81R` \x01\x7F)\xE8AC\xF5\x87\rGv\xA9-\xF8\xDA\x8Cl\x93\x03\xD5\x90\x88\xF3{\xA8_@\xCFo\xD1Be\xB4\xBC\x81R` \x01\x7F\x1B\xF8-\xEB\xA7\xD7I\x02\xC3p\x8C\xC6\xE7\x0Ea\xF3\x05\x12\xEC\xA9VU!\x0E'nXX\xCE\x8FX\xE5\x81R` \x01\x7F\"\xB9K.+\0C\xD0Nf-^\xC0\x18\xEA\x1C\x8A\x99\xA2:b\xC9\xEBF\xF01\x8Fj\x19I\x85\xF0\x81R` \x01\x7F)\x96\x9D\x8DSc\xBE\xF1\x10\x1Ah\xE4F\xA1N\x1D\xA7\xBA\x92\x94\xE1B\xA1F\xA9\x80\xFD\xDBMMA\xA5\x81RP\x81RP\x90P\x91\x90PV[\x81` \x03a\x10\\W`@Q\x80``\x01`@R\x80`\x05\x81R` \x01\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x81R` \x01`@Q\x80a\x01`\x01`@R\x80`\x01\x81R` \x01\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0\x81R` \x01\x7F!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B\x81R` \x01\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;\x81R` \x01\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80\x81R` \x01\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE\x81R` \x01\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C\x81R` \x01~\xE1Kcd\xA4~\x9CB\x84\xA9\xF8\n_\xC4\x1C\xD2\x12\xB0\xD4\xDB\xF8\xA5p7p\xA4\n\x9A49\x90\x81R` \x01\x7F0dNr\xE11\xA0)\x04\x8Bn\x19?\xD8A\x04\\\xEA$\xF6\xFDsk\xEC#\x12\x04p\x8Fp66\x81R` \x01\x7F\"9\x9C4\x13\x9B\xFF\xAD\xA8\xDE\x04j\xACP\xC9b\x8E5\x17\xA3\xA4RySd\xE7w\xCDe\xBB\x9FH\x81R` \x01\x7F\"\x90\xEE1\xC4\x82\xCF\x92\xB7\x9B\x19D\xDB\x1C\x01Gc^\x90\x04\xDB\x8C;\x9D\x13dK\xEF1\xEC;\xD3\x81RP\x81RP\x90P\x91\x90PV[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x10\x96`@Q\x80``\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81RP\x90V[a\x10\xA0\x84\x84a\x16\x99V[\x80\x82Ra\x10\xB0\x90\x85\x90\x85\x90a\x16\xEAV[` \x82\x01R\x80Qa\x10\xC6\x90\x85\x90\x84\x90\x86\x90a\x17YV[`@\x82\x01R\x93\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01Ra\x10\xEDa\x1FWV[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R_``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80a\x11\x1DW_\x80\xFD[P\x80a\x11kW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x19`$\x82\x01R\x7FBn254: scalar mul failed!\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x02\x90V[PP\x92\x91PPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01Ra\x11\x8Ea\x1FuV[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R_\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80a\x11\xC9W_\x80\xFD[P\x80a\x11kW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\x02\x90V[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R_a\x12J\x87\x87\x87\x87a\x18\xA8V[\x90P_\x80Q` a$\x9E\x839\x81Q\x91R_a\x12f\x88\x87\x89a\x1DrV[\x90Pa\x12r\x81\x83a$KV[`\xC0\x89\x01Qa\x01\xA0\x88\x01Q\x91\x92P\x90\x81\x90\x84\x90\x81\x90\x83\t\x84\x08\x92Pa\x12\x9E\x85a\x03<\x8A_\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xC0\x8A\x01Q\x83\t\x84\x08\x92Pa\x12\xC6\x86a\x03<\x8A` \x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xE0\x8A\x01Q\x83\t\x84\x08\x92Pa\x12\xEE\x86a\x03<\x8A`@\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\0\x8A\x01Q\x83\t\x84\x08\x92Pa\x13\x16\x86a\x03<\x8A``\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02 \x8A\x01Q\x83\t\x84\x08\x92Pa\x13>\x86a\x03<\x8A`\x80\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02@\x8A\x01Q\x83\t\x84\x08\x92Pa\x13f\x86a\x03<\x8D`@\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02`\x8A\x01Q\x83\t\x84\x08\x92Pa\x13\x8E\x86a\x03<\x8D``\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\x80\x8A\x01Q\x83\t\x84\x08\x92Pa\x13\xB6\x86a\x03<\x8D`\x80\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\xA0\x8A\x01Q\x83\t\x84\x08\x92Pa\x13\xDE\x86a\x03<\x8D`\xA0\x01Q\x84a\x10\xD2V[\x95P_\x8A`\xE0\x01Q\x90P\x84\x85a\x02\xC0\x8B\x01Q\x83\t\x85\x08\x93Pa\x14\x08\x87a\x03<\x8B`\xA0\x01Q\x84a\x10\xD2V[\x96Pa\x14>a\x148`@\x80Q\x80\x82\x01\x82R_\x80\x82R` \x91\x82\x01R\x81Q\x80\x83\x01\x90\x92R`\x01\x82R`\x02\x90\x82\x01R\x90V[\x85a\x10\xD2V[\x97PPPPPPP\x94P\x94\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a\x14vWP\x90V[`@Q\x80`@\x01`@R\x80\x83_\x01Q\x81R` \x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x84` \x01Qa\x14\xBA\x91\x90a$~V[a\x14\xE4\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDGa$KV[\x90R\x92\x91PPV[a\x15\x13`@Q\x80`\x80\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[_\x80_`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` _a\x01\x80\x83`\x08Z\xFA\x91PP_Q\x91P\x80a\x16\x8BW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R\x7FBn254: Pairing check failed!\0\0\0\0`D\x82\x01R`d\x01a\x02\x90V[P\x15\x15\x90P[\x94\x93PPPPV[\x81Q_\x90_\x80Q` a$\x9E\x839\x81Q\x91R\x90\x83\x80\x15a\x16\xDAW\x84\x93P_[\x82\x81\x10\x15a\x16\xCEW\x83\x85\x86\t\x94P`\x01\x01a\x16\xB8V[P`\x01\x84\x03\x93Pa\x16\xE1V[`\x01\x83\x03\x93P[PPP\x92\x91PPV[_\x82`\x01\x03a\x16\xFBWP`\x01a\0\xF5V[\x81_\x03a\x17\tWP_a\0\xF5V[` \x84\x01Q_\x80Q` a$\x9E\x839\x81Q\x91R\x90_\x90\x82\x81\x86\t\x90P\x85\x80\x15a\x177W`\x01\x87\x03\x92Pa\x17>V[`\x01\x84\x03\x92P[Pa\x17H\x82a\x1E]V[\x91P\x82\x82\x82\t\x97\x96PPPPPPPV[__\x80Q` a$\x9E\x839\x81Q\x91R\x82\x82\x03a\x17\xD2W`\x01_[`\x0B\x81\x10\x15a\x17\xC7W\x81\x86\x03a\x17\xA4W\x86\x81`\x0B\x81\x10a\x17\x95Wa\x17\x95a$7V[` \x02\x01Q\x93PPPPa\x16\x91V[\x82\x80a\x17\xB2Wa\x17\xB2a$jV[`@\x89\x01Q` \x01Q\x83\t\x91P`\x01\x01a\x17sV[P_\x92PPPa\x16\x91V[a\x17\xDAa\x1F\x93V[`@\x87\x01Q`\x01a\x01@\x83\x81\x01\x82\x81R\x92\x01\x90\x80[`\x0B\x81\x10\x15a\x18\x1CW` \x84\x03\x93P\x85\x86\x8A\x85Q\x89\x03\x08\x83\t\x80\x85R`\x1F\x19\x90\x93\x01\x92\x91P`\x01\x01a\x17\xEFV[PPPP_\x80_\x90P`\x01\x83\x89`@\x8C\x01Q_[`\x0B\x81\x10\x15a\x18pW\x88\x82Q\x8A\x85Q\x8C\x88Q\x8A\t\t\t\x89\x81\x88\x08\x96PP\x88\x89\x8D\x84Q\x8C\x03\x08\x86\t\x94P` \x93\x84\x01\x93\x92\x83\x01\x92\x91\x90\x91\x01\x90`\x01\x01a\x180V[PPPP\x80\x92PP_a\x18\x82\x83a\x1E]V[\x90P` \x8A\x01Q\x85\x81\x89\t\x96PP\x84\x81\x87\t\x95P\x84\x82\x87\t\x9A\x99PPPPPPPPPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R_\x80_\x80__\x80Q` a$\x9E\x839\x81Q\x91R\x90P`\x80\x89\x01Q\x81` \x8A\x01Q` \x8C\x01Q\t\x95P\x89Q\x94P\x81`\xA0\x8B\x01Q``\x8C\x01Q\t\x93P\x81a\x01\xA0\x89\x01Q\x85\x08\x92P\x81\x81\x84\x08\x92P\x81\x85\x84\t\x94P\x81\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85\x81R` \x01\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D\x81R` \x01\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD\x81RP\x81RP\x90P\x91\x90PV[\x81b\x10\0\0\x03a\x0C\xFAW`@Q\x80``\x01`@R\x80`\x14\x81R` \x01\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x81R` \x01`@Q\x80`\xE0\x01`@R\x80`\x01\x81R` \x01\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW\x81R` \x01\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD\x81R` \x01\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B\x81R` \x01\x7F\x19\xDD\xBC\xAF:\x8DF\xC1\\\x01v\xFB\xB5\xB9^M\xC5p\x88\xFF\x13\xF4\xD1\xBD\x84\xC6\xBF\xA5}\xCD\xC0\xE0\x81R` \x01\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18\x81R` \x01\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\\x81RP\x81RP\x90P\x91\x90PV[\x81` \x03a\x0E8W`@Q\x80``\x01`@R\x80`\x05\x81R` \x01\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x81R` \x01`@Q\x80`\xE0\x01`@R\x80`\x01\x81R` \x01\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0\x81R` \x01\x7F!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B\x81R` \x01\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;\x81R` \x01\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80\x81R` \x01\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE\x81R` \x01\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C\x81RP\x81RP\x90P\x91\x90PV[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x0Er`@Q\x80``\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81RP\x90V[a\x0E|\x84\x84a\x14uV[\x80\x82Ra\x0E\x8C\x90\x85\x90\x85\x90a\x14\xC6V[` \x82\x01R\x80Qa\x0E\xA2\x90\x85\x90\x84\x90\x86\x90a\x155V[`@\x82\x01R\x93\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01Ra\x0E\xC9a\x1D2V[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R_``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80a\x0E\xF9W_\x80\xFD[P\x80a\x0FGW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x19`$\x82\x01R\x7FBn254: scalar mul failed!\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x02dV[PP\x92\x91PPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01Ra\x0Fja\x1DPV[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R_\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80a\x0F\xA5W_\x80\xFD[P\x80a\x0FGW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\x02dV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R_a\x10&\x87\x87\x87\x87a\x16\x83V[\x90P_\x80Q` a\"x\x839\x81Q\x91R_a\x10B\x88\x87\x89a\x1BMV[\x90Pa\x10N\x81\x83a\"%V[`\xC0\x89\x01Qa\x01\xA0\x88\x01Q\x91\x92P\x90\x81\x90\x84\x90\x81\x90\x83\t\x84\x08\x92Pa\x10z\x85a\x03\x10\x8A_\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xC0\x8A\x01Q\x83\t\x84\x08\x92Pa\x10\xA2\x86a\x03\x10\x8A` \x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xE0\x8A\x01Q\x83\t\x84\x08\x92Pa\x10\xCA\x86a\x03\x10\x8A`@\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\0\x8A\x01Q\x83\t\x84\x08\x92Pa\x10\xF2\x86a\x03\x10\x8A``\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02 \x8A\x01Q\x83\t\x84\x08\x92Pa\x11\x1A\x86a\x03\x10\x8A`\x80\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02@\x8A\x01Q\x83\t\x84\x08\x92Pa\x11B\x86a\x03\x10\x8D`@\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02`\x8A\x01Q\x83\t\x84\x08\x92Pa\x11j\x86a\x03\x10\x8D``\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\x80\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\x92\x86a\x03\x10\x8D`\x80\x01Q\x84a\x0E\xAEV[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\xA0\x8A\x01Q\x83\t\x84\x08\x92Pa\x11\xBA\x86a\x03\x10\x8D`\xA0\x01Q\x84a\x0E\xAEV[\x95P_\x8A`\xE0\x01Q\x90P\x84\x85a\x02\xC0\x8B\x01Q\x83\t\x85\x08\x93Pa\x11\xE4\x87a\x03\x10\x8B`\xA0\x01Q\x84a\x0E\xAEV[\x96Pa\x12\x1Aa\x12\x14`@\x80Q\x80\x82\x01\x82R_\x80\x82R` \x91\x82\x01R\x81Q\x80\x83\x01\x90\x92R`\x01\x82R`\x02\x90\x82\x01R\x90V[\x85a\x0E\xAEV[\x97PPPPPPP\x94P\x94\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a\x12RWP\x90V[`@Q\x80`@\x01`@R\x80\x83_\x01Q\x81R` \x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x84` \x01Qa\x12\x96\x91\x90a\"XV[a\x12\xC0\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDGa\"%V[\x90R\x92\x91PPV[a\x12\xEF`@Q\x80`\x80\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[_\x80_`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` _a\x01\x80\x83`\x08Z\xFA\x91PP_Q\x91P\x80a\x14gW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R\x7FBn254: Pairing check failed!\0\0\0\0`D\x82\x01R`d\x01a\x02dV[P\x15\x15\x90P[\x94\x93PPPPV[\x81Q_\x90_\x80Q` a\"x\x839\x81Q\x91R\x90\x83\x80\x15a\x14\xB6W\x84\x93P_[\x82\x81\x10\x15a\x14\xAAW\x83\x85\x86\t\x94P`\x01\x01a\x14\x94V[P`\x01\x84\x03\x93Pa\x14\xBDV[`\x01\x83\x03\x93P[PPP\x92\x91PPV[_\x82`\x01\x03a\x14\xD7WP`\x01a\0\xC9V[\x81_\x03a\x14\xE5WP_a\0\xC9V[` \x84\x01Q_\x80Q` a\"x\x839\x81Q\x91R\x90_\x90\x82\x81\x86\t\x90P\x85\x80\x15a\x15\x13W`\x01\x87\x03\x92Pa\x15\x1AV[`\x01\x84\x03\x92P[Pa\x15$\x82a\x1C8V[\x91P\x82\x82\x82\t\x97\x96PPPPPPPV[__\x80Q` a\"x\x839\x81Q\x91R\x82\x82\x03a\x15\xAEW`\x01_[`\x07\x81\x10\x15a\x15\xA3W\x81\x86\x03a\x15\x80W\x86\x81`\x07\x81\x10a\x15qWa\x15qa\"\x11V[` \x02\x01Q\x93PPPPa\x14mV[\x82\x80a\x15\x8EWa\x15\x8Ea\"DV[`@\x89\x01Q` \x01Q\x83\t\x91P`\x01\x01a\x15OV[P_\x92PPPa\x14mV[a\x15\xB6a\x1DnV[`@\x87\x01Q`\x01`\xC0\x83\x81\x01\x82\x81R\x92\x01\x90\x80[`\x07\x81\x10\x15a\x15\xF7W` \x84\x03\x93P\x85\x86\x8A\x85Q\x89\x03\x08\x83\t\x80\x85R`\x1F\x19\x90\x93\x01\x92\x91P`\x01\x01a\x15\xCAV[PPPP_\x80_\x90P`\x01\x83\x89`@\x8C\x01Q_[`\x07\x81\x10\x15a\x16KW\x88\x82Q\x8A\x85Q\x8C\x88Q\x8A\t\t\t\x89\x81\x88\x08\x96PP\x88\x89\x8D\x84Q\x8C\x03\x08\x86\t\x94P` \x93\x84\x01\x93\x92\x83\x01\x92\x91\x90\x91\x01\x90`\x01\x01a\x16\x0BV[PPPP\x80\x92PP_a\x16]\x83a\x1C8V[\x90P` \x8A\x01Q\x85\x81\x89\t\x96PP\x84\x81\x87\t\x95P\x84\x82\x87\t\x9A\x99PPPPPPPPPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R_\x80_\x80__\x80Q` a\"x\x839\x81Q\x91R\x90P`\x80\x89\x01Q\x81` \x8A\x01Q` \x8C\x01Q\t\x95P\x89Q\x94P\x81`\xA0\x8B\x01Q``\x8C\x01Q\t\x93P\x81a\x01\xA0\x89\x01Q\x85\x08\x92P\x81\x81\x84\x08\x92P\x81\x85\x84\t\x94P\x81\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85\x81R` \x01\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D\x81R` \x01\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD\x81R` \x01\x7F\x15\xEE$u\xBE\xE5\x17\xC4\xEE\x05\xE5\x1F\xA1\xEEs\x12\xA87:\x0B\x13\xDB\x8CQ\xBA\xF0L\xB2\xE9\x9B\xD2\xBD\x81R` \x01~o\xABI\xB8i\xAEb\0\x1D\xEA\xC8x\xB2f{\xD3\x1B\xF3\xE2\x8E:-vJ\xA4\x9B\x8D\x9B\xBD\xD3\x10\x81R` \x01\x7F.\x85k\xF6\xD07p\x8F\xFAL\x06\xD4\xD8\x82\x0FE\xCC\xAD\xCE\x9CZm\x17\x8C\xBDW?\x82\xE0\xF9p\x11\x81R` \x01\x7F\x14\x07\xEE\xE3Y\x93\xF2\xB1\xAD^\xC6\xD9\xB8\x95\x0C\xA3\xAF3\x13]\x06\x03\x7F\x87\x1C^3\xBFVm\xD7\xB4\x81RP\x81RP\x90P\x91\x90PV[\x81b\x10\0\0\x03a\x0E\x86W`@Q\x80``\x01`@R\x80`\x14\x81R` \x01\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x81R` \x01`@Q\x80a\x01`\x01`@R\x80`\x01\x81R` \x01\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW\x81R` \x01\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD\x81R` \x01\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B\x81R` \x01\x7F\x19\xDD\xBC\xAF:\x8DF\xC1\\\x01v\xFB\xB5\xB9^M\xC5p\x88\xFF\x13\xF4\xD1\xBD\x84\xC6\xBF\xA5}\xCD\xC0\xE0\x81R` \x01\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18\x81R` \x01\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\\x81R` \x01\x7F)\xE8AC\xF5\x87\rGv\xA9-\xF8\xDA\x8Cl\x93\x03\xD5\x90\x88\xF3{\xA8_@\xCFo\xD1Be\xB4\xBC\x81R` \x01\x7F\x1B\xF8-\xEB\xA7\xD7I\x02\xC3p\x8C\xC6\xE7\x0Ea\xF3\x05\x12\xEC\xA9VU!\x0E'nXX\xCE\x8FX\xE5\x81R` \x01\x7F\"\xB9K.+\0C\xD0Nf-^\xC0\x18\xEA\x1C\x8A\x99\xA2:b\xC9\xEBF\xF01\x8Fj\x19I\x85\xF0\x81R` \x01\x7F)\x96\x9D\x8DSc\xBE\xF1\x10\x1Ah\xE4F\xA1N\x1D\xA7\xBA\x92\x94\xE1B\xA1F\xA9\x80\xFD\xDBMMA\xA5\x81RP\x81RP\x90P\x91\x90PV[\x81` \x03a\x10\\W`@Q\x80``\x01`@R\x80`\x05\x81R` \x01\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x81R` \x01`@Q\x80a\x01`\x01`@R\x80`\x01\x81R` \x01\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0\x81R` \x01\x7F!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B\x81R` \x01\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;\x81R` \x01\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80\x81R` \x01\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE\x81R` \x01\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C\x81R` \x01~\xE1Kcd\xA4~\x9CB\x84\xA9\xF8\n_\xC4\x1C\xD2\x12\xB0\xD4\xDB\xF8\xA5p7p\xA4\n\x9A49\x90\x81R` \x01\x7F0dNr\xE11\xA0)\x04\x8Bn\x19?\xD8A\x04\\\xEA$\xF6\xFDsk\xEC#\x12\x04p\x8Fp66\x81R` \x01\x7F\"9\x9C4\x13\x9B\xFF\xAD\xA8\xDE\x04j\xACP\xC9b\x8E5\x17\xA3\xA4RySd\xE7w\xCDe\xBB\x9FH\x81R` \x01\x7F\"\x90\xEE1\xC4\x82\xCF\x92\xB7\x9B\x19D\xDB\x1C\x01Gc^\x90\x04\xDB\x8C;\x9D\x13dK\xEF1\xEC;\xD3\x81RP\x81RP\x90P\x91\x90PV[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x10\x96`@Q\x80``\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81RP\x90V[a\x10\xA0\x84\x84a\x16\x99V[\x80\x82Ra\x10\xB0\x90\x85\x90\x85\x90a\x16\xEAV[` \x82\x01R\x80Qa\x10\xC6\x90\x85\x90\x84\x90\x86\x90a\x17YV[`@\x82\x01R\x93\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01Ra\x10\xEDa\x1FWV[\x83Q\x81R` \x80\x85\x01Q\x90\x82\x01R`@\x81\x01\x83\x90R_``\x83`\x80\x84`\x07a\x07\xD0Z\x03\xFA\x90P\x80\x80a\x11\x1DW_\x80\xFD[P\x80a\x11kW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x19`$\x82\x01R\x7FBn254: scalar mul failed!\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x02\x90V[PP\x92\x91PPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01Ra\x11\x8Ea\x1FuV[\x83Q\x81R` \x80\x85\x01Q\x81\x83\x01R\x83Q`@\x83\x01R\x83\x01Q``\x80\x83\x01\x91\x90\x91R_\x90\x83`\xC0\x84`\x06a\x07\xD0Z\x03\xFA\x90P\x80\x80a\x11\xC9W_\x80\xFD[P\x80a\x11kW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: group addition failed!\0\0\0`D\x82\x01R`d\x01a\x02\x90V[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R_a\x12J\x87\x87\x87\x87a\x18\xA8V[\x90P_\x80Q` a$\x9E\x839\x81Q\x91R_a\x12f\x88\x87\x89a\x1DrV[\x90Pa\x12r\x81\x83a$KV[`\xC0\x89\x01Qa\x01\xA0\x88\x01Q\x91\x92P\x90\x81\x90\x84\x90\x81\x90\x83\t\x84\x08\x92Pa\x12\x9E\x85a\x03<\x8A_\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xC0\x8A\x01Q\x83\t\x84\x08\x92Pa\x12\xC6\x86a\x03<\x8A` \x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x01\xE0\x8A\x01Q\x83\t\x84\x08\x92Pa\x12\xEE\x86a\x03<\x8A`@\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\0\x8A\x01Q\x83\t\x84\x08\x92Pa\x13\x16\x86a\x03<\x8A``\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02 \x8A\x01Q\x83\t\x84\x08\x92Pa\x13>\x86a\x03<\x8A`\x80\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02@\x8A\x01Q\x83\t\x84\x08\x92Pa\x13f\x86a\x03<\x8D`@\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02`\x8A\x01Q\x83\t\x84\x08\x92Pa\x13\x8E\x86a\x03<\x8D``\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\x80\x8A\x01Q\x83\t\x84\x08\x92Pa\x13\xB6\x86a\x03<\x8D`\x80\x01Q\x84a\x10\xD2V[\x95P\x83\x82\x82\t\x90P\x83\x84a\x02\xA0\x8A\x01Q\x83\t\x84\x08\x92Pa\x13\xDE\x86a\x03<\x8D`\xA0\x01Q\x84a\x10\xD2V[\x95P_\x8A`\xE0\x01Q\x90P\x84\x85a\x02\xC0\x8B\x01Q\x83\t\x85\x08\x93Pa\x14\x08\x87a\x03<\x8B`\xA0\x01Q\x84a\x10\xD2V[\x96Pa\x14>a\x148`@\x80Q\x80\x82\x01\x82R_\x80\x82R` \x91\x82\x01R\x81Q\x80\x83\x01\x90\x92R`\x01\x82R`\x02\x90\x82\x01R\x90V[\x85a\x10\xD2V[\x97PPPPPPP\x94P\x94\x92PPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R\x81Q` \x83\x01Q\x15\x90\x15\x16\x15a\x14vWP\x90V[`@Q\x80`@\x01`@R\x80\x83_\x01Q\x81R` \x01\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x84` \x01Qa\x14\xBA\x91\x90a$~V[a\x14\xE4\x90\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDGa$KV[\x90R\x92\x91PPV[a\x15\x13`@Q\x80`\x80\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81RP\x90V[`@Q\x80`\x80\x01`@R\x80\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xED\x81R` \x01\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2\x81R` \x01\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAA\x81R` \x01\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[\x81RP\x90P\x90V[_\x80_`@Q\x87Q\x81R` \x88\x01Q` \x82\x01R` \x87\x01Q`@\x82\x01R\x86Q``\x82\x01R``\x87\x01Q`\x80\x82\x01R`@\x87\x01Q`\xA0\x82\x01R\x85Q`\xC0\x82\x01R` \x86\x01Q`\xE0\x82\x01R` \x85\x01Qa\x01\0\x82\x01R\x84Qa\x01 \x82\x01R``\x85\x01Qa\x01@\x82\x01R`@\x85\x01Qa\x01`\x82\x01R` _a\x01\x80\x83`\x08Z\xFA\x91PP_Q\x91P\x80a\x16\x8BW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1C`$\x82\x01R\x7FBn254: Pairing check failed!\0\0\0\0`D\x82\x01R`d\x01a\x02\x90V[P\x15\x15\x90P[\x94\x93PPPPV[\x81Q_\x90_\x80Q` a$\x9E\x839\x81Q\x91R\x90\x83\x80\x15a\x16\xDAW\x84\x93P_[\x82\x81\x10\x15a\x16\xCEW\x83\x85\x86\t\x94P`\x01\x01a\x16\xB8V[P`\x01\x84\x03\x93Pa\x16\xE1V[`\x01\x83\x03\x93P[PPP\x92\x91PPV[_\x82`\x01\x03a\x16\xFBWP`\x01a\0\xF5V[\x81_\x03a\x17\tWP_a\0\xF5V[` \x84\x01Q_\x80Q` a$\x9E\x839\x81Q\x91R\x90_\x90\x82\x81\x86\t\x90P\x85\x80\x15a\x177W`\x01\x87\x03\x92Pa\x17>V[`\x01\x84\x03\x92P[Pa\x17H\x82a\x1E]V[\x91P\x82\x82\x82\t\x97\x96PPPPPPPV[__\x80Q` a$\x9E\x839\x81Q\x91R\x82\x82\x03a\x17\xD2W`\x01_[`\x0B\x81\x10\x15a\x17\xC7W\x81\x86\x03a\x17\xA4W\x86\x81`\x0B\x81\x10a\x17\x95Wa\x17\x95a$7V[` \x02\x01Q\x93PPPPa\x16\x91V[\x82\x80a\x17\xB2Wa\x17\xB2a$jV[`@\x89\x01Q` \x01Q\x83\t\x91P`\x01\x01a\x17sV[P_\x92PPPa\x16\x91V[a\x17\xDAa\x1F\x93V[`@\x87\x01Q`\x01a\x01@\x83\x81\x01\x82\x81R\x92\x01\x90\x80[`\x0B\x81\x10\x15a\x18\x1CW` \x84\x03\x93P\x85\x86\x8A\x85Q\x89\x03\x08\x83\t\x80\x85R`\x1F\x19\x90\x93\x01\x92\x91P`\x01\x01a\x17\xEFV[PPPP_\x80_\x90P`\x01\x83\x89`@\x8C\x01Q_[`\x0B\x81\x10\x15a\x18pW\x88\x82Q\x8A\x85Q\x8C\x88Q\x8A\t\t\t\x89\x81\x88\x08\x96PP\x88\x89\x8D\x84Q\x8C\x03\x08\x86\t\x94P` \x93\x84\x01\x93\x92\x83\x01\x92\x91\x90\x91\x01\x90`\x01\x01a\x180V[PPPP\x80\x92PP_a\x18\x82\x83a\x1E]V[\x90P` \x8A\x01Q\x85\x81\x89\t\x96PP\x84\x81\x87\t\x95P\x84\x82\x87\t\x9A\x99PPPPPPPPPPV[`@\x80Q\x80\x82\x01\x90\x91R_\x80\x82R` \x82\x01R_\x80_\x80__\x80Q` a$\x9E\x839\x81Q\x91R\x90P`\x80\x89\x01Q\x81` \x8A\x01Q` \x8C\x01Q\t\x95P\x89Q\x94P\x81`\xA0\x8B\x01Q``\x8C\x01Q\t\x93P\x81a\x01\xA0\x89\x01Q\x85\x08\x92P\x81\x81\x84\x08\x92P\x81\x85\x84\t\x94P\x81\x7F/\x8D\xD1\xF1\xA7X ::ethers::contract::builders::ContractCall { self.0 - .method_hash([119, 174, 63, 7], (verifying_key, public_input, proof)) + .method_hash([171, 149, 158, 227], (verifying_key, public_input, proof)) .expect("method not found (this should never happen)") } } @@ -483,7 +483,7 @@ pub mod plonk_verifier { Self::WrongPlonkVK(value) } } - ///Container type for all input parameters for the `verify` function with signature `verify((uint256,uint256,(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),bytes32,bytes32),uint256[7],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0x77ae3f07` + ///Container type for all input parameters for the `verify` function with signature `verify((uint256,uint256,(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),bytes32,bytes32),uint256[11],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0xab959ee3` #[derive( Clone, ::ethers::contract::EthCall, @@ -493,14 +493,14 @@ pub mod plonk_verifier { )] #[ethcall( name = "verify", - abi = "verify((uint256,uint256,(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),bytes32,bytes32),uint256[7],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))" + abi = "verify((uint256,uint256,(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),bytes32,bytes32),uint256[11],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))" )] pub struct VerifyCall { pub verifying_key: VerifyingKey, - pub public_input: [::ethers::core::types::U256; 7], + pub public_input: [::ethers::core::types::U256; 11], pub proof: PlonkProof, } - ///Container type for all return fields from the `verify` function with signature `verify((uint256,uint256,(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),bytes32,bytes32),uint256[7],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0x77ae3f07` + ///Container type for all return fields from the `verify` function with signature `verify((uint256,uint256,(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),bytes32,bytes32),uint256[11],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0xab959ee3` #[derive( Clone, ::ethers::contract::EthAbiType, diff --git a/contract-bindings-ethers/src/plonk_verifier_2.rs b/contract-bindings-ethers/src/plonk_verifier_2.rs deleted file mode 100644 index dc6f865083..0000000000 --- a/contract-bindings-ethers/src/plonk_verifier_2.rs +++ /dev/null @@ -1,538 +0,0 @@ -pub use plonk_verifier_2::*; -/// 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 plonk_verifier_2 { - pub use super::super::shared_types::*; - #[allow(deprecated)] - fn __abi() -> ::ethers::core::abi::Abi { - ::ethers::core::abi::ethabi::Contract { - constructor: ::core::option::Option::None, - functions: ::core::convert::From::from([ - ( - ::std::borrow::ToOwned::to_owned("P_MOD"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("P_MOD"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("R_MOD"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("R_MOD"), - inputs: ::std::vec![], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::string::String::new(), - kind: ::ethers::core::abi::ethabi::ParamType::Uint(256usize,), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ( - ::std::borrow::ToOwned::to_owned("verify"), - ::std::vec![::ethers::core::abi::ethabi::Function { - name: ::std::borrow::ToOwned::to_owned("verify"), - inputs: ::std::vec![ - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("vk"), - kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), - ::ethers::core::abi::ethabi::ParamType::FixedBytes(32usize), - ],), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned( - "struct IPlonkVerifier.VerifyingKey", - ), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("publicInput"), - kind: ::ethers::core::abi::ethabi::ParamType::FixedArray( - ::std::boxed::Box::new( - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ), - 7usize, - ), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("uint256[7]"), - ), - }, - ::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("proof"), - kind: ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Tuple(::std::vec![ - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ::ethers::core::abi::ethabi::ParamType::Uint(256usize), - ],), - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned( - "struct IPlonkVerifier.PlonkProof", - ), - ), - }, - ], - outputs: ::std::vec![::ethers::core::abi::ethabi::Param { - name: ::std::borrow::ToOwned::to_owned("success"), - kind: ::ethers::core::abi::ethabi::ParamType::Bool, - internal_type: ::core::option::Option::Some( - ::std::borrow::ToOwned::to_owned("bool"), - ), - },], - constant: ::core::option::Option::None, - state_mutability: ::ethers::core::abi::ethabi::StateMutability::View, - },], - ), - ]), - events: ::std::collections::BTreeMap::new(), - errors: ::core::convert::From::from([( - ::std::borrow::ToOwned::to_owned("UnsupportedDegree"), - ::std::vec![::ethers::core::abi::ethabi::AbiError { - name: ::std::borrow::ToOwned::to_owned("UnsupportedDegree"), - inputs: ::std::vec![], - },], - )]), - receive: false, - fallback: false, - } - } - ///The parsed JSON ABI of the contract. - pub static PLONKVERIFIER2_ABI: ::ethers::contract::Lazy<::ethers::core::abi::Abi> = - ::ethers::contract::Lazy::new(__abi); - #[rustfmt::skip] - const __BYTECODE: &[u8] = b"a& a\x005`\x0B\x82\x82\x829\x80Q_\x1A`s\x14a\0)WcNH{q`\xE0\x1B_R_`\x04R`$_\xFD[0_R`s\x81S\x82\x81\xF3\xFEs\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\x046\x10a\0JW_5`\xE0\x1C\x80c\x1Dq.'\x14a\0NW\x80c\xCESzw\x14a\0\x88W\x80c\xDFnl\xB4\x14a\0\xABW[_\x80\xFD[a\0u\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x81V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\x9Ba\0\x966`\x04a#\xEDV[a\0\xBFV[`@Q\x90\x15\x15\x81R` \x01a\0\x7FV[a\0u_\x80Q` a%\xF4\x839\x81Q\x91R\x81V[_a\0\xC9\x82a\x10\x12V[a\0\xD9\x83_[` \x02\x01Qa\x11MV[a\0\xE4\x83`\x01a\0\xCFV[a\0\xEF\x83`\x02a\0\xCFV[a\0\xFA\x83`\x03a\0\xCFV[a\x01\x05\x83`\x04a\0\xCFV[a\x01\x10\x83`\x05a\0\xCFV[a\x01\x1B\x83`\x06a\0\xCFV[_a\x01'\x85\x85\x85a\x11\xAFV[\x90P_a\x016\x86_\x01Qa\x17\xB8V[\x90P_a\x01H\x82\x84`\xA0\x01Q\x88a\x1B\x96V[\x90P_a\x01V\x84\x87\x84a\x1B\xF3V[\x90Pa\x025V[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0C`$\x82\x01Rkerror verify`\xA0\x1B`D\x82\x01R`d\x81\xFD[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\r`$\x82\x01Rlerror pairing`\x98\x1B`D\x82\x01R`d\x81\xFD[`@Q\x81Q\x81R` \x82\x01Q` \x82\x01R\x82`@\x82\x01R`@_``\x83`\x07Z\xFA\x90P\x80a\x01\xF6Wa\x01\xF6a\x01]V[PPPV[`@\x80Q\x82Q\x81R` \x80\x84\x01Q\x81\x83\x01R_Q\x82\x84\x01RQ``\x82\x01R\x90\x82`\x80\x83`\x06Z\xFA\x90P\x80a\x021Wa\x021a\x01]V[PPV[`@Q`\xC0\x81\x01\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1`@\x83\x01R\x7F\x01\x18\xC4\xD5\xB87\xBC\xC2\xBC\x89\xB5\xB3\x98\xB5\x97N\x9FYD\x07;2\x07\x8B~#\x1F\xEC\x93\x88\x83\xB0``\x83\x01R\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4`\x80\x83\x01R\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U`\xA0\x83\x01R\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2a\x01\0\x83\x01R\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xEDa\x01 \x83\x01R\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[a\x01@\x83\x01R\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAAa\x01`\x83\x01Ra\x01\x80\x82\x01`@R_\x80_\x80`\x80\x8A\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R` \x8A\x01Q` \x8D\x01Q\t\x93P\x8AQ_\x80Q` a%\xF4\x839\x81Q\x91R`\xA0\x8D\x01Q``\x8E\x01Q\t\x93P_\x80Q` a%\xF4\x839\x81Q\x91Ra\x01\xA0\x8F\x01Q\x85\x08\x92P_\x80Q` a%\xF4\x839\x81Q\x91R\x82\x84\x08\x92P_\x80Q` a%\xF4\x839\x81Q\x91R\x81\x84\t\x90P_\x80Q` a%\xF4\x839\x81Q\x91R\x7F/\x8D\xD1\xF1\xA7X\x83\x85a\x01\xC6V[a\x0FG\x85a\x01\xFBV[`@\x80Q\x80\x82\x01\x90\x91R\x93P`\x01\x84R`\x02` \x85\x01Ra\x0Fw\x81_\x80Q` a%\xF4\x839\x81Q\x91R\x03\x85a\x01\xC6V[Pa\x0F\x81\x84a\x01\xFBV[a\x0F\xB0\x84` \x01\x80Q\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x03\x90RV[PPPa\x01`\x88\x01Q\x80Q\x83R` \x90\x81\x01Q\x90\x83\x01R`\xE0\x86\x01Qa\x01\x80\x89\x01Q\x90a\x0F\xDD\x81\x83a\x01\xC6V[PPPa\x0F\xE9\x81a\x01\xFBV[` _a\x01\x80\x83`\x08Z\xFA\x90P\x80a\x10\x03Wa\x10\x03a\x01\x91V[PP_Q\x97\x96PPPPPPPV[\x80Qa\x10\x1D\x90a\x1D\xA8V[a\x10*\x81` \x01Qa\x1D\xA8V[a\x107\x81`@\x01Qa\x1D\xA8V[a\x10D\x81``\x01Qa\x1D\xA8V[a\x10Q\x81`\x80\x01Qa\x1D\xA8V[a\x10^\x81`\xA0\x01Qa\x1D\xA8V[a\x10k\x81`\xC0\x01Qa\x1D\xA8V[a\x10x\x81`\xE0\x01Qa\x1D\xA8V[a\x10\x86\x81a\x01\0\x01Qa\x1D\xA8V[a\x10\x94\x81a\x01 \x01Qa\x1D\xA8V[a\x10\xA2\x81a\x01@\x01Qa\x1D\xA8V[a\x10\xB0\x81a\x01`\x01Qa\x1D\xA8V[a\x10\xBE\x81a\x01\x80\x01Qa\x1D\xA8V[a\x10\xCC\x81a\x01\xA0\x01Qa\x11MV[a\x10\xDA\x81a\x01\xC0\x01Qa\x11MV[a\x10\xE8\x81a\x01\xE0\x01Qa\x11MV[a\x10\xF6\x81a\x02\0\x01Qa\x11MV[a\x11\x04\x81a\x02 \x01Qa\x11MV[a\x11\x12\x81a\x02@\x01Qa\x11MV[a\x11 \x81a\x02`\x01Qa\x11MV[a\x11.\x81a\x02\x80\x01Qa\x11MV[a\x11<\x81a\x02\xA0\x01Qa\x11MV[a\x11J\x81a\x02\xC0\x01Qa\x11MV[PV[_\x80Q` a%\xF4\x839\x81Q\x91R\x81\x10\x80a\x021W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[a\x11\xEF`@Q\x80a\x01\0\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81RP\x90V[`@Q` \x81\x01_\x81R`\xFE`\xE0\x1B\x81R\x85Q`\xC0\x1B`\x04\x82\x01R` \x86\x01Q`\xC0\x1B`\x0C\x82\x01Ra\x02\x80\x86\x01Q` \x82\x01Ra\x02\xA0\x86\x01Q`@\x82\x01R`\x01``\x82\x01R\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85\x81R` \x01\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D\x81R` \x01\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD\x81RP\x81RP\x90P\x91\x90PV[\x81b\x10\0\0\x03a\x1A?W`@Q\x80``\x01`@R\x80`\x14\x81R` \x01\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x81R` \x01`@Q\x80`\xE0\x01`@R\x80`\x01\x81R` \x01\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW\x81R` \x01\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD\x81R` \x01\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B\x81R` \x01\x7F\x19\xDD\xBC\xAF:\x8DF\xC1\\\x01v\xFB\xB5\xB9^M\xC5p\x88\xFF\x13\xF4\xD1\xBD\x84\xC6\xBF\xA5}\xCD\xC0\xE0\x81R` \x01\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18\x81R` \x01\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\\x81RP\x81RP\x90P\x91\x90PV[\x81` \x03a\x1B}W`@Q\x80``\x01`@R\x80`\x05\x81R` \x01\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x81R` \x01`@Q\x80`\xE0\x01`@R\x80`\x01\x81R` \x01\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0\x81R` \x01\x7F!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B\x81R` \x01\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;\x81R` \x01\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80\x81R` \x01\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE\x81R` \x01\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C\x81RP\x81RP\x90P\x91\x90PV[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x1B\xB7`@Q\x80``\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81RP\x90V[a\x1B\xC1\x84\x84a\x1EQV[\x80\x82Ra\x1B\xD1\x90\x85\x90\x85\x90a\x1E\xA2V[` \x82\x01R\x80Qa\x1B\xE7\x90\x85\x90\x84\x90\x86\x90a\x1F\x13V[`@\x82\x01R\x93\x92PPPV[` \x81\x01Q`@\x82\x01Q``\x85\x01Q`\x80\x86\x01Qa\x01\xA0\x86\x01Qa\x02@\x87\x01Q_\x95\x94\x93`\x01\x93\x90\x92\x90\x91_\x80Q` a%\xF4\x839\x81Q\x91R\x80\x80\x83\x87\t_\x80Q` a%\xF4\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x01\xC0\x88\x01Qa\x02`\x89\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R\x80_\x80Q` a%\xF4\x839\x81Q\x91R\x83\x87\t_\x80Q` a%\xF4\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x01\xE0\x88\x01Qa\x02\x80\x89\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R\x80_\x80Q` a%\xF4\x839\x81Q\x91R\x83\x87\t_\x80Q` a%\xF4\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x02\0\x88\x01Qa\x02\xA0\x89\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R\x80_\x80Q` a%\xF4\x839\x81Q\x91R\x83\x87\t_\x80Q` a%\xF4\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x02 \x88\x01Q\x91Pa\x02\xC0\x88\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R\x80\x82_\x80Q` a%\xF4\x839\x81Q\x91R\x85\x87\x08\t\x85\t\x93PPPP\x86Q` \x88\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R\x80\x86\x83\t_\x80Q` a%\xF4\x839\x81Q\x91R\x03\x85\x08\x95PP_\x80Q` a%\xF4\x839\x81Q\x91R\x80\x83\x83\t_\x80Q` a%\xF4\x839\x81Q\x91R\x03\x86\x08\x98\x97PPPPPPPPV[\x80Q` \x82\x01Q_\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x15\x90\x15\x16\x15a\x1D\xE1WPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x01\xF6W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7FBn254: invalid G1 point\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x11\xA6V[\x81Q_\x90_\x80Q` a%\xF4\x839\x81Q\x91R\x90\x83\x80\x15a\x1E\x92W\x84\x93P_[\x82\x81\x10\x15a\x1E\x86W\x83\x85\x86\t\x94P`\x01\x01a\x1EpV[P`\x01\x84\x03\x93Pa\x1E\x99V[`\x01\x83\x03\x93P[PPP\x92\x91PPV[_\x82`\x01\x03a\x1E\xB3WP`\x01a\x1F\x0CV[\x81_\x03a\x1E\xC1WP_a\x1F\x0CV[` \x84\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R\x90_\x90\x82\x81\x86\t\x90P\x85\x80\x15a\x1E\xEFW`\x01\x87\x03\x92Pa\x1E\xF6V[`\x01\x84\x03\x92P[Pa\x1F\0\x82a cV[\x91P\x82\x82\x82\t\x93PPPP[\x93\x92PPPV[__\x80Q` a%\xF4\x839\x81Q\x91R\x82\x82\x03a\x1F\x8CW`\x01_[`\x07\x81\x10\x15a\x1F\x81W\x81\x86\x03a\x1F^W\x86\x81`\x07\x81\x10a\x1FOWa\x1FOa%\xCBV[` \x02\x01Q\x93PPPPa [V[\x82\x80a\x1FlWa\x1Fla%\xDFV[`@\x89\x01Q` \x01Q\x83\t\x91P`\x01\x01a\x1F-V[P_\x92PPPa [V[a\x1F\x94a!(V[`@\x87\x01Q`\x01`\xC0\x83\x81\x01\x82\x81R\x92\x01\x90\x80[`\x07\x81\x10\x15a\x1F\xD5W` \x84\x03\x93P\x85\x86\x8A\x85Q\x89\x03\x08\x83\t\x80\x85R`\x1F\x19\x90\x93\x01\x92\x91P`\x01\x01a\x1F\xA8V[PPPP_\x80_\x90P`\x01\x83\x89`@\x8C\x01Q_[`\x07\x81\x10\x15a )W\x88\x82Q\x8A\x85Q\x8C\x88Q\x8A\t\t\t\x89\x81\x88\x08\x96PP\x88\x89\x8D\x84Q\x8C\x03\x08\x86\t\x94P` \x93\x84\x01\x93\x92\x83\x01\x92\x91\x90\x91\x01\x90`\x01\x01a\x1F\xE9V[PPPP\x80\x92PP_a ;\x83a cV[\x90P` \x8A\x01Q\x85\x81\x89\t\x96PP\x84\x81\x87\t\x95P\x84\x82\x87\t\x95PPPPPP[\x94\x93PPPPV[_\x80__\x80Q` a%\xF4\x839\x81Q\x91R\x90P`@Q` \x81R` \x80\x82\x01R` `@\x82\x01R\x84``\x82\x01R`\x02\x82\x03`\x80\x82\x01R\x81`\xA0\x82\x01R` _`\xC0\x83`\x05Z\xFA\x92PP_Q\x92P\x81a \xFDW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\x11\xA6V[PP\x91\x90PV[`@Q\x80``\x01`@R\x80_\x81R` \x01_\x81R` \x01a!#a!(V[\x90R\x90V[`@Q\x80`\xE0\x01`@R\x80`\x07\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[cNH{q`\xE0\x1B_R`A`\x04R`$_\xFD[`@Qa\x02\xE0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a!~Wa!~a!FV[`@R\x90V[`@Qa\x02\xC0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a!~Wa!~a!FV[_`@\x82\x84\x03\x12\x15a!\xB8W_\x80\xFD[`@Q`@\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a!\xDBWa!\xDBa!FV[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[_\x82`\x1F\x83\x01\x12a\"\x04W_\x80\xFD[`@Q`\xE0\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a\"'Wa\"'a!FV[`@R\x80`\xE0\x84\x01\x85\x81\x11\x15a\";W_\x80\xFD[\x84[\x81\x81\x10\x15a\"UW\x805\x83R` \x92\x83\x01\x92\x01a\"=V[P\x91\x95\x94PPPPPV[_a\x04\x80\x82\x84\x03\x12\x15a\"qW_\x80\xFD[a\"ya!ZV[\x90Pa\"\x85\x83\x83a!\xA8V[\x81Ra\"\x94\x83`@\x84\x01a!\xA8V[` \x82\x01Ra\"\xA6\x83`\x80\x84\x01a!\xA8V[`@\x82\x01Ra\"\xB8\x83`\xC0\x84\x01a!\xA8V[``\x82\x01Ra\x01\0a\"\xCC\x84\x82\x85\x01a!\xA8V[`\x80\x83\x01Ra\x01@a\"\xE0\x85\x82\x86\x01a!\xA8V[`\xA0\x84\x01Ra\x01\x80a\"\xF4\x86\x82\x87\x01a!\xA8V[`\xC0\x85\x01Ra\x01\xC0a#\x08\x87\x82\x88\x01a!\xA8V[`\xE0\x86\x01Ra\x02\0a#\x1C\x88\x82\x89\x01a!\xA8V[\x85\x87\x01Ra\x02@\x94Pa#1\x88\x86\x89\x01a!\xA8V[a\x01 \x87\x01Ra\x02\x80a#F\x89\x82\x8A\x01a!\xA8V[\x85\x88\x01Ra\x02\xC0\x94Pa#[\x89\x86\x8A\x01a!\xA8V[a\x01`\x88\x01Ra#o\x89a\x03\0\x8A\x01a!\xA8V[\x84\x88\x01Ra\x03@\x88\x015a\x01\xA0\x88\x01Ra\x03`\x88\x015\x83\x88\x01Ra\x03\x80\x88\x015a\x01\xE0\x88\x01Ra\x03\xA0\x88\x015\x82\x88\x01Ra\x03\xC0\x88\x015a\x02 \x88\x01Ra\x03\xE0\x88\x015\x86\x88\x01Ra\x04\0\x88\x015a\x02`\x88\x01Ra\x04 \x88\x015\x81\x88\x01RPPPPa\x04@\x84\x015a\x02\xA0\x84\x01Ra\x04`\x84\x015\x81\x84\x01RPP\x92\x91PPV[_\x80_\x83\x85\x03a\n`\x81\x12\x15a$\x01W_\x80\xFD[a\x05\0\x80\x82\x12\x15a$\x10W_\x80\xFD[a$\x18a!\x84V[\x91P\x855\x82R` \x86\x015` \x83\x01Ra$5\x87`@\x88\x01a!\xA8V[`@\x83\x01Ra$G\x87`\x80\x88\x01a!\xA8V[``\x83\x01Ra$Y\x87`\xC0\x88\x01a!\xA8V[`\x80\x83\x01Ra\x01\0a$m\x88\x82\x89\x01a!\xA8V[`\xA0\x84\x01Ra\x01@a$\x81\x89\x82\x8A\x01a!\xA8V[`\xC0\x85\x01Ra\x01\x80a$\x95\x8A\x82\x8B\x01a!\xA8V[`\xE0\x86\x01Ra\x01\xC0a$\xA9\x8B\x82\x8C\x01a!\xA8V[\x84\x87\x01Ra\x02\0\x93Pa$\xBE\x8B\x85\x8C\x01a!\xA8V[a\x01 \x87\x01Ra\x02@a$\xD3\x8C\x82\x8D\x01a!\xA8V[\x84\x88\x01Ra\x02\x80\x93Pa$\xE8\x8C\x85\x8D\x01a!\xA8V[a\x01`\x88\x01Ra$\xFC\x8Ca\x02\xC0\x8D\x01a!\xA8V[\x83\x88\x01Ra%\x0E\x8Ca\x03\0\x8D\x01a!\xA8V[a\x01\xA0\x88\x01Ra%\"\x8Ca\x03@\x8D\x01a!\xA8V[\x82\x88\x01Ra%4\x8Ca\x03\x80\x8D\x01a!\xA8V[a\x01\xE0\x88\x01Ra%H\x8Ca\x03\xC0\x8D\x01a!\xA8V[\x85\x88\x01Ra%Z\x8Ca\x04\0\x8D\x01a!\xA8V[a\x02 \x88\x01Ra%n\x8Ca\x04@\x8D\x01a!\xA8V[\x81\x88\x01RPPPa%\x83\x89a\x04\x80\x8A\x01a!\xA8V[a\x02`\x85\x01Ra\x04\xC0\x88\x015\x81\x85\x01RPPa\x04\xE0\x86\x015a\x02\xA0\x83\x01R\x81\x94Pa%\xB0\x87\x82\x88\x01a!\xF5V[\x93PPPa%\xC2\x85a\x05\xE0\x86\x01a\"`V[\x90P\x92P\x92P\x92V[cNH{q`\xE0\x1B_R`2`\x04R`$_\xFD[cNH{q`\xE0\x1B_R`\x12`\x04R`$_\xFD\xFE0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\xA1dsolcC\0\x08\x17\0\n"; - /// The bytecode of the contract. - pub static PLONKVERIFIER2_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__BYTECODE); - #[rustfmt::skip] - const __DEPLOYED_BYTECODE: &[u8] = b"s\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x000\x14`\x80`@R`\x046\x10a\0JW_5`\xE0\x1C\x80c\x1Dq.'\x14a\0NW\x80c\xCESzw\x14a\0\x88W\x80c\xDFnl\xB4\x14a\0\xABW[_\x80\xFD[a\0u\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x81V[`@Q\x90\x81R` \x01[`@Q\x80\x91\x03\x90\xF3[a\0\x9Ba\0\x966`\x04a#\xEDV[a\0\xBFV[`@Q\x90\x15\x15\x81R` \x01a\0\x7FV[a\0u_\x80Q` a%\xF4\x839\x81Q\x91R\x81V[_a\0\xC9\x82a\x10\x12V[a\0\xD9\x83_[` \x02\x01Qa\x11MV[a\0\xE4\x83`\x01a\0\xCFV[a\0\xEF\x83`\x02a\0\xCFV[a\0\xFA\x83`\x03a\0\xCFV[a\x01\x05\x83`\x04a\0\xCFV[a\x01\x10\x83`\x05a\0\xCFV[a\x01\x1B\x83`\x06a\0\xCFV[_a\x01'\x85\x85\x85a\x11\xAFV[\x90P_a\x016\x86_\x01Qa\x17\xB8V[\x90P_a\x01H\x82\x84`\xA0\x01Q\x88a\x1B\x96V[\x90P_a\x01V\x84\x87\x84a\x1B\xF3V[\x90Pa\x025V[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x0C`$\x82\x01Rkerror verify`\xA0\x1B`D\x82\x01R`d\x81\xFD[`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\r`$\x82\x01Rlerror pairing`\x98\x1B`D\x82\x01R`d\x81\xFD[`@Q\x81Q\x81R` \x82\x01Q` \x82\x01R\x82`@\x82\x01R`@_``\x83`\x07Z\xFA\x90P\x80a\x01\xF6Wa\x01\xF6a\x01]V[PPPV[`@\x80Q\x82Q\x81R` \x80\x84\x01Q\x81\x83\x01R_Q\x82\x84\x01RQ``\x82\x01R\x90\x82`\x80\x83`\x06Z\xFA\x90P\x80a\x021Wa\x021a\x01]V[PPV[`@Q`\xC0\x81\x01\x7F&\x0E\x01\xB2Q\xF6\xF1\xC7\xE7\xFFNX\x07\x91\xDE\xE8\xEAQ\xD8z5\x8E\x03\x8BN\xFE0\xFA\xC0\x93\x83\xC1`@\x83\x01R\x7F\x01\x18\xC4\xD5\xB87\xBC\xC2\xBC\x89\xB5\xB3\x98\xB5\x97N\x9FYD\x07;2\x07\x8B~#\x1F\xEC\x93\x88\x83\xB0``\x83\x01R\x7F\x04\xFCci\xF7\x11\x0F\xE3\xD2QV\xC1\xBB\x9Ar\x85\x9C\xF2\xA0FA\xF9\x9B\xA4\xEEA<\x80\xDAj_\xE4`\x80\x83\x01R\x7F\"\xFE\xBD\xA3\xC0\xC0c*VG[B\x14\xE5a^\x11\xE6\xDD?\x96\xE6\xCE\xA2\x85J\x87\xD4\xDA\xCC^U`\xA0\x83\x01R\x7F\x19\x8E\x93\x93\x92\rH:r`\xBF\xB71\xFB]%\xF1\xAAI35\xA9\xE7\x12\x97\xE4\x85\xB7\xAE\xF3\x12\xC2a\x01\0\x83\x01R\x7F\x18\0\xDE\xEF\x12\x1F\x1EvBj\0f^\\DygC\"\xD4\xF7^\xDA\xDDF\xDE\xBD\\\xD9\x92\xF6\xEDa\x01 \x83\x01R\x7F\t\x06\x89\xD0X_\xF0u\xEC\x9E\x99\xADi\x0C3\x95\xBCK13p\xB3\x8E\xF3U\xAC\xDA\xDC\xD1\"\x97[a\x01@\x83\x01R\x7F\x12\xC8^\xA5\xDB\x8Cm\xEBJ\xABq\x80\x8D\xCB@\x8F\xE3\xD1\xE7i\x0CC\xD3{L\xE6\xCC\x01f\xFA}\xAAa\x01`\x83\x01Ra\x01\x80\x82\x01`@R_\x80_\x80`\x80\x8A\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R` \x8A\x01Q` \x8D\x01Q\t\x93P\x8AQ_\x80Q` a%\xF4\x839\x81Q\x91R`\xA0\x8D\x01Q``\x8E\x01Q\t\x93P_\x80Q` a%\xF4\x839\x81Q\x91Ra\x01\xA0\x8F\x01Q\x85\x08\x92P_\x80Q` a%\xF4\x839\x81Q\x91R\x82\x84\x08\x92P_\x80Q` a%\xF4\x839\x81Q\x91R\x81\x84\t\x90P_\x80Q` a%\xF4\x839\x81Q\x91R\x7F/\x8D\xD1\xF1\xA7X\x83\x85a\x01\xC6V[a\x0FG\x85a\x01\xFBV[`@\x80Q\x80\x82\x01\x90\x91R\x93P`\x01\x84R`\x02` \x85\x01Ra\x0Fw\x81_\x80Q` a%\xF4\x839\x81Q\x91R\x03\x85a\x01\xC6V[Pa\x0F\x81\x84a\x01\xFBV[a\x0F\xB0\x84` \x01\x80Q\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x03\x90RV[PPPa\x01`\x88\x01Q\x80Q\x83R` \x90\x81\x01Q\x90\x83\x01R`\xE0\x86\x01Qa\x01\x80\x89\x01Q\x90a\x0F\xDD\x81\x83a\x01\xC6V[PPPa\x0F\xE9\x81a\x01\xFBV[` _a\x01\x80\x83`\x08Z\xFA\x90P\x80a\x10\x03Wa\x10\x03a\x01\x91V[PP_Q\x97\x96PPPPPPPV[\x80Qa\x10\x1D\x90a\x1D\xA8V[a\x10*\x81` \x01Qa\x1D\xA8V[a\x107\x81`@\x01Qa\x1D\xA8V[a\x10D\x81``\x01Qa\x1D\xA8V[a\x10Q\x81`\x80\x01Qa\x1D\xA8V[a\x10^\x81`\xA0\x01Qa\x1D\xA8V[a\x10k\x81`\xC0\x01Qa\x1D\xA8V[a\x10x\x81`\xE0\x01Qa\x1D\xA8V[a\x10\x86\x81a\x01\0\x01Qa\x1D\xA8V[a\x10\x94\x81a\x01 \x01Qa\x1D\xA8V[a\x10\xA2\x81a\x01@\x01Qa\x1D\xA8V[a\x10\xB0\x81a\x01`\x01Qa\x1D\xA8V[a\x10\xBE\x81a\x01\x80\x01Qa\x1D\xA8V[a\x10\xCC\x81a\x01\xA0\x01Qa\x11MV[a\x10\xDA\x81a\x01\xC0\x01Qa\x11MV[a\x10\xE8\x81a\x01\xE0\x01Qa\x11MV[a\x10\xF6\x81a\x02\0\x01Qa\x11MV[a\x11\x04\x81a\x02 \x01Qa\x11MV[a\x11\x12\x81a\x02@\x01Qa\x11MV[a\x11 \x81a\x02`\x01Qa\x11MV[a\x11.\x81a\x02\x80\x01Qa\x11MV[a\x11<\x81a\x02\xA0\x01Qa\x11MV[a\x11J\x81a\x02\xC0\x01Qa\x11MV[PV[_\x80Q` a%\xF4\x839\x81Q\x91R\x81\x10\x80a\x021W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1B`$\x82\x01R\x7FBn254: invalid scalar field\0\0\0\0\0`D\x82\x01R`d\x01[`@Q\x80\x91\x03\x90\xFD[a\x11\xEF`@Q\x80a\x01\0\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81R` \x01_\x81RP\x90V[`@Q` \x81\x01_\x81R`\xFE`\xE0\x1B\x81R\x85Q`\xC0\x1B`\x04\x82\x01R` \x86\x01Q`\xC0\x1B`\x0C\x82\x01Ra\x02\x80\x86\x01Q` \x82\x01Ra\x02\xA0\x86\x01Q`@\x82\x01R`\x01``\x82\x01R\x7F/\x8D\xD1\xF1\xA7X\xA8\x01f\x9Cd\x01q \xE1t \xAA\xE6\xAD\xAA\x01\xC2a|n\x85\x81R` \x01\x7F\x12YzV\xC2\xE48b\x0B\x90A\xB9\x89\x92\xAE\rNp[x\0W\xBFwf\xA2v|\xEC\xE1n\x1D\x81R` \x01\x7F\x02\xD9A\x17\xCD\x17\xBC\xF1)\x0F\xD6|\x01\x15]\xD4\x08\x07\x85}\xFFJZ\x0BM\xC6{\xEF\xA8\xAA4\xFD\x81RP\x81RP\x90P\x91\x90PV[\x81b\x10\0\0\x03a\x1A?W`@Q\x80``\x01`@R\x80`\x14\x81R` \x01\x7F0dKl\x9CJr\x16\x9EM\xAA1}%\xF0E\x12\xAE\x15\xC5;4\xE8\xF5\xAC\xD8\xE1U\xD0\xA6\xC1\x01\x81R` \x01`@Q\x80`\xE0\x01`@R\x80`\x01\x81R` \x01\x7F&\x12]\xA1\n\x0E\xD0c'P\x8A\xBA\x06\xD1\xE3\x03\xACaf2\xDB\xED4\x9FSB-\xA9S3xW\x81R` \x01\x7F\"`\xE7$\x84K\xCARQ\x82\x93S\x96\x8EI\x150RXA\x83WG:\\\x1DY\x7Fa?l\xBD\x81R` \x01\x7F \x87\xEA,\xD6d'\x86\x08\xFB\x0E\xBD\xB8 \x90\x7FY\x85\x02\xC8\x1Bf\x90\xC1\x85\xE2\xBF\x15\xCB\x93_B\x81R` \x01\x7F\x19\xDD\xBC\xAF:\x8DF\xC1\\\x01v\xFB\xB5\xB9^M\xC5p\x88\xFF\x13\xF4\xD1\xBD\x84\xC6\xBF\xA5}\xCD\xC0\xE0\x81R` \x01\x7F\x05\xA2\xC8\\\xFCY\x17\x89`\\\xAE\x81\x8E7\xDDAa\xEE\xF9\xAAfk\xECo\xE4(\x8D\t\xE6\xD24\x18\x81R` \x01\x7F\x11\xF7\x0ESc%\x8F\xF4\xF0\xD7\x16\xA6S\xE1\xDCA\xF1\xC6D\x84\xD7\xF4\xB6\xE2\x19\xD67v\x14\xA3\x90\\\x81RP\x81RP\x90P\x91\x90PV[\x81` \x03a\x1B}W`@Q\x80``\x01`@R\x80`\x05\x81R` \x01\x7F.\xE1+\xFFJ(\x13(j\x8D\xC3\x88\xCDuM\x9A>\xF2I\x065\xEB\xA5\x0C\xB9\xC2\xE5\xE7P\x80\0\x01\x81R` \x01`@Q\x80`\xE0\x01`@R\x80`\x01\x81R` \x01\x7F\t\xC52\xC60k\x93\xD2\x96x \rG\xC0\xB2\xA9\x9C\x18\xD5\x1B\x83\x8E\xEB\x1D>\xEDLS;\xB5\x12\xD0\x81R` \x01\x7F!\x08,\xA2\x16\xCB\xBFN\x1CnOE\x94\xDDP\x8C\x99m\xFB\xE1\x17N\xFB\x98\xB1\x15\t\xC6\xE3\x06F\x0B\x81R` \x01\x7F\x12w\xAEd\x15\xF0\xEF\x18\xF2\xBA_\xB1b\xC3\x9E\xB71\x1F8n-&\xD6D\x01\xF4\xA2]\xA7|%;\x81R` \x01\x7F+3}\xE1\xC8\xC1O\"\xEC\x9B\x9E/\x96\xAF\xEF6Rbsf\xF8\x17\n\n\x94\x8D\xADJ\xC1\xBD^\x80\x81R` \x01\x7F/\xBDM\xD2\x97k\xE5]\x1A\x16:\xA9\x82\x0F\xB8\x8D\xFA\xC5\xDD\xCEw\xE1\x87.\x90c '2z^\xBE\x81R` \x01\x7F\x10z\xABI\xE6Zg\xF9\xDA\x9C\xD2\xAB\xF7\x8B\xE3\x8B\xD9\xDC\x1D]\xB3\x9F\x81\xDE6\xBC\xFA[K\x03\x90C\x81RP\x81RP\x90P\x91\x90PV[`@Qc\xE2\xEF\t\xE5`\xE0\x1B\x81R`\x04\x01`@Q\x80\x91\x03\x90\xFD[a\x1B\xB7`@Q\x80``\x01`@R\x80_\x81R` \x01_\x81R` \x01_\x81RP\x90V[a\x1B\xC1\x84\x84a\x1EQV[\x80\x82Ra\x1B\xD1\x90\x85\x90\x85\x90a\x1E\xA2V[` \x82\x01R\x80Qa\x1B\xE7\x90\x85\x90\x84\x90\x86\x90a\x1F\x13V[`@\x82\x01R\x93\x92PPPV[` \x81\x01Q`@\x82\x01Q``\x85\x01Q`\x80\x86\x01Qa\x01\xA0\x86\x01Qa\x02@\x87\x01Q_\x95\x94\x93`\x01\x93\x90\x92\x90\x91_\x80Q` a%\xF4\x839\x81Q\x91R\x80\x80\x83\x87\t_\x80Q` a%\xF4\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x01\xC0\x88\x01Qa\x02`\x89\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R\x80_\x80Q` a%\xF4\x839\x81Q\x91R\x83\x87\t_\x80Q` a%\xF4\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x01\xE0\x88\x01Qa\x02\x80\x89\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R\x80_\x80Q` a%\xF4\x839\x81Q\x91R\x83\x87\t_\x80Q` a%\xF4\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x02\0\x88\x01Qa\x02\xA0\x89\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R\x80_\x80Q` a%\xF4\x839\x81Q\x91R\x83\x87\t_\x80Q` a%\xF4\x839\x81Q\x91R\x86\x86\x08\x08\x86\t\x94PPPa\x02 \x88\x01Q\x91Pa\x02\xC0\x88\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R\x80\x82_\x80Q` a%\xF4\x839\x81Q\x91R\x85\x87\x08\t\x85\t\x93PPPP\x86Q` \x88\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R\x80\x86\x83\t_\x80Q` a%\xF4\x839\x81Q\x91R\x03\x85\x08\x95PP_\x80Q` a%\xF4\x839\x81Q\x91R\x80\x83\x83\t_\x80Q` a%\xF4\x839\x81Q\x91R\x03\x86\x08\x98\x97PPPPPPPPV[\x80Q` \x82\x01Q_\x91\x7F0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X]\x97\x81j\x91hq\xCA\x8D< \x8C\x16\xD8|\xFDG\x91\x15\x90\x15\x16\x15a\x1D\xE1WPPPV[\x82Q` \x84\x01Q\x82`\x03\x84\x85\x85\x86\t\x85\t\x08\x83\x82\x83\t\x14\x83\x82\x10\x84\x84\x10\x16\x16\x93PPP\x81a\x01\xF6W`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x17`$\x82\x01R\x7FBn254: invalid G1 point\0\0\0\0\0\0\0\0\0`D\x82\x01R`d\x01a\x11\xA6V[\x81Q_\x90_\x80Q` a%\xF4\x839\x81Q\x91R\x90\x83\x80\x15a\x1E\x92W\x84\x93P_[\x82\x81\x10\x15a\x1E\x86W\x83\x85\x86\t\x94P`\x01\x01a\x1EpV[P`\x01\x84\x03\x93Pa\x1E\x99V[`\x01\x83\x03\x93P[PPP\x92\x91PPV[_\x82`\x01\x03a\x1E\xB3WP`\x01a\x1F\x0CV[\x81_\x03a\x1E\xC1WP_a\x1F\x0CV[` \x84\x01Q_\x80Q` a%\xF4\x839\x81Q\x91R\x90_\x90\x82\x81\x86\t\x90P\x85\x80\x15a\x1E\xEFW`\x01\x87\x03\x92Pa\x1E\xF6V[`\x01\x84\x03\x92P[Pa\x1F\0\x82a cV[\x91P\x82\x82\x82\t\x93PPPP[\x93\x92PPPV[__\x80Q` a%\xF4\x839\x81Q\x91R\x82\x82\x03a\x1F\x8CW`\x01_[`\x07\x81\x10\x15a\x1F\x81W\x81\x86\x03a\x1F^W\x86\x81`\x07\x81\x10a\x1FOWa\x1FOa%\xCBV[` \x02\x01Q\x93PPPPa [V[\x82\x80a\x1FlWa\x1Fla%\xDFV[`@\x89\x01Q` \x01Q\x83\t\x91P`\x01\x01a\x1F-V[P_\x92PPPa [V[a\x1F\x94a!(V[`@\x87\x01Q`\x01`\xC0\x83\x81\x01\x82\x81R\x92\x01\x90\x80[`\x07\x81\x10\x15a\x1F\xD5W` \x84\x03\x93P\x85\x86\x8A\x85Q\x89\x03\x08\x83\t\x80\x85R`\x1F\x19\x90\x93\x01\x92\x91P`\x01\x01a\x1F\xA8V[PPPP_\x80_\x90P`\x01\x83\x89`@\x8C\x01Q_[`\x07\x81\x10\x15a )W\x88\x82Q\x8A\x85Q\x8C\x88Q\x8A\t\t\t\x89\x81\x88\x08\x96PP\x88\x89\x8D\x84Q\x8C\x03\x08\x86\t\x94P` \x93\x84\x01\x93\x92\x83\x01\x92\x91\x90\x91\x01\x90`\x01\x01a\x1F\xE9V[PPPP\x80\x92PP_a ;\x83a cV[\x90P` \x8A\x01Q\x85\x81\x89\t\x96PP\x84\x81\x87\t\x95P\x84\x82\x87\t\x95PPPPPP[\x94\x93PPPPV[_\x80__\x80Q` a%\xF4\x839\x81Q\x91R\x90P`@Q` \x81R` \x80\x82\x01R` `@\x82\x01R\x84``\x82\x01R`\x02\x82\x03`\x80\x82\x01R\x81`\xA0\x82\x01R` _`\xC0\x83`\x05Z\xFA\x92PP_Q\x92P\x81a \xFDW`@QbF\x1B\xCD`\xE5\x1B\x81R` `\x04\x82\x01R`\x1D`$\x82\x01R\x7FBn254: pow precompile failed!\0\0\0`D\x82\x01R`d\x01a\x11\xA6V[PP\x91\x90PV[`@Q\x80``\x01`@R\x80_\x81R` \x01_\x81R` \x01a!#a!(V[\x90R\x90V[`@Q\x80`\xE0\x01`@R\x80`\x07\x90` \x82\x02\x806\x837P\x91\x92\x91PPV[cNH{q`\xE0\x1B_R`A`\x04R`$_\xFD[`@Qa\x02\xE0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a!~Wa!~a!FV[`@R\x90V[`@Qa\x02\xC0\x81\x01g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x81\x11\x82\x82\x10\x17\x15a!~Wa!~a!FV[_`@\x82\x84\x03\x12\x15a!\xB8W_\x80\xFD[`@Q`@\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a!\xDBWa!\xDBa!FV[`@R\x825\x81R` \x92\x83\x015\x92\x81\x01\x92\x90\x92RP\x91\x90PV[_\x82`\x1F\x83\x01\x12a\"\x04W_\x80\xFD[`@Q`\xE0\x81\x01\x81\x81\x10g\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x82\x11\x17\x15a\"'Wa\"'a!FV[`@R\x80`\xE0\x84\x01\x85\x81\x11\x15a\";W_\x80\xFD[\x84[\x81\x81\x10\x15a\"UW\x805\x83R` \x92\x83\x01\x92\x01a\"=V[P\x91\x95\x94PPPPPV[_a\x04\x80\x82\x84\x03\x12\x15a\"qW_\x80\xFD[a\"ya!ZV[\x90Pa\"\x85\x83\x83a!\xA8V[\x81Ra\"\x94\x83`@\x84\x01a!\xA8V[` \x82\x01Ra\"\xA6\x83`\x80\x84\x01a!\xA8V[`@\x82\x01Ra\"\xB8\x83`\xC0\x84\x01a!\xA8V[``\x82\x01Ra\x01\0a\"\xCC\x84\x82\x85\x01a!\xA8V[`\x80\x83\x01Ra\x01@a\"\xE0\x85\x82\x86\x01a!\xA8V[`\xA0\x84\x01Ra\x01\x80a\"\xF4\x86\x82\x87\x01a!\xA8V[`\xC0\x85\x01Ra\x01\xC0a#\x08\x87\x82\x88\x01a!\xA8V[`\xE0\x86\x01Ra\x02\0a#\x1C\x88\x82\x89\x01a!\xA8V[\x85\x87\x01Ra\x02@\x94Pa#1\x88\x86\x89\x01a!\xA8V[a\x01 \x87\x01Ra\x02\x80a#F\x89\x82\x8A\x01a!\xA8V[\x85\x88\x01Ra\x02\xC0\x94Pa#[\x89\x86\x8A\x01a!\xA8V[a\x01`\x88\x01Ra#o\x89a\x03\0\x8A\x01a!\xA8V[\x84\x88\x01Ra\x03@\x88\x015a\x01\xA0\x88\x01Ra\x03`\x88\x015\x83\x88\x01Ra\x03\x80\x88\x015a\x01\xE0\x88\x01Ra\x03\xA0\x88\x015\x82\x88\x01Ra\x03\xC0\x88\x015a\x02 \x88\x01Ra\x03\xE0\x88\x015\x86\x88\x01Ra\x04\0\x88\x015a\x02`\x88\x01Ra\x04 \x88\x015\x81\x88\x01RPPPPa\x04@\x84\x015a\x02\xA0\x84\x01Ra\x04`\x84\x015\x81\x84\x01RPP\x92\x91PPV[_\x80_\x83\x85\x03a\n`\x81\x12\x15a$\x01W_\x80\xFD[a\x05\0\x80\x82\x12\x15a$\x10W_\x80\xFD[a$\x18a!\x84V[\x91P\x855\x82R` \x86\x015` \x83\x01Ra$5\x87`@\x88\x01a!\xA8V[`@\x83\x01Ra$G\x87`\x80\x88\x01a!\xA8V[``\x83\x01Ra$Y\x87`\xC0\x88\x01a!\xA8V[`\x80\x83\x01Ra\x01\0a$m\x88\x82\x89\x01a!\xA8V[`\xA0\x84\x01Ra\x01@a$\x81\x89\x82\x8A\x01a!\xA8V[`\xC0\x85\x01Ra\x01\x80a$\x95\x8A\x82\x8B\x01a!\xA8V[`\xE0\x86\x01Ra\x01\xC0a$\xA9\x8B\x82\x8C\x01a!\xA8V[\x84\x87\x01Ra\x02\0\x93Pa$\xBE\x8B\x85\x8C\x01a!\xA8V[a\x01 \x87\x01Ra\x02@a$\xD3\x8C\x82\x8D\x01a!\xA8V[\x84\x88\x01Ra\x02\x80\x93Pa$\xE8\x8C\x85\x8D\x01a!\xA8V[a\x01`\x88\x01Ra$\xFC\x8Ca\x02\xC0\x8D\x01a!\xA8V[\x83\x88\x01Ra%\x0E\x8Ca\x03\0\x8D\x01a!\xA8V[a\x01\xA0\x88\x01Ra%\"\x8Ca\x03@\x8D\x01a!\xA8V[\x82\x88\x01Ra%4\x8Ca\x03\x80\x8D\x01a!\xA8V[a\x01\xE0\x88\x01Ra%H\x8Ca\x03\xC0\x8D\x01a!\xA8V[\x85\x88\x01Ra%Z\x8Ca\x04\0\x8D\x01a!\xA8V[a\x02 \x88\x01Ra%n\x8Ca\x04@\x8D\x01a!\xA8V[\x81\x88\x01RPPPa%\x83\x89a\x04\x80\x8A\x01a!\xA8V[a\x02`\x85\x01Ra\x04\xC0\x88\x015\x81\x85\x01RPPa\x04\xE0\x86\x015a\x02\xA0\x83\x01R\x81\x94Pa%\xB0\x87\x82\x88\x01a!\xF5V[\x93PPPa%\xC2\x85a\x05\xE0\x86\x01a\"`V[\x90P\x92P\x92P\x92V[cNH{q`\xE0\x1B_R`2`\x04R`$_\xFD[cNH{q`\xE0\x1B_R`\x12`\x04R`$_\xFD\xFE0dNr\xE11\xA0)\xB8PE\xB6\x81\x81X](3\xE8Hy\xB9p\x91C\xE1\xF5\x93\xF0\0\0\x01\xA1dsolcC\0\x08\x17\0\n"; - /// The deployed bytecode of the contract. - pub static PLONKVERIFIER2_DEPLOYED_BYTECODE: ::ethers::core::types::Bytes = - ::ethers::core::types::Bytes::from_static(__DEPLOYED_BYTECODE); - pub struct PlonkVerifier2(::ethers::contract::Contract); - impl ::core::clone::Clone for PlonkVerifier2 { - fn clone(&self) -> Self { - Self(::core::clone::Clone::clone(&self.0)) - } - } - impl ::core::ops::Deref for PlonkVerifier2 { - type Target = ::ethers::contract::Contract; - fn deref(&self) -> &Self::Target { - &self.0 - } - } - impl ::core::ops::DerefMut for PlonkVerifier2 { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } - } - impl ::core::fmt::Debug for PlonkVerifier2 { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - f.debug_tuple(::core::stringify!(PlonkVerifier2)) - .field(&self.address()) - .finish() - } - } - impl PlonkVerifier2 { - /// 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(), - PLONKVERIFIER2_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( - PLONKVERIFIER2_ABI.clone(), - PLONKVERIFIER2_BYTECODE.clone().into(), - client, - ); - let deployer = factory.deploy(constructor_args)?; - let deployer = ::ethers::contract::ContractDeployer::new(deployer); - Ok(deployer) - } - ///Calls the contract's `P_MOD` (0x1d712e27) function - pub fn p_mod( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([29, 113, 46, 39], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `R_MOD` (0xdf6e6cb4) function - pub fn r_mod( - &self, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([223, 110, 108, 180], ()) - .expect("method not found (this should never happen)") - } - ///Calls the contract's `verify` (0x77ae3f07) function - pub fn verify( - &self, - vk: VerifyingKey, - public_input: [::ethers::core::types::U256; 7], - proof: PlonkProof, - ) -> ::ethers::contract::builders::ContractCall { - self.0 - .method_hash([119, 174, 63, 7], (vk, public_input, proof)) - .expect("method not found (this should never happen)") - } - } - impl From<::ethers::contract::Contract> - for PlonkVerifier2 - { - fn from(contract: ::ethers::contract::Contract) -> Self { - Self::new(contract.address(), contract.client()) - } - } - ///Custom Error type `UnsupportedDegree` with signature `UnsupportedDegree()` and selector `0xe2ef09e5` - #[derive( - Clone, - ::ethers::contract::EthError, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[etherror(name = "UnsupportedDegree", abi = "UnsupportedDegree()")] - pub struct UnsupportedDegree; - ///Container type for all input parameters for the `P_MOD` function with signature `P_MOD()` and selector `0x1d712e27` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "P_MOD", abi = "P_MOD()")] - pub struct PModCall; - ///Container type for all input parameters for the `R_MOD` function with signature `R_MOD()` and selector `0xdf6e6cb4` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - #[ethcall(name = "R_MOD", abi = "R_MOD()")] - pub struct RModCall; - ///Container type for all input parameters for the `verify` function with signature `verify((uint256,uint256,(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),bytes32,bytes32),uint256[7],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0x77ae3f07` - #[derive( - Clone, - ::ethers::contract::EthCall, - ::ethers::contract::EthDisplay, - serde::Serialize, - serde::Deserialize, - )] - #[ethcall( - name = "verify", - abi = "verify((uint256,uint256,(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),bytes32,bytes32),uint256[7],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))" - )] - pub struct VerifyCall { - pub vk: VerifyingKey, - pub public_input: [::ethers::core::types::U256; 7], - pub proof: PlonkProof, - } - ///Container type for all of the contract's call - #[derive(Clone, ::ethers::contract::EthAbiType, serde::Serialize, serde::Deserialize)] - pub enum PlonkVerifier2Calls { - PMod(PModCall), - RMod(RModCall), - Verify(VerifyCall), - } - impl ::ethers::core::abi::AbiDecode for PlonkVerifier2Calls { - fn decode( - data: impl AsRef<[u8]>, - ) -> ::core::result::Result { - let data = data.as_ref(); - if let Ok(decoded) = ::decode(data) { - return Ok(Self::PMod(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::RMod(decoded)); - } - if let Ok(decoded) = ::decode(data) { - return Ok(Self::Verify(decoded)); - } - Err(::ethers::core::abi::Error::InvalidData.into()) - } - } - impl ::ethers::core::abi::AbiEncode for PlonkVerifier2Calls { - fn encode(self) -> Vec { - match self { - Self::PMod(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::RMod(element) => ::ethers::core::abi::AbiEncode::encode(element), - Self::Verify(element) => ::ethers::core::abi::AbiEncode::encode(element), - } - } - } - impl ::core::fmt::Display for PlonkVerifier2Calls { - fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { - match self { - Self::PMod(element) => ::core::fmt::Display::fmt(element, f), - Self::RMod(element) => ::core::fmt::Display::fmt(element, f), - Self::Verify(element) => ::core::fmt::Display::fmt(element, f), - } - } - } - impl ::core::convert::From for PlonkVerifier2Calls { - fn from(value: PModCall) -> Self { - Self::PMod(value) - } - } - impl ::core::convert::From for PlonkVerifier2Calls { - fn from(value: RModCall) -> Self { - Self::RMod(value) - } - } - impl ::core::convert::From for PlonkVerifier2Calls { - fn from(value: VerifyCall) -> Self { - Self::Verify(value) - } - } - ///Container type for all return fields from the `P_MOD` function with signature `P_MOD()` and selector `0x1d712e27` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct PModReturn(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `R_MOD` function with signature `R_MOD()` and selector `0xdf6e6cb4` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct RModReturn(pub ::ethers::core::types::U256); - ///Container type for all return fields from the `verify` function with signature `verify((uint256,uint256,(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),bytes32,bytes32),uint256[7],((uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),(uint256,uint256),uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))` and selector `0x77ae3f07` - #[derive( - Clone, - ::ethers::contract::EthAbiType, - ::ethers::contract::EthAbiCodec, - serde::Serialize, - serde::Deserialize, - Default, - Debug, - PartialEq, - Eq, - Hash, - )] - pub struct VerifyReturn { - pub success: bool, - } -} diff --git a/contract-bindings/artifacts/LightClientArbitrum_bytecode.json b/contract-bindings/artifacts/LightClientArbitrum_bytecode.json index 163a140604..ddbb8fed74 100644 --- a/contract-bindings/artifacts/LightClientArbitrum_bytecode.json +++ b/contract-bindings/artifacts/LightClientArbitrum_bytecode.json @@ -1 +1 @@ -"0x60a06040523060805234801562000014575f80fd5b506200001f62000025565b620000d9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000765760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6080516129dd620001005f395f81816111090152818161113201526112af01526129dd5ff3fe608060405260043610610147575f3560e01c8063826e41fc116100b3578063ad3cb1cc1161006d578063ad3cb1cc14610470578063c23b9e9e146104ad578063d24d933d146104e5578063e030330114610514578063f2fde38b14610533578063f9e50d1914610552575f80fd5b8063826e41fc1461033a5780638584d23f146103655780638da5cb5b146103a157806396c1ca61146103dd5780639baa3cc9146103fc5780639fdb54a71461041b575f80fd5b8063378ec23b11610104578063378ec23b14610288578063426d3194146102aa5780634f1ef286146102eb57806352d1902d146102fe57806369cc6a0414610312578063715018a614610326575f80fd5b8063013fa5fc1461014b57806302b592f31461016c5780630d8e6e2c146101c95780632063d4f7146101f45780632f79889d14610213578063313df7b114610251575b5f80fd5b348015610156575f80fd5b5061016a610165366004611f92565b610566565b005b348015610177575f80fd5b5061018b610186366004611fab565b610619565b6040516101c094939291906001600160401b039485168152928416602084015292166040820152606081019190915260800190565b60405180910390f35b3480156101d4575f80fd5b5060408051600181525f60208201819052918101919091526060016101c0565b3480156101ff575f80fd5b5061016a61020e3660046120f6565b610662565b34801561021e575f80fd5b5060085461023990600160c01b90046001600160401b031681565b6040516001600160401b0390911681526020016101c0565b34801561025c575f80fd5b50600854610270906001600160a01b031681565b6040516001600160a01b0390911681526020016101c0565b348015610293575f80fd5b5061029c6107bd565b6040519081526020016101c0565b3480156102b5575f80fd5b505f546001546002546003546102cb9392919084565b6040805194855260208501939093529183015260608201526080016101c0565b61016a6102f93660046122a7565b610824565b348015610309575f80fd5b5061029c610843565b34801561031d575f80fd5b5061016a61085e565b348015610331575f80fd5b5061016a6108cc565b348015610345575f80fd5b506008546001600160a01b031615155b60405190151581526020016101c0565b348015610370575f80fd5b5061038461037f366004611fab565b6108dd565b604080519283526001600160401b039091166020830152016101c0565b3480156103ac575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610270565b3480156103e8575f80fd5b5061016a6103f7366004612359565b610a08565b348015610407575f80fd5b5061016a610416366004612372565b610a91565b348015610426575f80fd5b5060065460075461044a916001600160401b0380821692600160401b909204169083565b604080516001600160401b039485168152939092166020840152908201526060016101c0565b34801561047b575f80fd5b506104a0604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101c0919061243d565b3480156104b8575f80fd5b506008546104d090600160a01b900463ffffffff1681565b60405163ffffffff90911681526020016101c0565b3480156104f0575f80fd5b5060045460055461044a916001600160401b0380821692600160401b909204169083565b34801561051f575f80fd5b5061035561052e36600461246f565b610bb3565b34801561053e575f80fd5b5061016a61054d366004611f92565b610d14565b34801561055d575f80fd5b5060095461029c565b61056e610d56565b6001600160a01b0381166105955760405163e6c4247b60e01b815260040160405180910390fd5b6008546001600160a01b03908116908216036105c45760405163a863aec960e01b815260040160405180910390fd5b600880546001600160a01b0319166001600160a01b0383169081179091556040519081527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b60098181548110610628575f80fd5b5f918252602090912060029091020180546001909101546001600160401b038083169350600160401b8304811692600160801b9004169084565b6008546001600160a01b03161515801561068757506008546001600160a01b03163314155b156106a5576040516301474c8f60e71b815260040160405180910390fd5b60065482516001600160401b0391821691161115806106de575060065460208301516001600160401b03600160401b9092048216911611155b156106fc5760405163051c46ef60e01b815260040160405180910390fd5b6107098260400151610db1565b6107138282610e21565b81516006805460208501516001600160401b03908116600160401b026001600160801b0319909216931692909217919091179055604082015160075561076161075a6107bd565b4284610f15565b81602001516001600160401b0316825f01516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae684604001516040516107b191815260200190565b60405180910390a35050565b5f60646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061081f919061248f565b905090565b61082c6110fe565b610835826111a2565b61083f82826111e3565b5050565b5f61084c6112a4565b505f805160206129b183398151915290565b610866610d56565b6008546001600160a01b0316156108b157600880546001600160a01b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c02450905f90a1565b60405163a863aec960e01b815260040160405180910390fd5b565b6108d4610d56565b6108ca5f6112ed565b600980545f918291906108f16001836124ba565b81548110610901576109016124cd565b5f918252602090912060029091020154600160801b90046001600160401b0316841061094057604051631856a49960e21b815260040160405180910390fd5b600854600160c01b90046001600160401b03165b81811015610a01578460098281548110610970576109706124cd565b5f918252602090912060029091020154600160801b90046001600160401b031611156109f957600981815481106109a9576109a96124cd565b905f5260205f20906002020160010154600982815481106109cc576109cc6124cd565b905f5260205f2090600202015f0160109054906101000a90046001600160401b0316935093505050915091565b600101610954565b5050915091565b610a10610d56565b610e108163ffffffff161080610a2f57506301e133808163ffffffff16115b80610a4d575060085463ffffffff600160a01b909104811690821611155b15610a6b576040516307a5077760e51b815260040160405180910390fd5b6008805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610ad55750825b90505f826001600160401b03166001148015610af05750303b155b905081158015610afe575080155b15610b1c5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610b4657845460ff60401b1916600160401b1785555b610b4f8661135d565b610b5761136e565b610b62898989611376565b8315610ba857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b6009545f90610bc06107bd565b841180610bcb575080155b80610c155750600854600980549091600160c01b90046001600160401b0316908110610bf957610bf96124cd565b5f9182526020909120600290910201546001600160401b031684105b15610c335760405163b0b4387760e01b815260040160405180910390fd5b5f8080610c416001856124ba565b90505b81610cdd57600854600160c01b90046001600160401b03168110610cdd578660098281548110610c7657610c766124cd565b5f9182526020909120600290910201546001600160401b031611610ccb576001915060098181548110610cab57610cab6124cd565b5f9182526020909120600290910201546001600160401b03169250610cdd565b80610cd5816124e1565b915050610c44565b81610cfb5760405163b0b4387760e01b815260040160405180910390fd5b85610d0684896124ba565b119450505050505b92915050565b610d1c610d56565b6001600160a01b038116610d4a57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b610d53816112ed565b50565b33610d887f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146108ca5760405163118cdaa760e01b8152336004820152602401610d41565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181108061083f5760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401610d41565b5f610e2a6114a2565b9050610e34611cf3565b83516001600160401b0390811682526020850151168160016020020152604084810151828201526001546060830152600254608083015260035460a08301525f5460c08301525163ce537a7760e01b815273__$5c5c07cf4f55be9472c2b47d897172e765$__9063ce537a7790610eb3908590859088906004016126fc565b602060405180830381865af4158015610ece573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ef2919061292a565b610f0f576040516309bde33960e01b815260040160405180910390fd5b50505050565b60095415801590610f8a575060085460098054600160a01b830463ffffffff1692600160c01b90046001600160401b0316908110610f5557610f556124cd565b5f918252602090912060029091020154610f7f90600160401b90046001600160401b031684612949565b6001600160401b0316115b1561101d57600854600980549091600160c01b90046001600160401b0316908110610fb757610fb76124cd565b5f9182526020822060029091020180546001600160c01b03191681556001015560088054600160c01b90046001600160401b0316906018610ff783612970565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516080810182526001600160401b03948516815292841660208085019182528301518516848301908152929091015160608401908152600980546001810182555f91909152935160029094027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af81018054935194518716600160801b0267ffffffffffffffff60801b19958816600160401b026001600160801b03199095169690971695909517929092179290921693909317909155517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b090910155565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061118457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166111785f805160206129b1833981519152546001600160a01b031690565b6001600160a01b031614155b156108ca5760405163703e46dd60e11b815260040160405180910390fd5b6111aa610d56565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d9060200161060e565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561123d575060408051601f3d908101601f1916820190925261123a9181019061248f565b60015b61126557604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610d41565b5f805160206129b1833981519152811461129557604051632a87526960e21b815260048101829052602401610d41565b61129f8383611ad1565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108ca5760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b611365611b26565b610d5381611b6f565b6108ca611b26565b82516001600160401b031615158061139a575060208301516001600160401b031615155b806113a757506020820151155b806113b457506040820151155b806113c157506060820151155b806113cb57508151155b806113dd5750610e108163ffffffff16105b806113f157506301e133808163ffffffff16115b1561140f576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b03908116600160401b026001600160801b0319938416919095169081178517909355604096870151600581905586515f5590860151600155958501516002556060909401516003556006805490941617179091556007919091556008805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b6114aa611d11565b621000008152600760208201527f23783d0e9777b7af65fbf849da7edb75e74b1eaf503e025d7f2f7f80991befa26040820151527f2a4e2fe8adfa53f468525582d5184c4c70bbdb946c21f216418a9879705e54a76020604083015101527f0624b2c1e77f24afceaf39451743b9fa80d5853fca7ba00389c675650774009b6060820151527f250d7719e94ca2df00dfe327938f5a8d4d837779b99837ca777a53d39127b1796020606083015101527f0dc09515152eaea66d0db2f571cc995e369d26fe647394f10db5398c917519dc6080820151527f1273144d6cec2c4a68b24a149379c0f5592bb7fbddbe32fa171919950ca404cb6020608083015101527f119521bb68caec216e2f05eeb466fb3abfe1f39baf7fe7cb392ea057b6a2d9bf60a0820151527f2d52adeaba8045e53ab526fe9982d0ea452def6b3ea0253d27a19ef3b46e8428602060a083015101527f16c3b5b217d302975a920d13374524d7a52e4a50fd7fb930842271ebf4a84efd60c0820151527f200788916b907b196972bde304318e885a2521514b2db5e4a11899c51204f089602060c083015101527f1127581afe753defca9aef12e7332db9978a200b1699ce3888c0f3aea6111dc360e0820151527f0881e13f00723be1a04872ed02b2d078c31e80feaf27724e262ce97c2cb0bb1d602060e083015101527f1482a3a6bb91d6483d153683e2404f2f5546e0e895530fdf132091498406e3de610100820151527efa52db3d52d905ead1248102f3a80a43a90d8400c68f60a62c543c417b2f4b602061010083015101527f0a57dadd4a55199525ac6ac6fabc87a4cccfdc98142bcef9dbf47de00ecc5164610120820151527f18d95abd9b8e12c36936aa218cfff582548a6bbff25c338c2006eaeb1fe5b696602061012083015101527f2bc40e91dd169b8bc143a02952a1b6c6e627bfeb7a2bbe5078e14123f3c54c1c610140820151527f108d65a20c579b6d9883275eb6889fc3f5fc79735ca9f611a13b67daa2fbc8d0602061014083015101527f21bc1f86d0608e5f0626b467ee6f8282b619223f60a7acb0fc63ba7bdaf783be610160820151527f05ef3282f8eef01515fb9a8a7d6ca06b8b007d1d512403efb268fb03ce5f09e9602061016083015101527f2cab66c1cb5a83869e73ac34fbe467486999babd541d9010ee9a804806eee4ef610180820151527f2db1982419c5a4a17593acff9535fa967683d75c8aec01319b64b84aada2ad84602061018083015101527f2c38667c6c7eb868bdd30c34dd3f4b84d9b9b1a27d7867b364c8b7831423e9086101a0820151527f2b2cb4044dd51165c48138219d51cf8d1689f91ed3eeefead6e055eb488a2ce260206101a083015101527f2d48e54703011df2c74a14dafde3af4fd83ec71875d8ddc3554658640cc955016101c0820151527f243a99d80d32eb5408b59d5b08302bede070d3fb0a8efe2f2262f865bffb4d0d60206101c083015101527f0455d2325bf6269a66f07d838f55f36947a3cd9b87edd8480bced95cbb45cc116101e0820151527f0f66d9085a6ed60b838179987e240992bff4c0516ccf6ccde4a1ca94ce8b986460206101e083015101527f2bac0d23c8585d1487ec611b5effc97e5852fea43a7cba36ccdd2c207931f394610200820151527f1860b54e01a06aea5adb4b13bf5baebab92b736807a3a89ff2040992b06ee6ec602061020083015101527f0c0bfa1c2fc6f8ed01233d5168db1e1dfe725504f032f669f50a92ae77c72906610220820151527f0d741e124c7d1069b8a400cbcdcfd90128a533901ad4de1e037fe72984dc34cf602061022083015101527f01cfed30085c9efce04668205794aa39b1a8ee591234b4c77a22f8c26d899e05610240820151527f2ab68ac82d36cedb647d14a5b0035e8c9a0be84780b7bae1133a27a880966ed1602061024083015101527f072e1d50f8b5cf8d574b3847276477d95bbd5116351000841f728da44f4043b5610260820151527f23f8ea6eacd0876d57220f57eabacbe76a2323411663731a251d5dca36f1b59f602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b611ada82611b77565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611b1e5761129f8282611bda565b61083f611c4c565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166108ca57604051631afcd79f60e31b815260040160405180910390fd5b610d1c611b26565b806001600160a01b03163b5f03611bac57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610d41565b5f805160206129b183398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b031684604051611bf69190612995565b5f60405180830381855af49150503d805f8114611c2e576040519150601f19603f3d011682016040523d82523d5f602084013e611c33565b606091505b5091509150611c43858383611c6b565b95945050505050565b34156108ca5760405163b398979f60e01b815260040160405180910390fd5b606082611c8057611c7b82611cca565b611cc3565b8151158015611c9757506001600160a01b0384163b155b15611cc057604051639996b31560e01b81526001600160a01b0385166004820152602401610d41565b50805b9392505050565b805115611cda5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6040518060e001604052806007906020820280368337509192915050565b604051806102c001604052805f81526020015f8152602001611d4460405180604001604052805f81526020015f81525090565b8152602001611d6460405180604001604052805f81526020015f81525090565b8152602001611d8460405180604001604052805f81526020015f81525090565b8152602001611da460405180604001604052805f81526020015f81525090565b8152602001611dc460405180604001604052805f81526020015f81525090565b8152602001611de460405180604001604052805f81526020015f81525090565b8152602001611e0460405180604001604052805f81526020015f81525090565b8152602001611e2460405180604001604052805f81526020015f81525090565b8152602001611e4460405180604001604052805f81526020015f81525090565b8152602001611e6460405180604001604052805f81526020015f81525090565b8152602001611e8460405180604001604052805f81526020015f81525090565b8152602001611ea460405180604001604052805f81526020015f81525090565b8152602001611ec460405180604001604052805f81526020015f81525090565b8152602001611ee460405180604001604052805f81526020015f81525090565b8152602001611f0460405180604001604052805f81526020015f81525090565b8152602001611f2460405180604001604052805f81526020015f81525090565b8152602001611f4460405180604001604052805f81526020015f81525090565b8152602001611f6460405180604001604052805f81526020015f81525090565b81525f6020820181905260409091015290565b80356001600160a01b0381168114611f8d575f80fd5b919050565b5f60208284031215611fa2575f80fd5b611cc382611f77565b5f60208284031215611fbb575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b6040516102e081016001600160401b0381118282101715611ff957611ff9611fc2565b60405290565b604051601f8201601f191681016001600160401b038111828210171561202757612027611fc2565b604052919050565b80356001600160401b0381168114611f8d575f80fd5b5f60608284031215612055575f80fd5b604051606081018181106001600160401b038211171561207757612077611fc2565b6040529050806120868361202f565b81526120946020840161202f565b6020820152604083013560408201525092915050565b5f604082840312156120ba575f80fd5b604051604081018181106001600160401b03821117156120dc576120dc611fc2565b604052823581526020928301359281019290925250919050565b5f808284036104e0811215612109575f80fd5b6121138585612045565b925061048080605f1983011215612128575f80fd5b612130611fd6565b915061213f86606087016120aa565b825261214e8660a087016120aa565b60208301526121608660e087016120aa565b6040830152610120612174878288016120aa565b6060840152610160612188888289016120aa565b60808501526101a061219c89828a016120aa565b60a08601526101e06121b08a828b016120aa565b60c08701526102206121c48b828c016120aa565b60e08801526102606121d88c828d016120aa565b6101008901526102a06121ed8d828e016120aa565b878a01526121ff8d6102e08e016120aa565b6101408a01526122138d6103208e016120aa565b868a01526122258d6103608e016120aa565b6101808a01526103a08c0135948901949094526103c08b01356101c08901526103e08b0135928801929092526104008a01356102008801526104208a013590870152610440890135610240870152610460890135908601529287013561028085015250506104a0850135908201526104c0909301356102c08401525092909150565b5f80604083850312156122b8575f80fd5b6122c183611f77565b91506020808401356001600160401b03808211156122dd575f80fd5b818601915086601f8301126122f0575f80fd5b81358181111561230257612302611fc2565b612314601f8201601f19168501611fff565b91508082528784828501011115612329575f80fd5b80848401858401375f848284010152508093505050509250929050565b803563ffffffff81168114611f8d575f80fd5b5f60208284031215612369575f80fd5b611cc382612346565b5f805f80848603610120811215612387575f80fd5b6123918787612045565b94506080605f19820112156123a4575f80fd5b50604051608081018181106001600160401b03821117156123c7576123c7611fc2565b8060405250606086013581526080860135602082015260a0860135604082015260c086013560608201528093505061240160e08601612346565b91506124106101008601611f77565b905092959194509250565b5f5b8381101561243557818101518382015260200161241d565b50505f910152565b602081525f825180602084015261245b81604085016020870161241b565b601f01601f19169190910160400192915050565b5f8060408385031215612480575f80fd5b50508035926020909101359150565b5f6020828403121561249f575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610d0e57610d0e6124a6565b634e487b7160e01b5f52603260045260245ffd5b5f816124ef576124ef6124a6565b505f190190565b805f5b6007811015610f0f5781518452602093840193909101906001016124f9565b61252d82825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e08401525060808101516101006125908185018380518252602090810151910152565b60a083015191506101406125b08186018480518252602090810151910152565b60c084015192506101806125d08187018580518252602090810151910152565b60e085015193506101c06125f08188018680518252602090810151910152565b928501519350610200926126108785018680518252602090810151910152565b61012086015194506102406126318189018780518252602090810151910152565b928601519450610280926126518885018780518252602090810151910152565b61016087015195506102c0612672818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b5f610a60820190508451825260208501516020830152604085015161272e604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a085015161010061277b8185018380518252602090810151910152565b60c0870151915061014061279b8186018480518252602090810151910152565b60e088015192506101806127bb8187018580518252602090810151910152565b9188015192506101c0916127db8684018580518252602090810151910152565b61012089015193506102006127fc8188018680518252602090810151910152565b9189015193506102409161281c8784018680518252602090810151910152565b6101608a0151945061028061283d8189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e08301526129146105008301856124f6565b6129226105e0830184612518565b949350505050565b5f6020828403121561293a575f80fd5b81518015158114611cc3575f80fd5b6001600160401b03828116828216039080821115612969576129696124a6565b5092915050565b5f6001600160401b0380831681810361298b5761298b6124a6565b6001019392505050565b5f82516129a681846020870161241b565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a" +"0x60a06040523060805234801562000014575f80fd5b506200001f62000025565b620000d9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000765760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051612ecb620001005f395f81816110fd0152818161112601526112a30152612ecb5ff3fe6080604052600436106101ba575f3560e01c8063811f853f116100f2578063a1be8d5211610092578063d24d933d11610062578063d24d933d146105eb578063e03033011461061a578063f2fde38b14610639578063f9e50d1914610658575f80fd5b8063a1be8d5214610539578063ad3cb1cc14610558578063b2424e3f14610595578063c23b9e9e146105b3575f80fd5b80638da5cb5b116100cd5780638da5cb5b1461046a57806390c14390146104a657806396c1ca61146104c55780639fdb54a7146104e4575f80fd5b8063811f853f146103e4578063826e41fc146104035780638584d23f1461042e575f80fd5b8063426d31941161015d57806369cc6a041161013857806369cc6a0414610389578063715018a61461039d578063757c37ad146103b157806376671808146103d0575f80fd5b8063426d3194146103405780634f1ef2861461036257806352d1902d14610375575f80fd5b80630d8e6e2c116101985780630d8e6e2c1461027e5780632f79889d146102a9578063313df7b1146102e7578063378ec23b1461031e575f80fd5b8063013fa5fc146101be57806302b592f3146101df5780630625e19b1461023c575b5f80fd5b3480156101c9575f80fd5b506101dd6101d836600461237d565b61066c565b005b3480156101ea575f80fd5b506101fe6101f9366004612396565b61071f565b60405161023394939291906001600160401b039485168152928416602084015292166040820152606081019190915260800190565b60405180910390f35b348015610247575f80fd5b5060055460065460075460085461025e9392919084565b604080519485526020850193909352918301526060820152608001610233565b348015610289575f80fd5b5060408051600181525f6020820181905291810191909152606001610233565b3480156102b4575f80fd5b50600d546102cf90600160c01b90046001600160401b031681565b6040516001600160401b039091168152602001610233565b3480156102f2575f80fd5b50600d54610306906001600160a01b031681565b6040516001600160a01b039091168152602001610233565b348015610329575f80fd5b50610332610768565b604051908152602001610233565b34801561034b575f80fd5b5060015460025460035460045461025e9392919084565b6101dd61037036600461241a565b6107cf565b348015610380575f80fd5b506103326107ee565b348015610394575f80fd5b506101dd610809565b3480156103a8575f80fd5b506101dd610877565b3480156103bc575f80fd5b506101dd6103cb3660046125e3565b610888565b3480156103db575f80fd5b506102cf610b5a565b3480156103ef575f80fd5b506101dd6103fe3660046127bc565b610b7f565b34801561040e575f80fd5b50600d546001600160a01b031615155b6040519015158152602001610233565b348015610439575f80fd5b5061044d610448366004612396565b610ca3565b604080519283526001600160401b03909116602083015201610233565b348015610475575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610306565b3480156104b1575f80fd5b506102cf6104c0366004612822565b610dce565b3480156104d0575f80fd5b506101dd6104df366004612853565b610e2b565b3480156104ef575f80fd5b50600b54600c54610513916001600160401b0380821692600160401b909204169083565b604080516001600160401b03948516815293909216602084015290820152606001610233565b348015610544575f80fd5b5061041e61055336600461286c565b610eb4565b348015610563575f80fd5b50610588604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161023391906128a7565b3480156105a0575f80fd5b505f546102cf906001600160401b031681565b3480156105be575f80fd5b50600d546105d690600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610233565b3480156105f6575f80fd5b50600954600a54610513916001600160401b0380821692600160401b909204169083565b348015610625575f80fd5b5061041e6106343660046128d9565b610ef6565b348015610644575f80fd5b506101dd61065336600461237d565b611055565b348015610663575f80fd5b50600e54610332565b610674611097565b6001600160a01b03811661069b5760405163e6c4247b60e01b815260040160405180910390fd5b600d546001600160a01b03908116908216036106ca5760405163a863aec960e01b815260040160405180910390fd5b600d80546001600160a01b0319166001600160a01b0383169081179091556040519081527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b600e818154811061072e575f80fd5b5f918252602090912060029091020180546001909101546001600160401b038083169350600160401b8304811692600160801b9004169084565b5f60646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ca91906128f9565b905090565b6107d76110f2565b6107e082611196565b6107ea82826111d7565b5050565b5f6107f7611298565b505f80516020612e9f83398151915290565b610811611097565b600d546001600160a01b03161561085c57600d80546001600160a01b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c02450905f90a1565b60405163a863aec960e01b815260040160405180910390fd5b565b61087f611097565b6108755f6112e1565b600d546001600160a01b0316151580156108ad5750600d546001600160a01b03163314155b156108cb576040516301474c8f60e71b815260040160405180910390fd5b600b5483516001600160401b0391821691161115806109045750600b5460208401516001600160401b03600160401b9092048216911611155b156109225760405163051c46ef60e01b815260040160405180910390fd5b61092f8360400151611351565b5f610938610b5a565b60208501515f80549293509161095791906001600160401b0316610dce565b9050610964826001612924565b6001600160401b0316816001600160401b031614801561099d5750600b5461099b90600160401b90046001600160401b0316610eb4565b155b80156109b157505f826001600160401b0316115b156109cf57604051637150de4560e01b815260040160405180910390fd5b6109da826002612924565b6001600160401b0316816001600160401b031610610a0b57604051637150de4560e01b815260040160405180910390fd5b610a188460200151611351565b610a258460400151611351565b610a328460600151611351565b610a3d8585856113c1565b8451600b805460208801516001600160401b03818116600160401b026001600160801b03199093169416939093171790556040860151600c55610a7f90610eb4565b15610ae95783516005556020840151600655604084015160075560608401516008557f31eabd9099fdb25dacddd206abff87311e553441fc9d0fcdef201062d7e7071b610acd826001612924565b6040516001600160401b03909116815260200160405180910390a15b610afb610af4610768565b4287611519565b84602001516001600160401b0316855f01516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae68760400151604051610b4b91815260200190565b60405180910390a35050505050565b600b545f805490916107ca916001600160401b03600160401b90920482169116610dce565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610bc35750825b90505f826001600160401b03166001148015610bde5750303b155b905081158015610bec575080155b15610c0a5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610c3457845460ff60401b1916600160401b1785555b610c3d87611702565b610c45611713565b610c518a8a8a8961171b565b8315610c9757845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b600e80545f91829190610cb760018361294b565b81548110610cc757610cc761295e565b5f918252602090912060029091020154600160801b90046001600160401b03168410610d0657604051631856a49960e21b815260040160405180910390fd5b600d54600160c01b90046001600160401b03165b81811015610dc75784600e8281548110610d3657610d3661295e565b5f918252602090912060029091020154600160801b90046001600160401b03161115610dbf57600e8181548110610d6f57610d6f61295e565b905f5260205f20906002020160010154600e8281548110610d9257610d9261295e565b905f5260205f2090600202015f0160109054906101000a90046001600160401b0316935093505050915091565b600101610d1a565b5050915091565b5f816001600160401b03165f03610de657505f610e25565b610df08284612986565b6001600160401b03165f03610e1057610e0982846129ab565b9050610e25565b610e1a82846129ab565b610e09906001612924565b92915050565b610e33611097565b610e108163ffffffff161080610e5257506301e133808163ffffffff16115b80610e705750600d5463ffffffff600160a01b909104811690821611155b15610e8e576040516307a5077760e51b815260040160405180910390fd5b600d805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b5f816001600160401b03165f03610ecc57505f919050565b5f54610ee1906001600160401b031683612986565b6001600160401b03161592915050565b919050565b600e545f90610f03610768565b841180610f0e575080155b80610f585750600d54600e80549091600160c01b90046001600160401b0316908110610f3c57610f3c61295e565b5f9182526020909120600290910201546001600160401b031684105b15610f765760405163b0b4387760e01b815260040160405180910390fd5b5f8080610f8460018561294b565b90505b8161102057600d54600160c01b90046001600160401b031681106110205786600e8281548110610fb957610fb961295e565b5f9182526020909120600290910201546001600160401b03161161100e5760019150600e8181548110610fee57610fee61295e565b5f9182526020909120600290910201546001600160401b03169250611020565b80611018816129d0565b915050610f87565b8161103e5760405163b0b4387760e01b815260040160405180910390fd5b85611049848961294b565b11979650505050505050565b61105d611097565b6001600160a01b03811661108b57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b611094816112e1565b50565b336110c97f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146108755760405163118cdaa760e01b8152336004820152602401611082565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061117857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661116c5f80516020612e9f833981519152546001600160a01b031690565b6001600160a01b031614155b156108755760405163703e46dd60e11b815260040160405180910390fd5b61119e611097565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d90602001610714565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611231575060408051601f3d908101601f1916820190925261122e918101906128f9565b60015b61125957604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611082565b5f80516020612e9f833981519152811461128957604051632a87526960e21b815260048101829052602401611082565b6112938383611895565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108755760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110806107ea5760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401611082565b5f6113ca6118ea565b90506113d46120e2565b84516001600160401b0390811682526020808701805190921690830152604080870151908301526006546060830152600754608083015260085460a083015260055460c08301525161142590610eb4565b1561145757602084015160e082015260408401516101008201526060840151610120820152835161014082015261147b565b60065460e08201526007546101008201526008546101208201526005546101408201525b60405163fc8660c760e01b815273__$5c5c07cf4f55be9472c2b47d897172e765$__9063fc8660c7906114b690859085908890600401612bf1565b602060405180830381865af41580156114d1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114f59190612e1f565b611512576040516309bde33960e01b815260040160405180910390fd5b5050505050565b600e541580159061158e5750600d54600e8054600160a01b830463ffffffff1692600160c01b90046001600160401b03169081106115595761155961295e565b5f91825260209091206002909102015461158390600160401b90046001600160401b031684612e3e565b6001600160401b0316115b1561162157600d54600e80549091600160c01b90046001600160401b03169081106115bb576115bb61295e565b5f9182526020822060029091020180546001600160c01b031916815560010155600d8054600160c01b90046001600160401b03169060186115fb83612e5e565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516080810182526001600160401b03948516815292841660208085019182528301518516848301908152929091015160608401908152600e80546001810182555f91909152935160029094027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd81018054935194518716600160801b0267ffffffffffffffff60801b19958816600160401b026001600160801b03199095169690971695909517929092179290921693909317909155517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe90910155565b61170a611f15565b61109481611f5e565b610875611f15565b83516001600160401b031615158061173f575060208401516001600160401b031615155b8061174c57506020830151155b8061175957506040830151155b8061176657506060830151155b8061177057508251155b806117825750610e108263ffffffff16105b8061179657506301e133808263ffffffff16115b806117a857506001600160401b038116155b156117c6576040516350dd03f760e11b815260040160405180910390fd5b8351600980546020808801516001600160401b03908116600160401b026001600160801b03199384169582169586178117909455604098890151600a819055600b8054909416909517909317909155600c92909255845160018190559185015160028190559585015160038190556060909501516004819055600592909255600695909555600793909355600892909255600d805463ffffffff909216600160a01b0263ffffffff60a01b199092169190911790555f80549190921667ffffffffffffffff1991909116179055565b61189e82611f66565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156118e2576112938282611fc9565b6107ea61203b565b6118f2612101565b621000008152600b60208201527f26867ee58aaf860fc9e0e3a78666ffc51f3ba1ad8ae001c196830c55b5af0b8c6040820151527f091230adb753f82815151277060cc56b546bb2e950a0de19ed061ec68c071a906020604083015101527f02a509a06d8c56f83f204688ff6e42eac6e3cbdd063b0971a3af953e81badbb66060820151527f06f43ed2b9cece35d1201abc13ffdaea35560cf0f1446277138ce812b9ad9f396020606083015101527f1a588c99ad88f789c87722b061bb5535daa0abcc1dc6d176d7fea51e5d80b9266080820151527f2062b995e61a6ab8aab6cd6e7520b879d84f965ab1f094c104f0c1213b28038b6020608083015101527f21a2fd766a0cebecfdbfdfe56139a1bbd9aec15e2e35be8ef01934a0ec43868560a0820151527f20fe500ac7d1aa7820db8c6f7f9d509e3b2e88731e3a12dd65f06f43ca930da0602060a083015101527f0ab53d1285c7f4819b3ff6e1ddada6bf2515d34bbaf61186c6a04be47dfd65a360c0820151527f0b80a9878082cdfdd9fcc16bb33fa424c0ad66b81949bf642153d3c7ad082f22602060c083015101527f1b900f8e5f8e8064a5888a1bd796b54a2652fc02034fe4b6e6fc8d6650f7453b60e0820151527ecca258a8832c64d1f8e1721a78fc25b13d29adbb81e35a79fc2f49f8902786602060e083015101527f0d1d3348d642e6f2e9739d735d8c723676dbaefdcbb4e96641defa353d26ebb3610100820151527f14fe9d6a335104e7491ca6d5086113e6b0f52946960d726664667bd58539d41e602061010083015101527f1da94364440c4e3fb8af2d363cdefa4edda437579e1b056a16a5e9a11dffa2ab610120820151527f0a077bd307ed31222db55cb0128bafce5e22557b57f5ac915359c50296cb5c77602061012083015101527f28ff80b133d989235c7129dea54469b780ac4717449290067e7c9a7d5be7dbd5610140820151527f1c0fc22eef23b50a2ddc553f9fc1b61fd8c57a58ca321a829c7ec255f757b3a6602061014083015101527e3c4e21e5dfba62a5b1702fb0ef234bfe95a77701a456882350526d140243f5610160820151527f06012db82876ba33e6e8f80a51013662e56c4abc86a7d85c272e19a6d7f57d0b602061016083015101527f16d5247dbdeae1df70093e5ee77272959661e0fbabda431777fa729f5b532f44610180820151527e8d9ee00f799cf00608b082d03b9de5a42b8126c35fbfbd1e602108df10e0e3602061018083015101527f2f526c6981643ff6f6e9d2b5a921e06cf95f274629b5a145bd552b7fda6a87006101a0820151527f2fe7108fd4e24231f3dadb6e09072e106fca0694fe39dff96557a88221a89a5060206101a083015101527f26a3568598a6981e6325f4816736e381087b5b0e4b27ef364d8ae1e29fe9df996101c0820151527f1db81cdf82a9ec99f3c9716df22d38317e6bb84fc57d2f0e7b2bc8a0569f7cc460206101c083015101527e99888088e11de6ed086c99b9bba986d908df5b0c5007680d97567d485719946101e0820151527f1f91576eadffff932b6e54bab022f93f6fec3e5b7674d0006bc5f2223527a34860206101e083015101527e68b3c117ee7e84d6b670b6af20197759ec80d34f3c594328663031e9cd7e02610200820151527f1c3832e24877346680e7047bae2cfcd51fafe3e7caf199e9dfc8e8f10c2b6943602061020083015101527f164cdd9ad5d4e96e109073e8e735cd4ac64aba6ddaa244da6701369c8cba5daf610220820151527f16c41e647f1ab0d45c891544299e4ef9c004d8bc0a3bf096dc38ce8ed90c0d67602061022083015101527f134ba7a9567ba20e1f35959ee8c2cd688d3a962bb1797e8ab8e511768de0ce83610240820151527f02e4d286c9435f7bd94c1a2c78b99966d06faca1ae45de78149950a4fefcd6e7602061024083015101527f039a0b2d920f29e35cb2a9e1ec6cc22ac1d482af45e47399724a0745d542e839610260820151527f15ac2658bfdd2227aebf8e20935935a648819e1dcea807da1c838abfa7896c63602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661087557604051631afcd79f60e31b815260040160405180910390fd5b61105d611f15565b806001600160a01b03163b5f03611f9b57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611082565b5f80516020612e9f83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b031684604051611fe59190612e83565b5f60405180830381855af49150503d805f811461201d576040519150601f19603f3d011682016040523d82523d5f602084013e612022565b606091505b509150915061203285838361205a565b95945050505050565b34156108755760405163b398979f60e01b815260040160405180910390fd5b60608261206f5761206a826120b9565b6120b2565b815115801561208657506001600160a01b0384163b155b156120af57604051639996b31560e01b81526001600160a01b0385166004820152602401611082565b50805b9392505050565b8051156120c95780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b604051806101600160405280600b906020820280368337509192915050565b604051806102c001604052805f81526020015f815260200161213460405180604001604052805f81526020015f81525090565b815260200161215460405180604001604052805f81526020015f81525090565b815260200161217460405180604001604052805f81526020015f81525090565b815260200161219460405180604001604052805f81526020015f81525090565b81526020016121b460405180604001604052805f81526020015f81525090565b81526020016121d460405180604001604052805f81526020015f81525090565b81526020016121f460405180604001604052805f81526020015f81525090565b815260200161221460405180604001604052805f81526020015f81525090565b815260200161223460405180604001604052805f81526020015f81525090565b815260200161225460405180604001604052805f81526020015f81525090565b815260200161227460405180604001604052805f81526020015f81525090565b815260200161229460405180604001604052805f81526020015f81525090565b81526020016122b460405180604001604052805f81526020015f81525090565b81526020016122d460405180604001604052805f81526020015f81525090565b81526020016122f460405180604001604052805f81526020015f81525090565b815260200161231460405180604001604052805f81526020015f81525090565b815260200161233460405180604001604052805f81526020015f81525090565b815260200161235460405180604001604052805f81526020015f81525090565b81525f6020820181905260409091015290565b80356001600160a01b0381168114610ef1575f80fd5b5f6020828403121561238d575f80fd5b6120b282612367565b5f602082840312156123a6575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b6040516102e081016001600160401b03811182821017156123e4576123e46123ad565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612412576124126123ad565b604052919050565b5f806040838503121561242b575f80fd5b61243483612367565b91506020808401356001600160401b0380821115612450575f80fd5b818601915086601f830112612463575f80fd5b813581811115612475576124756123ad565b612487601f8201601f191685016123ea565b9150808252878482850101111561249c575f80fd5b80848401858401375f848284010152508093505050509250929050565b80356001600160401b0381168114610ef1575f80fd5b5f606082840312156124df575f80fd5b604051606081018181106001600160401b0382111715612501576125016123ad565b604052905080612510836124b9565b815261251e602084016124b9565b6020820152604083013560408201525092915050565b5f60808284031215612544575f80fd5b604051608081018181106001600160401b0382111715612566576125666123ad565b8060405250809150823581526020830135602082015260408301356040820152606083013560608201525092915050565b5f604082840312156125a7575f80fd5b604051604081018181106001600160401b03821117156125c9576125c96123ad565b604052823581526020928301359281019290925250919050565b5f805f8385036105608112156125f7575f80fd5b61260186866124cf565b93506126108660608701612534565b92506104808060df1983011215612625575f80fd5b61262d6123c1565b915061263c8760e08801612597565b825261012061264d88828901612597565b602084015261016061266189828a01612597565b60408501526101a06126758a828b01612597565b60608601526101e06126898b828c01612597565b608087015261022061269d8c828d01612597565b60a08801526102606126b18d828e01612597565b60c08901526102a06126c58e828f01612597565b60e08a01526126d88e6102e08f01612597565b6101008a01526126ec8e6103208f01612597565b878a01526126fe8e6103608f01612597565b6101408a01526127128e6103a08f01612597565b868a01526127248e6103e08f01612597565b6101808a01526104208d0135858a01526104408d01356101c08a01526104608d0135848a0152878d01356102008a01526104a08d0135838a01526104c08d01356102408a01526104e08d0135828a01526105008d01356102808a01526105208d0135818a015250505050505050506105408501356102c0820152809150509250925092565b803563ffffffff81168114610ef1575f80fd5b5f805f805f61014086880312156127d1575f80fd5b6127db87876124cf565b94506127ea8760608801612534565b93506127f860e087016127a9565b92506128076101008701612367565b915061281661012087016124b9565b90509295509295909350565b5f8060408385031215612833575f80fd5b61283c836124b9565b915061284a602084016124b9565b90509250929050565b5f60208284031215612863575f80fd5b6120b2826127a9565b5f6020828403121561287c575f80fd5b6120b2826124b9565b5f5b8381101561289f578181015183820152602001612887565b50505f910152565b602081525f82518060208401526128c5816040850160208701612885565b601f01601f19169190910160400192915050565b5f80604083850312156128ea575f80fd5b50508035926020909101359150565b5f60208284031215612909575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111561294457612944612910565b5092915050565b81810381811115610e2557610e25612910565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f6001600160401b038084168061299f5761299f612972565b92169190910692915050565b5f6001600160401b03808416806129c4576129c4612972565b92169190910492915050565b5f816129de576129de612910565b505f190190565b805f5b600b811015612a075781518452602093840193909101906001016129e8565b50505050565b612a2282825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e0840152506080810151610100612a858185018380518252602090810151910152565b60a08301519150610140612aa58186018480518252602090810151910152565b60c08401519250610180612ac58187018580518252602090810151910152565b60e085015193506101c0612ae58188018680518252602090810151910152565b92850151935061020092612b058785018680518252602090810151910152565b6101208601519450610240612b268189018780518252602090810151910152565b92860151945061028092612b468885018780518252602090810151910152565b61016087015195506102c0612b67818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b5f610ae08201905084518252602085015160208301526040850151612c23604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a0850151610100612c708185018380518252602090810151910152565b60c08701519150610140612c908186018480518252602090810151910152565b60e08801519250610180612cb08187018580518252602090810151910152565b9188015192506101c091612cd08684018580518252602090810151910152565b6101208901519350610200612cf18188018680518252602090810151910152565b91890151935061024091612d118784018680518252602090810151910152565b6101608a01519450610280612d328189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e0830152612e096105008301856129e5565b612e17610660830184612a0d565b949350505050565b5f60208284031215612e2f575f80fd5b815180151581146120b2575f80fd5b6001600160401b0382811682821603908082111561294457612944612910565b5f6001600160401b03808316818103612e7957612e79612910565b6001019392505050565b5f8251612e94818460208701612885565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a" diff --git a/contract-bindings/artifacts/LightClientMock_bytecode.json b/contract-bindings/artifacts/LightClientMock_bytecode.json index a7835c8b85..38058e70b5 100644 --- a/contract-bindings/artifacts/LightClientMock_bytecode.json +++ b/contract-bindings/artifacts/LightClientMock_bytecode.json @@ -1 +1 @@ -"0x60a06040523060805234801562000014575f80fd5b506040516200306f3803806200306f8339810160408190526200003791620002d8565b6200004162000057565b6200004e8383836200010b565b5050506200038c565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000a85760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001085780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b82516001600160401b031615158062000130575060208301516001600160401b031615155b806200013e57506020820151155b806200014c57506040820151155b806200015a57506060820151155b806200016557508151155b80620001785750610e108163ffffffff16105b806200018d57506301e133808163ffffffff16115b15620001ac576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b0390811668010000000000000000026001600160801b0319938416919095169081178517909355604096870151600581905586515f5590860151600155958501516002556060909401516003556006805490941617179091556007919091556008805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b604051606081016001600160401b03811182821017156200027357634e487b7160e01b5f52604160045260245ffd5b60405290565b604051608081016001600160401b03811182821017156200027357634e487b7160e01b5f52604160045260245ffd5b80516001600160401b0381168114620002bf575f80fd5b919050565b805163ffffffff81168114620002bf575f80fd5b5f805f838503610100811215620002ed575f80fd5b6060811215620002fb575f80fd5b6200030562000244565b6200031086620002a8565b81526200032060208701620002a8565b60208201526040868101519082015293506080605f198201121562000343575f80fd5b506200034e62000279565b60608581015182526080860151602083015260a0860151604083015260c08601519082015291506200038360e08501620002c4565b90509250925092565b608051612cbc620003b35f395f818161113f0152818161116801526112e50152612cbc5ff3fe6080604052600436106101af575f3560e01c80638584d23f116100e7578063c23b9e9e11610087578063e030330111610062578063e030330114610614578063f2fde38b14610633578063f567616014610652578063f9e50d1914610671575f80fd5b8063c23b9e9e14610592578063c8e5e498146105ca578063d24d933d146105e5575f80fd5b80639baa3cc9116100c25780639baa3cc91461048a5780639fdb54a7146104a9578063ad3cb1cc146104fe578063b5adea3c1461053b575f80fd5b80638584d23f146103f35780638da5cb5b1461042f57806396c1ca611461046b575f80fd5b8063378ec23b1161015257806352d1902d1161012d57806352d1902d1461038c57806369cc6a04146103a0578063715018a6146103b4578063826e41fc146103c8575f80fd5b8063378ec23b1461031c578063426d3194146103385780634f1ef28614610379575f80fd5b80632063d4f71161018d5780632063d4f71461025c5780632d52aad61461027b5780632f79889d146102a7578063313df7b1146102e5575f80fd5b8063013fa5fc146101b357806302b592f3146101d45780630d8e6e2c14610231575b5f80fd5b3480156101be575f80fd5b506101d26101cd366004612168565b610685565b005b3480156101df575f80fd5b506101f36101ee366004612181565b610738565b60405161022894939291906001600160401b039485168152928416602084015292166040820152606081019190915260800190565b60405180910390f35b34801561023c575f80fd5b5060408051600181525f6020820181905291810191909152606001610228565b348015610267575f80fd5b506101d26102763660046122ee565b610781565b348015610286575f80fd5b506101d2610295366004612181565b600a805460ff19166001179055600b55565b3480156102b2575f80fd5b506008546102cd90600160c01b90046001600160401b031681565b6040516001600160401b039091168152602001610228565b3480156102f0575f80fd5b50600854610304906001600160a01b031681565b6040516001600160a01b039091168152602001610228565b348015610327575f80fd5b50435b604051908152602001610228565b348015610343575f80fd5b505f546001546002546003546103599392919084565b604080519485526020850193909352918301526060820152608001610228565b6101d261038736600461249f565b6108db565b348015610397575f80fd5b5061032a6108fa565b3480156103ab575f80fd5b506101d2610915565b3480156103bf575f80fd5b506101d2610983565b3480156103d3575f80fd5b506008546001600160a01b031615155b6040519015158152602001610228565b3480156103fe575f80fd5b5061041261040d366004612181565b610994565b604080519283526001600160401b03909116602083015201610228565b34801561043a575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610304565b348015610476575f80fd5b506101d2610485366004612551565b610abf565b348015610495575f80fd5b506101d26104a436600461256a565b610b48565b3480156104b4575f80fd5b506006546007546104d8916001600160401b0380821692600160401b909204169083565b604080516001600160401b03948516815293909216602084015290820152606001610228565b348015610509575f80fd5b5061052e604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516102289190612614565b348015610546575f80fd5b506101d2610555366004612646565b80516006805460208401516001600160401b03908116600160401b026001600160801b031990921693169290921791909117905560400151600755565b34801561059d575f80fd5b506008546105b590600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610228565b3480156105d5575f80fd5b506101d2600a805460ff19169055565b3480156105f0575f80fd5b506004546005546104d8916001600160401b0380821692600160401b909204169083565b34801561061f575f80fd5b506103e361062e366004612660565b610c6a565b34801561063e575f80fd5b506101d261064d366004612168565b610c9f565b34801561065d575f80fd5b506101d261066c366004612680565b610ce1565b34801561067c575f80fd5b5060095461032a565b61068d610d8c565b6001600160a01b0381166106b45760405163e6c4247b60e01b815260040160405180910390fd5b6008546001600160a01b03908116908216036106e35760405163a863aec960e01b815260040160405180910390fd5b600880546001600160a01b0319166001600160a01b0383169081179091556040519081527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b60098181548110610747575f80fd5b5f918252602090912060029091020180546001909101546001600160401b038083169350600160401b8304811692600160801b9004169084565b6008546001600160a01b0316151580156107a657506008546001600160a01b03163314155b156107c4576040516301474c8f60e71b815260040160405180910390fd5b60065482516001600160401b0391821691161115806107fd575060065460208301516001600160401b03600160401b9092048216911611155b1561081b5760405163051c46ef60e01b815260040160405180910390fd5b6108288260400151610de7565b6108328282610e57565b81516006805460208501516001600160401b03908116600160401b026001600160801b0319909216931692909217919091179055604082015160075561087f6108784390565b4284610f4b565b81602001516001600160401b0316825f01516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae684604001516040516108cf91815260200190565b60405180910390a35050565b6108e3611134565b6108ec826111d8565b6108f68282611219565b5050565b5f6109036112da565b505f80516020612c9083398151915290565b61091d610d8c565b6008546001600160a01b03161561096857600880546001600160a01b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c02450905f90a1565b60405163a863aec960e01b815260040160405180910390fd5b565b61098b610d8c565b6109815f611323565b600980545f918291906109a8600183612782565b815481106109b8576109b8612795565b5f918252602090912060029091020154600160801b90046001600160401b031684106109f757604051631856a49960e21b815260040160405180910390fd5b600854600160c01b90046001600160401b03165b81811015610ab8578460098281548110610a2757610a27612795565b5f918252602090912060029091020154600160801b90046001600160401b03161115610ab05760098181548110610a6057610a60612795565b905f5260205f2090600202016001015460098281548110610a8357610a83612795565b905f5260205f2090600202015f0160109054906101000a90046001600160401b0316935093505050915091565b600101610a0b565b5050915091565b610ac7610d8c565b610e108163ffffffff161080610ae657506301e133808163ffffffff16115b80610b04575060085463ffffffff600160a01b909104811690821611155b15610b22576040516307a5077760e51b815260040160405180910390fd5b6008805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610b8c5750825b90505f826001600160401b03166001148015610ba75750303b155b905081158015610bb5575080155b15610bd35760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610bfd57845460ff60401b1916600160401b1785555b610c0686611393565b610c0e6113a4565b610c198989896113ac565b8315610c5f57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b600a545f9060ff16610c8557610c8083836114d8565b610c96565b81600b5484610c949190612782565b115b90505b92915050565b610ca7610d8c565b6001600160a01b038116610cd557604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b610cde81611323565b50565b610cec60095f611e82565b5f5b81518110156108f6576009828281518110610d0b57610d0b612795565b6020908102919091018101518254600181810185555f94855293839020825160029092020180549383015160408401516001600160401b03908116600160801b0267ffffffffffffffff60801b19928216600160401b026001600160801b031990971691909416179490941793909316178255606001519082015501610cee565b33610dbe7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146109815760405163118cdaa760e01b8152336004820152602401610ccc565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110806108f65760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401610ccc565b5f610e60611630565b9050610e6a611ea0565b83516001600160401b0390811682526020850151168160016020020152604084810151828201526001546060830152600254608083015260035460a08301525f5460c08301525163ce537a7760e01b815273__$5c5c07cf4f55be9472c2b47d897172e765$__9063ce537a7790610ee9908590859088906004016129af565b602060405180830381865af4158015610f04573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f289190612bdd565b610f45576040516309bde33960e01b815260040160405180910390fd5b50505050565b60095415801590610fc0575060085460098054600160a01b830463ffffffff1692600160c01b90046001600160401b0316908110610f8b57610f8b612795565b5f918252602090912060029091020154610fb590600160401b90046001600160401b031684612bfc565b6001600160401b0316115b1561105357600854600980549091600160c01b90046001600160401b0316908110610fed57610fed612795565b5f9182526020822060029091020180546001600160c01b03191681556001015560088054600160c01b90046001600160401b031690601861102d83612c23565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516080810182526001600160401b03948516815292841660208085019182528301518516848301908152929091015160608401908152600980546001810182555f91909152935160029094027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af81018054935194518716600160801b0267ffffffffffffffff60801b19958816600160401b026001600160801b03199095169690971695909517929092179290921693909317909155517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b090910155565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806111ba57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166111ae5f80516020612c90833981519152546001600160a01b031690565b6001600160a01b031614155b156109815760405163703e46dd60e11b815260040160405180910390fd5b6111e0610d8c565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d9060200161072d565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611273575060408051601f3d908101601f1916820190925261127091810190612c48565b60015b61129b57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610ccc565b5f80516020612c9083398151915281146112cb57604051632a87526960e21b815260048101829052602401610ccc565b6112d58383611c60565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109815760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b61139b611cb5565b610cde81611cfe565b610981611cb5565b82516001600160401b03161515806113d0575060208301516001600160401b031615155b806113dd57506020820151155b806113ea57506040820151155b806113f757506060820151155b8061140157508151155b806114135750610e108163ffffffff16105b8061142757506301e133808163ffffffff16115b15611445576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b03908116600160401b026001600160801b0319938416919095169081178517909355604096870151600581905586515f5590860151600155958501516002556060909401516003556006805490941617179091556007919091556008805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b6009545f90438411806114e9575080155b806115335750600854600980549091600160c01b90046001600160401b031690811061151757611517612795565b5f9182526020909120600290910201546001600160401b031684105b156115515760405163b0b4387760e01b815260040160405180910390fd5b5f808061155f600185612782565b90505b816115fb57600854600160c01b90046001600160401b031681106115fb57866009828154811061159457611594612795565b5f9182526020909120600290910201546001600160401b0316116115e95760019150600981815481106115c9576115c9612795565b5f9182526020909120600290910201546001600160401b031692506115fb565b806115f381612c5f565b915050611562565b816116195760405163b0b4387760e01b815260040160405180910390fd5b856116248489612782565b11979650505050505050565b611638611ebe565b620100008152600760208201527f1369aa78dc50135ad756d62c97a64a0edcd30066584168200d9d1facf82ca4f56040820151527f2cf23456d712b06f8e3aa5bf0acc3e46a3d094602a3a2b99d873bba05a4391476020604083015101527f08a35f379d2d2c490a51006697275e4db79b67b4a175c1477e262d29e25e42316060820151527f218828131bb7940ccc88c561b299755af4bf0b71ed930b129e8be0a1218139ea6020606083015101527f23a2172436c1145b36d5bc6d3b31fa1610c73a543ea443918aaa3ee175f9921b6080820151527f2502adf404d62877c310214ae9942e93c40b154d34c024bab48a3ca057e60a116020608083015101527f1bb88ada91ab7734882f7826b81275320081ac485f9cf8bfbc3ba54b6eb4dff360a0820151527f25c74a27e9a3b20114a3a91f31c20f01777e7ed913e0ef949f0285e2e7c2069b602060a083015101527f12b0ce76ac8b0dbd405ebc5dd0bae0f91aed50033c7ea36fc62aaba2b98333dc60c0820151527f185b42af49dd1cbe337a84f74b704172428e754a0bea024ab3eb2f996afb2c47602060c083015101527f21f53ad4538b45438bbf0521446070223920e3df6f9022a64cc16d7f94e85c0860e0820151527f2278ac3dedfdac7feb9725a022497175518eada52c8932fc40e6e75bea889fb8602060e083015101527f0876136f81c16298487bfb1be74d4a3487ec45645ab1d09dc2e5b865d62230df610100820151527f098c641c947ecd798dfd5e1b2fe428024cdf03061a53ff774ea8a9e3de9d3f2b602061010083015101527f15eaac2c6232d2268bf79dc47ed9666f992fb3d96ad23fb21690c21586c5472e610120820151527f0f10f1ffc54881287fda6f200bc85d8245b508d844a974098a41119867b325d0602061012083015101527f0895ceea40b085534e9739ca5442ba48b3a3592affde2b509df74521b47d8ab0610140820151527f2e12ec5800ac92fe2a8e7040bc5b435b9eb71e31380173fa7688bf81fcbba455602061014083015101527f2f5384eb5653e47576efe248e7903f463243414bfed5237dda750df3996bd918610160820151527f1c3cd6b11da8704cdc871ab4fa323d7ee57bd40ce165b49a56d5ef6489cd251a602061016083015101527f13579994957ce1554cc1e5b194fb63c9513707f627414f8442681ae736e36450610180820151527f26c9bdcd96d8e420b12974ade93ad9c312c4185213d2f6831a7c625a18890e95602061018083015101527f0cc70a1d542a9a1535ae5d9201696adc5c99c1bcebd9951dfa8afec79fa0b6446101a0820151527f10b043d9f1869181b96579d6616efc17a5df7b84c4d431d966c9094bf1e8815360206101a083015101527f198a65309d131a43b0ab1c47659d0336cfbf62b27f4727106b4fd971c73dd4036101c0820151527f23df99eac3c1947903b211b800efeb76f47d5e87b7414866543492e8c7798d1a60206101c083015101527f221cc5e47b81ce8dcfa72ef981916a8eddef12fcde59c56c62830c126ebef0de6101e0820151527f231f99340c35c9e09652a6df73c9cec5d88738cb71ff45716fdc9e9e45a4926e60206101e083015101527f2c9f1489fce0f263e03f3e97bf0a72273aafcca9325ff47786adb04a52a6d22c610200820151527f21f66e28f17e01e9fd593e16d022c4eca25bd5db96daec606d97b604cc414838602061020083015101527f2015745604a9571e226bd99043cfaf1f96267cc5de67f497563ff81100531d26610220820151527f206889ff4c58dd08ee1107191a2a5bc5dbae55c49d7d8397801799868d10f805602061022083015101527f21062ab8f8ecd8932b429a1eb8614b1e03db61bff6a5cd2d5d7ea193e90e9927610240820151527f217f9b27b934b88ffe555d682dfe6e8b6d503f86b14bbd96342bc48487a60b27602061024083015101527f1c9eda2d195cb731f903235ead6a4f7c66db49da713ecb27afee076f0eea7154610260820151527f2647c161c00b90258e1cefebb17481f8a5d91b5f9dca626e3e89a9215bcca16a602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b611c6982611d06565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611cad576112d58282611d69565b6108f6611ddb565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661098157604051631afcd79f60e31b815260040160405180910390fd5b610ca7611cb5565b806001600160a01b03163b5f03611d3b57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610ccc565b5f80516020612c9083398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b031684604051611d859190612c74565b5f60405180830381855af49150503d805f8114611dbd576040519150601f19603f3d011682016040523d82523d5f602084013e611dc2565b606091505b5091509150611dd2858383611dfa565b95945050505050565b34156109815760405163b398979f60e01b815260040160405180910390fd5b606082611e0f57611e0a82611e59565b611e52565b8151158015611e2657506001600160a01b0384163b155b15611e4f57604051639996b31560e01b81526001600160a01b0385166004820152602401610ccc565b50805b9392505050565b805115611e695780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080545f8255600202905f5260205f2090810190610cde9190612124565b6040518060e001604052806007906020820280368337509192915050565b604051806102c001604052805f81526020015f8152602001611ef160405180604001604052805f81526020015f81525090565b8152602001611f1160405180604001604052805f81526020015f81525090565b8152602001611f3160405180604001604052805f81526020015f81525090565b8152602001611f5160405180604001604052805f81526020015f81525090565b8152602001611f7160405180604001604052805f81526020015f81525090565b8152602001611f9160405180604001604052805f81526020015f81525090565b8152602001611fb160405180604001604052805f81526020015f81525090565b8152602001611fd160405180604001604052805f81526020015f81525090565b8152602001611ff160405180604001604052805f81526020015f81525090565b815260200161201160405180604001604052805f81526020015f81525090565b815260200161203160405180604001604052805f81526020015f81525090565b815260200161205160405180604001604052805f81526020015f81525090565b815260200161207160405180604001604052805f81526020015f81525090565b815260200161209160405180604001604052805f81526020015f81525090565b81526020016120b160405180604001604052805f81526020015f81525090565b81526020016120d160405180604001604052805f81526020015f81525090565b81526020016120f160405180604001604052805f81526020015f81525090565b815260200161211160405180604001604052805f81526020015f81525090565b81525f6020820181905260409091015290565b5b808211156121495780546001600160c01b03191681555f6001820155600201612125565b5090565b80356001600160a01b0381168114612163575f80fd5b919050565b5f60208284031215612178575f80fd5b610c968261214d565b5f60208284031215612191575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b6040516102e081016001600160401b03811182821017156121cf576121cf612198565b60405290565b604051608081016001600160401b03811182821017156121cf576121cf612198565b604051601f8201601f191681016001600160401b038111828210171561221f5761221f612198565b604052919050565b80356001600160401b0381168114612163575f80fd5b5f6060828403121561224d575f80fd5b604051606081018181106001600160401b038211171561226f5761226f612198565b60405290508061227e83612227565b815261228c60208401612227565b6020820152604083013560408201525092915050565b5f604082840312156122b2575f80fd5b604051604081018181106001600160401b03821117156122d4576122d4612198565b604052823581526020928301359281019290925250919050565b5f808284036104e0811215612301575f80fd5b61230b858561223d565b925061048080605f1983011215612320575f80fd5b6123286121ac565b915061233786606087016122a2565b82526123468660a087016122a2565b60208301526123588660e087016122a2565b604083015261012061236c878288016122a2565b6060840152610160612380888289016122a2565b60808501526101a061239489828a016122a2565b60a08601526101e06123a88a828b016122a2565b60c08701526102206123bc8b828c016122a2565b60e08801526102606123d08c828d016122a2565b6101008901526102a06123e58d828e016122a2565b878a01526123f78d6102e08e016122a2565b6101408a015261240b8d6103208e016122a2565b868a015261241d8d6103608e016122a2565b6101808a01526103a08c0135948901949094526103c08b01356101c08901526103e08b0135928801929092526104008a01356102008801526104208a013590870152610440890135610240870152610460890135908601529287013561028085015250506104a0850135908201526104c0909301356102c08401525092909150565b5f80604083850312156124b0575f80fd5b6124b98361214d565b91506020808401356001600160401b03808211156124d5575f80fd5b818601915086601f8301126124e8575f80fd5b8135818111156124fa576124fa612198565b61250c601f8201601f191685016121f7565b91508082528784828501011115612521575f80fd5b80848401858401375f848284010152508093505050509250929050565b803563ffffffff81168114612163575f80fd5b5f60208284031215612561575f80fd5b610c968261253e565b5f805f8084860361012081121561257f575f80fd5b612589878761223d565b94506080605f198201121561259c575f80fd5b506125a56121d5565b60608681013582526080870135602083015260a0870135604083015260c08701359082015292506125d860e0860161253e565b91506125e7610100860161214d565b905092959194509250565b5f5b8381101561260c5781810151838201526020016125f4565b50505f910152565b602081525f82518060208401526126328160408501602087016125f2565b601f01601f19169190910160400192915050565b5f60608284031215612656575f80fd5b610c96838361223d565b5f8060408385031215612671575f80fd5b50508035926020909101359150565b5f6020808385031215612691575f80fd5b82356001600160401b03808211156126a7575f80fd5b818501915085601f8301126126ba575f80fd5b8135818111156126cc576126cc612198565b6126da848260051b016121f7565b818152848101925060079190911b8301840190878211156126f9575f80fd5b928401925b818410156127635760808489031215612715575f80fd5b61271d6121d5565b61272685612227565b8152612733868601612227565b868201526040612744818701612227565b90820152606085810135908201528352608090930192918401916126fe565b979650505050505050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610c9957610c9961276e565b634e487b7160e01b5f52603260045260245ffd5b805f5b6007811015610f455781518452602093840193909101906001016127ac565b6127e082825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e08401525060808101516101006128438185018380518252602090810151910152565b60a083015191506101406128638186018480518252602090810151910152565b60c084015192506101806128838187018580518252602090810151910152565b60e085015193506101c06128a38188018680518252602090810151910152565b928501519350610200926128c38785018680518252602090810151910152565b61012086015194506102406128e48189018780518252602090810151910152565b928601519450610280926129048885018780518252602090810151910152565b61016087015195506102c0612925818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b5f610a6082019050845182526020850151602083015260408501516129e1604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a0850151610100612a2e8185018380518252602090810151910152565b60c08701519150610140612a4e8186018480518252602090810151910152565b60e08801519250610180612a6e8187018580518252602090810151910152565b9188015192506101c091612a8e8684018580518252602090810151910152565b6101208901519350610200612aaf8188018680518252602090810151910152565b91890151935061024091612acf8784018680518252602090810151910152565b6101608a01519450610280612af08189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e0830152612bc76105008301856127a9565b612bd56105e08301846127cb565b949350505050565b5f60208284031215612bed575f80fd5b81518015158114611e52575f80fd5b6001600160401b03828116828216039080821115612c1c57612c1c61276e565b5092915050565b5f6001600160401b03808316818103612c3e57612c3e61276e565b6001019392505050565b5f60208284031215612c58575f80fd5b5051919050565b5f81612c6d57612c6d61276e565b505f190190565b5f8251612c858184602087016125f2565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a" +"0x60a06040523060805234801562000014575f80fd5b50604051620035bf380380620035bf833981016040819052620000379162000328565b6200004162000059565b6200004f848484846200010d565b50505050620003f0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000aa5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146200010a5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b83516001600160401b031615158062000132575060208401516001600160401b031615155b806200014057506020830151155b806200014e57506040830151155b806200015c57506060830151155b806200016757508251155b806200017a5750610e108263ffffffff16105b806200018f57506301e133808263ffffffff16115b80620001a257506001600160401b038116155b15620001c1576040516350dd03f760e11b815260040160405180910390fd5b8351600980546020808801516001600160401b0390811668010000000000000000026001600160801b03199384169582169586178117909455604098890151600a819055600b8054909416909517909317909155600c92909255845160018190559185015160028190559585015160038190556060909501516004819055600592909255600695909555600793909355600892909255600d805463ffffffff909216600160a01b0263ffffffff60a01b199092169190911790555f8054919092166001600160401b031991909116179055565b604051606081016001600160401b0381118282101715620002c357634e487b7160e01b5f52604160045260245ffd5b60405290565b604051608081016001600160401b0381118282101715620002c357634e487b7160e01b5f52604160045260245ffd5b80516001600160401b03811681146200030f575f80fd5b919050565b805163ffffffff811681146200030f575f80fd5b5f805f808486036101208112156200033e575f80fd5b60608112156200034c575f80fd5b6200035662000294565b6200036187620002f8565b81526200037160208801620002f8565b60208201526040878101519082015294506080605f198201121562000394575f80fd5b506200039f620002c9565b60608681015182526080870151602083015260a0870151604083015260c0870151908201529250620003d460e0860162000314565b9150620003e56101008601620002f8565b905092959194509250565b6080516131a8620004175f395f818161113d0152818161116601526112e301526131a85ff3fe6080604052600436106101f1575f3560e01c8063826e41fc11610108578063b2424e3f1161009d578063d24d933d1161006d578063d24d933d146106f6578063e030330114610725578063f2fde38b14610744578063f567616014610763578063f9e50d1914610782575f80fd5b8063b2424e3f1461062e578063b5adea3c1461064c578063c23b9e9e146106a3578063c8e5e498146106db575f80fd5b806396c1ca61116100d857806396c1ca611461055e5780639fdb54a71461057d578063a1be8d52146105d2578063ad3cb1cc146105f1575f80fd5b8063826e41fc1461049c5780638584d23f146104c75780638da5cb5b1461050357806390c143901461053f575f80fd5b80633c23b6db1161018957806369cc6a041161015957806369cc6a0414610422578063715018a614610436578063757c37ad1461044a5780637667180814610469578063811f853f1461047d575f80fd5b80633c23b6db1461039d578063426d3194146103d95780634f1ef286146103fb57806352d1902d1461040e575f80fd5b80632d52aad6116101c45780632d52aad6146102e05780632f79889d1461030c578063313df7b11461034a578063378ec23b14610381575f80fd5b8063013fa5fc146101f557806302b592f3146102165780630625e19b146102735780630d8e6e2c146102b5575b5f80fd5b348015610200575f80fd5b5061021461020f366004612558565b610796565b005b348015610221575f80fd5b50610235610230366004612571565b610849565b60405161026a94939291906001600160401b039485168152928416602084015292166040820152606081019190915260800190565b60405180910390f35b34801561027e575f80fd5b506005546006546007546008546102959392919084565b60408051948552602085019390935291830152606082015260800161026a565b3480156102c0575f80fd5b5060408051600181525f602082018190529181019190915260600161026a565b3480156102eb575f80fd5b506102146102fa366004612571565b600f805460ff19166001179055601055565b348015610317575f80fd5b50600d5461033290600160c01b90046001600160401b031681565b6040516001600160401b03909116815260200161026a565b348015610355575f80fd5b50600d54610369906001600160a01b031681565b6040516001600160a01b03909116815260200161026a565b34801561038c575f80fd5b50435b60405190815260200161026a565b3480156103a8575f80fd5b506102146103b736600461259e565b5f805467ffffffffffffffff19166001600160401b0392909216919091179055565b3480156103e4575f80fd5b506001546002546003546004546102959392919084565b610214610409366004612646565b610892565b348015610419575f80fd5b5061038f6108b1565b34801561042d575f80fd5b506102146108cc565b348015610441575f80fd5b5061021461093a565b348015610455575f80fd5b506102146104643660046127d8565b61094b565b348015610474575f80fd5b50610332610c16565b348015610488575f80fd5b506102146104973660046129b1565b610c40565b3480156104a7575f80fd5b50600d546001600160a01b031615155b604051901515815260200161026a565b3480156104d2575f80fd5b506104e66104e1366004612571565b610d64565b604080519283526001600160401b0390911660208301520161026a565b34801561050e575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610369565b34801561054a575f80fd5b50610332610559366004612a17565b610e8f565b348015610569575f80fd5b50610214610578366004612a48565b610eec565b348015610588575f80fd5b50600b54600c546105ac916001600160401b0380821692600160401b909204169083565b604080516001600160401b0394851681529390921660208401529082015260600161026a565b3480156105dd575f80fd5b506104b76105ec36600461259e565b610f75565b3480156105fc575f80fd5b50610621604051806040016040528060058152602001640352e302e360dc1b81525081565b60405161026a9190612a83565b348015610639575f80fd5b505f54610332906001600160401b031681565b348015610657575f80fd5b50610214610666366004612ab5565b8051600b805460208401516001600160401b03908116600160401b026001600160801b031990921693169290921791909117905560400151600c55565b3480156106ae575f80fd5b50600d546106c690600160a01b900463ffffffff1681565b60405163ffffffff909116815260200161026a565b3480156106e6575f80fd5b50610214600f805460ff19169055565b348015610701575f80fd5b50600954600a546105ac916001600160401b0380821692600160401b909204169083565b348015610730575f80fd5b506104b761073f366004612acf565b610fb7565b34801561074f575f80fd5b5061021461075e366004612558565b610fea565b34801561076e575f80fd5b5061021461077d366004612aef565b61102c565b34801561078d575f80fd5b50600e5461038f565b61079e6110d7565b6001600160a01b0381166107c55760405163e6c4247b60e01b815260040160405180910390fd5b600d546001600160a01b03908116908216036107f45760405163a863aec960e01b815260040160405180910390fd5b600d80546001600160a01b0319166001600160a01b0383169081179091556040519081527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b600e8181548110610858575f80fd5b5f918252602090912060029091020180546001909101546001600160401b038083169350600160401b8304811692600160801b9004169084565b61089a611132565b6108a3826111d6565b6108ad8282611217565b5050565b5f6108ba6112d8565b505f8051602061317c83398151915290565b6108d46110d7565b600d546001600160a01b03161561091f57600d80546001600160a01b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c02450905f90a1565b60405163a863aec960e01b815260040160405180910390fd5b565b6109426110d7565b6109385f611321565b600d546001600160a01b0316151580156109705750600d546001600160a01b03163314155b1561098e576040516301474c8f60e71b815260040160405180910390fd5b600b5483516001600160401b0391821691161115806109c75750600b5460208401516001600160401b03600160401b9092048216911611155b156109e55760405163051c46ef60e01b815260040160405180910390fd5b6109f28360400151611391565b5f6109fb610c16565b60208501515f805492935091610a1a91906001600160401b0316610e8f565b9050610a27826001612bf1565b6001600160401b0316816001600160401b0316148015610a605750600b54610a5e90600160401b90046001600160401b0316610f75565b155b8015610a7457505f826001600160401b0316115b15610a9257604051637150de4560e01b815260040160405180910390fd5b610a9d826002612bf1565b6001600160401b0316816001600160401b031610610ace57604051637150de4560e01b815260040160405180910390fd5b610adb8460200151611391565b610ae88460400151611391565b610af58460600151611391565b610b00858585611401565b8451600b805460208801516001600160401b03818116600160401b026001600160801b03199093169416939093171790556040860151600c55610b4290610f75565b15610bac5783516005556020840151600655604084015160075560608401516008557f31eabd9099fdb25dacddd206abff87311e553441fc9d0fcdef201062d7e7071b610b90826001612bf1565b6040516001600160401b03909116815260200160405180910390a15b610bb7434287611559565b84602001516001600160401b0316855f01516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae68760400151604051610c0791815260200190565b60405180910390a35050505050565b600b545f80549091610c3b916001600160401b03600160401b90920482169116610e8f565b905090565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610c845750825b90505f826001600160401b03166001148015610c9f5750303b155b905081158015610cad575080155b15610ccb5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610cf557845460ff60401b1916600160401b1785555b610cfe87611742565b610d06611753565b610d128a8a8a8961175b565b8315610d5857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b600e80545f91829190610d78600183612c11565b81548110610d8857610d88612c24565b5f918252602090912060029091020154600160801b90046001600160401b03168410610dc757604051631856a49960e21b815260040160405180910390fd5b600d54600160c01b90046001600160401b03165b81811015610e885784600e8281548110610df757610df7612c24565b5f918252602090912060029091020154600160801b90046001600160401b03161115610e8057600e8181548110610e3057610e30612c24565b905f5260205f20906002020160010154600e8281548110610e5357610e53612c24565b905f5260205f2090600202015f0160109054906101000a90046001600160401b0316935093505050915091565b600101610ddb565b5050915091565b5f816001600160401b03165f03610ea757505f610ee6565b610eb18284612c4c565b6001600160401b03165f03610ed157610eca8284612c71565b9050610ee6565b610edb8284612c71565b610eca906001612bf1565b92915050565b610ef46110d7565b610e108163ffffffff161080610f1357506301e133808163ffffffff16115b80610f315750600d5463ffffffff600160a01b909104811690821611155b15610f4f576040516307a5077760e51b815260040160405180910390fd5b600d805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b5f816001600160401b03165f03610f8d57505f919050565b5f54610fa2906001600160401b031683612c4c565b6001600160401b03161592915050565b919050565b600f545f9060ff16610fd257610fcd83836118d5565b610fe3565b8160105484610fe19190612c11565b115b9392505050565b610ff26110d7565b6001600160a01b03811661102057604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61102981611321565b50565b611037600e5f612276565b5f5b81518110156108ad57600e82828151811061105657611056612c24565b6020908102919091018101518254600181810185555f94855293839020825160029092020180549383015160408401516001600160401b03908116600160801b0267ffffffffffffffff60801b19928216600160401b026001600160801b031990971691909416179490941793909316178255606001519082015501611039565b336111097f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146109385760405163118cdaa760e01b8152336004820152602401611017565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806111b857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166111ac5f8051602061317c833981519152546001600160a01b031690565b6001600160a01b031614155b156109385760405163703e46dd60e11b815260040160405180910390fd5b6111de6110d7565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d9060200161083e565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611271575060408051601f3d908101601f1916820190925261126e91810190612c96565b60015b61129957604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611017565b5f8051602061317c83398151915281146112c957604051632a87526960e21b815260048101829052602401611017565b6112d38383611a2d565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109385760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110806108ad5760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401611017565b5f61140a611a82565b9050611414612294565b84516001600160401b0390811682526020808701805190921690830152604080870151908301526006546060830152600754608083015260085460a083015260055460c08301525161146590610f75565b1561149757602084015160e08201526040840151610100820152606084015161012082015283516101408201526114bb565b60065460e08201526007546101008201526008546101208201526005546101408201525b60405163fc8660c760e01b815273__$5c5c07cf4f55be9472c2b47d897172e765$__9063fc8660c7906114f690859085908890600401612eb9565b602060405180830381865af4158015611511573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061153591906130e7565b611552576040516309bde33960e01b815260040160405180910390fd5b5050505050565b600e54158015906115ce5750600d54600e8054600160a01b830463ffffffff1692600160c01b90046001600160401b031690811061159957611599612c24565b5f9182526020909120600290910201546115c390600160401b90046001600160401b031684613106565b6001600160401b0316115b1561166157600d54600e80549091600160c01b90046001600160401b03169081106115fb576115fb612c24565b5f9182526020822060029091020180546001600160c01b031916815560010155600d8054600160c01b90046001600160401b031690601861163b83613126565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516080810182526001600160401b03948516815292841660208085019182528301518516848301908152929091015160608401908152600e80546001810182555f91909152935160029094027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd81018054935194518716600160801b0267ffffffffffffffff60801b19958816600160401b026001600160801b03199095169690971695909517929092179290921693909317909155517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe90910155565b61174a6120b1565b611029816120fa565b6109386120b1565b83516001600160401b031615158061177f575060208401516001600160401b031615155b8061178c57506020830151155b8061179957506040830151155b806117a657506060830151155b806117b057508251155b806117c25750610e108263ffffffff16105b806117d657506301e133808263ffffffff16115b806117e857506001600160401b038116155b15611806576040516350dd03f760e11b815260040160405180910390fd5b8351600980546020808801516001600160401b03908116600160401b026001600160801b03199384169582169586178117909455604098890151600a819055600b8054909416909517909317909155600c92909255845160018190559185015160028190559585015160038190556060909501516004819055600592909255600695909555600793909355600892909255600d805463ffffffff909216600160a01b0263ffffffff60a01b199092169190911790555f80549190921667ffffffffffffffff1991909116179055565b600e545f90438411806118e6575080155b806119305750600d54600e80549091600160c01b90046001600160401b031690811061191457611914612c24565b5f9182526020909120600290910201546001600160401b031684105b1561194e5760405163b0b4387760e01b815260040160405180910390fd5b5f808061195c600185612c11565b90505b816119f857600d54600160c01b90046001600160401b031681106119f85786600e828154811061199157611991612c24565b5f9182526020909120600290910201546001600160401b0316116119e65760019150600e81815481106119c6576119c6612c24565b5f9182526020909120600290910201546001600160401b031692506119f8565b806119f08161314b565b91505061195f565b81611a165760405163b0b4387760e01b815260040160405180910390fd5b85611a218489612c11565b11979650505050505050565b611a3682612102565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611a7a576112d38282612165565b6108ad6121d7565b611a8a6122b3565b620100008152600b60208201527f2faf5a113efd87d75818e63ff9a6170007f22c89bbc4a8bd0f2b48268757b0146040820151527f185aee05f8d3babfce67931f15db39e61f25f794a4134d7bee6e18c5ad1ec0576020604083015101527f0dccf5dcf667a37ca93b8d721091d8f3a8049b3d1e89a56d66e42751bbaf7b5e6060820151527f2cf10949fc5bfcecb3bc54dd4121e55807430f17f30498a7ea6a026070b191626020606083015101527f08d70e4e0184fe53bd566f0d7edc4cd7b0e339490973d0faec7dac2089f538e56080820151527ef665fe1fd110d37d1dea446e8400f06f06b9b58ab3df90fbae7c47ee5860416020608083015101527f087e14d71924ac0f2880adf0f106925e5a6fdd57d020bb3c8aa70fa9fc00ccf360a0820151527f01db7e3178b342f91d54fc972cee72569f429a393988ee43c289e2ed96077152602060a083015101527f196dd42d767201f7f196c42aaef485656046310f5083559592bd1313e16948b760c0820151527f17889680810aaabd1ff3ac4a6c5492100579e059170cd2b77e2b3da6d37cc246602060c083015101527f24935e7a77ac313fd3d60ff3f1a0a79ec32c7dc519b39da0acb2c49f367771cc60e0820151527f168e29425ef138cb6943c75352f33c190e5f1488eb54a9e11deb744da7fb6b2e602060e083015101527f1b58d558b5526453bd1028ca938c940bb89e723f7c35787c02f9f179ae9a0cea610100820151527f21afc121d91d9d1c17dafb9236bc9b872c5b43df064c0b1286012fb43a762324602061010083015101527f1047fc55794d1e597de155077611e3c789a0a2be02183821bba56cf61cc1b8ed610120820151527f174252324727c0d2ee5e50eb57a5231f67474ceed6932ad4ffe9bcf866aa3428602061012083015101527f28db289a4cfb73ba92961572f3185298ae366ed1a44971607bcbf801f120f561610140820151527f045cfe7ae2cd175508172e7d9c2e899bb1d216dfc31fe89fc6c917caaee877a2602061014083015101527f195f2eec8547727fc46ed01b79e8f666ded64ae54f57073874a5a2470380a785610160820151527f1527322e85da1aefbd839e65d11dc695aac16b0db6c62591d9813242d41cbe31602061016083015101527f10c8d7d7355f7e0f8c002f482cc3b98c90baa94261c59a17b424eecfe4e963b2610180820151527f2272e30178647167bbead3a2d7371988f2e198e65815029ded4c64bfc0850f1f602061018083015101527f15d56ea7ab2fa61265f551c2ae25389c8fe7bcb3bf6608082c36a201f225f77d6101a0820151527f0b58546887202e7273d3d0c55d65dd6132cac98ebf04efb1b52445c513c4a4df60206101a083015101527f050d6f43774e8dffaa868f2a7dc82f566c69d175d818d4517cc70ac5fcb2f1b16101c0820151527f2fff87bf605e998373bb64553f3a625dabcd12888692d678a8f44d136440c86360206101c083015101527f12d085608c602cfb5b8c03ec7bd13ac0ff9e64a9ac1e9aa746594a033e464bf26101e0820151527f18ac5a3536042eeb0b0c7c2f43f5e2ca3b2173daa4c2812ffca64787e8e956b260206101e083015101527f0f0f9891fc2b790e74dc253c8854df6392e010f4de6760b8423a3dd69bbe5dce610200820151527f16bed1d244a2fe3ab9a652c7feec5650161d8a75227dece7294f3c8fc542fd6c602061020083015101527f0fa36d00672fa6a1c44cd3c259212c1ada48c66bf7bb085f24471b15b17e6e51610220820151527f182088e56b64955232460891d2b279765325813aef1dae855e5f496c418afc41602061022083015101527f2baf5ae2dd832e1449facc611b6b80fd66d58c871d5827c5c8e2747064e29964610240820151527f29f543b543137e881804c989cd3b99934010002238e8ab3eec882e09d306681f602061024083015101527f2db0ddc7123b42f520e257466a0d92da8b564fe01ec665096c14119643012984610260820151527f1b7ab27a66966284d7fb29bce9d550eafba16c49fbc6267827cdfc8d0b16f94f602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661093857604051631afcd79f60e31b815260040160405180910390fd5b610ff26120b1565b806001600160a01b03163b5f0361213757604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611017565b5f8051602061317c83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516121819190613160565b5f60405180830381855af49150503d805f81146121b9576040519150601f19603f3d011682016040523d82523d5f602084013e6121be565b606091505b50915091506121ce8583836121f6565b95945050505050565b34156109385760405163b398979f60e01b815260040160405180910390fd5b60608261220657610fcd8261224d565b815115801561221d57506001600160a01b0384163b155b1561224657604051639996b31560e01b81526001600160a01b0385166004820152602401611017565b5092915050565b80511561225d5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080545f8255600202905f5260205f20908101906110299190612519565b604051806101600160405280600b906020820280368337509192915050565b604051806102c001604052805f81526020015f81526020016122e660405180604001604052805f81526020015f81525090565b815260200161230660405180604001604052805f81526020015f81525090565b815260200161232660405180604001604052805f81526020015f81525090565b815260200161234660405180604001604052805f81526020015f81525090565b815260200161236660405180604001604052805f81526020015f81525090565b815260200161238660405180604001604052805f81526020015f81525090565b81526020016123a660405180604001604052805f81526020015f81525090565b81526020016123c660405180604001604052805f81526020015f81525090565b81526020016123e660405180604001604052805f81526020015f81525090565b815260200161240660405180604001604052805f81526020015f81525090565b815260200161242660405180604001604052805f81526020015f81525090565b815260200161244660405180604001604052805f81526020015f81525090565b815260200161246660405180604001604052805f81526020015f81525090565b815260200161248660405180604001604052805f81526020015f81525090565b81526020016124a660405180604001604052805f81526020015f81525090565b81526020016124c660405180604001604052805f81526020015f81525090565b81526020016124e660405180604001604052805f81526020015f81525090565b815260200161250660405180604001604052805f81526020015f81525090565b81525f6020820181905260409091015290565b5b8082111561253e5780546001600160c01b03191681555f600182015560020161251a565b5090565b80356001600160a01b0381168114610fb2575f80fd5b5f60208284031215612568575f80fd5b610fe382612542565b5f60208284031215612581575f80fd5b5035919050565b80356001600160401b0381168114610fb2575f80fd5b5f602082840312156125ae575f80fd5b610fe382612588565b634e487b7160e01b5f52604160045260245ffd5b604051608081016001600160401b03811182821017156125ed576125ed6125b7565b60405290565b6040516102e081016001600160401b03811182821017156125ed576125ed6125b7565b604051601f8201601f191681016001600160401b038111828210171561263e5761263e6125b7565b604052919050565b5f8060408385031215612657575f80fd5b61266083612542565b91506020808401356001600160401b038082111561267c575f80fd5b818601915086601f83011261268f575f80fd5b8135818111156126a1576126a16125b7565b6126b3601f8201601f19168501612616565b915080825287848285010111156126c8575f80fd5b80848401858401375f848284010152508093505050509250929050565b5f606082840312156126f5575f80fd5b604051606081018181106001600160401b0382111715612717576127176125b7565b60405290508061272683612588565b815261273460208401612588565b6020820152604083013560408201525092915050565b5f6080828403121561275a575f80fd5b6127626125cb565b90508135815260208201356020820152604082013560408201526060820135606082015292915050565b5f6040828403121561279c575f80fd5b604051604081018181106001600160401b03821117156127be576127be6125b7565b604052823581526020928301359281019290925250919050565b5f805f8385036105608112156127ec575f80fd5b6127f686866126e5565b9350612805866060870161274a565b92506104808060df198301121561281a575f80fd5b6128226125f3565b91506128318760e0880161278c565b82526101206128428882890161278c565b602084015261016061285689828a0161278c565b60408501526101a061286a8a828b0161278c565b60608601526101e061287e8b828c0161278c565b60808701526102206128928c828d0161278c565b60a08801526102606128a68d828e0161278c565b60c08901526102a06128ba8e828f0161278c565b60e08a01526128cd8e6102e08f0161278c565b6101008a01526128e18e6103208f0161278c565b878a01526128f38e6103608f0161278c565b6101408a01526129078e6103a08f0161278c565b868a01526129198e6103e08f0161278c565b6101808a01526104208d0135858a01526104408d01356101c08a01526104608d0135848a0152878d01356102008a01526104a08d0135838a01526104c08d01356102408a01526104e08d0135828a01526105008d01356102808a01526105208d0135818a015250505050505050506105408501356102c0820152809150509250925092565b803563ffffffff81168114610fb2575f80fd5b5f805f805f61014086880312156129c6575f80fd5b6129d087876126e5565b94506129df876060880161274a565b93506129ed60e0870161299e565b92506129fc6101008701612542565b9150612a0b6101208701612588565b90509295509295909350565b5f8060408385031215612a28575f80fd5b612a3183612588565b9150612a3f60208401612588565b90509250929050565b5f60208284031215612a58575f80fd5b610fe38261299e565b5f5b83811015612a7b578181015183820152602001612a63565b50505f910152565b602081525f8251806020840152612aa1816040850160208701612a61565b601f01601f19169190910160400192915050565b5f60608284031215612ac5575f80fd5b610fe383836126e5565b5f8060408385031215612ae0575f80fd5b50508035926020909101359150565b5f6020808385031215612b00575f80fd5b82356001600160401b0380821115612b16575f80fd5b818501915085601f830112612b29575f80fd5b813581811115612b3b57612b3b6125b7565b612b49848260051b01612616565b818152848101925060079190911b830184019087821115612b68575f80fd5b928401925b81841015612bd25760808489031215612b84575f80fd5b612b8c6125cb565b612b9585612588565b8152612ba2868601612588565b868201526040612bb3818701612588565b9082015260608581013590820152835260809093019291840191612b6d565b979650505050505050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0381811683821601908082111561224657612246612bdd565b81810381811115610ee657610ee6612bdd565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f6001600160401b0380841680612c6557612c65612c38565b92169190910692915050565b5f6001600160401b0380841680612c8a57612c8a612c38565b92169190910492915050565b5f60208284031215612ca6575f80fd5b5051919050565b805f5b600b811015612ccf578151845260209384019390910190600101612cb0565b50505050565b612cea82825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e0840152506080810151610100612d4d8185018380518252602090810151910152565b60a08301519150610140612d6d8186018480518252602090810151910152565b60c08401519250610180612d8d8187018580518252602090810151910152565b60e085015193506101c0612dad8188018680518252602090810151910152565b92850151935061020092612dcd8785018680518252602090810151910152565b6101208601519450610240612dee8189018780518252602090810151910152565b92860151945061028092612e0e8885018780518252602090810151910152565b61016087015195506102c0612e2f818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b5f610ae08201905084518252602085015160208301526040850151612eeb604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a0850151610100612f388185018380518252602090810151910152565b60c08701519150610140612f588186018480518252602090810151910152565b60e08801519250610180612f788187018580518252602090810151910152565b9188015192506101c091612f988684018580518252602090810151910152565b6101208901519350610200612fb98188018680518252602090810151910152565b91890151935061024091612fd98784018680518252602090810151910152565b6101608a01519450610280612ffa8189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e08301526130d1610500830185612cad565b6130df610660830184612cd5565b949350505050565b5f602082840312156130f7575f80fd5b81518015158114610fe3575f80fd5b6001600160401b0382811682821603908082111561224657612246612bdd565b5f6001600160401b0380831681810361314157613141612bdd565b6001019392505050565b5f8161315957613159612bdd565b505f190190565b5f8251613171818460208701612a61565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a" diff --git a/contract-bindings/artifacts/LightClient_bytecode.json b/contract-bindings/artifacts/LightClient_bytecode.json index 0046f9e770..20c53afe74 100644 --- a/contract-bindings/artifacts/LightClient_bytecode.json +++ b/contract-bindings/artifacts/LightClient_bytecode.json @@ -1 +1 @@ -"0x60a06040523060805234801562000014575f80fd5b506200001f62000025565b620000d9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000765760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051612968620001005f395f8181611094015281816110bd015261123a01526129685ff3fe608060405260043610610147575f3560e01c8063826e41fc116100b3578063ad3cb1cc1161006d578063ad3cb1cc1461046a578063c23b9e9e146104a7578063d24d933d146104df578063e03033011461050e578063f2fde38b1461052d578063f9e50d191461054c575f80fd5b8063826e41fc146103345780638584d23f1461035f5780638da5cb5b1461039b57806396c1ca61146103d75780639baa3cc9146103f65780639fdb54a714610415575f80fd5b8063378ec23b11610104578063378ec23b14610288578063426d3194146102a45780634f1ef286146102e557806352d1902d146102f857806369cc6a041461030c578063715018a614610320575f80fd5b8063013fa5fc1461014b57806302b592f31461016c5780630d8e6e2c146101c95780632063d4f7146101f45780632f79889d14610213578063313df7b114610251575b5f80fd5b348015610156575f80fd5b5061016a610165366004611f1d565b610560565b005b348015610177575f80fd5b5061018b610186366004611f36565b610613565b6040516101c094939291906001600160401b039485168152928416602084015292166040820152606081019190915260800190565b60405180910390f35b3480156101d4575f80fd5b5060408051600181525f60208201819052918101919091526060016101c0565b3480156101ff575f80fd5b5061016a61020e366004612081565b61065c565b34801561021e575f80fd5b5060085461023990600160c01b90046001600160401b031681565b6040516001600160401b0390911681526020016101c0565b34801561025c575f80fd5b50600854610270906001600160a01b031681565b6040516001600160a01b0390911681526020016101c0565b348015610293575f80fd5b50435b6040519081526020016101c0565b3480156102af575f80fd5b505f546001546002546003546102c59392919084565b6040805194855260208501939093529183015260608201526080016101c0565b61016a6102f3366004612232565b6107b6565b348015610303575f80fd5b506102966107d5565b348015610317575f80fd5b5061016a6107f0565b34801561032b575f80fd5b5061016a61085e565b34801561033f575f80fd5b506008546001600160a01b031615155b60405190151581526020016101c0565b34801561036a575f80fd5b5061037e610379366004611f36565b61086f565b604080519283526001600160401b039091166020830152016101c0565b3480156103a6575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610270565b3480156103e2575f80fd5b5061016a6103f13660046122e4565b61099a565b348015610401575f80fd5b5061016a6104103660046122fd565b610a23565b348015610420575f80fd5b50600654600754610444916001600160401b0380821692600160401b909204169083565b604080516001600160401b039485168152939092166020840152908201526060016101c0565b348015610475575f80fd5b5061049a604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101c091906123c8565b3480156104b2575f80fd5b506008546104ca90600160a01b900463ffffffff1681565b60405163ffffffff90911681526020016101c0565b3480156104ea575f80fd5b50600454600554610444916001600160401b0380821692600160401b909204169083565b348015610519575f80fd5b5061034f6105283660046123fa565b610b45565b348015610538575f80fd5b5061016a610547366004611f1d565b610c9f565b348015610557575f80fd5b50600954610296565b610568610ce1565b6001600160a01b03811661058f5760405163e6c4247b60e01b815260040160405180910390fd5b6008546001600160a01b03908116908216036105be5760405163a863aec960e01b815260040160405180910390fd5b600880546001600160a01b0319166001600160a01b0383169081179091556040519081527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b60098181548110610622575f80fd5b5f918252602090912060029091020180546001909101546001600160401b038083169350600160401b8304811692600160801b9004169084565b6008546001600160a01b03161515801561068157506008546001600160a01b03163314155b1561069f576040516301474c8f60e71b815260040160405180910390fd5b60065482516001600160401b0391821691161115806106d8575060065460208301516001600160401b03600160401b9092048216911611155b156106f65760405163051c46ef60e01b815260040160405180910390fd5b6107038260400151610d3c565b61070d8282610dac565b81516006805460208501516001600160401b03908116600160401b026001600160801b0319909216931692909217919091179055604082015160075561075a6107534390565b4284610ea0565b81602001516001600160401b0316825f01516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae684604001516040516107aa91815260200190565b60405180910390a35050565b6107be611089565b6107c78261112d565b6107d1828261116e565b5050565b5f6107de61122f565b505f8051602061293c83398151915290565b6107f8610ce1565b6008546001600160a01b03161561084357600880546001600160a01b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c02450905f90a1565b60405163a863aec960e01b815260040160405180910390fd5b565b610866610ce1565b61085c5f611278565b600980545f9182919061088360018361242e565b8154811061089357610893612441565b5f918252602090912060029091020154600160801b90046001600160401b031684106108d257604051631856a49960e21b815260040160405180910390fd5b600854600160c01b90046001600160401b03165b8181101561099357846009828154811061090257610902612441565b5f918252602090912060029091020154600160801b90046001600160401b0316111561098b576009818154811061093b5761093b612441565b905f5260205f209060020201600101546009828154811061095e5761095e612441565b905f5260205f2090600202015f0160109054906101000a90046001600160401b0316935093505050915091565b6001016108e6565b5050915091565b6109a2610ce1565b610e108163ffffffff1610806109c157506301e133808163ffffffff16115b806109df575060085463ffffffff600160a01b909104811690821611155b156109fd576040516307a5077760e51b815260040160405180910390fd5b6008805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610a675750825b90505f826001600160401b03166001148015610a825750303b155b905081158015610a90575080155b15610aae5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ad857845460ff60401b1916600160401b1785555b610ae1866112e8565b610ae96112f9565b610af4898989611301565b8315610b3a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b6009545f9043841180610b56575080155b80610ba05750600854600980549091600160c01b90046001600160401b0316908110610b8457610b84612441565b5f9182526020909120600290910201546001600160401b031684105b15610bbe5760405163b0b4387760e01b815260040160405180910390fd5b5f8080610bcc60018561242e565b90505b81610c6857600854600160c01b90046001600160401b03168110610c68578660098281548110610c0157610c01612441565b5f9182526020909120600290910201546001600160401b031611610c56576001915060098181548110610c3657610c36612441565b5f9182526020909120600290910201546001600160401b03169250610c68565b80610c6081612455565b915050610bcf565b81610c865760405163b0b4387760e01b815260040160405180910390fd5b85610c91848961242e565b119450505050505b92915050565b610ca7610ce1565b6001600160a01b038116610cd557604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b610cde81611278565b50565b33610d137f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461085c5760405163118cdaa760e01b8152336004820152602401610ccc565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018110806107d15760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c6400000000006044820152606401610ccc565b5f610db561142d565b9050610dbf611c7e565b83516001600160401b0390811682526020850151168160016020020152604084810151828201526001546060830152600254608083015260035460a08301525f5460c08301525163ce537a7760e01b815273__$5c5c07cf4f55be9472c2b47d897172e765$__9063ce537a7790610e3e90859085908890600401612670565b602060405180830381865af4158015610e59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e7d919061289e565b610e9a576040516309bde33960e01b815260040160405180910390fd5b50505050565b60095415801590610f15575060085460098054600160a01b830463ffffffff1692600160c01b90046001600160401b0316908110610ee057610ee0612441565b5f918252602090912060029091020154610f0a90600160401b90046001600160401b0316846128bd565b6001600160401b0316115b15610fa857600854600980549091600160c01b90046001600160401b0316908110610f4257610f42612441565b5f9182526020822060029091020180546001600160c01b03191681556001015560088054600160c01b90046001600160401b0316906018610f82836128e4565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516080810182526001600160401b03948516815292841660208085019182528301518516848301908152929091015160608401908152600980546001810182555f91909152935160029094027f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af81018054935194518716600160801b0267ffffffffffffffff60801b19958816600160401b026001600160801b03199095169690971695909517929092179290921693909317909155517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b090910155565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061110f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166111035f8051602061293c833981519152546001600160a01b031690565b6001600160a01b031614155b1561085c5760405163703e46dd60e11b815260040160405180910390fd5b611135610ce1565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d90602001610608565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156111c8575060408051601f3d908101601f191682019092526111c591810190612909565b60015b6111f057604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610ccc565b5f8051602061293c833981519152811461122057604051632a87526960e21b815260048101829052602401610ccc565b61122a8383611a5c565b505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461085c5760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b6112f0611ab1565b610cde81611afa565b61085c611ab1565b82516001600160401b0316151580611325575060208301516001600160401b031615155b8061133257506020820151155b8061133f57506040820151155b8061134c57506060820151155b8061135657508151155b806113685750610e108163ffffffff16105b8061137c57506301e133808163ffffffff16115b1561139a576040516350dd03f760e11b815260040160405180910390fd5b8251600480546020808701516001600160401b03908116600160401b026001600160801b0319938416919095169081178517909355604096870151600581905586515f5590860151600155958501516002556060909401516003556006805490941617179091556007919091556008805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b611435611c9c565b621000008152600760208201527f23783d0e9777b7af65fbf849da7edb75e74b1eaf503e025d7f2f7f80991befa26040820151527f2a4e2fe8adfa53f468525582d5184c4c70bbdb946c21f216418a9879705e54a76020604083015101527f0624b2c1e77f24afceaf39451743b9fa80d5853fca7ba00389c675650774009b6060820151527f250d7719e94ca2df00dfe327938f5a8d4d837779b99837ca777a53d39127b1796020606083015101527f0dc09515152eaea66d0db2f571cc995e369d26fe647394f10db5398c917519dc6080820151527f1273144d6cec2c4a68b24a149379c0f5592bb7fbddbe32fa171919950ca404cb6020608083015101527f119521bb68caec216e2f05eeb466fb3abfe1f39baf7fe7cb392ea057b6a2d9bf60a0820151527f2d52adeaba8045e53ab526fe9982d0ea452def6b3ea0253d27a19ef3b46e8428602060a083015101527f16c3b5b217d302975a920d13374524d7a52e4a50fd7fb930842271ebf4a84efd60c0820151527f200788916b907b196972bde304318e885a2521514b2db5e4a11899c51204f089602060c083015101527f1127581afe753defca9aef12e7332db9978a200b1699ce3888c0f3aea6111dc360e0820151527f0881e13f00723be1a04872ed02b2d078c31e80feaf27724e262ce97c2cb0bb1d602060e083015101527f1482a3a6bb91d6483d153683e2404f2f5546e0e895530fdf132091498406e3de610100820151527efa52db3d52d905ead1248102f3a80a43a90d8400c68f60a62c543c417b2f4b602061010083015101527f0a57dadd4a55199525ac6ac6fabc87a4cccfdc98142bcef9dbf47de00ecc5164610120820151527f18d95abd9b8e12c36936aa218cfff582548a6bbff25c338c2006eaeb1fe5b696602061012083015101527f2bc40e91dd169b8bc143a02952a1b6c6e627bfeb7a2bbe5078e14123f3c54c1c610140820151527f108d65a20c579b6d9883275eb6889fc3f5fc79735ca9f611a13b67daa2fbc8d0602061014083015101527f21bc1f86d0608e5f0626b467ee6f8282b619223f60a7acb0fc63ba7bdaf783be610160820151527f05ef3282f8eef01515fb9a8a7d6ca06b8b007d1d512403efb268fb03ce5f09e9602061016083015101527f2cab66c1cb5a83869e73ac34fbe467486999babd541d9010ee9a804806eee4ef610180820151527f2db1982419c5a4a17593acff9535fa967683d75c8aec01319b64b84aada2ad84602061018083015101527f2c38667c6c7eb868bdd30c34dd3f4b84d9b9b1a27d7867b364c8b7831423e9086101a0820151527f2b2cb4044dd51165c48138219d51cf8d1689f91ed3eeefead6e055eb488a2ce260206101a083015101527f2d48e54703011df2c74a14dafde3af4fd83ec71875d8ddc3554658640cc955016101c0820151527f243a99d80d32eb5408b59d5b08302bede070d3fb0a8efe2f2262f865bffb4d0d60206101c083015101527f0455d2325bf6269a66f07d838f55f36947a3cd9b87edd8480bced95cbb45cc116101e0820151527f0f66d9085a6ed60b838179987e240992bff4c0516ccf6ccde4a1ca94ce8b986460206101e083015101527f2bac0d23c8585d1487ec611b5effc97e5852fea43a7cba36ccdd2c207931f394610200820151527f1860b54e01a06aea5adb4b13bf5baebab92b736807a3a89ff2040992b06ee6ec602061020083015101527f0c0bfa1c2fc6f8ed01233d5168db1e1dfe725504f032f669f50a92ae77c72906610220820151527f0d741e124c7d1069b8a400cbcdcfd90128a533901ad4de1e037fe72984dc34cf602061022083015101527f01cfed30085c9efce04668205794aa39b1a8ee591234b4c77a22f8c26d899e05610240820151527f2ab68ac82d36cedb647d14a5b0035e8c9a0be84780b7bae1133a27a880966ed1602061024083015101527f072e1d50f8b5cf8d574b3847276477d95bbd5116351000841f728da44f4043b5610260820151527f23f8ea6eacd0876d57220f57eabacbe76a2323411663731a251d5dca36f1b59f602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b611a6582611b02565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115611aa95761122a8282611b65565b6107d1611bd7565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661085c57604051631afcd79f60e31b815260040160405180910390fd5b610ca7611ab1565b806001600160a01b03163b5f03611b3757604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610ccc565b5f8051602061293c83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b031684604051611b819190612920565b5f60405180830381855af49150503d805f8114611bb9576040519150601f19603f3d011682016040523d82523d5f602084013e611bbe565b606091505b5091509150611bce858383611bf6565b95945050505050565b341561085c5760405163b398979f60e01b815260040160405180910390fd5b606082611c0b57611c0682611c55565b611c4e565b8151158015611c2257506001600160a01b0384163b155b15611c4b57604051639996b31560e01b81526001600160a01b0385166004820152602401610ccc565b50805b9392505050565b805115611c655780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6040518060e001604052806007906020820280368337509192915050565b604051806102c001604052805f81526020015f8152602001611ccf60405180604001604052805f81526020015f81525090565b8152602001611cef60405180604001604052805f81526020015f81525090565b8152602001611d0f60405180604001604052805f81526020015f81525090565b8152602001611d2f60405180604001604052805f81526020015f81525090565b8152602001611d4f60405180604001604052805f81526020015f81525090565b8152602001611d6f60405180604001604052805f81526020015f81525090565b8152602001611d8f60405180604001604052805f81526020015f81525090565b8152602001611daf60405180604001604052805f81526020015f81525090565b8152602001611dcf60405180604001604052805f81526020015f81525090565b8152602001611def60405180604001604052805f81526020015f81525090565b8152602001611e0f60405180604001604052805f81526020015f81525090565b8152602001611e2f60405180604001604052805f81526020015f81525090565b8152602001611e4f60405180604001604052805f81526020015f81525090565b8152602001611e6f60405180604001604052805f81526020015f81525090565b8152602001611e8f60405180604001604052805f81526020015f81525090565b8152602001611eaf60405180604001604052805f81526020015f81525090565b8152602001611ecf60405180604001604052805f81526020015f81525090565b8152602001611eef60405180604001604052805f81526020015f81525090565b81525f6020820181905260409091015290565b80356001600160a01b0381168114611f18575f80fd5b919050565b5f60208284031215611f2d575f80fd5b611c4e82611f02565b5f60208284031215611f46575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b6040516102e081016001600160401b0381118282101715611f8457611f84611f4d565b60405290565b604051601f8201601f191681016001600160401b0381118282101715611fb257611fb2611f4d565b604052919050565b80356001600160401b0381168114611f18575f80fd5b5f60608284031215611fe0575f80fd5b604051606081018181106001600160401b038211171561200257612002611f4d565b60405290508061201183611fba565b815261201f60208401611fba565b6020820152604083013560408201525092915050565b5f60408284031215612045575f80fd5b604051604081018181106001600160401b038211171561206757612067611f4d565b604052823581526020928301359281019290925250919050565b5f808284036104e0811215612094575f80fd5b61209e8585611fd0565b925061048080605f19830112156120b3575f80fd5b6120bb611f61565b91506120ca8660608701612035565b82526120d98660a08701612035565b60208301526120eb8660e08701612035565b60408301526101206120ff87828801612035565b606084015261016061211388828901612035565b60808501526101a061212789828a01612035565b60a08601526101e061213b8a828b01612035565b60c087015261022061214f8b828c01612035565b60e08801526102606121638c828d01612035565b6101008901526102a06121788d828e01612035565b878a015261218a8d6102e08e01612035565b6101408a015261219e8d6103208e01612035565b868a01526121b08d6103608e01612035565b6101808a01526103a08c0135948901949094526103c08b01356101c08901526103e08b0135928801929092526104008a01356102008801526104208a013590870152610440890135610240870152610460890135908601529287013561028085015250506104a0850135908201526104c0909301356102c08401525092909150565b5f8060408385031215612243575f80fd5b61224c83611f02565b91506020808401356001600160401b0380821115612268575f80fd5b818601915086601f83011261227b575f80fd5b81358181111561228d5761228d611f4d565b61229f601f8201601f19168501611f8a565b915080825287848285010111156122b4575f80fd5b80848401858401375f848284010152508093505050509250929050565b803563ffffffff81168114611f18575f80fd5b5f602082840312156122f4575f80fd5b611c4e826122d1565b5f805f80848603610120811215612312575f80fd5b61231c8787611fd0565b94506080605f198201121561232f575f80fd5b50604051608081018181106001600160401b038211171561235257612352611f4d565b8060405250606086013581526080860135602082015260a0860135604082015260c086013560608201528093505061238c60e086016122d1565b915061239b6101008601611f02565b905092959194509250565b5f5b838110156123c05781810151838201526020016123a8565b50505f910152565b602081525f82518060208401526123e68160408501602087016123a6565b601f01601f19169190910160400192915050565b5f806040838503121561240b575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610c9957610c9961241a565b634e487b7160e01b5f52603260045260245ffd5b5f816124635761246361241a565b505f190190565b805f5b6007811015610e9a57815184526020938401939091019060010161246d565b6124a182825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e08401525060808101516101006125048185018380518252602090810151910152565b60a083015191506101406125248186018480518252602090810151910152565b60c084015192506101806125448187018580518252602090810151910152565b60e085015193506101c06125648188018680518252602090810151910152565b928501519350610200926125848785018680518252602090810151910152565b61012086015194506102406125a58189018780518252602090810151910152565b928601519450610280926125c58885018780518252602090810151910152565b61016087015195506102c06125e6818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b5f610a6082019050845182526020850151602083015260408501516126a2604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a08501516101006126ef8185018380518252602090810151910152565b60c0870151915061014061270f8186018480518252602090810151910152565b60e0880151925061018061272f8187018580518252602090810151910152565b9188015192506101c09161274f8684018580518252602090810151910152565b61012089015193506102006127708188018680518252602090810151910152565b918901519350610240916127908784018680518252602090810151910152565b6101608a015194506102806127b18189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e083015261288861050083018561246a565b6128966105e083018461248c565b949350505050565b5f602082840312156128ae575f80fd5b81518015158114611c4e575f80fd5b6001600160401b038281168282160390808211156128dd576128dd61241a565b5092915050565b5f6001600160401b038083168181036128ff576128ff61241a565b6001019392505050565b5f60208284031215612919575f80fd5b5051919050565b5f82516129318184602087016123a6565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a" +"0x60a06040523060805234801562000014575f80fd5b506200001f62000025565b620000d9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000765760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051612e55620001005f395f8181611087015281816110b0015261122d0152612e555ff3fe6080604052600436106101ba575f3560e01c8063811f853f116100f2578063a1be8d5211610092578063d24d933d11610062578063d24d933d146105e5578063e030330114610614578063f2fde38b14610633578063f9e50d1914610652575f80fd5b8063a1be8d5214610533578063ad3cb1cc14610552578063b2424e3f1461058f578063c23b9e9e146105ad575f80fd5b80638da5cb5b116100cd5780638da5cb5b1461046457806390c14390146104a057806396c1ca61146104bf5780639fdb54a7146104de575f80fd5b8063811f853f146103de578063826e41fc146103fd5780638584d23f14610428575f80fd5b8063426d31941161015d57806369cc6a041161013857806369cc6a0414610383578063715018a614610397578063757c37ad146103ab57806376671808146103ca575f80fd5b8063426d31941461033a5780634f1ef2861461035c57806352d1902d1461036f575f80fd5b80630d8e6e2c116101985780630d8e6e2c1461027e5780632f79889d146102a9578063313df7b1146102e7578063378ec23b1461031e575f80fd5b8063013fa5fc146101be57806302b592f3146101df5780630625e19b1461023c575b5f80fd5b3480156101c9575f80fd5b506101dd6101d8366004612307565b610666565b005b3480156101ea575f80fd5b506101fe6101f9366004612320565b610719565b60405161023394939291906001600160401b039485168152928416602084015292166040820152606081019190915260800190565b60405180910390f35b348015610247575f80fd5b5060055460065460075460085461025e9392919084565b604080519485526020850193909352918301526060820152608001610233565b348015610289575f80fd5b5060408051600181525f6020820181905291810191909152606001610233565b3480156102b4575f80fd5b50600d546102cf90600160c01b90046001600160401b031681565b6040516001600160401b039091168152602001610233565b3480156102f2575f80fd5b50600d54610306906001600160a01b031681565b6040516001600160a01b039091168152602001610233565b348015610329575f80fd5b50435b604051908152602001610233565b348015610345575f80fd5b5060015460025460035460045461025e9392919084565b6101dd61036a3660046123a4565b610762565b34801561037a575f80fd5b5061032c610781565b34801561038e575f80fd5b506101dd61079c565b3480156103a2575f80fd5b506101dd61080a565b3480156103b6575f80fd5b506101dd6103c536600461256d565b61081b565b3480156103d5575f80fd5b506102cf610ae6565b3480156103e9575f80fd5b506101dd6103f8366004612746565b610b10565b348015610408575f80fd5b50600d546001600160a01b031615155b6040519015158152602001610233565b348015610433575f80fd5b50610447610442366004612320565b610c34565b604080519283526001600160401b03909116602083015201610233565b34801561046f575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610306565b3480156104ab575f80fd5b506102cf6104ba3660046127ac565b610d5f565b3480156104ca575f80fd5b506101dd6104d93660046127dd565b610dbc565b3480156104e9575f80fd5b50600b54600c5461050d916001600160401b0380821692600160401b909204169083565b604080516001600160401b03948516815293909216602084015290820152606001610233565b34801561053e575f80fd5b5061041861054d3660046127f6565b610e45565b34801561055d575f80fd5b50610582604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516102339190612831565b34801561059a575f80fd5b505f546102cf906001600160401b031681565b3480156105b8575f80fd5b50600d546105d090600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610233565b3480156105f0575f80fd5b50600954600a5461050d916001600160401b0380821692600160401b909204169083565b34801561061f575f80fd5b5061041861062e366004612863565b610e87565b34801561063e575f80fd5b506101dd61064d366004612307565b610fdf565b34801561065d575f80fd5b50600e5461032c565b61066e611021565b6001600160a01b0381166106955760405163e6c4247b60e01b815260040160405180910390fd5b600d546001600160a01b03908116908216036106c45760405163a863aec960e01b815260040160405180910390fd5b600d80546001600160a01b0319166001600160a01b0383169081179091556040519081527f8017bb887fdf8fca4314a9d40f6e73b3b81002d67e5cfa85d88173af6aa46072906020015b60405180910390a150565b600e8181548110610728575f80fd5b5f918252602090912060029091020180546001909101546001600160401b038083169350600160401b8304811692600160801b9004169084565b61076a61107c565b61077382611120565b61077d8282611161565b5050565b5f61078a611222565b505f80516020612e2983398151915290565b6107a4611021565b600d546001600160a01b0316156107ef57600d80546001600160a01b03191690556040517f9a5f57de856dd668c54dd95e5c55df93432171cbca49a8776d5620ea59c02450905f90a1565b60405163a863aec960e01b815260040160405180910390fd5b565b610812611021565b6108085f61126b565b600d546001600160a01b0316151580156108405750600d546001600160a01b03163314155b1561085e576040516301474c8f60e71b815260040160405180910390fd5b600b5483516001600160401b0391821691161115806108975750600b5460208401516001600160401b03600160401b9092048216911611155b156108b55760405163051c46ef60e01b815260040160405180910390fd5b6108c283604001516112db565b5f6108cb610ae6565b60208501515f8054929350916108ea91906001600160401b0316610d5f565b90506108f7826001612897565b6001600160401b0316816001600160401b03161480156109305750600b5461092e90600160401b90046001600160401b0316610e45565b155b801561094457505f826001600160401b0316115b1561096257604051637150de4560e01b815260040160405180910390fd5b61096d826002612897565b6001600160401b0316816001600160401b03161061099e57604051637150de4560e01b815260040160405180910390fd5b6109ab84602001516112db565b6109b884604001516112db565b6109c584606001516112db565b6109d085858561134b565b8451600b805460208801516001600160401b03818116600160401b026001600160801b03199093169416939093171790556040860151600c55610a1290610e45565b15610a7c5783516005556020840151600655604084015160075560608401516008557f31eabd9099fdb25dacddd206abff87311e553441fc9d0fcdef201062d7e7071b610a60826001612897565b6040516001600160401b03909116815260200160405180910390a15b610a874342876114a3565b84602001516001600160401b0316855f01516001600160401b03167fa04a773924505a418564363725f56832f5772e6b8d0dbd6efce724dfe803dae68760400151604051610ad791815260200190565b60405180910390a35050505050565b600b545f80549091610b0b916001600160401b03600160401b90920482169116610d5f565b905090565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610b545750825b90505f826001600160401b03166001148015610b6f5750303b155b905081158015610b7d575080155b15610b9b5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610bc557845460ff60401b1916600160401b1785555b610bce8761168c565b610bd661169d565b610be28a8a8a896116a5565b8315610c2857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b600e80545f91829190610c486001836128be565b81548110610c5857610c586128d1565b5f918252602090912060029091020154600160801b90046001600160401b03168410610c9757604051631856a49960e21b815260040160405180910390fd5b600d54600160c01b90046001600160401b03165b81811015610d585784600e8281548110610cc757610cc76128d1565b5f918252602090912060029091020154600160801b90046001600160401b03161115610d5057600e8181548110610d0057610d006128d1565b905f5260205f20906002020160010154600e8281548110610d2357610d236128d1565b905f5260205f2090600202015f0160109054906101000a90046001600160401b0316935093505050915091565b600101610cab565b5050915091565b5f816001600160401b03165f03610d7757505f610db6565b610d8182846128f9565b6001600160401b03165f03610da157610d9a828461291e565b9050610db6565b610dab828461291e565b610d9a906001612897565b92915050565b610dc4611021565b610e108163ffffffff161080610de357506301e133808163ffffffff16115b80610e015750600d5463ffffffff600160a01b909104811690821611155b15610e1f576040516307a5077760e51b815260040160405180910390fd5b600d805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b5f816001600160401b03165f03610e5d57505f919050565b5f54610e72906001600160401b0316836128f9565b6001600160401b03161592915050565b919050565b600e545f9043841180610e98575080155b80610ee25750600d54600e80549091600160c01b90046001600160401b0316908110610ec657610ec66128d1565b5f9182526020909120600290910201546001600160401b031684105b15610f005760405163b0b4387760e01b815260040160405180910390fd5b5f8080610f0e6001856128be565b90505b81610faa57600d54600160c01b90046001600160401b03168110610faa5786600e8281548110610f4357610f436128d1565b5f9182526020909120600290910201546001600160401b031611610f985760019150600e8181548110610f7857610f786128d1565b5f9182526020909120600290910201546001600160401b03169250610faa565b80610fa281612943565b915050610f11565b81610fc85760405163b0b4387760e01b815260040160405180910390fd5b85610fd384896128be565b11979650505050505050565b610fe7611021565b6001600160a01b03811661101557604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61101e8161126b565b50565b336110537f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146108085760405163118cdaa760e01b815233600482015260240161100c565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061110257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166110f65f80516020612e29833981519152546001600160a01b031690565b6001600160a01b031614155b156108085760405163703e46dd60e11b815260040160405180910390fd5b611128611021565b6040516001600160a01b03821681527ff78721226efe9a1bb678189a16d1554928b9f2192e2cb93eeda83b79fa40007d9060200161070e565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156111bb575060408051601f3d908101601f191682019092526111b891810190612958565b60015b6111e357604051634c9c8ce360e01b81526001600160a01b038316600482015260240161100c565b5f80516020612e29833981519152811461121357604051632a87526960e21b81526004810182905260240161100c565b61121d838361181f565b505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108085760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000181108061077d5760405162461bcd60e51b815260206004820152601b60248201527f426e3235343a20696e76616c6964207363616c6172206669656c640000000000604482015260640161100c565b5f611354611874565b905061135e61206c565b84516001600160401b0390811682526020808701805190921690830152604080870151908301526006546060830152600754608083015260085460a083015260055460c0830152516113af90610e45565b156113e157602084015160e0820152604084015161010082015260608401516101208201528351610140820152611405565b60065460e08201526007546101008201526008546101208201526005546101408201525b60405163fc8660c760e01b815273__$5c5c07cf4f55be9472c2b47d897172e765$__9063fc8660c79061144090859085908890600401612b7b565b602060405180830381865af415801561145b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061147f9190612da9565b61149c576040516309bde33960e01b815260040160405180910390fd5b5050505050565b600e54158015906115185750600d54600e8054600160a01b830463ffffffff1692600160c01b90046001600160401b03169081106114e3576114e36128d1565b5f91825260209091206002909102015461150d90600160401b90046001600160401b031684612dc8565b6001600160401b0316115b156115ab57600d54600e80549091600160c01b90046001600160401b0316908110611545576115456128d1565b5f9182526020822060029091020180546001600160c01b031916815560010155600d8054600160c01b90046001600160401b031690601861158583612de8565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550505b604080516080810182526001600160401b03948516815292841660208085019182528301518516848301908152929091015160608401908152600e80546001810182555f91909152935160029094027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd81018054935194518716600160801b0267ffffffffffffffff60801b19958816600160401b026001600160801b03199095169690971695909517929092179290921693909317909155517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe90910155565b611694611e9f565b61101e81611ee8565b610808611e9f565b83516001600160401b03161515806116c9575060208401516001600160401b031615155b806116d657506020830151155b806116e357506040830151155b806116f057506060830151155b806116fa57508251155b8061170c5750610e108263ffffffff16105b8061172057506301e133808263ffffffff16115b8061173257506001600160401b038116155b15611750576040516350dd03f760e11b815260040160405180910390fd5b8351600980546020808801516001600160401b03908116600160401b026001600160801b03199384169582169586178117909455604098890151600a819055600b8054909416909517909317909155600c92909255845160018190559185015160028190559585015160038190556060909501516004819055600592909255600695909555600793909355600892909255600d805463ffffffff909216600160a01b0263ffffffff60a01b199092169190911790555f80549190921667ffffffffffffffff1991909116179055565b61182882611ef0565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561186c5761121d8282611f53565b61077d611fc5565b61187c61208b565b621000008152600b60208201527f26867ee58aaf860fc9e0e3a78666ffc51f3ba1ad8ae001c196830c55b5af0b8c6040820151527f091230adb753f82815151277060cc56b546bb2e950a0de19ed061ec68c071a906020604083015101527f02a509a06d8c56f83f204688ff6e42eac6e3cbdd063b0971a3af953e81badbb66060820151527f06f43ed2b9cece35d1201abc13ffdaea35560cf0f1446277138ce812b9ad9f396020606083015101527f1a588c99ad88f789c87722b061bb5535daa0abcc1dc6d176d7fea51e5d80b9266080820151527f2062b995e61a6ab8aab6cd6e7520b879d84f965ab1f094c104f0c1213b28038b6020608083015101527f21a2fd766a0cebecfdbfdfe56139a1bbd9aec15e2e35be8ef01934a0ec43868560a0820151527f20fe500ac7d1aa7820db8c6f7f9d509e3b2e88731e3a12dd65f06f43ca930da0602060a083015101527f0ab53d1285c7f4819b3ff6e1ddada6bf2515d34bbaf61186c6a04be47dfd65a360c0820151527f0b80a9878082cdfdd9fcc16bb33fa424c0ad66b81949bf642153d3c7ad082f22602060c083015101527f1b900f8e5f8e8064a5888a1bd796b54a2652fc02034fe4b6e6fc8d6650f7453b60e0820151527ecca258a8832c64d1f8e1721a78fc25b13d29adbb81e35a79fc2f49f8902786602060e083015101527f0d1d3348d642e6f2e9739d735d8c723676dbaefdcbb4e96641defa353d26ebb3610100820151527f14fe9d6a335104e7491ca6d5086113e6b0f52946960d726664667bd58539d41e602061010083015101527f1da94364440c4e3fb8af2d363cdefa4edda437579e1b056a16a5e9a11dffa2ab610120820151527f0a077bd307ed31222db55cb0128bafce5e22557b57f5ac915359c50296cb5c77602061012083015101527f28ff80b133d989235c7129dea54469b780ac4717449290067e7c9a7d5be7dbd5610140820151527f1c0fc22eef23b50a2ddc553f9fc1b61fd8c57a58ca321a829c7ec255f757b3a6602061014083015101527e3c4e21e5dfba62a5b1702fb0ef234bfe95a77701a456882350526d140243f5610160820151527f06012db82876ba33e6e8f80a51013662e56c4abc86a7d85c272e19a6d7f57d0b602061016083015101527f16d5247dbdeae1df70093e5ee77272959661e0fbabda431777fa729f5b532f44610180820151527e8d9ee00f799cf00608b082d03b9de5a42b8126c35fbfbd1e602108df10e0e3602061018083015101527f2f526c6981643ff6f6e9d2b5a921e06cf95f274629b5a145bd552b7fda6a87006101a0820151527f2fe7108fd4e24231f3dadb6e09072e106fca0694fe39dff96557a88221a89a5060206101a083015101527f26a3568598a6981e6325f4816736e381087b5b0e4b27ef364d8ae1e29fe9df996101c0820151527f1db81cdf82a9ec99f3c9716df22d38317e6bb84fc57d2f0e7b2bc8a0569f7cc460206101c083015101527e99888088e11de6ed086c99b9bba986d908df5b0c5007680d97567d485719946101e0820151527f1f91576eadffff932b6e54bab022f93f6fec3e5b7674d0006bc5f2223527a34860206101e083015101527e68b3c117ee7e84d6b670b6af20197759ec80d34f3c594328663031e9cd7e02610200820151527f1c3832e24877346680e7047bae2cfcd51fafe3e7caf199e9dfc8e8f10c2b6943602061020083015101527f164cdd9ad5d4e96e109073e8e735cd4ac64aba6ddaa244da6701369c8cba5daf610220820151527f16c41e647f1ab0d45c891544299e4ef9c004d8bc0a3bf096dc38ce8ed90c0d67602061022083015101527f134ba7a9567ba20e1f35959ee8c2cd688d3a962bb1797e8ab8e511768de0ce83610240820151527f02e4d286c9435f7bd94c1a2c78b99966d06faca1ae45de78149950a4fefcd6e7602061024083015101527f039a0b2d920f29e35cb2a9e1ec6cc22ac1d482af45e47399724a0745d542e839610260820151527f15ac2658bfdd2227aebf8e20935935a648819e1dcea807da1c838abfa7896c63602061026083015101527fb0838893ec1f237e8b07323b0744599f4e97b598b3b589bcc2bc37b8d5c418016102808201527fc18393c0fa30fe4e8b038e357ad851eae8de9107584effe7c7f1f651b2010e266102a082015290565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661080857604051631afcd79f60e31b815260040160405180910390fd5b610fe7611e9f565b806001600160a01b03163b5f03611f2557604051634c9c8ce360e01b81526001600160a01b038216600482015260240161100c565b5f80516020612e2983398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b031684604051611f6f9190612e0d565b5f60405180830381855af49150503d805f8114611fa7576040519150601f19603f3d011682016040523d82523d5f602084013e611fac565b606091505b5091509150611fbc858383611fe4565b95945050505050565b34156108085760405163b398979f60e01b815260040160405180910390fd5b606082611ff957611ff482612043565b61203c565b815115801561201057506001600160a01b0384163b155b1561203957604051639996b31560e01b81526001600160a01b038516600482015260240161100c565b50805b9392505050565b8051156120535780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b604051806101600160405280600b906020820280368337509192915050565b604051806102c001604052805f81526020015f81526020016120be60405180604001604052805f81526020015f81525090565b81526020016120de60405180604001604052805f81526020015f81525090565b81526020016120fe60405180604001604052805f81526020015f81525090565b815260200161211e60405180604001604052805f81526020015f81525090565b815260200161213e60405180604001604052805f81526020015f81525090565b815260200161215e60405180604001604052805f81526020015f81525090565b815260200161217e60405180604001604052805f81526020015f81525090565b815260200161219e60405180604001604052805f81526020015f81525090565b81526020016121be60405180604001604052805f81526020015f81525090565b81526020016121de60405180604001604052805f81526020015f81525090565b81526020016121fe60405180604001604052805f81526020015f81525090565b815260200161221e60405180604001604052805f81526020015f81525090565b815260200161223e60405180604001604052805f81526020015f81525090565b815260200161225e60405180604001604052805f81526020015f81525090565b815260200161227e60405180604001604052805f81526020015f81525090565b815260200161229e60405180604001604052805f81526020015f81525090565b81526020016122be60405180604001604052805f81526020015f81525090565b81526020016122de60405180604001604052805f81526020015f81525090565b81525f6020820181905260409091015290565b80356001600160a01b0381168114610e82575f80fd5b5f60208284031215612317575f80fd5b61203c826122f1565b5f60208284031215612330575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b6040516102e081016001600160401b038111828210171561236e5761236e612337565b60405290565b604051601f8201601f191681016001600160401b038111828210171561239c5761239c612337565b604052919050565b5f80604083850312156123b5575f80fd5b6123be836122f1565b91506020808401356001600160401b03808211156123da575f80fd5b818601915086601f8301126123ed575f80fd5b8135818111156123ff576123ff612337565b612411601f8201601f19168501612374565b91508082528784828501011115612426575f80fd5b80848401858401375f848284010152508093505050509250929050565b80356001600160401b0381168114610e82575f80fd5b5f60608284031215612469575f80fd5b604051606081018181106001600160401b038211171561248b5761248b612337565b60405290508061249a83612443565b81526124a860208401612443565b6020820152604083013560408201525092915050565b5f608082840312156124ce575f80fd5b604051608081018181106001600160401b03821117156124f0576124f0612337565b8060405250809150823581526020830135602082015260408301356040820152606083013560608201525092915050565b5f60408284031215612531575f80fd5b604051604081018181106001600160401b038211171561255357612553612337565b604052823581526020928301359281019290925250919050565b5f805f838503610560811215612581575f80fd5b61258b8686612459565b935061259a86606087016124be565b92506104808060df19830112156125af575f80fd5b6125b761234b565b91506125c68760e08801612521565b82526101206125d788828901612521565b60208401526101606125eb89828a01612521565b60408501526101a06125ff8a828b01612521565b60608601526101e06126138b828c01612521565b60808701526102206126278c828d01612521565b60a088015261026061263b8d828e01612521565b60c08901526102a061264f8e828f01612521565b60e08a01526126628e6102e08f01612521565b6101008a01526126768e6103208f01612521565b878a01526126888e6103608f01612521565b6101408a015261269c8e6103a08f01612521565b868a01526126ae8e6103e08f01612521565b6101808a01526104208d0135858a01526104408d01356101c08a01526104608d0135848a0152878d01356102008a01526104a08d0135838a01526104c08d01356102408a01526104e08d0135828a01526105008d01356102808a01526105208d0135818a015250505050505050506105408501356102c0820152809150509250925092565b803563ffffffff81168114610e82575f80fd5b5f805f805f610140868803121561275b575f80fd5b6127658787612459565b945061277487606088016124be565b935061278260e08701612733565b925061279161010087016122f1565b91506127a06101208701612443565b90509295509295909350565b5f80604083850312156127bd575f80fd5b6127c683612443565b91506127d460208401612443565b90509250929050565b5f602082840312156127ed575f80fd5b61203c82612733565b5f60208284031215612806575f80fd5b61203c82612443565b5f5b83811015612829578181015183820152602001612811565b50505f910152565b602081525f825180602084015261284f81604085016020870161280f565b601f01601f19169190910160400192915050565b5f8060408385031215612874575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038181168382160190808211156128b7576128b7612883565b5092915050565b81810381811115610db657610db6612883565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f6001600160401b0380841680612912576129126128e5565b92169190910692915050565b5f6001600160401b0380841680612937576129376128e5565b92169190910492915050565b5f8161295157612951612883565b505f190190565b5f60208284031215612968575f80fd5b5051919050565b805f5b600b811015612991578151845260209384019390910190600101612972565b50505050565b6129ac82825180518252602090810151910152565b6020818101518051604085015290810151606084015250604081015180516080840152602081015160a0840152506060810151805160c0840152602081015160e0840152506080810151610100612a0f8185018380518252602090810151910152565b60a08301519150610140612a2f8186018480518252602090810151910152565b60c08401519250610180612a4f8187018580518252602090810151910152565b60e085015193506101c0612a6f8188018680518252602090810151910152565b92850151935061020092612a8f8785018680518252602090810151910152565b6101208601519450610240612ab08189018780518252602090810151910152565b92860151945061028092612ad08885018780518252602090810151910152565b61016087015195506102c0612af1818a018880518252602090810151910152565b9287015180516103008a0152602001516103208901526101a0870151610340890152908601516103608801526101e0860151610380880152928501516103a08701526102208501516103c0870152918401516103e08601526102608401516104008601528301516104208501526102a0830151610440850152909101516104609092019190915250565b5f610ae08201905084518252602085015160208301526040850151612bad604084018280518252602090810151910152565b50606085015180516080840152602081015160a0840152506080850151805160c0840152602081015160e08401525060a0850151610100612bfa8185018380518252602090810151910152565b60c08701519150610140612c1a8186018480518252602090810151910152565b60e08801519250610180612c3a8187018580518252602090810151910152565b9188015192506101c091612c5a8684018580518252602090810151910152565b6101208901519350610200612c7b8188018680518252602090810151910152565b91890151935061024091612c9b8784018680518252602090810151910152565b6101608a01519450610280612cbc8189018780518252602090810151910152565b918a015180516102c08901526020908101516102e08901526101a08b015180516103008a0152810151610320890152938a015180516103408901528401516103608801526101e08a015180516103808901528401516103a088015289015180516103c08801528301516103e087015261022089015180516104008801528301516104208701529088015180516104408701528201516104608601526102608801518051610480870152909101516104a08501528601516104c0840152506102a08501516104e0830152612d9361050083018561296f565b612da1610660830184612997565b949350505050565b5f60208284031215612db9575f80fd5b8151801515811461203c575f80fd5b6001600160401b038281168282160390808211156128b7576128b7612883565b5f6001600160401b03808316818103612e0357612e03612883565b6001019392505050565b5f8251612e1e81846020870161280f565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca164736f6c6343000817000a" diff --git a/contracts/rust/adapter/src/bin/eval_domain.rs b/contracts/rust/adapter/src/bin/eval_domain.rs index cce85cc9ad..a74609cc83 100644 --- a/contracts/rust/adapter/src/bin/eval_domain.rs +++ b/contracts/rust/adapter/src/bin/eval_domain.rs @@ -5,7 +5,7 @@ use ark_ff::{Field, PrimeField}; use ark_poly::{EvaluationDomain, Radix2EvaluationDomain}; fn main() { - let domain = Radix2EvaluationDomain::::new(2u32.pow(5) as usize).unwrap(); + let domain = Radix2EvaluationDomain::::new(2u32.pow(20) as usize).unwrap(); let size_inv = <::BasePrimeField as PrimeField>::into_bigint(domain.size_inv); let size_inv_str = format!("0x{:X}", size_inv).to_lowercase(); @@ -26,8 +26,8 @@ fn main() { let mut domain_elements_str = "".to_owned(); - // Generates the domain elements for 8 inputs: 1, g, g^2,...,g^7 - for i in 0..8 { + // Generates the domain elements: 1, g, g^2,...,g^10 + for i in 0..=10 { let mut element_fr = domain.group_gen; element_fr = element_fr.pow([i]); diff --git a/contracts/rust/adapter/src/light_client.rs b/contracts/rust/adapter/src/light_client.rs index fdf8d95a3c..5eee57c038 100644 --- a/contracts/rust/adapter/src/light_client.rs +++ b/contracts/rust/adapter/src/light_client.rs @@ -4,13 +4,11 @@ use ark_ff::PrimeField; use ark_std::str::FromStr; use diff_test_bn254::{field_to_u256, u256_to_field}; use ethers::{ - abi::AbiDecode, - abi::Token, - abi::Tokenize, + abi::{AbiDecode, Token, Tokenize}, prelude::{AbiError, EthAbiCodec, EthAbiType}, types::U256, }; -use hotshot_types::light_client::{GenericLightClientState, GenericStakeTableState, PublicInput}; +use hotshot_types::light_client::{GenericLightClientState, GenericStakeTableState}; /// Intermediate representations for `LightClientState` in Solidity #[derive(Clone, Debug, EthAbiType, EthAbiCodec, PartialEq)] @@ -73,16 +71,6 @@ impl From> for ParsedLightClientState } } -impl From for ParsedLightClientState { - fn from(pi: PublicInput) -> Self { - Self { - view_num: field_to_u256(pi.view_number()).as_u64(), - block_height: field_to_u256(pi.block_height()).as_u64(), - block_comm_root: field_to_u256(pi.block_comm_root()), - } - } -} - impl From<(u64, u64, U256)> for ParsedLightClientState { fn from(s: (u64, u64, U256)) -> Self { Self { @@ -189,6 +177,7 @@ pub struct LightClientConstructorArgs { pub light_client_state: ParsedLightClientState, pub stake_table_state: ParsedStakeTableState, pub max_history_seconds: u32, + pub blocks_per_epoch: u64, } impl LightClientConstructorArgs { @@ -201,6 +190,7 @@ impl LightClientConstructorArgs { light_client_state: ParsedLightClientState::dummy_genesis(), stake_table_state: ParsedStakeTableState::dummy_genesis(), max_history_seconds: 864000, + blocks_per_epoch: 14400, // 24hr assuming 6 sec block time } } } @@ -216,6 +206,7 @@ impl Tokenize for LightClientConstructorArgs { ethers::abi::Token::Tuple(self.light_client_state.into_tokens()), ethers::abi::Token::Tuple(self.stake_table_state.into_tokens()), ethers::abi::Token::Uint(U256::from(self.max_history_seconds)), + ethers::abi::Token::Uint(U256::from(self.blocks_per_epoch)), ] } } diff --git a/contracts/rust/diff-test/Cargo.toml b/contracts/rust/diff-test/Cargo.toml index 96d663c1f7..87dc683c38 100644 --- a/contracts/rust/diff-test/Cargo.toml +++ b/contracts/rust/diff-test/Cargo.toml @@ -17,6 +17,7 @@ diff-test-bn254 = { git = "https://github.com/EspressoSystems/solidity-bn254.git ethers = { version = "2.0.4" } hotshot-contract-adapter = { path = "../adapter" } hotshot-state-prover = { workspace = true } +hotshot-types = { workspace = true } jf-pcs = { workspace = true } jf-plonk = { workspace = true } jf-signature = { workspace = true } diff --git a/contracts/rust/diff-test/src/main.rs b/contracts/rust/diff-test/src/main.rs index a07382ff11..d631c322ac 100644 --- a/contracts/rust/diff-test/src/main.rs +++ b/contracts/rust/diff-test/src/main.rs @@ -12,10 +12,14 @@ use ethers::{ abi::{AbiDecode, AbiEncode, Address}, types::{Bytes, U256}, }; -use hotshot_contract_adapter::{jellyfish::*, light_client::ParsedLightClientState}; +use hotshot_contract_adapter::{ + jellyfish::*, + light_client::{ParsedLightClientState, ParsedStakeTableState}, +}; use hotshot_state_prover::mock_ledger::{ - gen_plonk_proof_for_test, MockLedger, MockSystemParam, STAKE_TABLE_CAPACITY, + gen_plonk_proof_for_test, MockLedger, MockSystemParam, STAKE_TABLE_CAPACITY_FOR_TEST, }; +use hotshot_types::utils::epoch_from_block_number; use jf_pcs::prelude::Commitment; use jf_plonk::proof_system::structs::{Proof, VerifyingKey}; use jf_plonk::proof_system::PlonkKzgSnark; @@ -83,6 +87,8 @@ enum Action { MockConsecutiveFinalizedStates, /// Get a light client state that skipped a few blocks MockSkipBlocks, + /// Compute the epoch number from block height + EpochCompute, } #[allow(clippy::type_complexity)] @@ -125,7 +131,7 @@ fn main() { let log_size = cli.args[0].parse::().unwrap(); let zeta = u256_to_field::(cli.args[1].parse::().unwrap()); - let pi_u256: [U256; 7] = AbiDecode::decode_hex(&cli.args[2]).unwrap(); + let pi_u256: [U256; 11] = AbiDecode::decode_hex(&cli.args[2]).unwrap(); let pi: Vec = pi_u256.into_iter().map(u256_to_field).collect(); let verifier = Verifier::::new(2u32.pow(log_size) as usize).unwrap(); @@ -257,7 +263,7 @@ fn main() { } let vk = cli.args[0].parse::().unwrap().into(); - let pi_u256: [U256; 7] = AbiDecode::decode_hex(&cli.args[1]).unwrap(); + let pi_u256: [U256; 11] = AbiDecode::decode_hex(&cli.args[1]).unwrap(); let pi: Vec = pi_u256.into_iter().map(u256_to_field).collect(); let proof: Proof = cli.args[2].parse::().unwrap().into(); let msg = { @@ -295,8 +301,8 @@ fn main() { .is_ok()); let vk_parsed: ParsedVerifyingKey = vk.into(); - let mut pi_parsed = [U256::default(); 7]; - assert_eq!(public_input.len(), 7); + let mut pi_parsed = [U256::default(); 11]; + assert_eq!(public_input.len(), 11); for (i, pi) in public_input.into_iter().enumerate() { pi_parsed[i] = field_to_u256(pi); } @@ -380,7 +386,10 @@ fn main() { let pp = MockSystemParam::init(); let ledger = MockLedger::init(pp, num_init_validators as usize); - let res = (ledger.get_state(), ledger.get_stake_table_state()); + let res: (ParsedLightClientState, ParsedStakeTableState) = ( + ledger.light_client_state().into(), + ledger.voting_stake_table_state().into(), + ); println!("{}", res.encode_hex()); } Action::MockConsecutiveFinalizedStates => { @@ -394,6 +403,7 @@ fn main() { let mut new_states: Vec = vec![]; let mut proofs: Vec = vec![]; + let mut next_st_states: Vec = vec![]; for _ in 1..4 { // random number of notarized but not finalized block @@ -407,11 +417,12 @@ fn main() { ledger.elapse_with_block(); let (pi, proof) = ledger.gen_state_proof(); - new_states.push(pi.into()); + next_st_states.push(pi.next_st_state.into()); + new_states.push(pi.lc_state.into()); proofs.push(proof.into()); } - let res = (new_states, proofs); + let res = (new_states, next_st_states, proofs); println!("{}", res.encode_hex()); } Action::MockSkipBlocks => { @@ -427,21 +438,24 @@ fn main() { }; let pp = MockSystemParam::init(); - let mut ledger = MockLedger::init(pp, STAKE_TABLE_CAPACITY / 2); + let mut ledger = MockLedger::init(pp, STAKE_TABLE_CAPACITY_FOR_TEST / 2); for _ in 0..num_block_skipped { ledger.elapse_with_block(); } let res = if require_valid_proof { - let (state, proof) = ledger.gen_state_proof(); - let state_parsed: ParsedLightClientState = state.into(); + let (pi, proof) = ledger.gen_state_proof(); + let state_parsed: ParsedLightClientState = pi.lc_state.into(); let proof_parsed: ParsedPlonkProof = proof.into(); - (state_parsed, proof_parsed) + let next_stake_table: ParsedStakeTableState = pi.next_st_state.into(); + (state_parsed, next_stake_table, proof_parsed) } else { - let state_parsed = ledger.get_state(); + let state_parsed = ledger.light_client_state().into(); let proof_parsed = ParsedPlonkProof::dummy(&mut ledger.rng); - (state_parsed, proof_parsed) + let next_stake_table: ParsedStakeTableState = + ledger.next_stake_table_state().into(); + (state_parsed, next_stake_table, proof_parsed) }; println!("{}", res.encode_hex()); } @@ -487,5 +501,15 @@ fn main() { let res = (vk_parsed, sig_parsed); println!("{}", res.encode_hex()); } + Action::EpochCompute => { + if cli.args.len() != 2 { + panic!("Should provide arg1=blockNum, arg2=blocksPerEpoch"); + } + let block_num = cli.args[0].parse::().unwrap(); + let epoch_height = cli.args[1].parse::().unwrap(); + + let res = epoch_from_block_number(block_num, epoch_height); + println!("{}", (res,).encode_hex()); + } }; } diff --git a/contracts/script/LightClient.s.sol b/contracts/script/LightClient.s.sol index ba74b9f043..2323ad1d87 100644 --- a/contracts/script/LightClient.s.sol +++ b/contracts/script/LightClient.s.sol @@ -23,8 +23,13 @@ contract DeployLightClientScript is Script { /// @param stateHistoryRetentionPeriod state history retention period in seconds /// @param owner The address that will be set as the owner of the proxy (typically a multisig /// wallet). - - function run(uint32 numInitValidators, uint32 stateHistoryRetentionPeriod, address owner) + /// @param blocksPerEpoch Number of HotShot block per epoch (also per stake table snapshot) + function run( + uint32 numInitValidators, + uint32 stateHistoryRetentionPeriod, + address owner, + uint64 blocksPerEpoch + ) public returns ( address proxyAddress, @@ -57,7 +62,8 @@ contract DeployLightClientScript is Script { proxyAddress = Upgrades.deployUUPSProxy( contractName, abi.encodeCall( - LC.initialize, (state, stakeState, stateHistoryRetentionPeriod, deployer) + LC.initialize, + (state, stakeState, stateHistoryRetentionPeriod, deployer, blocksPerEpoch) ) ); @@ -209,7 +215,11 @@ contract UpgradeLightClientContractWithSameContractScript is Script { /// the admin is not a multisig wallet but is the same as the associated mnemonic /// used in staging deployments only contract DeployLightClientContractScript is Script { - function run(uint32 numInitValidators, uint32 stateHistoryRetentionPeriod) + function run( + uint32 numInitValidators, + uint32 stateHistoryRetentionPeriod, + uint64 blocksPerEpoch + ) external returns ( address payable proxyAddress, @@ -229,7 +239,7 @@ contract DeployLightClientContractScript is Script { (LC.LightClientState memory state, LC.StakeTableState memory stakeState) = abi.decode(result, (LC.LightClientState, LC.StakeTableState)); - return deployContract(state, stakeState, stateHistoryRetentionPeriod); + return deployContract(state, stakeState, stateHistoryRetentionPeriod, blocksPerEpoch); } /// @notice deploys the impl, proxy & initializes the impl @@ -239,7 +249,8 @@ contract DeployLightClientContractScript is Script { function deployContract( LC.LightClientState memory state, LC.StakeTableState memory stakeState, - uint32 stateHistoryRetentionPeriod + uint32 stateHistoryRetentionPeriod, + uint64 blocksPerEpoch ) private returns ( @@ -259,11 +270,12 @@ contract DeployLightClientContractScript is Script { // Encode the initializer function call bytes memory data = abi.encodeWithSignature( - "initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address)", + "initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address,uint64)", state, stakeState, stateHistoryRetentionPeriod, - admin + admin, + blocksPerEpoch ); // our proxy diff --git a/contracts/script/LightClientArb.s.sol b/contracts/script/LightClientArb.s.sol index e3c3ea7182..0ece0083fa 100644 --- a/contracts/script/LightClientArb.s.sol +++ b/contracts/script/LightClientArb.s.sol @@ -13,7 +13,12 @@ contract DeployLightClientArbitrum is Script { error RetentionPeriodIsNotSetCorrectly(); error InitialStateIsNotSetCorrectly(); - function run(uint32 numInitValidators, uint32 stateHistoryRetentionPeriod, address owner) + function run( + uint32 numInitValidators, + uint32 stateHistoryRetentionPeriod, + address owner, + uint64 blocksPerEpoch + ) public returns ( address proxyAddress, @@ -47,7 +52,8 @@ contract DeployLightClientArbitrum is Script { proxyAddress = Upgrades.deployUUPSProxy( "LightClientArbitrum.sol:LightClientArbitrum", abi.encodeCall( - LC.initialize, (state, stakeState, stateHistoryRetentionPeriod, deployer) + LC.initialize, + (state, stakeState, stateHistoryRetentionPeriod, deployer, blocksPerEpoch) ) ); diff --git a/contracts/script/LightClientCallNewFinalizedState.s.sol b/contracts/script/LightClientCallNewFinalizedState.s.sol index c1705b2a5a..ee7f65fbff 100644 --- a/contracts/script/LightClientCallNewFinalizedState.s.sol +++ b/contracts/script/LightClientCallNewFinalizedState.s.sol @@ -18,8 +18,11 @@ contract CallNewFinalizedState is Script { cmds[2] = vm.toString(numInitValidators); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs,) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[], LC.StakeTableState[])); + ( + LC.LightClientState[] memory states, + LC.StakeTableState[] memory nextStakeTables, + V.PlonkProof[] memory proofs + ) = abi.decode(result, (LC.LightClientState[], LC.StakeTableState[], V.PlonkProof[])); address admin; string memory seedPhrase = vm.envString("MNEMONIC"); @@ -28,7 +31,7 @@ contract CallNewFinalizedState is Script { LCMock lc = LCMock(lcContractAddress); - lc.newFinalizedState(states[0], proofs[0]); + lc.newFinalizedState(states[0], nextStakeTables[0], proofs[0]); vm.stopBroadcast(); } diff --git a/contracts/src/LightClient.sol b/contracts/src/LightClient.sol index 456309c478..af70a054a9 100644 --- a/contracts/src/LightClient.sol +++ b/contracts/src/LightClient.sol @@ -38,17 +38,27 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { /// @notice when the permissioned prover is unset, this event is emitted. event PermissionedProverNotRequired(); + /// @notice When entering a new epoch and a new stake table snapshot. + event NewEpoch(uint64 epoch); + + /// @notice Event that a new finalized state has been successfully verified and updated + event NewState( + uint64 indexed viewNum, uint64 indexed blockHeight, BN254.ScalarField blockCommRoot + ); // === System Parameters === // + /// @notice number of blocks per epoch + uint64 public _blocksPerEpoch; + // === Storage === // /// @notice genesis stake commitment StakeTableState public genesisStakeTableState; - + /// @notice stake table commitments for the current voting stakers + StakeTableState public votingStakeTableState; /// @notice genesis block commitment LightClientState public genesisState; - /// @notice Finalized HotShot's light client state LightClientState public finalizedState; @@ -108,11 +118,6 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { BN254.ScalarField hotShotBlockCommRoot; } - /// @notice Event that a new finalized state has been successfully verified and updated - event NewState( - uint64 indexed viewNum, uint64 indexed blockHeight, BN254.ScalarField blockCommRoot - ); - /// @notice The state is outdated and older than currently known `finalizedState` error OutdatedState(); /// @notice Invalid user inputs: wrong format or non-sensible arguments @@ -133,6 +138,8 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { error InvalidHotShotBlockForCommitmentCheck(); /// @notice Invalid Max Block States error InvalidMaxStateHistory(); + /// @notice The last block of the epoch (of the finalizedState) should not be skipped + error MissingLastBlockInEpochUpdate(); /// @notice Constructor disables initializers to prevent the implementation contract from being /// initialized @@ -149,15 +156,19 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { /// @param _stateHistoryRetentionPeriod The maximum retention period (in seconds) for the state /// history. the min retention period allowed is 1 hour and max 365 days /// @param owner The address of the contract owner + /// @param blocksPerEpoch Number of HotShot block per epoch (also per stake table snapshot) function initialize( LightClientState memory _genesis, StakeTableState memory _genesisStakeTableState, uint32 _stateHistoryRetentionPeriod, - address owner + address owner, + uint64 blocksPerEpoch ) public initializer { __Ownable_init(owner); //sets owner of the contract __UUPSUpgradeable_init(); - _initializeState(_genesis, _genesisStakeTableState, _stateHistoryRetentionPeriod); + _initializeState( + _genesis, _genesisStakeTableState, _stateHistoryRetentionPeriod, blocksPerEpoch + ); } /// @notice returns the current block number @@ -189,10 +200,12 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { /// @param _genesisStakeTableState The initial stake table state of the light client /// @param _stateHistoryRetentionPeriod The maximum retention period (in seconds) for the state /// history. The min retention period allowed is 1 hour and the max is 365 days. + /// @param blocksPerEpoch Number of HotShot block per epoch (also per stake table snapshot) function _initializeState( LightClientState memory _genesis, StakeTableState memory _genesisStakeTableState, - uint32 _stateHistoryRetentionPeriod + uint32 _stateHistoryRetentionPeriod, + uint64 blocksPerEpoch ) internal { // The viewNum and blockHeight in the genesis state must be zero to indicate that this is // the initial state. Stake table commitments and threshold cannot be zero, otherwise it's @@ -205,16 +218,18 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { || BN254.ScalarField.unwrap(_genesisStakeTableState.schnorrKeyComm) == 0 || BN254.ScalarField.unwrap(_genesisStakeTableState.amountComm) == 0 || _genesisStakeTableState.threshold == 0 || _stateHistoryRetentionPeriod < 1 hours - || _stateHistoryRetentionPeriod > 365 days + || _stateHistoryRetentionPeriod > 365 days || blocksPerEpoch == 0 ) { revert InvalidArgs(); } genesisState = _genesis; - genesisStakeTableState = _genesisStakeTableState; finalizedState = _genesis; + genesisStakeTableState = _genesisStakeTableState; + votingStakeTableState = _genesisStakeTableState; stateHistoryRetentionPeriod = _stateHistoryRetentionPeriod; + _blocksPerEpoch = blocksPerEpoch; } // === State Modifying APIs === @@ -230,9 +245,12 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { /// @notice While `newState.stakeTable*` refers to the (possibly) new stake table states, /// the entire `newState` needs to be signed by stakers in `finalizedState` /// @param newState new light client state + /// @param nextStakeTable the stake table to use in the next block (same as the current except + /// during epoch change) /// @param proof PlonkProof function newFinalizedState( LightClientState memory newState, + StakeTableState memory nextStakeTable, IPlonkVerifier.PlonkProof memory proof ) external virtual { //revert if we're in permissionedProver mode and the permissioned prover has not been set @@ -249,11 +267,34 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { // format validity check BN254.validateScalarField(newState.blockCommRoot); + // epoch-related checks + uint64 lastUpdateEpoch = currentEpoch(); + uint64 newEpoch = epochFromBlockNumber(newState.blockHeight, _blocksPerEpoch); + if ( + newEpoch == lastUpdateEpoch + 1 && !isLastBlockInEpoch(finalizedState.blockHeight) + && lastUpdateEpoch > 0 + ) { + // advancing 1 epoch is only allowed if the last block of last epoch was submitted + // or if there is no last epoch (i.e. when current epoch is epoch 1) + revert MissingLastBlockInEpochUpdate(); + } + if (newEpoch >= lastUpdateEpoch + 2) { + revert MissingLastBlockInEpochUpdate(); + } + BN254.validateScalarField(nextStakeTable.blsKeyComm); + BN254.validateScalarField(nextStakeTable.schnorrKeyComm); + BN254.validateScalarField(nextStakeTable.amountComm); + // check plonk proof - verifyProof(newState, proof); + verifyProof(newState, nextStakeTable, proof); // upon successful verification, update the latest finalized state + // during epoch change, also update to the new stake table finalizedState = newState; + if (isLastBlockInEpoch(newState.blockHeight)) { + votingStakeTableState = nextStakeTable; + emit NewEpoch(newEpoch + 1); + } updateStateHistory(uint64(currentBlockNumber()), uint64(block.timestamp), newState); @@ -262,21 +303,36 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { /// @notice Verify the Plonk proof, marked as `virtual` for easier testing as we can swap VK /// used in inherited contracts. - function verifyProof(LightClientState memory state, IPlonkVerifier.PlonkProof memory proof) - internal - virtual - { + function verifyProof( + LightClientState memory state, + StakeTableState memory nextStakeTable, + IPlonkVerifier.PlonkProof memory proof + ) internal virtual { IPlonkVerifier.VerifyingKey memory vk = VkLib.getVk(); // Prepare the public input - uint256[7] memory publicInput; + uint256[11] memory publicInput; publicInput[0] = uint256(state.viewNum); publicInput[1] = uint256(state.blockHeight); publicInput[2] = BN254.ScalarField.unwrap(state.blockCommRoot); - publicInput[3] = BN254.ScalarField.unwrap(genesisStakeTableState.blsKeyComm); - publicInput[4] = BN254.ScalarField.unwrap(genesisStakeTableState.schnorrKeyComm); - publicInput[5] = BN254.ScalarField.unwrap(genesisStakeTableState.amountComm); - publicInput[6] = genesisStakeTableState.threshold; + publicInput[3] = BN254.ScalarField.unwrap(votingStakeTableState.blsKeyComm); + publicInput[4] = BN254.ScalarField.unwrap(votingStakeTableState.schnorrKeyComm); + publicInput[5] = BN254.ScalarField.unwrap(votingStakeTableState.amountComm); + publicInput[6] = votingStakeTableState.threshold; + + if (isLastBlockInEpoch(state.blockHeight)) { + // during epoch change: use the next stake table + publicInput[7] = BN254.ScalarField.unwrap(nextStakeTable.blsKeyComm); + publicInput[8] = BN254.ScalarField.unwrap(nextStakeTable.schnorrKeyComm); + publicInput[9] = BN254.ScalarField.unwrap(nextStakeTable.amountComm); + publicInput[10] = nextStakeTable.threshold; + } else { + // use the previous stake table, effectively force nextStakeTable == votingStakeTable + publicInput[7] = BN254.ScalarField.unwrap(votingStakeTableState.blsKeyComm); + publicInput[8] = BN254.ScalarField.unwrap(votingStakeTableState.schnorrKeyComm); + publicInput[9] = BN254.ScalarField.unwrap(votingStakeTableState.amountComm); + publicInput[10] = votingStakeTableState.threshold; + } if (!PlonkVerifier.verify(vk, publicInput, proof)) { revert InvalidProof(); @@ -471,4 +527,40 @@ contract LightClient is Initializable, OwnableUpgradeable, UUPSUpgradeable { function isPermissionedProverEnabled() public view returns (bool) { return (permissionedProver != address(0)); } + + // === Epoch-related logic === + // + + /// @notice Returns the current epoch according the latest update on finalizedState + /// @return current epoch (computed from the last known hotshot block number) + function currentEpoch() public view returns (uint64) { + return epochFromBlockNumber(finalizedState.blockHeight, _blocksPerEpoch); + } + + /// @notice Calculate the epoch number from the hotshot block number + /// @dev same logic as `hotshot_types::utils::epoch_from_block_number()` + function epochFromBlockNumber(uint64 blockNum, uint64 blocksPerEpoch) + public + pure + returns (uint64) + { + if (blocksPerEpoch == 0) { + // this case is unreachable in our context since we reject zero-valued _blocksPerEpoch + // at init time + return 0; + } else if (blockNum % blocksPerEpoch == 0) { + return blockNum / blocksPerEpoch; + } else { + return blockNum / blocksPerEpoch + 1; + } + } + + /// @notice Decide if a block height is the last block in an epoch + function isLastBlockInEpoch(uint64 blockHeight) public view returns (bool) { + if (blockHeight == 0) { + return false; + } else { + return blockHeight % _blocksPerEpoch == 0; + } + } } diff --git a/contracts/src/StakeTable.sol b/contracts/src/StakeTable.sol index 6c90117556..9c7271d7ed 100644 --- a/contracts/src/StakeTable.sol +++ b/contracts/src/StakeTable.sol @@ -75,9 +75,6 @@ contract StakeTable is AbstractStakeTable, Ownable, InitializedAt { /// Error raised when the value is invalid error InvalidValue(); - // Error raised when the hotShotBlocksPerEpoch is zero - error InvalidHotShotBlocksPerEpoch(); - /// Mapping from a hash of a BLS key to a node struct defined in the abstract contract. mapping(address account => Node node) public nodes; @@ -106,9 +103,6 @@ contract StakeTable is AbstractStakeTable, Ownable, InitializedAt { /// the number of validators that can exit per epoch. uint64 public maxNumChurnPerEpoch; - /// @notice The number of hotshot blocks per epoch. - uint64 public hotShotBlocksPerEpoch; - address public admin; uint256 public minStakeAmount; @@ -118,7 +112,6 @@ contract StakeTable is AbstractStakeTable, Ownable, InitializedAt { address _tokenAddress, address _lightClientAddress, uint64 _maxNumChurnPerEpoch, - uint64 _hotShotBlocksPerEpoch, uint256 _minStakeAmount, address _initialOwner ) Ownable(_initialOwner) InitializedAt() { @@ -134,10 +127,6 @@ contract StakeTable is AbstractStakeTable, Ownable, InitializedAt { exitEpoch = 1; numPendingExitsInEpoch = 0; - if (_hotShotBlocksPerEpoch == 0) { - revert InvalidHotShotBlocksPerEpoch(); - } - hotShotBlocksPerEpoch = _hotShotBlocksPerEpoch; minStakeAmount = _minStakeAmount; admin = msg.sender; } @@ -164,19 +153,6 @@ contract StakeTable is AbstractStakeTable, Ownable, InitializedAt { && BN254.BaseField.unwrap(a.y1) == BN254.BaseField.unwrap(b.y1); } - /// @dev Fetches the last hotshot block number from the light client contract to calculate the - /// epoch. - /// @return current epoch (computed from the last known hotshot block number) - function currentEpoch() public view virtual returns (uint64) { - // get the last hotshot block number from the light client contract since this contract - // gets the latest info from HotShot periodically - (, uint64 lastHotshotBlockNumber,) = lightClient.finalizedState(); - - uint64 epoch = lastHotshotBlockNumber / hotShotBlocksPerEpoch; - - return epoch; - } - /// @notice Add a registration function pushToRegistrationQueue() internal virtual override { // Either we have a need for a new registration epoch and registrations queue for the @@ -185,9 +161,10 @@ contract StakeTable is AbstractStakeTable, Ownable, InitializedAt { // if the current epoch is max uint64, the registration queue will not be updated and this // function will revert - if (registrationEpoch < currentEpoch() + 1) { + uint64 curEpoch = lightClient.currentEpoch(); + if (registrationEpoch < curEpoch + 1) { // The registration epoch is outdated. - registrationEpoch = currentEpoch() + 1; + registrationEpoch = curEpoch + 1; numPendingRegistrationsInEpoch = 0; } else if (numPendingRegistrationsInEpoch >= maxNumChurnPerEpoch) { // The queue for in the current registration epoch is full. @@ -207,9 +184,10 @@ contract StakeTable is AbstractStakeTable, Ownable, InitializedAt { // if the current epoch is max uint64, the exit queue will not be updated and this function // will revert - if (exitEpoch < currentEpoch() + 1) { + uint64 curEpoch = lightClient.currentEpoch(); + if (exitEpoch < curEpoch + 1) { // The exit epoch is outdated. - exitEpoch = currentEpoch() + 1; + exitEpoch = curEpoch + 1; numPendingExitsInEpoch = 0; } else if (numPendingExitsInEpoch >= maxNumChurnPerEpoch) { // The queue for in the current exit epoch is full. @@ -371,8 +349,8 @@ contract StakeTable is AbstractStakeTable, Ownable, InitializedAt { } // A node cannot deposit more tokens while it waiting to register. - uint64 _currentEpoch = currentEpoch(); - if (_currentEpoch <= node.registerEpoch) { + uint64 _curEpoch = lightClient.currentEpoch(); + if (_curEpoch <= node.registerEpoch) { revert PrematureDeposit(); } @@ -386,7 +364,7 @@ contract StakeTable is AbstractStakeTable, Ownable, InitializedAt { emit Deposit(msg.sender, uint256(amount)); - uint64 effectiveEpoch = _currentEpoch + 1; + uint64 effectiveEpoch = _curEpoch + 1; return (nodes[msg.sender].balance, effectiveEpoch); } @@ -396,6 +374,7 @@ contract StakeTable is AbstractStakeTable, Ownable, InitializedAt { /// @dev TODO modify this according to the current spec function requestExit() external virtual override { Node memory node = nodes[msg.sender]; + uint64 curEpoch = lightClient.currentEpoch(); if (node.account == address(0)) { revert NodeNotRegistered(); @@ -412,7 +391,7 @@ contract StakeTable is AbstractStakeTable, Ownable, InitializedAt { // Cannot exit before becoming an active participant. Activation happens one epoch after the // node's registration epoch, due to the consensus-imposed activation waiting period. - if (currentEpoch() < node.registerEpoch + 1) { + if (curEpoch < node.registerEpoch + 1) { revert PrematureExit(); } @@ -431,6 +410,7 @@ contract StakeTable is AbstractStakeTable, Ownable, InitializedAt { /// for the exit escrow period to be over function withdrawFunds() external virtual override returns (uint256) { Node memory node = nodes[msg.sender]; + uint64 curEpoch = lightClient.currentEpoch(); if (node.account == address(0)) { revert NodeNotRegistered(); @@ -448,7 +428,7 @@ contract StakeTable is AbstractStakeTable, Ownable, InitializedAt { } // Verify that the exit escrow period is over. - if (currentEpoch() < node.exitEpoch + exitEscrowPeriod(node)) { + if (curEpoch < node.exitEpoch + exitEscrowPeriod(node)) { revert PrematureWithdrawal(); } totalStake -= balance; diff --git a/contracts/src/libraries/LightClientStateUpdateVK.sol b/contracts/src/libraries/LightClientStateUpdateVK.sol index 1c5b001019..57d3f37a24 100644 --- a/contracts/src/libraries/LightClientStateUpdateVK.sol +++ b/contracts/src/libraries/LightClientStateUpdateVK.sol @@ -25,172 +25,172 @@ library LightClientStateUpdateVK { // domain size mstore(vk, 1048576) // num of public inputs - mstore(add(vk, 0x20), 7) + mstore(add(vk, 0x20), 11) // sigma0 mstore( mload(add(vk, 0x40)), - 16043392748105542250304322824810370020021025564942427718474950685092675841954 + 17425521561317211150332406747083910778533028187068871110049757158598593416076 ) mstore( add(mload(add(vk, 0x40)), 0x20), - 19135284366657833628354977949371490269920872528386804828338183734933915063463 + 4102954851617520144561260789230439331972649333479878813987242991488397154960 ) // sigma1 mstore( mload(add(vk, 0x60)), - 2778717324330498744994531263702315244149678900961828222283402152593904107675 + 1196221903700326256624205564743508182068743441476554464462201352563117972406 ) mstore( add(mload(add(vk, 0x60)), 0x20), - 16759366415806200391095504905464812555509135295738337106253912320243246018937 + 3145421364735674033683818446404329167355192474243445954267703270211190628153 ) // sigma2 mstore( mload(add(vk, 0x80)), - 6220330596615226723642438930205134518711246397122520386233799907528379013596 + 11916586992501186063872468462679204480469859180687561296889307826633685645606 ) mstore( add(mload(add(vk, 0x80)), 0x20), - 8344958809262021811929679424186961192688788615559223638884967520276027016395 + 14648443031351710109987589529264541399379424554019182560143471352713000256395 ) // sigma3 mstore( mload(add(vk, 0xa0)), - 7952811448742934474128215788861604894182577909950573256881248636552173771199 + 15214302562009752362723263951803262123875488277225789760423649278907975435909 ) mstore( add(mload(add(vk, 0xa0)), 0x20), - 20500159975945184586417129168820991334637018612773612287842415693151993758760 + 14923342739468841552958235154563491959836915596191006877952825083918340525472 ) // sigma4 mstore( mload(add(vk, 0xc0)), - 10296671863931908571056025645132677298697792048312748314247297091242497167101 + 4843349310452537230570842675749672560574773384214850780853342887137492428195 ) mstore( add(mload(add(vk, 0xc0)), 0x20), - 14487321642141254557263069781234760963154849825884844778816524063348598567049 + 5202767806966754384348781525447081969417765556202932669247869581722611363618 ) // q1 mstore( mload(add(vk, 0xe0)), - 7758833542876569127261238805250663426100336271670929506591434105603119717827 + 12466980253647197863523949882122657746001558430394371891778047008850329421115 ) mstore( add(mload(add(vk, 0xe0)), 0x20), - 3847980651474203698351602471244791446829358454627973590875164935356920412957 + 361557274344703796527359967465158384549219123165960802605536906972142512006 ) // q2 mstore( mload(add(vk, 0x100)), - 9277076569845583759629501106958656611791077602517098829558737012728982332382 + 5931659549205234910810408580286745598885831969025569735948360065058978851763 ) mstore( add(mload(add(vk, 0x100)), 0x20), - 442283620081484392522390233257214501417811361363792609544757268467188182859 + 9496122563454086445600634192847376062545341568309830301357599600602894685214 ) // q3 mstore( mload(add(vk, 0x120)), - 4678354727148314768583368011442986799904545609212135187355874282069755187556 + 13416134883028471985650874820727392680938931672860015787204929883090660074155 ) mstore( add(mload(add(vk, 0x120)), 0x20), - 11239540448038284734601875871911558572979722253259682483359467915957118547606 + 4536351019470275723378753116518283795536843949411441119908077930507936685175 ) // q4 mstore( mload(add(vk, 0x140)), - 19795855070701456519856289246107606667286081050354689801132498355098877250588 + 18543948145752508686613131095921285947697480580719415047340123972953593863125 ) mstore( add(mload(add(vk, 0x140)), 0x20), - 7486832458658187317275572122161344331029297565191850558196052941108256950480 + 12692602670436285491044275748306931639042881008127374621216774308555595953062 ) // qM12 mstore( mload(add(vk, 0x160)), - 15258708840140408534057880342484090317487134490781304521604654158159692661694 + 106550073988543920586769649455077439246956595529883347818159899789765002229 ) mstore( add(mload(add(vk, 0x160)), 0x20), - 2684189309724513706861143955683980707183027467486121633924046346673706699241 + 2715959482041502313111266343081155611167352660831984875711341237471290948875 ) // qM34 mstore( mload(add(vk, 0x180)), - 20204605388553534621522300111279473013506461170995450431955470728233298617583 + 10327472946492122366102057353474547438199377882786211527617242045618345684804 ) mstore( add(mload(add(vk, 0x180)), 0x20), - 20667860155429666628752166675435907067937684456207285708587770630418366377348 + 250221952714311618167570683268039160934403486620453081324322880636020908259 ) // qO mstore( mload(add(vk, 0x1a0)), - 20001416105877927202901579747864018649895183788011637572138305596074976602376 + 21404333575751727226773308025252944038845065232562928797508804563478912861952 ) mstore( add(mload(add(vk, 0x1a0)), 0x20), - 19528436190309610113547469449976708739079126597255604268425501554938355526882 + 21666959861010532297933049706808674539056239964665650896779027292387438795344 ) // qC mstore( mload(add(vk, 0x1c0)), - 20482873589297055931625799341900159582543895173558170170584514916029179712769 + 17476481469657731341505617829551702041018304706568399200670460539341986455449 ) mstore( add(mload(add(vk, 0x1c0)), 0x20), - 16386801470684282089941433984161903425938200748129533869396840661293226216717 + 13442371743560265578060352708562539029987193963610502642810709467527712308420 ) // qH1 mstore( mload(add(vk, 0x1e0)), - 1960884119254066702392602328821638986229496749601689484863310054626771192849 + 271269703702509063405037213232753759099383403509159772522792961590812940692 ) mstore( add(mload(add(vk, 0x1e0)), 0x20), - 6966409033516919499274932822727395736487830106099489183848257044616164644964 + 14278494566324766000172297208859996299916797915604484348044097507071812412232 ) // qH2 mstore( mload(add(vk, 0x200)), - 19753440871621787440428381199327465770585928335388367352727113355846992655252 + 184992713123027778841265929357623034441600642402295931904269663219005357570 ) mstore( add(mload(add(vk, 0x200)), 0x20), - 11026377003353031626858906742565594946968872706038673353464112313773276980972 + 12764054383855857666063486226246678618318065931696439027096283631450610952515 ) // qH3 mstore( mload(add(vk, 0x220)), - 5448915697208493401615649328992224252292638718144982802779361343669178673414 + 10086692506048550183449376203492324195428353495407777096243340671389626162607 ) mstore( add(mload(add(vk, 0x220)), 0x20), - 6085228836821381915568415426008615814705795649793227339139722249659752395983 + 10297394455299135280428731763757285478375255606485074244869710855303571705191 ) // qH4 mstore( mload(add(vk, 0x240)), - 819687199834621753152082039202327894832066894790282585745748408358274702853 + 8727614809919057737663922812292350969787371462363384591395256378324689145475 ) mstore( add(mload(add(vk, 0x240)), 0x20), - 19319663644033644630589680099329782677655847333441532334438696245011494104785 + 1308919828497170083713690383242056372987459220230569173422412710448350418663 ) // qEcc mstore( mload(add(vk, 0x260)), - 3247667238694701634583031584459011661543842409365209666160058601955613754293 + 1629110141514917607190411179588253135595330890146733359426882364391829989433 ) mstore( add(mload(add(vk, 0x260)), 0x20), - 16270745764918143312248739566720243316557176152434456136076490117238720935327 + 9802732174432577731680065691829634522386091545768624240289414976709128186979 ) // g2LSB mstore( diff --git a/contracts/src/libraries/PlonkVerifier.sol b/contracts/src/libraries/PlonkVerifier.sol index e5f0f85e91..53a21be0a0 100644 --- a/contracts/src/libraries/PlonkVerifier.sol +++ b/contracts/src/libraries/PlonkVerifier.sol @@ -67,7 +67,7 @@ library PlonkVerifier { /// @return _ A boolean indicating successful verification, false otherwise function verify( IPlonkVerifier.VerifyingKey memory verifyingKey, - uint256[7] memory publicInput, + uint256[11] memory publicInput, IPlonkVerifier.PlonkProof memory proof ) external view returns (bool) { _validateProof(proof); @@ -79,6 +79,10 @@ library PlonkVerifier { BN254.validateScalarField(BN254.ScalarField.wrap(publicInput[4])); BN254.validateScalarField(BN254.ScalarField.wrap(publicInput[5])); BN254.validateScalarField(BN254.ScalarField.wrap(publicInput[6])); + BN254.validateScalarField(BN254.ScalarField.wrap(publicInput[7])); + BN254.validateScalarField(BN254.ScalarField.wrap(publicInput[8])); + BN254.validateScalarField(BN254.ScalarField.wrap(publicInput[9])); + BN254.validateScalarField(BN254.ScalarField.wrap(publicInput[10])); return _verify(verifyingKey, publicInput, proof); } @@ -115,10 +119,10 @@ library PlonkVerifier { // core verifier logic, assuming all input arguments are validated function _verify( IPlonkVerifier.VerifyingKey memory verifyingKey, - uint256[7] memory publicInput, + uint256[11] memory publicInput, IPlonkVerifier.PlonkProof memory proof ) private view returns (bool) { - if (verifyingKey.numInputs != 7) revert WrongPlonkVK(); + if (verifyingKey.numInputs != 11) revert WrongPlonkVK(); Challenges memory chal = _computeChallenges(verifyingKey, publicInput, proof); @@ -167,7 +171,7 @@ library PlonkVerifier { function _computeChallenges( IPlonkVerifier.VerifyingKey memory vk, - uint256[7] memory pi, + uint256[11] memory pi, IPlonkVerifier.PlonkProof memory proof ) internal pure returns (Challenges memory res) { uint256 p = BN254.R_MOD; @@ -261,30 +265,34 @@ library PlonkVerifier { mstore(add(dataPtr, 0x600), mload(add(pi, 0x80))) // PI[4] mstore(add(dataPtr, 0x620), mload(add(pi, 0xa0))) // PI[5] mstore(add(dataPtr, 0x640), mload(add(pi, 0xc0))) // PI[6] + mstore(add(dataPtr, 0x660), mload(add(pi, 0xe0))) // PI[7] + mstore(add(dataPtr, 0x680), mload(add(pi, 0x100))) // PI[8] + mstore(add(dataPtr, 0x6a0), mload(add(pi, 0x120))) // PI[9] + mstore(add(dataPtr, 0x6c0), mload(add(pi, 0x140))) // PI[10] // proof let wire0Ptr := mload(proof) - mstore(add(dataPtr, 0x660), mload(wire0Ptr)) // wire0.x - mstore(add(dataPtr, 0x680), mload(add(wire0Ptr, 0x20))) // wire0.y + mstore(add(dataPtr, 0x6e0), mload(wire0Ptr)) // wire0.x + mstore(add(dataPtr, 0x700), mload(add(wire0Ptr, 0x20))) // wire0.y let wire1Ptr := mload(add(proof, 0x20)) - mstore(add(dataPtr, 0x6a0), mload(wire1Ptr)) // wire1.x - mstore(add(dataPtr, 0x6c0), mload(add(wire1Ptr, 0x20))) // wire1.y + mstore(add(dataPtr, 0x720), mload(wire1Ptr)) // wire1.x + mstore(add(dataPtr, 0x740), mload(add(wire1Ptr, 0x20))) // wire1.y let wire2Ptr := mload(add(proof, 0x40)) - mstore(add(dataPtr, 0x6e0), mload(wire2Ptr)) // wire2.x - mstore(add(dataPtr, 0x700), mload(add(wire2Ptr, 0x20))) // wire2.y + mstore(add(dataPtr, 0x760), mload(wire2Ptr)) // wire2.x + mstore(add(dataPtr, 0x780), mload(add(wire2Ptr, 0x20))) // wire2.y let wire3Ptr := mload(add(proof, 0x60)) - mstore(add(dataPtr, 0x720), mload(wire3Ptr)) // wire3.x - mstore(add(dataPtr, 0x740), mload(add(wire3Ptr, 0x20))) // wire3.y + mstore(add(dataPtr, 0x7a0), mload(wire3Ptr)) // wire3.x + mstore(add(dataPtr, 0x7c0), mload(add(wire3Ptr, 0x20))) // wire3.y let wire4Ptr := mload(add(proof, 0x80)) - mstore(add(dataPtr, 0x760), mload(wire4Ptr)) // wire4.x - mstore(add(dataPtr, 0x780), mload(add(wire4Ptr, 0x20))) // wire4.y + mstore(add(dataPtr, 0x7e0), mload(wire4Ptr)) // wire4.x + mstore(add(dataPtr, 0x800), mload(add(wire4Ptr, 0x20))) // wire4.y // challenge: beta { mstore(statePtr, 0x0) // init state - // preimage len: state(0x20) + transcript(0x7a0) + // preimage len: state(0x20) + transcript(0x820) // overwrite previous state at freePtr - mstore(statePtr, keccak256(statePtr, 0x7c0)) + mstore(statePtr, keccak256(statePtr, 0x840)) // (mod p) to get beta mstore(add(res, 0x60), mod(mload(statePtr), p)) } diff --git a/contracts/src/libraries/PlonkVerifier2.sol b/contracts/src/libraries/PlonkVerifier2.sol deleted file mode 100644 index 9df354998f..0000000000 --- a/contracts/src/libraries/PlonkVerifier2.sol +++ /dev/null @@ -1,929 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED - -pragma solidity ^0.8.0; - -import { BN254 } from "bn254/BN254.sol"; -import { PolynomialEval as Poly } from "./PolynomialEval.sol"; -import { IPlonkVerifier } from "../interfaces/IPlonkVerifier.sol"; - -library PlonkVerifier2 { - // use notation from https://datatracker.ietf.org/doc/draft-irtf-cfrg-pairing-friendly-curves/ - // - // Elliptic curve is defined over a prime field GF(p), with embedding degree k. - // Short Weierstrass (SW form) is, for a, b \in GF(p^n) for some natural number n > 0: - // E: y^2 = x^3 + a * x + b - // - // Pairing is defined over cyclic subgroups G1, G2, both of which are of order r. - // G1 is a subgroup of E(GF(p)), G2 is a subgroup of E(GF(p^k)). - // - // BN family are parameterized curves with well-chosen t, - // p = 36 * t^4 + 36 * t^3 + 24 * t^2 + 6 * t + 1 - // r = 36 * t^4 + 36 * t^3 + 18 * t^2 + 6 * t + 1 - // for some integer t. - // E has the equation: - // E: y^2 = x^3 + b - // where b is a primitive element of multiplicative group (GF(p))^* of order (p-1). - // A pairing e is defined by taking G1 as a subgroup of E(GF(p)) of order r, - // G2 as a subgroup of E'(GF(p^2)), - // and G_T as a subgroup of a multiplicative group (GF(p^12))^* of order r. - // - // BN254 is defined over a 254-bit prime order p, embedding degree k = 12. - uint256 public constant P_MOD = - 21888242871839275222246405745257275088696311157297823662689037894645226208583; - uint256 public constant R_MOD = - 21888242871839275222246405745257275088548364400416034343698204186575808495617; - - // _COSET_K0 = 1, has no effect during multiplication, thus avoid declaring it here. - uint256 private constant COSET_K1 = - 0x2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a; - uint256 private constant COSET_K2 = - 0x1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb025; - uint256 private constant COSET_K3 = - 0x2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a; - uint256 private constant COSET_K4 = - 0x2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e881; - - // Parsed from Aztec's Ignition CRS, - // `beta_h` \in G2 where \beta is the trapdoor, h is G2 generator `BN254.P2()` - // See parsing code: https://github.com/alxiong/crs - uint256 private constant BETA_H_X0 = - 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1; - uint256 private constant BETA_H_X1 = - 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0; - uint256 private constant BETA_H_Y0 = - 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4; - uint256 private constant BETA_H_Y1 = - 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55; - - // BN254.P2 - uint256 private constant H_X0 = - 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2; - uint256 private constant H_X1 = - 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed; - uint256 private constant H_Y0 = - 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b; - uint256 private constant H_Y1 = - 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa; - - /// The number of wire types of the circuit, TurboPlonk has 5. - uint256 private constant NUM_WIRE_TYPES = 5; - - uint256 private constant ERROR_STRING_ID = - 0x08c379a000000000000000000000000000000000000000000000000000000000; // selector for function - // Error(string) - - /// @dev Plonk IOP verifier challenges. - struct Challenges { - uint256 alpha; // 0x00 - uint256 alpha2; // 0x20 - uint256 alpha3; // 0x40 - uint256 beta; // 0x60 - uint256 gamma; // 0x80 - uint256 zeta; // 0xA0 - uint256 v; // 0xC0 - uint256 u; // 0xE0 - } - /// @dev Validate all group points and scalar fields. Revert if - /// any are invalid. - /// @param proof A Plonk proof - - function _validateProof(IPlonkVerifier.PlonkProof memory proof) internal pure { - BN254.validateG1Point(proof.wire0); - BN254.validateG1Point(proof.wire1); - BN254.validateG1Point(proof.wire2); - BN254.validateG1Point(proof.wire3); - BN254.validateG1Point(proof.wire4); - BN254.validateG1Point(proof.prodPerm); - BN254.validateG1Point(proof.split0); - BN254.validateG1Point(proof.split1); - BN254.validateG1Point(proof.split2); - BN254.validateG1Point(proof.split3); - BN254.validateG1Point(proof.split4); - BN254.validateG1Point(proof.zeta); - BN254.validateG1Point(proof.zetaOmega); - BN254.validateScalarField(proof.wireEval0); - BN254.validateScalarField(proof.wireEval1); - BN254.validateScalarField(proof.wireEval2); - BN254.validateScalarField(proof.wireEval3); - BN254.validateScalarField(proof.wireEval4); - BN254.validateScalarField(proof.sigmaEval0); - BN254.validateScalarField(proof.sigmaEval1); - BN254.validateScalarField(proof.sigmaEval2); - BN254.validateScalarField(proof.sigmaEval3); - BN254.validateScalarField(proof.prodPermZetaOmegaEval); - } - - /// @dev Compute the constant term of the linearization polynomial. - /// ``` - /// r_plonk = PI - L1(x) * alpha^2 - alpha * \prod_i=1..m-1 (w_i + beta * sigma_i + gamma) * - /// (w_m + gamma) * z(xw) - /// ``` - /// where m is the number of wire types. - function _computeLinPolyConstantTerm( - Challenges memory chal, - IPlonkVerifier.PlonkProof memory proof, - Poly.EvalData memory evalData - ) internal pure returns (uint256 res) { - uint256 lagrangeOneEval = BN254.ScalarField.unwrap(evalData.lagrangeOne); - uint256 piEval = BN254.ScalarField.unwrap(evalData.piEval); - uint256 perm = 1; - - assembly { - let beta := mload(add(chal, 0x60)) - let gamma := mload(add(chal, 0x80)) - - // \prod_i=1..m-1 (w_i + beta * sigma_i + gamma) - { - let w0 := mload(add(proof, 0x1a0)) - let sigma0 := mload(add(proof, 0x240)) - perm := - mulmod( - perm, - addmod(addmod(w0, gamma, R_MOD), mulmod(beta, sigma0, R_MOD), R_MOD), - R_MOD - ) - } - { - let w1 := mload(add(proof, 0x1c0)) - let sigma1 := mload(add(proof, 0x260)) - perm := - mulmod( - perm, - addmod(addmod(w1, gamma, R_MOD), mulmod(beta, sigma1, R_MOD), R_MOD), - R_MOD - ) - } - { - let w2 := mload(add(proof, 0x1e0)) - let sigma2 := mload(add(proof, 0x280)) - perm := - mulmod( - perm, - addmod(addmod(w2, gamma, R_MOD), mulmod(beta, sigma2, R_MOD), R_MOD), - R_MOD - ) - } - { - let w3 := mload(add(proof, 0x200)) - let sigma3 := mload(add(proof, 0x2a0)) - perm := - mulmod( - perm, - addmod(addmod(w3, gamma, R_MOD), mulmod(beta, sigma3, R_MOD), R_MOD), - R_MOD - ) - } - - // \prod_i=1..m-1 (w_i + beta * sigma_i + gamma) * (w_m + gamma) * z(xw) - { - let w4 := mload(add(proof, 0x220)) - let permNextEval := mload(add(proof, 0x2c0)) - perm := mulmod(perm, mulmod(addmod(w4, gamma, R_MOD), permNextEval, R_MOD), R_MOD) - } - - let alpha := mload(chal) - let alpha2 := mload(add(chal, 0x20)) - // PI - L1(x) * alpha^2 - alpha * \prod_i=1..m-1 (w_i + beta * sigma_i + gamma) * (w_m + - // gamma) * z(xw) - res := addmod(piEval, sub(R_MOD, mulmod(alpha2, lagrangeOneEval, R_MOD)), R_MOD) - res := addmod(res, sub(R_MOD, mulmod(alpha, perm, R_MOD)), R_MOD) - } - } - - function _computeChallenges( - IPlonkVerifier.VerifyingKey memory vk, - uint256[7] memory pi, - IPlonkVerifier.PlonkProof memory proof - ) internal pure returns (Challenges memory res) { - assembly { - // use free memory space for scratch pad, 0x40: free memory ptr - let statePtr := mload(0x40) - let dataPtr := add(statePtr, 0x20) - - // Start of transcript (unit: bytes) - // sizeInBits (4) | domainSize (8) | numInputs (8) | pad (12) - mstore(dataPtr, 0) // initialize to 0 first - mstore(dataPtr, shl(224, 254)) // sizeInBits - mstore(add(dataPtr, 4), shl(192, mload(vk))) // domainSize - mstore(add(dataPtr, 12), shl(192, mload(add(vk, 0x20)))) // numInputs - - // G2 from SRS - mstore(add(dataPtr, 0x20), mload(add(vk, 0x280))) // g2LSB (32) - mstore(add(dataPtr, 0x40), mload(add(vk, 0x2a0))) // g2MSB (32) - - // k0 ~ k4 - mstore(add(dataPtr, 0x60), 0x1) - mstore( - add(dataPtr, 0x80), - 0x2f8dd1f1a7583c42c4e12a44e110404c73ca6c94813f85835da4fb7bb1301d4a - ) - mstore( - add(dataPtr, 0xa0), - 0x1ee678a0470a75a6eaa8fe837060498ba828a3703b311d0f77f010424afeb025 - ) - mstore( - add(dataPtr, 0xc0), - 0x2042a587a90c187b0a087c03e29c968b950b1db26d5c82d666905a6895790c0a - ) - mstore( - add(dataPtr, 0xe0), - 0x2e2b91456103698adf57b799969dea1c8f739da5d8d40dd3eb9222db7c81e881 - ) - - // selectors - let q1Ptr := mload(add(vk, 0xe0)) - mstore(add(dataPtr, 0x100), mload(q1Ptr)) // q1.x - mstore(add(dataPtr, 0x120), mload(add(q1Ptr, 0x20))) // q1.y - let q2Ptr := mload(add(vk, 0x100)) - mstore(add(dataPtr, 0x140), mload(q2Ptr)) // q2.x - mstore(add(dataPtr, 0x160), mload(add(q2Ptr, 0x20))) // q2.y - let q3Ptr := mload(add(vk, 0x120)) - mstore(add(dataPtr, 0x180), mload(q3Ptr)) // q3.x - mstore(add(dataPtr, 0x1a0), mload(add(q3Ptr, 0x20))) // q3.y - let q4Ptr := mload(add(vk, 0x140)) - mstore(add(dataPtr, 0x1c0), mload(q4Ptr)) // q4.x - mstore(add(dataPtr, 0x1e0), mload(add(q4Ptr, 0x20))) // q4.y - let qM12Ptr := mload(add(vk, 0x160)) - mstore(add(dataPtr, 0x200), mload(qM12Ptr)) // qM12.x - mstore(add(dataPtr, 0x220), mload(add(qM12Ptr, 0x20))) // qM12.y - let qM34Ptr := mload(add(vk, 0x180)) - mstore(add(dataPtr, 0x240), mload(qM34Ptr)) // qM34.x - mstore(add(dataPtr, 0x260), mload(add(qM34Ptr, 0x20))) // qM34.y - let qH1Ptr := mload(add(vk, 0x1e0)) - mstore(add(dataPtr, 0x280), mload(qH1Ptr)) // qH1.x - mstore(add(dataPtr, 0x2a0), mload(add(qH1Ptr, 0x20))) // qH1.y - let qH2Ptr := mload(add(vk, 0x200)) - mstore(add(dataPtr, 0x2c0), mload(qH2Ptr)) // qH2.x - mstore(add(dataPtr, 0x2e0), mload(add(qH2Ptr, 0x20))) // qH2.y - let qH3Ptr := mload(add(vk, 0x220)) - mstore(add(dataPtr, 0x300), mload(qH3Ptr)) // qH3.x - mstore(add(dataPtr, 0x320), mload(add(qH3Ptr, 0x20))) // qH3.y - let qH4Ptr := mload(add(vk, 0x240)) - mstore(add(dataPtr, 0x340), mload(qH4Ptr)) // qH4.x - mstore(add(dataPtr, 0x360), mload(add(qH4Ptr, 0x20))) // qH4.y - let qOPtr := mload(add(vk, 0x1a0)) - mstore(add(dataPtr, 0x380), mload(qOPtr)) // qO.x - mstore(add(dataPtr, 0x3a0), mload(add(qOPtr, 0x20))) // qO.y - let qCPtr := mload(add(vk, 0x1c0)) - mstore(add(dataPtr, 0x3c0), mload(qCPtr)) // qC.x - mstore(add(dataPtr, 0x3e0), mload(add(qCPtr, 0x20))) // qC.y - let qECCPtr := mload(add(vk, 0x260)) - mstore(add(dataPtr, 0x400), mload(qECCPtr)) // qECC.x - mstore(add(dataPtr, 0x420), mload(add(qECCPtr, 0x20))) // qECC.y - - // sigmas - let sigma0Ptr := mload(add(vk, 0x40)) - mstore(add(dataPtr, 0x440), mload(sigma0Ptr)) // sigma0.x - mstore(add(dataPtr, 0x460), mload(add(sigma0Ptr, 0x20))) // sigma0.y - let sigma1Ptr := mload(add(vk, 0x60)) - mstore(add(dataPtr, 0x480), mload(sigma1Ptr)) // sigma1.x - mstore(add(dataPtr, 0x4a0), mload(add(sigma1Ptr, 0x20))) // sigma1.y - let sigma2Ptr := mload(add(vk, 0x80)) - mstore(add(dataPtr, 0x4c0), mload(sigma2Ptr)) // sigma2.x - mstore(add(dataPtr, 0x4e0), mload(add(sigma2Ptr, 0x20))) // sigma2.y - let sigma3Ptr := mload(add(vk, 0xa0)) - mstore(add(dataPtr, 0x500), mload(sigma3Ptr)) // sigma3.x - mstore(add(dataPtr, 0x520), mload(add(sigma3Ptr, 0x20))) // sigma3.y - let sigma4Ptr := mload(add(vk, 0xc0)) - mstore(add(dataPtr, 0x540), mload(sigma4Ptr)) // sigma4.x - mstore(add(dataPtr, 0x560), mload(add(sigma4Ptr, 0x20))) // sigma4.y - - // public inputs - mstore(add(dataPtr, 0x580), mload(pi)) // PI[0] - mstore(add(dataPtr, 0x5a0), mload(add(pi, 0x20))) // PI[1] - mstore(add(dataPtr, 0x5c0), mload(add(pi, 0x40))) // PI[2] - mstore(add(dataPtr, 0x5e0), mload(add(pi, 0x60))) // PI[3] - mstore(add(dataPtr, 0x600), mload(add(pi, 0x80))) // PI[4] - mstore(add(dataPtr, 0x620), mload(add(pi, 0xa0))) // PI[5] - mstore(add(dataPtr, 0x640), mload(add(pi, 0xc0))) // PI[6] - mstore(add(dataPtr, 0x660), mload(add(pi, 0xe0))) // PI[7] - - // proof - let wire0Ptr := mload(proof) - mstore(add(dataPtr, 0x660), mload(wire0Ptr)) // wire0.x - mstore(add(dataPtr, 0x680), mload(add(wire0Ptr, 0x20))) // wire0.y - let wire1Ptr := mload(add(proof, 0x20)) - mstore(add(dataPtr, 0x6a0), mload(wire1Ptr)) // wire1.x - mstore(add(dataPtr, 0x6c0), mload(add(wire1Ptr, 0x20))) // wire1.y - let wire2Ptr := mload(add(proof, 0x40)) - mstore(add(dataPtr, 0x6e0), mload(wire2Ptr)) // wire2.x - mstore(add(dataPtr, 0x700), mload(add(wire2Ptr, 0x20))) // wire2.y - let wire3Ptr := mload(add(proof, 0x60)) - mstore(add(dataPtr, 0x720), mload(wire3Ptr)) // wire3.x - mstore(add(dataPtr, 0x740), mload(add(wire3Ptr, 0x20))) // wire3.y - let wire4Ptr := mload(add(proof, 0x80)) - mstore(add(dataPtr, 0x760), mload(wire4Ptr)) // wire4.x - mstore(add(dataPtr, 0x780), mload(add(wire4Ptr, 0x20))) // wire4.y - - // challenge: beta - { - mstore(statePtr, 0x0) // init state - // preimage len: state(0x20) + transcript(0x7a0) - mstore(add(dataPtr, 0x7c0), keccak256(statePtr, 0x7c0)) - // update new state (by updating state pointer) - statePtr := add(dataPtr, 0x7c0) - // empty transcript - dataPtr := add(statePtr, 0x20) - // (mod R_MOD) to get beta - mstore(add(res, 0x60), mod(mload(statePtr), R_MOD)) - } - - // challenge: gamma - { - // preimage len: state(0x20) + transcript(0x0) - mstore(dataPtr, keccak256(statePtr, 0x20)) - // update new state (by updating state pointer) - statePtr := dataPtr - // empty transcript - dataPtr := add(statePtr, 0x20) - // (mod R_MOD) to get gamma - mstore(add(res, 0x80), mod(mload(statePtr), R_MOD)) - } - - let prodPermPtr := mload(add(proof, 0xa0)) - mstore(dataPtr, mload(prodPermPtr)) // prodPerm.x - mstore(add(dataPtr, 0x20), mload(add(prodPermPtr, 0x20))) // prodPerm.y - - // challenge: alpha, alpha2, alpha3 - { - // preimage len: state(0x20) + transcript(0x40) - let alpha := keccak256(statePtr, 0x60) - // update new state (by updating state pointer) - statePtr := add(dataPtr, 0x40) - mstore(statePtr, alpha) - // empty transcript - dataPtr := add(statePtr, 0x20) - // (mod R_MOD) to get challenge - mstore(res, mod(alpha, R_MOD)) - - let alpha2 := mulmod(alpha, alpha, R_MOD) - let alpha3 := mulmod(alpha2, alpha, R_MOD) - mstore(add(res, 0x20), alpha2) - mstore(add(res, 0x40), alpha3) - } - - let split0Ptr := mload(add(proof, 0xc0)) - mstore(dataPtr, mload(split0Ptr)) // split0.x - mstore(add(dataPtr, 0x20), mload(add(split0Ptr, 0x20))) // split0.y - let split1Ptr := mload(add(proof, 0xe0)) - mstore(add(dataPtr, 0x40), mload(split1Ptr)) // split1.x - mstore(add(dataPtr, 0x60), mload(add(split1Ptr, 0x20))) // split1.y - let split2Ptr := mload(add(proof, 0x100)) - mstore(add(dataPtr, 0x80), mload(split2Ptr)) // split2.x - mstore(add(dataPtr, 0xa0), mload(add(split2Ptr, 0x20))) // split2.y - let split3Ptr := mload(add(proof, 0x120)) - mstore(add(dataPtr, 0xc0), mload(split3Ptr)) // split3.x - mstore(add(dataPtr, 0xe0), mload(add(split3Ptr, 0x20))) // split3.y - let split4Ptr := mload(add(proof, 0x140)) - mstore(add(dataPtr, 0x100), mload(split4Ptr)) // split4.x - mstore(add(dataPtr, 0x120), mload(add(split4Ptr, 0x20))) // split4.y - - // challenge: zeta - { - // preimage len: state(0x20) + transcript(0x140) - mstore(add(dataPtr, 0x140), keccak256(statePtr, 0x160)) - // update new state (by updating state pointer) - statePtr := add(dataPtr, 0x140) - // empty transcript - dataPtr := add(statePtr, 0x20) - // (mod R_MOD) to get challenge - mstore(add(res, 0xa0), mod(mload(statePtr), R_MOD)) - } - - mstore(dataPtr, mload(add(proof, 0x1a0))) // wireEval0 - mstore(add(dataPtr, 0x20), mload(add(proof, 0x1c0))) // wireEval1 - mstore(add(dataPtr, 0x40), mload(add(proof, 0x1e0))) // wireEval2 - mstore(add(dataPtr, 0x60), mload(add(proof, 0x200))) // wireEval3 - mstore(add(dataPtr, 0x80), mload(add(proof, 0x220))) // wireEval4 - mstore(add(dataPtr, 0xa0), mload(add(proof, 0x240))) // sigmaEval0 - mstore(add(dataPtr, 0xc0), mload(add(proof, 0x260))) // sigmaEval1 - mstore(add(dataPtr, 0xe0), mload(add(proof, 0x280))) // sigmaEval2 - mstore(add(dataPtr, 0x100), mload(add(proof, 0x2a0))) // sigmaEval3 - mstore(add(dataPtr, 0x120), mload(add(proof, 0x2c0))) // prodPermZetaOmegaEval - - // challenge: v - { - // preimage len: state(0x20) + transcript(0x140) - mstore(add(dataPtr, 0x140), keccak256(statePtr, 0x160)) - // update new state (by updating state pointer) - statePtr := add(dataPtr, 0x140) - // empty transcript - dataPtr := add(statePtr, 0x20) - // (mod R_MOD) to get challenge - mstore(add(res, 0xc0), mod(mload(statePtr), R_MOD)) - } - - let zetaPtr := mload(add(proof, 0x160)) - mstore(dataPtr, mload(zetaPtr)) // zeta.x - mstore(add(dataPtr, 0x20), mload(add(zetaPtr, 0x20))) // zeta.y - let zetaOmegaPtr := mload(add(proof, 0x180)) - mstore(add(dataPtr, 0x40), mload(zetaOmegaPtr)) // zetaOmega.x - mstore(add(dataPtr, 0x60), mload(add(zetaOmegaPtr, 0x20))) // zetaOmega.y - - // challenge: u - { - // preimage len: state(0x20) + transcript(0x80) - let hash := keccak256(statePtr, 0xa0) - // (mod R_MOD) to get challenge - mstore(add(res, 0xe0), mod(hash, R_MOD)) - } - } - } - - function verify( - IPlonkVerifier.VerifyingKey memory vk, - uint256[7] memory publicInput, - IPlonkVerifier.PlonkProof memory proof - ) external view returns (bool success) { - _validateProof(proof); - - BN254.validateScalarField(BN254.ScalarField.wrap(publicInput[0])); - BN254.validateScalarField(BN254.ScalarField.wrap(publicInput[1])); - BN254.validateScalarField(BN254.ScalarField.wrap(publicInput[2])); - BN254.validateScalarField(BN254.ScalarField.wrap(publicInput[3])); - BN254.validateScalarField(BN254.ScalarField.wrap(publicInput[4])); - BN254.validateScalarField(BN254.ScalarField.wrap(publicInput[5])); - BN254.validateScalarField(BN254.ScalarField.wrap(publicInput[6])); - - Challenges memory chal = _computeChallenges(vk, publicInput, proof); - Poly.EvalDomain memory domain = Poly.newEvalDomain(vk.domainSize); - Poly.EvalData memory evalData = Poly.evalDataGen(domain, chal.zeta, publicInput); - - uint256 linPolyConstant = _computeLinPolyConstantTerm(chal, proof, evalData); - - assembly { - // credit: error function from Succinct's SP1 code - function error_verify() { - let ptError := mload(0x40) - mstore(ptError, ERROR_STRING_ID) // selector for function Error(string) - mstore(add(ptError, 0x4), 0x20) - mstore(add(ptError, 0x24), 0xc) - mstore(add(ptError, 0x44), "error verify") - revert(ptError, 0x64) - } - function error_pairing() { - let ptError := mload(0x40) - mstore(ptError, ERROR_STRING_ID) // selector for function Error(string) - mstore(add(ptError, 0x4), 0x20) - mstore(add(ptError, 0x24), 0xd) - mstore(add(ptError, 0x44), "error pairing") - revert(ptError, 0x64) - } - // allocate 64 bytes in memory to store a G1 point - function mallocG1() -> ptr { - ptr := mload(0x40) - mstore(0x40, add(ptr, 0x40)) - } - - // base: &uint256[2], scalar: uint256 - // result will be written to 0x00 (as there are 64 bytes of scratch space) - function scalarMul(base, scalar) { - let ptr := mload(0x40) // free memory pointer - // layout: - // 0x00: base.x - // 0x20: base.y - // 0x40: scalar - mstore(ptr, mload(base)) - mstore(add(ptr, 0x20), mload(add(base, 0x20))) - mstore(add(ptr, 0x40), scalar) - let l_success := staticcall(gas(), 7, ptr, 0x60, 0x00, 0x40) - if iszero(l_success) { error_verify() } - } - - // self: &uint256[2], rhs: &uint256[2] placed at 0x0 - // self += rhs (G1 point addition) - function g1AddAssign(self) { - let ptr := mload(0x40) // free memory pointer - // layout: - // 0x00: self.x - // 0x20: self.y - // 0x40: rhs.x - // 0x60: rhs.y - mstore(ptr, mload(self)) - mstore(add(ptr, 0x20), mload(add(self, 0x20))) - mstore(add(ptr, 0x40), mload(0x0)) - mstore(add(ptr, 0x60), mload(add(0x0, 0x20))) - let l_success := staticcall(gas(), 6, ptr, 0x80, self, 0x40) - if iszero(l_success) { error_verify() } - } - - /// @dev self: &uint256[2] - /// self = -self - function g1NegateAssign(self) { - let y := mload(add(self, 0x20)) - mstore(add(self, 0x20), sub(P_MOD, y)) - } - - // layout for final pairing check (total memory size: 0x180): - // e(a, [x]_2) =?= e(b, [1]_2) - // Definitions: - // - x \in Fp2 = c0 + c1 * X - // 0x00: a.x - // 0x20: a.y - // 0x40: [x]_2.x.c0 - // 0x60: [x]_2.x.c1 - // 0x80: [x]_2.y.c0 - // 0xa0: [x]_2.y.c1 - // 0xc0: b.x - // 0xe0: b.y - // 0x100: [1]_2.x.c1 - // 0x120: [1]_2.x.c0 - // 0x140: [1]_2.y.c1 - // 0x160: [1]_2.y.c0 - - let aPtr := mload(0x40) // free memory ptr - let bPtr := add(aPtr, 0xc0) - // load beta_h (i.e. [x]_2) from SRS - mstore(add(aPtr, 0x40), BETA_H_X0) - mstore(add(aPtr, 0x60), BETA_H_X1) - mstore(add(aPtr, 0x80), BETA_H_Y0) - mstore(add(aPtr, 0xa0), BETA_H_Y1) - // load BN254.P2 (i.e. [1]_2) from SRS - mstore(add(aPtr, 0x100), H_X0) - mstore(add(aPtr, 0x120), H_X1) - mstore(add(aPtr, 0x140), H_Y0) - mstore(add(aPtr, 0x160), H_Y1) - // reserve space for inputs to the pairing check - mstore(0x40, add(aPtr, 0x180)) - - let base := 0x00 - let scalar := 0 - let tmp := 0 - let tmp2 := 0 - - let gamma := mload(add(chal, 0x80)) - - // ============================================ - // Compute coefficient for the permutation product polynomial commitment. - // firstScalar = - // L1(zeta) * alpha^2 - // + alpha - // * (beta * zeta + wireEval0 + gamma) - // * (beta * k1 * zeta + wireEval1 + gamma) - // * (beta * k2 * zeta + wireEval2 + gamma) - // * ... - // where wireEval0, wireEval1, wireEval2, ... are in w_evals - // ============================================ - { - // firstScalar = alpha^2 * L1(zeta) - scalar := mulmod(mload(add(chal, 0x20)), mload(add(evalData, 0x20)), R_MOD) - // rhs = alpha - let rhs := mload(chal) - // tmp = beta * zeta - tmp := mulmod(mload(add(chal, 0x60)), mload(add(chal, 0xA0)), R_MOD) - // ================================= - // k0 (which is 1) component - // (beta * zeta + wireEval0 + gamma) - // ================================= - tmp2 := addmod(tmp, mload(add(proof, 0x1A0)), R_MOD) - tmp2 := addmod(tmp2, gamma, R_MOD) - rhs := mulmod(tmp2, rhs, R_MOD) - - // ================================= - // k1 component - // (beta * zeta * k1 + wireEval1 + gamma) - // ================================= - tmp2 := mulmod(tmp, COSET_K1, R_MOD) - tmp2 := addmod(tmp2, mload(add(proof, 0x1C0)), R_MOD) - tmp2 := addmod(tmp2, gamma, R_MOD) - rhs := mulmod(tmp2, rhs, R_MOD) - - // ================================= - // k2 component - // (beta * zeta * k2 + wireEval2 + gamma) - // ================================= - tmp2 := mulmod(tmp, COSET_K2, R_MOD) - tmp2 := addmod(tmp2, mload(add(proof, 0x1E0)), R_MOD) - tmp2 := addmod(tmp2, gamma, R_MOD) - rhs := mulmod(tmp2, rhs, R_MOD) - - // ================================= - // k3 component - // (beta * zeta * k3 + wireEval3 + gamma) - // ================================= - tmp2 := mulmod(tmp, COSET_K3, R_MOD) - tmp2 := addmod(tmp2, mload(add(proof, 0x200)), R_MOD) - tmp2 := addmod(tmp2, gamma, R_MOD) - rhs := mulmod(tmp2, rhs, R_MOD) - - // ================================= - // k4 component - // (beta * zeta * k4 + wireEval4 + gamma) - // ================================= - tmp2 := mulmod(tmp, COSET_K4, R_MOD) - tmp2 := addmod(tmp2, mload(add(proof, 0x220)), R_MOD) - tmp2 := addmod(tmp2, gamma, R_MOD) - rhs := mulmod(tmp2, rhs, R_MOD) - - scalar := addmod(scalar, rhs, R_MOD) // firstScalar - } - base := mload(add(proof, 0xa0)) // proof.prodPerm - scalarMul(base, scalar) - // update G1 point `b` with result from scalarMul in scratch pad - mstore(bPtr, mload(0x00)) - mstore(add(bPtr, 0x20), mload(0x20)) - - // ============================================ - // Compute coefficient for the last wire sigma polynomial commitment. - // secondScalar = - alpha * beta * z_w - // * (wireEval0 + gamma + beta * sigmaEval0) - // * (wireEval1 + gamma + beta * sigmaEval1) - // * ... - // ============================================ - // secondScalar = alpha * beta * z_w - scalar := mulmod(mload(chal), mload(add(chal, 0x60)), R_MOD) - scalar := mulmod(scalar, mload(add(proof, 0x2C0)), R_MOD) - - // (wireEval0 + gamma + beta * sigmaEval0) - tmp := mulmod(mload(add(chal, 0x60)), mload(add(proof, 0x240)), R_MOD) - tmp := addmod(tmp, mload(add(proof, 0x1A0)), R_MOD) - tmp := addmod(tmp, gamma, R_MOD) - scalar := mulmod(scalar, tmp, R_MOD) - - // (wireEval1 + gamma + beta * sigmaEval1) - tmp := mulmod(mload(add(chal, 0x60)), mload(add(proof, 0x260)), R_MOD) - tmp := addmod(tmp, mload(add(proof, 0x1C0)), R_MOD) - tmp := addmod(tmp, gamma, R_MOD) - scalar := mulmod(scalar, tmp, R_MOD) - - // (wireEval2 + gamma + beta * sigmaEval2) - tmp := mulmod(mload(add(chal, 0x60)), mload(add(proof, 0x280)), R_MOD) - tmp := addmod(tmp, mload(add(proof, 0x1E0)), R_MOD) - tmp := addmod(tmp, gamma, R_MOD) - scalar := mulmod(scalar, tmp, R_MOD) - - // (wireEval3 + gamma + beta * sigmaEval3) - tmp := mulmod(mload(add(chal, 0x60)), mload(add(proof, 0x2A0)), R_MOD) - tmp := addmod(tmp, mload(add(proof, 0x200)), R_MOD) - tmp := addmod(tmp, gamma, R_MOD) - - scalar := sub(R_MOD, mulmod(scalar, tmp, R_MOD)) // secondScalar - base := mload(add(vk, 0xc0)) // vk.sigma4 - scalarMul(base, scalar) // base^scalar (res stored at 0x00) - g1AddAssign(bPtr) // b += base^scalar - - // ============ - // q_lc: linear combination selectors - // ============ - scalar := mload(add(proof, 0x1a0)) // proof.wireEval0 - base := mload(add(vk, 0xe0)) // vk.q1 - scalarMul(base, scalar) // q1^wireEval0 (result stored at 0x00) - g1AddAssign(bPtr) // b += q1^wireEval0 - - scalar := mload(add(proof, 0x1c0)) // proof.wireEval1 - base := mload(add(vk, 0x100)) // vk.q2 - scalarMul(base, scalar) // q2^wireEval1 (result stored at 0x00) - g1AddAssign(bPtr) // b += q2^wireEval1 - - scalar := mload(add(proof, 0x1e0)) // proof.wireEval2 - base := mload(add(vk, 0x120)) // vk.q3 - scalarMul(base, scalar) // q3^wireEval2 (result stored at 0x00) - g1AddAssign(bPtr) // b += q3^wireEval2 - - scalar := mload(add(proof, 0x200)) // proof.wireEval3 - base := mload(add(vk, 0x140)) // vk.q4 - scalarMul(base, scalar) // q4^wireEval3 (result stored at 0x00) - g1AddAssign(bPtr) // b += q4^wireEval3 - - // ============ - // q_M: multiplication selectors - // ============ - // w_evals[0] * w_evals[1] - scalar := mulmod(mload(add(proof, 0x1a0)), mload(add(proof, 0x1c0)), R_MOD) - base := mload(add(vk, 0x160)) // vk.qM12 - scalarMul(base, scalar) // qM12^(wireEval0 * wireEval1) - g1AddAssign(bPtr) // b += qM12^(wireEval0 * wireEval1) - - // w_evals[2] * w_evals[3] - scalar := mulmod(mload(add(proof, 0x1e0)), mload(add(proof, 0x200)), R_MOD) - base := mload(add(vk, 0x180)) // vk.qM34 - scalarMul(base, scalar) // qM34^(wireEval2 * wireEval3) - g1AddAssign(bPtr) // b += qM34^(wireEval2 * wireEval3) - - // ============ - // q_H: hash (rescue-friendly) selectors - // ============ - // w_evals[0].pow(5); - tmp := mload(add(proof, 0x1a0)) // proof.wireEval0 - tmp2 := mulmod(tmp, tmp, R_MOD) - tmp2 := mulmod(tmp2, tmp2, R_MOD) - scalar := mulmod(tmp, tmp2, R_MOD) - base := mload(add(vk, 0x1e0)) // vk.qH1 - scalarMul(base, scalar) // qH1^(wireEval0.pow(5)) - g1AddAssign(bPtr) // b += qH1^(wireEval0.pow(5)) - - // w_evals[1].pow(5); - tmp := mload(add(proof, 0x1c0)) // proof.wireEval1 - tmp2 := mulmod(tmp, tmp, R_MOD) - tmp2 := mulmod(tmp2, tmp2, R_MOD) - scalar := mulmod(tmp, tmp2, R_MOD) - base := mload(add(vk, 0x200)) // vk.qH2 - scalarMul(base, scalar) // qH2^(wireEval2.pow(5)) - g1AddAssign(bPtr) // b += qH2^(wireEval1.pow(5)) - - // w_evals[2].pow(5); - tmp := mload(add(proof, 0x1e0)) // proof.wireEval2 - tmp2 := mulmod(tmp, tmp, R_MOD) - tmp2 := mulmod(tmp2, tmp2, R_MOD) - scalar := mulmod(tmp, tmp2, R_MOD) - base := mload(add(vk, 0x220)) // vk.qH3 - scalarMul(base, scalar) // qH3^(wireEval2.pow(5)) - g1AddAssign(bPtr) // b += qH3^(wireEval2.pow(5)) - - // w_evals[3].pow(5); - tmp := mload(add(proof, 0x200)) // proof.wireEval3 - tmp2 := mulmod(tmp, tmp, R_MOD) - tmp2 := mulmod(tmp2, tmp2, R_MOD) - scalar := mulmod(tmp, tmp2, R_MOD) - base := mload(add(vk, 0x240)) // vk.qH4 - scalarMul(base, scalar) // qH4^(wireEval3.pow(5)) - g1AddAssign(bPtr) // b += qH4^(wireEval3.pow(5)) - - // ============ - // q_o and q_c: output and constant selectors - // ============ - scalar := sub(R_MOD, mload(add(proof, 0x220))) // - proof.wireEval4 - base := mload(add(vk, 0x1a0)) // vk.qO - scalarMul(base, scalar) // qO^(-w_evals[4]) - g1AddAssign(bPtr) // b += qO^(-w_evals[4]) - - scalar := 1 - base := mload(add(vk, 0x1c0)) // vk.qC - scalarMul(base, scalar) // qC - g1AddAssign(bPtr) // b += qC - - // ============ - // q_Ecc: Elliptic Curve Operation selector - // ============ - // q_Ecc = w_evals[0] * w_evals[1] * w_evals[2] * w_evals[3] * w_evals[4]; - tmp := mulmod(mload(add(proof, 0x1a0)), mload(add(proof, 0x1c0)), R_MOD) - tmp := mulmod(tmp, mload(add(proof, 0x1E0)), R_MOD) - tmp := mulmod(tmp, mload(add(proof, 0x200)), R_MOD) - scalar := mulmod(tmp, mload(add(proof, 0x220)), R_MOD) - base := mload(add(vk, 0x260)) // vk.qEcc - scalarMul(base, scalar) // qEcc^(\prod{w_evals}) - g1AddAssign(bPtr) // b += qEcc^(\prod{w_evals}) - - // ============================================ - // splitting quotient commitments - // ============================================ - // 1 - zeta^n = - (zeta^n - 1) - scalar := sub(R_MOD, mload(evalData)) // - vanishEval - base := mload(add(proof, 0xc0)) // proof.split0 - scalarMul(base, scalar) // split0^(-vanishEval) - g1AddAssign(bPtr) // b += split0^(-vanishEval) - - // (1-zeta^n) * zeta^(n+2) - tmp := addmod(mload(evalData), 1, R_MOD) // zeta^n - tmp2 := mload(add(chal, 0xa0)) // zeta - tmp2 := mulmod(tmp2, tmp2, R_MOD) // zeta^2 - tmp := mulmod(tmp, tmp2, R_MOD) // zeta^(n+2) - scalar := mulmod(scalar, tmp, R_MOD) - base := mload(add(proof, 0xe0)) // proof.split1 - scalarMul(base, scalar) - g1AddAssign(bPtr) // b += split1^[(1-zeta^n) * zeta^(n+2)] - - // (1-zeta^n) * zeta^2(n+2) - scalar := mulmod(scalar, tmp, R_MOD) - base := mload(add(proof, 0x100)) // proof.split2 - scalarMul(base, scalar) - g1AddAssign(bPtr) // b += split2^[(1-zeta^n) * zeta^2(n+2)] - - // (1-zeta^n) * zeta^3(n+2) - scalar := mulmod(scalar, tmp, R_MOD) - base := mload(add(proof, 0x120)) // proof.split3 - scalarMul(base, scalar) - g1AddAssign(bPtr) // b += split3^[(1-zeta^n) * zeta^3(n+2)] - - // (1-zeta^n) * zeta^4(n+2) - scalar := mulmod(scalar, tmp, R_MOD) - base := mload(add(proof, 0x140)) // proof.split4 - scalarMul(base, scalar) - g1AddAssign(bPtr) // b += split4^[(1-zeta^n) * zeta^4(n+2)] - - // ============================================ - // Add wire witness poly commitments - // Meanwhile, _prepareEvaluation (`[E]1` in Sec 8.4, step 11 of Plonk) - // ============================================ - let eval := sub(R_MOD, linPolyConstant) // - r0 - tmp := mload(add(chal, 0xc0)) // chal.v - - scalar := tmp // chal.v - base := mload(proof) // proof.wire0 - scalarMul(base, scalar) - g1AddAssign(bPtr) // b += wire0^v - // eval += v * proof.wireEval0 - eval := addmod(eval, mulmod(scalar, mload(add(proof, 0x1a0)), R_MOD), R_MOD) - - scalar := mulmod(scalar, tmp, R_MOD) // v^2 - base := mload(add(proof, 0x20)) // proof.wire1 - scalarMul(base, scalar) - g1AddAssign(bPtr) // b += wire1^(v^2) - // eval += v^2 * proof.wireEval1 - eval := addmod(eval, mulmod(scalar, mload(add(proof, 0x1c0)), R_MOD), R_MOD) - - scalar := mulmod(scalar, tmp, R_MOD) // v^3 - base := mload(add(proof, 0x40)) // proof.wire2 - scalarMul(base, scalar) - g1AddAssign(bPtr) // b += wire2^(v^3) - // eval += v^3 * proof.wireEval2 - eval := addmod(eval, mulmod(scalar, mload(add(proof, 0x1e0)), R_MOD), R_MOD) - - scalar := mulmod(scalar, tmp, R_MOD) // v^4 - base := mload(add(proof, 0x60)) // proof.wire3 - scalarMul(base, scalar) - g1AddAssign(bPtr) // b += wire3^(v^4) - // eval += v^4 * proof.wireEval3 - eval := addmod(eval, mulmod(scalar, mload(add(proof, 0x200)), R_MOD), R_MOD) - - scalar := mulmod(scalar, tmp, R_MOD) // v^5 - base := mload(add(proof, 0x80)) // proof.wire4 - scalarMul(base, scalar) - g1AddAssign(bPtr) // b += wire4^(v^5) - // eval += v^5 * proof.wireEval4 - eval := addmod(eval, mulmod(scalar, mload(add(proof, 0x220)), R_MOD), R_MOD) - - // ============================================ - // Add sigma poly commitments - // The last sigma commitment is excluded. - // ============================================ - scalar := mulmod(scalar, tmp, R_MOD) // v^6 - base := mload(add(vk, 0x40)) // vk.sigma0 - scalarMul(base, scalar) - g1AddAssign(bPtr) // b += sigma0^(v^6) - // eval += v^6 * proof.sigmaEval0 - eval := addmod(eval, mulmod(scalar, mload(add(proof, 0x240)), R_MOD), R_MOD) - - scalar := mulmod(scalar, tmp, R_MOD) // v^7 - base := mload(add(vk, 0x60)) // vk.sigma1 - scalarMul(base, scalar) - g1AddAssign(bPtr) // b += sigma1^(v^7) - // eval += v^7 * proof.sigmaEval1 - eval := addmod(eval, mulmod(scalar, mload(add(proof, 0x260)), R_MOD), R_MOD) - - scalar := mulmod(scalar, tmp, R_MOD) // v^8 - base := mload(add(vk, 0x80)) // vk.sigma2 - scalarMul(base, scalar) - g1AddAssign(bPtr) // b += sigma2^(v^8) - // eval += v^8 * proof.sigmaEval2 - eval := addmod(eval, mulmod(scalar, mload(add(proof, 0x280)), R_MOD), R_MOD) - - scalar := mulmod(scalar, tmp, R_MOD) // v^9 - base := mload(add(vk, 0xa0)) // vk.sigma3 - scalarMul(base, scalar) - g1AddAssign(bPtr) // b += sigma3^(v^9) - // eval += v^9 * proof.sigmaEval3 - eval := addmod(eval, mulmod(scalar, mload(add(proof, 0x2a0)), R_MOD), R_MOD) - - // ============================================ - // Add poly comm evaluated at point `zeta * g` - // ============================================ - scalar := mload(add(chal, 0xe0)) // chal.u - base := mload(add(proof, 0xa0)) // proof.prodPerm - scalarMul(base, scalar) - g1AddAssign(bPtr) // b += prodPerm^u - // eval += u * proof.prodPermZetaOmegaEval - eval := addmod(eval, mulmod(scalar, mload(add(proof, 0x2c0)), R_MOD), R_MOD) - - scalar := mload(add(chal, 0xa0)) // chal.zeta or evalPoint - base := mload(add(proof, 0x160)) // proof.zeta or openingProof - scalarMul(base, scalar) - g1AddAssign(bPtr) // b += proof.zeta^chal.zeta - - // chal.zeta * groupGen or nextEvalPoint - tmp := mulmod(scalar, mload(add(mload(add(domain, 0x40)), 0x20)), R_MOD) - scalar := mulmod(tmp, mload(add(chal, 0xe0)), R_MOD) // u * nextEvalPoint - base := mload(add(proof, 0x180)) // shiftedOpeningProof or proof.zetaOmega - scalarMul(base, scalar) - g1AddAssign(bPtr) // b += proof.zetaOmega^(u * chal.zeta * groupGen) - - base := mallocG1() - mstore(base, 1) // BN254.P1.x - mstore(add(base, 0x20), 2) // BN254.P1.y - scalarMul(base, sub(R_MOD, eval)) // P1^-eval or [E]1 in paper - g1AddAssign(bPtr) // b += P1^-eval - - // b = -b - g1NegateAssign(bPtr) - - // a = openingProof + shiftedOpeningProof^u - // first store openingProof to aPtr - tmp := mload(add(proof, 0x160)) // ptr to proof.zeta - mstore(aPtr, mload(tmp)) - mstore(add(aPtr, 0x20), mload(add(tmp, 0x20))) - - scalar := mload(add(chal, 0xe0)) // chal.u - base := mload(add(proof, 0x180)) // shiftedOpeningProof or proof.zetaOmega - scalarMul(base, scalar) - g1AddAssign(aPtr) // a += shiftedOpeningProof^u - - // ============================================ - // Final pairing check - // ============================================ - let l_success := staticcall(gas(), 8, aPtr, 0x180, 0x00, 0x20) - if iszero(l_success) { error_pairing() } - - success := mload(0x00) - } - } -} diff --git a/contracts/src/libraries/PolynomialEval.sol b/contracts/src/libraries/PolynomialEval.sol index 7586a821d7..ab5486e124 100644 --- a/contracts/src/libraries/PolynomialEval.sol +++ b/contracts/src/libraries/PolynomialEval.sol @@ -14,7 +14,7 @@ library PolynomialEval { struct EvalDomain { uint256 logSize; // log_2(self.size) uint256 sizeInv; // Inverse of the size in the field - uint256[7] elements; // 1, g, g^2, ..., g^6 + uint256[11] elements; // 1, g, g^2, ..., g^10 } /// @dev stores vanishing poly, lagrange at 1, and Public input poly @@ -40,7 +40,11 @@ library PolynomialEval { 0x86812a00ac43ea801669c640171203c41a496671bfbc065ac8db24d52cf31e5, 0x2d965651cdd9e4811f4e51b80ddca8a8b4a93ee17420aae6adaa01c2617c6e85, 0x12597a56c2e438620b9041b98992ae0d4e705b780057bf7766a2767cece16e1d, - 0x2d94117cd17bcf1290fd67c01155dd40807857dff4a5a0b4dc67befa8aa34fd + 0x2d94117cd17bcf1290fd67c01155dd40807857dff4a5a0b4dc67befa8aa34fd, + 0x15ee2475bee517c4ee05e51fa1ee7312a8373a0b13db8c51baf04cb2e99bd2bd, + 0x6fab49b869ae62001deac878b2667bd31bf3e28e3a2d764aa49b8d9bbdd310, + 0x2e856bf6d037708ffa4c06d4d8820f45ccadce9c5a6d178cbd573f82e0f97011, + 0x1407eee35993f2b1ad5ec6d9b8950ca3af33135d06037f871c5e33bf566dd7b4 ] ); } else if (domainSize == 1048576) { @@ -54,7 +58,11 @@ library PolynomialEval { 0x2087ea2cd664278608fb0ebdb820907f598502c81b6690c185e2bf15cb935f42, 0x19ddbcaf3a8d46c15c0176fbb5b95e4dc57088ff13f4d1bd84c6bfa57dcdc0e0, 0x5a2c85cfc591789605cae818e37dd4161eef9aa666bec6fe4288d09e6d23418, - 0x11f70e5363258ff4f0d716a653e1dc41f1c64484d7f4b6e219d6377614a3905c + 0x11f70e5363258ff4f0d716a653e1dc41f1c64484d7f4b6e219d6377614a3905c, + 0x29e84143f5870d4776a92df8da8c6c9303d59088f37ba85f40cf6fd14265b4bc, + 0x1bf82deba7d74902c3708cc6e70e61f30512eca95655210e276e5858ce8f58e5, + 0x22b94b2e2b0043d04e662d5ec018ea1c8a99a23a62c9eb46f0318f6a194985f0, + 0x29969d8d5363bef1101a68e446a14e1da7ba9294e142a146a980fddb4d4d41a5 ] ); } @@ -70,7 +78,11 @@ library PolynomialEval { 0x1277ae6415f0ef18f2ba5fb162c39eb7311f386e2d26d64401f4a25da77c253b, 0x2b337de1c8c14f22ec9b9e2f96afef3652627366f8170a0a948dad4ac1bd5e80, 0x2fbd4dd2976be55d1a163aa9820fb88dfac5ddce77e1872e90632027327a5ebe, - 0x107aab49e65a67f9da9cd2abf78be38bd9dc1d5db39f81de36bcfa5b4b039043 + 0x107aab49e65a67f9da9cd2abf78be38bd9dc1d5db39f81de36bcfa5b4b039043, + 0xe14b6364a47e9c4284a9f80a5fc41cd212b0d4dbf8a5703770a40a9a343990, + 0x30644e72e131a029048b6e193fd841045cea24f6fd736bec231204708f703636, + 0x22399c34139bffada8de046aac50c9628e3517a3a452795364e777cd65bb9f48, + 0x2290ee31c482cf92b79b1944db1c0147635e9004db8c3b9d13644bef31ec3bd3 ] ); } else { @@ -141,7 +153,7 @@ library PolynomialEval { /// @dev Evaluate public input polynomial at point `zeta`. function evaluatePiPoly( EvalDomain memory self, - uint256[7] memory pi, + uint256[11] memory pi, uint256 zeta, uint256 vanishingPolyEval ) internal view returns (uint256 res) { @@ -149,7 +161,7 @@ library PolynomialEval { if (vanishingPolyEval == 0) { uint256 group = 1; - for (uint256 i = 0; i < 7; i++) { + for (uint256 i = 0; i < 11; i++) { if (zeta == group) { return pi[i]; } @@ -190,7 +202,7 @@ library PolynomialEval { // n(n - 1) to 3n // // credit: @shresthagrawal and @jakovmitrovski from CommonPrefix - uint256[7] memory suffix; + uint256[11] memory suffix; // Assume we have [a, b, c, d] where a = zeta - g^0, b = zeta - g^1, ... // @@ -198,15 +210,15 @@ library PolynomialEval { // suffix[length - 1] = 1 // suffix = [dcb, dc, d, 1] assembly { - let suffixPtr := add(suffix, mul(6, 0x20)) - let localDomainElementsPtr := add(mload(add(self, 0x40)), mul(6, 0x20)) + let suffixPtr := add(suffix, mul(10, 0x20)) + let localDomainElementsPtr := add(mload(add(self, 0x40)), mul(10, 0x20)) let currentElementSuffix := 1 // Last element of suffix is set to 1 mstore(suffixPtr, currentElementSuffix) // Calculate prefix and suffix products - for { let i := 1 } lt(i, 7) { i := add(i, 1) } { + for { let i := 1 } lt(i, 11) { i := add(i, 1) } { // move suffix pointer suffixPtr := sub(suffixPtr, 0x20) @@ -232,7 +244,7 @@ library PolynomialEval { // Compute the sum term \sum_{i=0}^{length} currentElementPrefix * suffix[i] * pi[i] * // g^i - for { let i := 0 } lt(i, 7) { i := add(i, 1) } { + for { let i := 0 } lt(i, 11) { i := add(i, 1) } { // sum += currentElementPrefix * suffix[i] * pi[i] * g^i let currentTerm := mulmod( @@ -272,7 +284,7 @@ library PolynomialEval { } /// @dev compute the EvalData for a given domain and a challenge zeta - function evalDataGen(EvalDomain memory self, uint256 zeta, uint256[7] memory publicInput) + function evalDataGen(EvalDomain memory self, uint256 zeta, uint256[11] memory publicInput) internal view returns (EvalData memory evalData) diff --git a/contracts/test/LightClient.t.sol b/contracts/test/LightClient.t.sol index 56700a04b1..803b963bda 100644 --- a/contracts/test/LightClient.t.sol +++ b/contracts/test/LightClient.t.sol @@ -22,6 +22,7 @@ contract LightClientCommonTest is Test { uint32 public constant DELAY_THRESHOLD = 6; uint32 public constant MAX_HISTORY_SECONDS = 1 days; uint32 public initialBlockTimestamp = 1 days; + uint64 public constant BLOCKS_PER_EPOCH = 3; // this constant should be consistent with `hotshot_contract::light_client.rs` uint64 internal constant STAKE_TABLE_CAPACITY = 10; DeployLightClientTestScript public deployer = new DeployLightClientTestScript(); @@ -32,12 +33,14 @@ contract LightClientCommonTest is Test { function deployAndInitProxy( LC.LightClientState memory state, LC.StakeTableState memory stakeState, - uint32 stateHistoryRetentionPeriod + uint32 stateHistoryRetentionPeriod, + uint64 blocksPerEpoch ) public returns (address payable, address) { vm.warp(1 days); //deploy light client test with a proxy - (lcTestProxy, admin, state) = - deployer.deployContract(state, stakeState, stateHistoryRetentionPeriod, admin); + (lcTestProxy, admin, state) = deployer.deployContract( + state, stakeState, stateHistoryRetentionPeriod, admin, blocksPerEpoch + ); //cast the proxy to be of type light client test lc = LCMock(lcTestProxy); @@ -63,8 +66,9 @@ contract LightClientCommonTest is Test { genesis = state; genesisStakeTableState = stakeState; - (lcTestProxy, admin) = - deployAndInitProxy(genesis, genesisStakeTableState, MAX_HISTORY_SECONDS); + (lcTestProxy, admin) = deployAndInitProxy( + genesis, genesisStakeTableState, MAX_HISTORY_SECONDS, BLOCKS_PER_EPOCH + ); ( uint256 threshold, @@ -72,11 +76,21 @@ contract LightClientCommonTest is Test { BN254.ScalarField stakeTableSchnorrKeyComm, BN254.ScalarField stakeTableAmountComm ) = lc.genesisStakeTableState(); - assertEq(stakeState.blsKeyComm, stakeTableBlsKeyComm); assertEq(stakeState.schnorrKeyComm, stakeTableSchnorrKeyComm); assertEq(stakeState.amountComm, stakeTableAmountComm); assertEq(stakeState.threshold, threshold); + + ( + uint256 votingThreshold, + BN254.ScalarField votingBlsKeyComm, + BN254.ScalarField votingSchnorrKeyComm, + BN254.ScalarField votingAmountComm + ) = lc.votingStakeTableState(); + assertEq(stakeState.blsKeyComm, votingBlsKeyComm); + assertEq(stakeState.schnorrKeyComm, votingSchnorrKeyComm); + assertEq(stakeState.amountComm, votingAmountComm); + assertEq(stakeState.threshold, votingThreshold); } function assertEq(BN254.ScalarField a, BN254.ScalarField b) public pure { @@ -102,18 +116,22 @@ contract LightClient_constructor_Test is LightClientCommonTest { function initWithExpectRevert( LC.LightClientState memory _genesis, LC.StakeTableState memory _genesisStakeTableState, - uint32 _stateHistoryRetentionPeriod + uint32 _stateHistoryRetentionPeriod, + uint64 blocksPerEpoch ) private { vm.expectRevert(LC.InvalidArgs.selector); - - lc = new LCMock(_genesis, _genesisStakeTableState, _stateHistoryRetentionPeriod); + lc = new LCMock( + _genesis, _genesisStakeTableState, _stateHistoryRetentionPeriod, blocksPerEpoch + ); } // test that initializing the contract reverts when the stateHistoryRetentionPeriod is below the // required threshold function test_RevertWhen_InvalidStateHistoryRetentionPeriodOnSetUp() public { uint32 invalidRetentionPeriod = 10; - initWithExpectRevert(genesis, genesisStakeTableState, invalidRetentionPeriod); + initWithExpectRevert( + genesis, genesisStakeTableState, invalidRetentionPeriod, BLOCKS_PER_EPOCH + ); } function test_RevertWhen_InvalidGenesis() external { @@ -122,41 +140,54 @@ contract LightClient_constructor_Test is LightClientCommonTest { // wrong viewNum would revert badGenesis.viewNum = 1; - initWithExpectRevert(badGenesis, badGenesisStakeTableState, MAX_HISTORY_SECONDS); + initWithExpectRevert( + badGenesis, badGenesisStakeTableState, MAX_HISTORY_SECONDS, BLOCKS_PER_EPOCH + ); badGenesis.viewNum = genesis.viewNum; // revert to correct // wrong blockHeight would revert badGenesis.blockHeight = 1; - initWithExpectRevert(badGenesis, badGenesisStakeTableState, MAX_HISTORY_SECONDS); + initWithExpectRevert( + badGenesis, badGenesisStakeTableState, MAX_HISTORY_SECONDS, BLOCKS_PER_EPOCH + ); badGenesis.blockHeight = genesis.blockHeight; // revert to correct // zero-valued stake table commitments would revert badGenesisStakeTableState.blsKeyComm = BN254.ScalarField.wrap(0); - initWithExpectRevert(badGenesis, badGenesisStakeTableState, MAX_HISTORY_SECONDS); + initWithExpectRevert( + badGenesis, badGenesisStakeTableState, MAX_HISTORY_SECONDS, BLOCKS_PER_EPOCH + ); + // revert to correct + badGenesisStakeTableState.blsKeyComm = badGenesisStakeTableState.blsKeyComm; - badGenesisStakeTableState.blsKeyComm = badGenesisStakeTableState.blsKeyComm; // revert - // to correct badGenesisStakeTableState.schnorrKeyComm = BN254.ScalarField.wrap(0); - initWithExpectRevert(badGenesis, badGenesisStakeTableState, MAX_HISTORY_SECONDS); + initWithExpectRevert( + badGenesis, badGenesisStakeTableState, MAX_HISTORY_SECONDS, BLOCKS_PER_EPOCH + ); + // revert to correct + badGenesisStakeTableState.schnorrKeyComm = badGenesisStakeTableState.schnorrKeyComm; - badGenesisStakeTableState.schnorrKeyComm = badGenesisStakeTableState.schnorrKeyComm; // revert - // to correct badGenesisStakeTableState.amountComm = BN254.ScalarField.wrap(0); - - initWithExpectRevert(badGenesis, badGenesisStakeTableState, MAX_HISTORY_SECONDS); - badGenesisStakeTableState.amountComm = badGenesisStakeTableState.amountComm; // revert - // to correct + initWithExpectRevert( + badGenesis, badGenesisStakeTableState, MAX_HISTORY_SECONDS, BLOCKS_PER_EPOCH + ); + badGenesisStakeTableState.amountComm = badGenesisStakeTableState.amountComm; // zero-valued threshold would revert badGenesisStakeTableState.threshold = 0; - initWithExpectRevert(badGenesis, badGenesisStakeTableState, MAX_HISTORY_SECONDS); - badGenesisStakeTableState.threshold = badGenesisStakeTableState.threshold; // revert to - // correct + initWithExpectRevert( + badGenesis, badGenesisStakeTableState, MAX_HISTORY_SECONDS, BLOCKS_PER_EPOCH + ); + badGenesisStakeTableState.threshold = badGenesisStakeTableState.threshold; // revert + + // zero-valued epoch length would revert + initWithExpectRevert(badGenesis, badGenesisStakeTableState, MAX_HISTORY_SECONDS, 0); } } contract LightClient_permissionedProver_Test is LightClientCommonTest { LC.LightClientState internal newState; + LC.StakeTableState internal nextStakeTable; V.PlonkProof internal newProof; function setUp() public { @@ -168,11 +199,15 @@ contract LightClient_permissionedProver_Test is LightClientCommonTest { cmds[2] = vm.toString(STAKE_TABLE_CAPACITY / 2); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); + ( + LC.LightClientState[] memory states, + LC.StakeTableState[] memory nextStakeTables, + V.PlonkProof[] memory proofs + ) = abi.decode(result, (LC.LightClientState[], LC.StakeTableState[], V.PlonkProof[])); newState = states[0]; newProof = proofs[0]; + nextStakeTable = nextStakeTables[0]; } function test_NoProverPermissionsRequired() external { @@ -196,7 +231,7 @@ contract LightClient_permissionedProver_Test is LightClientCommonTest { vm.expectEmit(true, true, true, true); emit LC.NewState(newState.viewNum, newState.blockHeight, newState.blockCommRoot); vm.prank(makeAddr("randomUser")); - lc.newFinalizedState(newState, newProof); + lc.newFinalizedState(newState, nextStakeTable, newProof); } function test_UpdatePermissionedProverWhenPermissionedProverModeDisabled() external { @@ -257,13 +292,13 @@ contract LightClient_permissionedProver_Test is LightClientCommonTest { //confirm that the old prover doesn't work vm.prank(oldPermissionedProver); vm.expectRevert(LC.ProverNotPermissioned.selector); - lc.newFinalizedState(newState, newProof); + lc.newFinalizedState(newState, nextStakeTable, newProof); //confirm that the new prover works vm.prank(prover2); vm.expectEmit(true, true, true, true); emit LC.NewState(newState.viewNum, newState.blockHeight, newState.blockCommRoot); - lc.newFinalizedState(newState, newProof); + lc.newFinalizedState(newState, nextStakeTable, newProof); } function test_RevertWhen_sameProverSentInUpdate() public { @@ -289,13 +324,13 @@ contract LightClient_permissionedProver_Test is LightClientCommonTest { function test_RevertWhen_ProverDoesNotHavePermissions() external { vm.expectRevert(LC.ProverNotPermissioned.selector); vm.prank(makeAddr("ProverWithNoPermissions")); - lc.newFinalizedState(newState, newProof); + lc.newFinalizedState(newState, nextStakeTable, newProof); } function test_RevertWhen_ProverAddressNotPermissionedEvenIfAdminAddress() external { vm.expectRevert(LC.ProverNotPermissioned.selector); vm.prank(admin); - lc.newFinalizedState(newState, newProof); + lc.newFinalizedState(newState, nextStakeTable, newProof); } } @@ -313,13 +348,17 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { cmds[2] = vm.toString(STAKE_TABLE_CAPACITY / 2); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); + ( + LC.LightClientState[] memory states, + LC.StakeTableState[] memory nextStakeTables, + V.PlonkProof[] memory proofs + ) = abi.decode(result, (LC.LightClientState[], LC.StakeTableState[], V.PlonkProof[])); vm.expectEmit(true, true, true, true); emit LC.NewState(states[0].viewNum, states[0].blockHeight, states[0].blockCommRoot); vm.prank(permissionedProver); - lc.newFinalizedState(states[0], proofs[0]); + + lc.newFinalizedState(states[0], nextStakeTables[0], proofs[0]); } /// @dev Test happy path for (the number of states + 1) consecutive new finalized blocks @@ -341,8 +380,9 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { abi.decode(result, (LC.LightClientState, LC.StakeTableState)); genesis = state; genesisStakeTableState = stakeState; - (lcTestProxy, admin) = - deployAndInitProxy(genesis, genesisStakeTableState, MAX_HISTORY_SECONDS); + (lcTestProxy, admin) = deployAndInitProxy( + genesis, genesisStakeTableState, MAX_HISTORY_SECONDS, BLOCKS_PER_EPOCH + ); // Generating a few consecutive states and proofs cmds = new string[](3); @@ -351,8 +391,11 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { cmds[2] = vm.toString(numInitValidators); result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); + ( + LC.LightClientState[] memory states, + LC.StakeTableState[] memory nextStakeTables, + V.PlonkProof[] memory proofs + ) = abi.decode(result, (LC.LightClientState[], LC.StakeTableState[], V.PlonkProof[])); uint256 statesLen = states.length; uint64 viewNum; @@ -362,7 +405,7 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { vm.expectEmit(true, true, true, true); emit LC.NewState(states[i].viewNum, states[i].blockHeight, states[i].blockCommRoot); vm.prank(permissionedProver); - lc.newFinalizedState(states[i], proofs[i]); + lc.newFinalizedState(states[i], nextStakeTables[i], proofs[i]); (viewNum, blockHeight, blockCommRoot) = lc.finalizedState(); assertEq(viewNum, states[i].viewNum); @@ -379,7 +422,7 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { numBlockSkipped = uint32(bound(numBlockSkipped, 1, 3)); // re-assign LightClient with the same genesis - deployAndInitProxy(genesis, genesisStakeTableState, MAX_HISTORY_SECONDS); + deployAndInitProxy(genesis, genesisStakeTableState, MAX_HISTORY_SECONDS, BLOCKS_PER_EPOCH); string[] memory cmds = new string[](3); cmds[0] = "diff-test"; @@ -387,13 +430,16 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { cmds[2] = vm.toString(numBlockSkipped); bytes memory result = vm.ffi(cmds); - (LC.LightClientState memory state, V.PlonkProof memory proof) = - abi.decode(result, (LC.LightClientState, V.PlonkProof)); + ( + LC.LightClientState memory state, + LC.StakeTableState memory nextStakeTable, + V.PlonkProof memory proof + ) = abi.decode(result, (LC.LightClientState, LC.StakeTableState, V.PlonkProof)); vm.expectEmit(true, true, true, true); emit LC.NewState(state.viewNum, state.blockHeight, state.blockCommRoot); vm.prank(permissionedProver); - lc.newFinalizedState(state, proof); + lc.newFinalizedState(state, nextStakeTable, proof); } /// @dev Test unhappy path when a valid but oudated finalized state is submitted @@ -406,8 +452,11 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { cmds[3] = vm.toString(false); bytes memory result = vm.ffi(cmds); - (LC.LightClientState memory newState, V.PlonkProof memory proof) = - abi.decode(result, (LC.LightClientState, V.PlonkProof)); + ( + LC.LightClientState memory newState, + LC.StakeTableState memory nextStakeTable, + V.PlonkProof memory proof + ) = abi.decode(result, (LC.LightClientState, LC.StakeTableState, V.PlonkProof)); LC.LightClientState memory state = genesis; state.viewNum = 10; @@ -416,13 +465,13 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { // outdated view num vm.expectRevert(LC.OutdatedState.selector); - lc.newFinalizedState(newState, proof); + lc.newFinalizedState(newState, nextStakeTable, proof); // outdated block height state.viewNum = genesis.viewNum; state.blockHeight = numBlockSkipped + 1; vm.expectRevert(LC.OutdatedState.selector); - lc.newFinalizedState(newState, proof); + lc.newFinalizedState(newState, nextStakeTable, proof); vm.stopPrank(); } @@ -436,8 +485,11 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { cmds[3] = vm.toString(false); bytes memory result = vm.ffi(cmds); - (LC.LightClientState memory newState, V.PlonkProof memory proof) = - abi.decode(result, (LC.LightClientState, V.PlonkProof)); + ( + LC.LightClientState memory newState, + LC.StakeTableState memory nextStakeTable, + V.PlonkProof memory proof + ) = abi.decode(result, (LC.LightClientState, LC.StakeTableState, V.PlonkProof)); LC.LightClientState memory badState = newState; @@ -445,8 +497,7 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { vm.startPrank(permissionedProver); badState.blockCommRoot = BN254.ScalarField.wrap(BN254.R_MOD); vm.expectRevert("Bn254: invalid scalar field"); - lc.newFinalizedState(badState, proof); - badState.blockCommRoot = newState.blockCommRoot; + lc.newFinalizedState(badState, nextStakeTable, proof); } /// @dev Test unhappy path when the plonk proof or the public inputs are wrong @@ -459,8 +510,11 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { cmds[3] = vm.toString(true); bytes memory result = vm.ffi(cmds); - (LC.LightClientState memory newState, V.PlonkProof memory proof) = - abi.decode(result, (LC.LightClientState, V.PlonkProof)); + ( + LC.LightClientState memory newState, + LC.StakeTableState memory nextStakeTable, + V.PlonkProof memory proof + ) = abi.decode(result, (LC.LightClientState, LC.StakeTableState, V.PlonkProof)); BN254.ScalarField randScalar = BN254.ScalarField.wrap(1234); LC.LightClientState memory badState = LC.LightClientState({ @@ -473,19 +527,19 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { vm.startPrank(permissionedProver); badState.viewNum = newState.viewNum + 2; vm.expectRevert(LC.InvalidProof.selector); - lc.newFinalizedState(badState, proof); + lc.newFinalizedState(badState, nextStakeTable, proof); badState.viewNum = newState.viewNum; // wrong block height badState.blockHeight = newState.blockHeight + 1; vm.expectRevert(LC.InvalidProof.selector); - lc.newFinalizedState(badState, proof); + lc.newFinalizedState(badState, nextStakeTable, proof); badState.blockHeight = newState.blockHeight; // wrong blockCommRoot badState.blockCommRoot = randScalar; vm.expectRevert(LC.InvalidProof.selector); - lc.newFinalizedState(badState, proof); + lc.newFinalizedState(badState, nextStakeTable, proof); badState.blockCommRoot = newState.blockCommRoot; cmds = new string[](3); @@ -496,7 +550,7 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { result = vm.ffi(cmds); (V.PlonkProof memory dummyProof) = abi.decode(result, (V.PlonkProof)); vm.expectRevert(LC.InvalidProof.selector); - lc.newFinalizedState(newState, dummyProof); + lc.newFinalizedState(newState, nextStakeTable, dummyProof); vm.stopPrank(); } @@ -504,6 +558,7 @@ contract LightClient_newFinalizedState_Test is LightClientCommonTest { contract LightClient_StateUpdatesTest is LightClientCommonTest { LC.LightClientState internal newState; + LC.StakeTableState internal nextStakeTable; V.PlonkProof internal newProof; function assertInitialStateHistoryConditions() internal view { @@ -542,11 +597,15 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { assertGe(lc.stateHistoryRetentionPeriod(), 1 days); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); + ( + LC.LightClientState[] memory states, + LC.StakeTableState[] memory nextStakeTables, + V.PlonkProof[] memory proofs + ) = abi.decode(result, (LC.LightClientState[], LC.StakeTableState[], V.PlonkProof[])); newState = states[1]; newProof = proofs[1]; + nextStakeTable = nextStakeTables[1]; } function test_1lBlockUpdatesIsUpdated() public { @@ -556,7 +615,7 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { vm.prank(permissionedProver); vm.expectEmit(true, true, true, true); emit LC.NewState(newState.viewNum, newState.blockHeight, newState.blockCommRoot); - lc.newFinalizedState(newState, newProof); + lc.newFinalizedState(newState, nextStakeTable, newProof); assertEq(lc.getStateHistoryCount(), blockUpdatesCount + 1); } @@ -603,8 +662,11 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { assertInitialStateHistoryConditions(); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); + ( + LC.LightClientState[] memory states, + LC.StakeTableState[] memory nextStakeTables, + V.PlonkProof[] memory proofs + ) = abi.decode(result, (LC.LightClientState[], LC.StakeTableState[], V.PlonkProof[])); // Add one ${numDays} worth of a new state with a timestamp of 1 hour later uint256 i; @@ -613,7 +675,7 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { vm.prank(permissionedProver); vm.expectEmit(true, true, true, true); emit LC.NewState(states[i].viewNum, states[i].blockHeight, states[i].blockCommRoot); - lc.newFinalizedState(states[i], proofs[i]); + lc.newFinalizedState(states[i], nextStakeTables[i], proofs[i]); } // assert that the first index is one since the stateHistoryRetentionPeriod is 86400, it @@ -636,7 +698,7 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { vm.expectEmit(true, true, true, true); emit LC.NewState(states[i].viewNum, states[i].blockHeight, states[i].blockCommRoot); vm.warp(initialBlockTimestamp + ((i + 1) * 1 days)); // increase the timestamp for each - lc.newFinalizedState(states[i], proofs[i]); + lc.newFinalizedState(states[i], nextStakeTables[i], proofs[i]); i++; // the duration between the updates are more than stateHistoryRetentionPeriod, so the first @@ -649,7 +711,7 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { vm.prank(permissionedProver); vm.expectEmit(true, true, true, true); emit LC.NewState(states[j].viewNum, states[j].blockHeight, states[j].blockCommRoot); - lc.newFinalizedState(states[j], proofs[j]); + lc.newFinalizedState(states[j], nextStakeTables[j], proofs[j]); } // get stale commitments and assert that it has been reset to zero @@ -673,8 +735,11 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { uint32 numDays = 2; bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); + ( + LC.LightClientState[] memory states, + LC.StakeTableState[] memory nextStakeTables, + V.PlonkProof[] memory proofs + ) = abi.decode(result, (LC.LightClientState[], LC.StakeTableState[], V.PlonkProof[])); assertInitialStateHistoryConditions(); @@ -689,7 +754,7 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { vm.prank(permissionedProver); vm.expectEmit(true, true, true, true); emit LC.NewState(states[i].viewNum, states[i].blockHeight, states[i].blockCommRoot); - lc.newFinalizedState(states[i], proofs[i]); + lc.newFinalizedState(states[i], nextStakeTables[i], proofs[i]); } // assert that the size of the state history is equal to the retention period @@ -712,7 +777,7 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { vm.expectEmit(true, true, true, true); emit LC.NewState(states[i].viewNum, states[i].blockHeight, states[i].blockCommRoot); vm.warp((numDays + 3) * 1 days); // increase the timestamp - lc.newFinalizedState(states[i], proofs[i]); + lc.newFinalizedState(states[i], nextStakeTables[i], proofs[i]); i++; // the duration between the updates are more than stateHistoryRetentionPeriod, so the first @@ -729,7 +794,7 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { vm.prank(permissionedProver); vm.expectEmit(true, true, true, true); emit LC.NewState(states[j].viewNum, states[j].blockHeight, states[j].blockCommRoot); - lc.newFinalizedState(states[j], proofs[j]); + lc.newFinalizedState(states[j], nextStakeTables[j], proofs[j]); } // get stale commitments and assert that it has been reset to zero @@ -979,6 +1044,7 @@ contract LightClient_StateUpdatesTest is LightClientCommonTest { contract LightClient_HotShotCommUpdatesTest is LightClientCommonTest { LC.LightClientState internal newState; + LC.StakeTableState internal nextStakeTable; V.PlonkProof internal newProof; /** @@ -999,11 +1065,15 @@ contract LightClient_HotShotCommUpdatesTest is LightClientCommonTest { cmds[2] = vm.toString(STAKE_TABLE_CAPACITY / 2); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory _states, V.PlonkProof[] memory _proofs) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); + ( + LC.LightClientState[] memory _states, + LC.StakeTableState[] memory nextStakeTables, + V.PlonkProof[] memory _proofs + ) = abi.decode(result, (LC.LightClientState[], LC.StakeTableState[], V.PlonkProof[])); newState = _states[1]; newProof = _proofs[1]; + nextStakeTable = nextStakeTables[1]; } function assertEqBN254(BN254.ScalarField a, BN254.ScalarField b) public pure { @@ -1021,7 +1091,7 @@ contract LightClient_HotShotCommUpdatesTest is LightClientCommonTest { vm.prank(permissionedProver); vm.expectEmit(true, true, true, true); emit LC.NewState(newState.viewNum, newState.blockHeight, newState.blockCommRoot); - lc.newFinalizedState(newState, newProof); + lc.newFinalizedState(newState, nextStakeTable, newProof); assertEq(lc.getStateHistoryCount(), blockCommCount + 1); } @@ -1035,18 +1105,19 @@ contract LightClient_HotShotCommUpdatesTest is LightClientCommonTest { cmds[2] = vm.toString(STAKE_TABLE_CAPACITY / 2); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory _states, V.PlonkProof[] memory _proofs) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); + ( + LC.LightClientState[] memory states, + LC.StakeTableState[] memory nextStakeTables, + V.PlonkProof[] memory proofs + ) = abi.decode(result, (LC.LightClientState[], LC.StakeTableState[], V.PlonkProof[])); - uint256 statesCount = _states.length - 1; + uint256 statesCount = states.length - 1; // Update the state and thus the l1BlockUpdates array would be updated for (uint8 i = 1; i <= statesCount; i++) { - LC.LightClientState memory state = _states[i]; - V.PlonkProof memory proof = _proofs[i]; vm.prank(permissionedProver); vm.expectEmit(true, true, true, true); - emit LC.NewState(state.viewNum, state.blockHeight, state.blockCommRoot); - lc.newFinalizedState(state, proof); + emit LC.NewState(states[i].viewNum, states[i].blockHeight, states[i].blockCommRoot); + lc.newFinalizedState(states[i], nextStakeTables[i], proofs[i]); } assertEq(lc.getStateHistoryCount(), blockCommCount + statesCount); @@ -1060,18 +1131,19 @@ contract LightClient_HotShotCommUpdatesTest is LightClientCommonTest { cmds[2] = vm.toString(STAKE_TABLE_CAPACITY / 2); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory _states, V.PlonkProof[] memory _proofs) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); + ( + LC.LightClientState[] memory states, + LC.StakeTableState[] memory nextStakeTables, + V.PlonkProof[] memory proofs + ) = abi.decode(result, (LC.LightClientState[], LC.StakeTableState[], V.PlonkProof[])); - uint256 statesCount = _states.length - 1; + uint256 statesCount = states.length - 1; // Update the state and thus the l1BlockUpdates array would be updated for (uint8 i = 1; i <= statesCount; i++) { - LC.LightClientState memory state = _states[i]; - V.PlonkProof memory proof = _proofs[i]; vm.prank(permissionedProver); vm.expectEmit(true, true, true, true); - emit LC.NewState(state.viewNum, state.blockHeight, state.blockCommRoot); - lc.newFinalizedState(state, proof); + emit LC.NewState(states[i].viewNum, states[i].blockHeight, states[i].blockCommRoot); + lc.newFinalizedState(states[i], nextStakeTables[i], proofs[i]); } // Test for a smaller hotShotBlockHeight @@ -1108,3 +1180,156 @@ contract LightClient_HotShotCommUpdatesTest is LightClientCommonTest { lc.getHotShotCommitment(hotShotBlockHeight); } } + +contract LightClient_EpochTest is LightClientCommonTest { + function setUp() public { + init(); + // checking init from epoch 0 + assertEq(lc.currentEpoch(), 0); + } + + function testFuzz_CorrectEpochCompute(uint64 blockNum, uint64 blocksPerEpoch) external { + string[] memory cmds = new string[](4); + cmds[0] = "diff-test"; + cmds[1] = "epoch-compute"; + cmds[2] = vm.toString(blockNum); + cmds[3] = vm.toString(blocksPerEpoch); + + bytes memory result = vm.ffi(cmds); + (uint64 epoch) = abi.decode(result, (uint64)); + assertEq(epoch, lc.epochFromBlockNumber(blockNum, blocksPerEpoch)); + } + + function testFuzz_currentEpoch(uint64 newBlockHeight) public { + uint64 anyView = 10; + BN254.ScalarField anyRoot = genesis.blockCommRoot; + + lc.setFinalizedState(LC.LightClientState(anyView, newBlockHeight, anyRoot)); + // note: since we've tested `lc.epochFromBlockNumber()` in the last test, we use it as + // ground truth here + assertEq(lc.currentEpoch(), lc.epochFromBlockNumber(newBlockHeight, lc._blocksPerEpoch())); + } + + function test_isLastBlockInEpoch() public view { + assertFalse(lc.isLastBlockInEpoch(0)); + for (uint64 i = 1; i < BLOCKS_PER_EPOCH - 1; i++) { + assertFalse(lc.isLastBlockInEpoch(i)); + assertFalse(lc.isLastBlockInEpoch(i + 3 * BLOCKS_PER_EPOCH)); + } + assertTrue(lc.isLastBlockInEpoch(BLOCKS_PER_EPOCH)); + assertTrue(lc.isLastBlockInEpoch(4 * BLOCKS_PER_EPOCH)); + } + + function test_RevertWhen_LastBlockInEpochSkipped() public { + string[] memory cmds = new string[](3); + cmds[0] = "diff-test"; + cmds[1] = "mock-skip-blocks"; + cmds[2] = vm.toString(lc._blocksPerEpoch() + 1); // skipping the entire first epoch + + bytes memory result = vm.ffi(cmds); + ( + LC.LightClientState memory state, + LC.StakeTableState memory nextStakeTable, + V.PlonkProof memory proof + ) = abi.decode(result, (LC.LightClientState, LC.StakeTableState, V.PlonkProof)); + + vm.prank(permissionedProver); + vm.expectRevert(LC.MissingLastBlockInEpochUpdate.selector); + lc.newFinalizedState(state, nextStakeTable, proof); + + // force update the state to the first block in epoch 2 + lc.setFinalizedState(state); + cmds[0] = "diff-test"; + cmds[1] = "mock-skip-blocks"; + cmds[2] = vm.toString(3 * lc._blocksPerEpoch() + 1); // skipping to epoch 4 + + result = vm.ffi(cmds); + (state, nextStakeTable, proof) = + abi.decode(result, (LC.LightClientState, LC.StakeTableState, V.PlonkProof)); + + vm.prank(permissionedProver); + vm.expectRevert(LC.MissingLastBlockInEpochUpdate.selector); + lc.newFinalizedState(state, nextStakeTable, proof); + } + + /// @dev when I update within the same epoch (not the last block thus not epoch change), + /// the `votingStakeTable` should NOT be updated + function test_NoStakeTableUpdateOutsideEpochChange() public { + string[] memory cmds = new string[](3); + cmds[0] = "diff-test"; + cmds[1] = "mock-skip-blocks"; + cmds[2] = vm.toString(uint64(1)); + + bytes memory result = vm.ffi(cmds); + ( + LC.LightClientState memory state, + LC.StakeTableState memory nextStakeTable, + V.PlonkProof memory proof + ) = abi.decode(result, (LC.LightClientState, LC.StakeTableState, V.PlonkProof)); + + LC.StakeTableState memory badNextStakeTable = LC.StakeTableState( + nextStakeTable.threshold + 1, + BN254.ScalarField.wrap(42), + BN254.ScalarField.wrap(43), + BN254.ScalarField.wrap(44) + ); + vm.prank(permissionedProver); + lc.newFinalizedState(state, badNextStakeTable, proof); + + ( + uint256 threshold, + BN254.ScalarField blsKeyComm, + BN254.ScalarField schnorrKeyComm, + BN254.ScalarField amountComm + ) = lc.votingStakeTableState(); + + assertEq(threshold, nextStakeTable.threshold); + assertEq(blsKeyComm, nextStakeTable.blsKeyComm); + assertEq(schnorrKeyComm, nextStakeTable.schnorrKeyComm); + assertEq(amountComm, nextStakeTable.amountComm); + } + + function test_StakeTableUpdateDuringEpochChange() public { + string[] memory cmds = new string[](3); + cmds[0] = "diff-test"; + cmds[1] = "mock-skip-blocks"; + cmds[2] = vm.toString(lc._blocksPerEpoch()); + + bytes memory result = vm.ffi(cmds); + ( + LC.LightClientState memory state, + LC.StakeTableState memory nextStakeTable, + V.PlonkProof memory proof + ) = abi.decode(result, (LC.LightClientState, LC.StakeTableState, V.PlonkProof)); + + // if feed with inconsistent nextStakeTable, should revert + LC.StakeTableState memory badNextStakeTable = LC.StakeTableState( + nextStakeTable.threshold + 1, + BN254.ScalarField.wrap(42), + BN254.ScalarField.wrap(43), + BN254.ScalarField.wrap(44) + ); + vm.prank(permissionedProver); + vm.expectRevert(LC.InvalidProof.selector); + lc.newFinalizedState(state, badNextStakeTable, proof); + + // happy path + vm.prank(permissionedProver); + vm.expectEmit(true, true, true, true); + emit LC.NewEpoch(2); + lc.newFinalizedState(state, nextStakeTable, proof); + + // check the voting stake table is updated + ( + uint256 threshold, + BN254.ScalarField blsKeyComm, + BN254.ScalarField schnorrKeyComm, + BN254.ScalarField amountComm + ) = lc.votingStakeTableState(); + + assertEq(threshold, nextStakeTable.threshold); + assertEq(blsKeyComm, nextStakeTable.blsKeyComm); + assertEq(schnorrKeyComm, nextStakeTable.schnorrKeyComm); + assertEq(amountComm, nextStakeTable.amountComm); + } +} diff --git a/contracts/test/LightClientBenchmark.t.sol b/contracts/test/LightClientBenchmark.t.sol index 4fb4a9aeda..ca2434e802 100644 --- a/contracts/test/LightClientBenchmark.t.sol +++ b/contracts/test/LightClientBenchmark.t.sol @@ -14,6 +14,7 @@ import { LightClientCommonTest } from "./LightClient.t.sol"; contract LightClientBench is LightClientCommonTest { LC.LightClientState state; + LC.StakeTableState nextStakeTable; V.PlonkProof proof; function setUp() public { @@ -25,20 +26,26 @@ contract LightClientBench is LightClientCommonTest { cmds[2] = vm.toString(STAKE_TABLE_CAPACITY / 2); bytes memory result = vm.ffi(cmds); - (LC.LightClientState[] memory states, V.PlonkProof[] memory proofs) = - abi.decode(result, (LC.LightClientState[], V.PlonkProof[])); + ( + LC.LightClientState[] memory states, + LC.StakeTableState[] memory nextStakeTables, + V.PlonkProof[] memory proofs + ) = abi.decode(result, (LC.LightClientState[], LC.StakeTableState[], V.PlonkProof[])); state = states[0]; proof = proofs[0]; + nextStakeTable = nextStakeTables[0]; } /// @dev for benchmarking purposes only function testCorrectUpdateBench() external { vm.pauseGasMetering(); LC.LightClientState memory st = state; + LC.StakeTableState memory nextSTState = nextStakeTable; V.PlonkProof memory pf = proof; + vm.prank(permissionedProver); vm.resumeGasMetering(); - lc.newFinalizedState(st, pf); + lc.newFinalizedState(st, nextSTState, pf); } } diff --git a/contracts/test/LightClientUpgradeSameContract.t.sol b/contracts/test/LightClientUpgradeSameContract.t.sol index 9ae9b9c2bd..4fb1cce24c 100644 --- a/contracts/test/LightClientUpgradeSameContract.t.sol +++ b/contracts/test/LightClientUpgradeSameContract.t.sol @@ -25,10 +25,12 @@ contract LightClientUpgradeSameContractTest is Test { address public proxy; uint32 public constant MAX_HISTORY_SECONDS = 864000; //10 days + uint64 public constant BLOCKS_PER_EPOCH = 3; // deploy the first implementation with its proxy function setUp() public { - (proxy, admin, stateV1, stakeStateV1) = deployer.run(5, MAX_HISTORY_SECONDS); + (proxy, admin, stateV1, stakeStateV1) = + deployer.run(5, MAX_HISTORY_SECONDS, BLOCKS_PER_EPOCH); lcV1Proxy = LCV1(proxy); } diff --git a/contracts/test/LightClientUpgradeToVx.t.sol b/contracts/test/LightClientUpgradeToVx.t.sol index 71efd66e29..915cbbc3e9 100644 --- a/contracts/test/LightClientUpgradeToVx.t.sol +++ b/contracts/test/LightClientUpgradeToVx.t.sol @@ -42,10 +42,12 @@ contract LightClientUpgradeToVxTest is Test { address public lcV1Impl; uint32 public constant MAX_HISTORY_SECONDS = 864000; //10 days + uint64 public constant BLOCKS_PER_EPOCH = 3; // deploy the first implementation with its proxy function setUp() public { - (proxy, admin, stateV1, stakeStateV1) = deployer.run(5, MAX_HISTORY_SECONDS); + (proxy, admin, stateV1, stakeStateV1) = + deployer.run(5, MAX_HISTORY_SECONDS, BLOCKS_PER_EPOCH); lcV1Proxy = LCV1(proxy); lcV1Impl = Upgrades.getImplementationAddress(proxy); assertNotEq(lcV1Impl, address(0)); diff --git a/contracts/test/LightClientV2.sol b/contracts/test/LightClientV2.sol index 6a68a33a3a..f857998547 100644 --- a/contracts/test/LightClientV2.sol +++ b/contracts/test/LightClientV2.sol @@ -62,6 +62,7 @@ contract LightClientV2 is LightClient { /// become the snapshots used for vote verifications later on. function newFinalizedState( ExtendedLightClientState memory newState, + StakeTableState memory nextStakeTable, IPlonkVerifier.PlonkProof memory proof ) external virtual { if ( @@ -74,7 +75,7 @@ contract LightClientV2 is LightClient { BN254.validateScalarField(newState.blockCommRoot); // check plonk proof - verifyProof(newState, proof); + verifyProof(newState, nextStakeTable, proof); // New condition to check w.r.t. LightClient contract V1 require(newField == 0, "newField can only be set to 0"); @@ -93,19 +94,34 @@ contract LightClientV2 is LightClient { /// used in inherited contracts. function verifyProof( ExtendedLightClientState memory state, + StakeTableState memory nextStakeTable, IPlonkVerifier.PlonkProof memory proof ) internal virtual { IPlonkVerifier.VerifyingKey memory vk = VkLib.getVk(); // Prepare the public input - uint256[7] memory publicInput; + uint256[11] memory publicInput; publicInput[0] = uint256(state.viewNum); publicInput[1] = uint256(state.blockHeight); publicInput[2] = BN254.ScalarField.unwrap(state.blockCommRoot); - publicInput[3] = BN254.ScalarField.unwrap(genesisStakeTableState.blsKeyComm); - publicInput[4] = BN254.ScalarField.unwrap(genesisStakeTableState.schnorrKeyComm); - publicInput[5] = BN254.ScalarField.unwrap(genesisStakeTableState.amountComm); - publicInput[6] = genesisStakeTableState.threshold; + publicInput[3] = BN254.ScalarField.unwrap(votingStakeTableState.blsKeyComm); + publicInput[4] = BN254.ScalarField.unwrap(votingStakeTableState.schnorrKeyComm); + publicInput[5] = BN254.ScalarField.unwrap(votingStakeTableState.amountComm); + publicInput[6] = votingStakeTableState.threshold; + + if (isLastBlockInEpoch(state.blockHeight)) { + // during epoch change: use the next stake table + publicInput[7] = BN254.ScalarField.unwrap(nextStakeTable.blsKeyComm); + publicInput[8] = BN254.ScalarField.unwrap(nextStakeTable.schnorrKeyComm); + publicInput[9] = BN254.ScalarField.unwrap(nextStakeTable.amountComm); + publicInput[10] = nextStakeTable.threshold; + } else { + // use the previous stake table, effectively force nextStakeTable == votingStakeTable + publicInput[7] = BN254.ScalarField.unwrap(votingStakeTableState.blsKeyComm); + publicInput[8] = BN254.ScalarField.unwrap(votingStakeTableState.schnorrKeyComm); + publicInput[9] = BN254.ScalarField.unwrap(votingStakeTableState.amountComm); + publicInput[10] = votingStakeTableState.threshold; + } if (!PlonkVerifier.verify(vk, publicInput, proof)) { revert InvalidProof(); diff --git a/contracts/test/PlonkVerifier.t.sol b/contracts/test/PlonkVerifier.t.sol index c541471c40..e16187571f 100644 --- a/contracts/test/PlonkVerifier.t.sol +++ b/contracts/test/PlonkVerifier.t.sol @@ -34,7 +34,7 @@ contract PlonkVerifierCommonTest is Test { /// @dev Sanitize all values in `a` to be valid scalar fields Bn254::Fr. /// This is helpful to sanitize fuzzer-generated random `uint[]` values. - function sanitizeScalarFields(uint256[7] memory a) public pure returns (uint256[7] memory) { + function sanitizeScalarFields(uint256[11] memory a) public pure returns (uint256[11] memory) { for (uint256 i = 0; i < a.length; i++) { a[i] = sanitizeScalarField(a[i]); } @@ -74,7 +74,7 @@ contract PlonkVerifierCommonTest is Test { /// @dev helper function to generate some dummy but format-valid arguments for /// `prepareOpeningProof` step. The verifyingKey should be fixed/loaded from library, /// proof should be generated via `dummyProof()`, other inputs are from fuzzers. - function dummyArgsForOpeningProof(uint64 seed, uint256[7] memory publicInput) + function dummyArgsForOpeningProof(uint64 seed, uint256[11] memory publicInput) public returns ( IPlonkVerifier.VerifyingKey memory, @@ -139,9 +139,11 @@ contract PlonkVerifier_verify_Test is PlonkVerifierCommonTest { bytes memory result = vm.ffi(cmds); ( IPlonkVerifier.VerifyingKey memory verifyingKey, - uint256[7] memory publicInput, + uint256[11] memory publicInput, IPlonkVerifier.PlonkProof memory proof - ) = abi.decode(result, (IPlonkVerifier.VerifyingKey, uint256[7], IPlonkVerifier.PlonkProof)); + ) = abi.decode( + result, (IPlonkVerifier.VerifyingKey, uint256[11], IPlonkVerifier.PlonkProof) + ); vm.resumeGasMetering(); assert(V.verify(verifyingKey, publicInput, proof)); @@ -156,9 +158,11 @@ contract PlonkVerifier_verify_Test is PlonkVerifierCommonTest { bytes memory result = vm.ffi(cmds); ( IPlonkVerifier.VerifyingKey memory verifyingKey, - uint256[7] memory publicInput, + uint256[11] memory publicInput, IPlonkVerifier.PlonkProof memory proof - ) = abi.decode(result, (IPlonkVerifier.VerifyingKey, uint256[7], IPlonkVerifier.PlonkProof)); + ) = abi.decode( + result, (IPlonkVerifier.VerifyingKey, uint256[11], IPlonkVerifier.PlonkProof) + ); // there are 18 points in verifying key // randomly choose one to mutate @@ -184,9 +188,9 @@ contract PlonkVerifier_verify_Test is PlonkVerifierCommonTest { // @dev Test when bad public input is supplied, the verification should fail // We know our `gen_circuit_for_test` in `diff_test.rs` has only 8 public inputs - function testFuzz_badPublicInput_fails(uint256[7] calldata randPublicInput) external { - uint256[7] memory badPublicInput; - for (uint256 i = 0; i < 7; i++) { + function testFuzz_badPublicInput_fails(uint256[11] calldata randPublicInput) external { + uint256[11] memory badPublicInput; + for (uint256 i = 0; i < 11; i++) { badPublicInput[i] = randPublicInput[i]; } badPublicInput = sanitizeScalarFields(badPublicInput); @@ -197,7 +201,7 @@ contract PlonkVerifier_verify_Test is PlonkVerifierCommonTest { bytes memory result = vm.ffi(cmds); (IPlonkVerifier.VerifyingKey memory verifyingKey,, IPlonkVerifier.PlonkProof memory proof) = - abi.decode(result, (IPlonkVerifier.VerifyingKey, uint256[7], IPlonkVerifier.PlonkProof)); + abi.decode(result, (IPlonkVerifier.VerifyingKey, uint256[11], IPlonkVerifier.PlonkProof)); assert(!V.verify(verifyingKey, badPublicInput, proof)); } @@ -211,8 +215,8 @@ contract PlonkVerifier_verify_Test is PlonkVerifierCommonTest { cmds[1] = "plonk-verify"; bytes memory result = vm.ffi(cmds); - (IPlonkVerifier.VerifyingKey memory verifyingKey, uint256[7] memory publicInput,) = - abi.decode(result, (IPlonkVerifier.VerifyingKey, uint256[7], IPlonkVerifier.PlonkProof)); + (IPlonkVerifier.VerifyingKey memory verifyingKey, uint256[11] memory publicInput,) = abi + .decode(result, (IPlonkVerifier.VerifyingKey, uint256[11], IPlonkVerifier.PlonkProof)); assert(!V.verify(verifyingKey, publicInput, badProof)); } @@ -278,11 +282,11 @@ contract PlonkVerifier_validateProof_Test is PlonkVerifierCommonTest { contract PlonkVerifier_computeChallenges_Test is PlonkVerifierCommonTest { /// @dev Test `computeChallenges` matches that of Jellyfish - function testFuzz_computeChallenges_matches(uint64 seed, uint256[7] memory _publicInput) + function testFuzz_computeChallenges_matches(uint64 seed, uint256[11] memory _publicInput) external { - uint256[7] memory publicInput; - for (uint256 i = 0; i < 7; i++) { + uint256[11] memory publicInput; + for (uint256 i = 0; i < 11; i++) { publicInput[i] = _publicInput[i]; } diff --git a/contracts/test/PlonkVerifier2.t.sol b/contracts/test/PlonkVerifier2.t.sol deleted file mode 100644 index 6da971bf3a..0000000000 --- a/contracts/test/PlonkVerifier2.t.sol +++ /dev/null @@ -1,144 +0,0 @@ -// SPDX-License-Identifier: Unlicensed - -/* solhint-disable contract-name-camelcase, func-name-mixedcase, one-contract-per-file */ -/* solhint-disable no-inline-assembly */ - -// NOTE: For developers and auditors: we mainly test the consistency between the outputs between -// Solidity and Jellyfish library, with the help of fuzzer-generated inputs from Forge Testing. -// Inside the logic of `verify()`, variables values only need to be consistent and valid -// (i.e. valid group or field elements) and don't need to be from a correct proof/public input. -// Only the last step `_verifyOpeningProof` will test *correctness* of these parameters. -// Therefore, we employ more randomly generated dummy inputs for most tests for robustness, -// and only rely on Rust-code to generate correct inputs for the `_verifyOpeningProof`. - -pragma solidity ^0.8.0; - -// Libraries -import "forge-std/Test.sol"; -import { BN254 } from "bn254/BN254.sol"; -import { IPlonkVerifier } from "../src/interfaces/IPlonkVerifier.sol"; -import { LightClientStateUpdateVKMock as VkTest } from "./mocks/LightClientStateUpdateVKMock.sol"; - -// Target contract -import { PlonkVerifier2 as V } from "../src/libraries/PlonkVerifier2.sol"; - -/// @dev Common helpers/utils for PlonkVerifier tests -contract PlonkVerifierCommonTest is Test { - /// @dev Sanitize a single value to be valid scalar field Bn254::Fr. - function sanitizeScalarField(uint256 a) public pure returns (uint256) { - a = bound(a, 0, BN254.R_MOD - 1); - BN254.validateScalarField(BN254.ScalarField.wrap(a)); - return a; - } - - /// @dev Sanitize all values in `a` to be valid scalar fields Bn254::Fr. - /// This is helpful to sanitize fuzzer-generated random `uint[]` values. - function sanitizeScalarFields(uint256[7] memory a) public pure returns (uint256[7] memory) { - for (uint256 i = 0; i < a.length; i++) { - a[i] = sanitizeScalarField(a[i]); - } - return a; - } - - /// @dev Generate a random valid (format-wise) proof from a random seed - function dummyProof(uint64 seed) public returns (IPlonkVerifier.PlonkProof memory) { - string[] memory cmds = new string[](3); - cmds[0] = "diff-test"; - cmds[1] = "dummy-proof"; - cmds[2] = vm.toString(seed); - - bytes memory result = vm.ffi(cmds); - (IPlonkVerifier.PlonkProof memory proof) = abi.decode(result, (IPlonkVerifier.PlonkProof)); - return proof; - } -} - -contract PlonkVerifier2_verify_Test is PlonkVerifierCommonTest { - /// @dev Test happy path of `verify`. - function test_verify_succeeds() external { - vm.pauseGasMetering(); - string[] memory cmds = new string[](2); - cmds[0] = "diff-test"; - cmds[1] = "plonk-verify"; - - bytes memory result = vm.ffi(cmds); - ( - IPlonkVerifier.VerifyingKey memory verifyingKey, - uint256[7] memory publicInput, - IPlonkVerifier.PlonkProof memory proof - ) = abi.decode(result, (IPlonkVerifier.VerifyingKey, uint256[7], IPlonkVerifier.PlonkProof)); - - vm.resumeGasMetering(); - assert(V.verify(verifyingKey, publicInput, proof)); - } - - /// @dev Test when bad verifying key is supplied, the verification should fail - function testFuzz_badVerifyingKey_fails(uint256 nthPoint) external { - string[] memory cmds = new string[](2); - cmds[0] = "diff-test"; - cmds[1] = "plonk-verify"; - - bytes memory result = vm.ffi(cmds); - ( - IPlonkVerifier.VerifyingKey memory verifyingKey, - uint256[7] memory publicInput, - IPlonkVerifier.PlonkProof memory proof - ) = abi.decode(result, (IPlonkVerifier.VerifyingKey, uint256[7], IPlonkVerifier.PlonkProof)); - - // there are 18 points in verifying key - // randomly choose one to mutate - nthPoint = bound(nthPoint, 0, 17); - - BN254.G1Point memory badPoint; - assembly { - // the first point offset is 0x40 - let badPointRef := add(verifyingKey, add(mul(nthPoint, 0x20), 0x40)) - badPoint := mload(badPointRef) - } - - // modify the point to be invalid - badPoint = BN254.add(badPoint, BN254.P1()); - - assembly { - let badPointRef := add(verifyingKey, add(mul(nthPoint, 0x20), 0x40)) - mstore(badPointRef, badPoint) - } - - assert(!V.verify(verifyingKey, publicInput, proof)); - } - - // @dev Test when bad public input is supplied, the verification should fail - // We know our `gen_circuit_for_test` in `diff_test.rs` has only 8 public inputs - function testFuzz_badPublicInput_fails(uint256[7] calldata randPublicInput) external { - uint256[7] memory badPublicInput; - for (uint256 i = 0; i < 7; i++) { - badPublicInput[i] = randPublicInput[i]; - } - badPublicInput = sanitizeScalarFields(badPublicInput); - - string[] memory cmds = new string[](2); - cmds[0] = "diff-test"; - cmds[1] = "plonk-verify"; - - bytes memory result = vm.ffi(cmds); - (IPlonkVerifier.VerifyingKey memory verifyingKey,, IPlonkVerifier.PlonkProof memory proof) = - abi.decode(result, (IPlonkVerifier.VerifyingKey, uint256[7], IPlonkVerifier.PlonkProof)); - - assert(!V.verify(verifyingKey, badPublicInput, proof)); - } - - /// @dev Test when bad proof is supplied, the verification should fail - function testFuzz_badProof_fails(uint64 seed) external { - IPlonkVerifier.PlonkProof memory badProof = dummyProof(seed); - - string[] memory cmds = new string[](2); - cmds[0] = "diff-test"; - cmds[1] = "plonk-verify"; - - bytes memory result = vm.ffi(cmds); - (IPlonkVerifier.VerifyingKey memory verifyingKey, uint256[7] memory publicInput,) = - abi.decode(result, (IPlonkVerifier.VerifyingKey, uint256[7], IPlonkVerifier.PlonkProof)); - - assert(!V.verify(verifyingKey, publicInput, badProof)); - } -} diff --git a/contracts/test/PolynomialEval.t.sol b/contracts/test/PolynomialEval.t.sol index e4ebba1523..d7b026f4b3 100644 --- a/contracts/test/PolynomialEval.t.sol +++ b/contracts/test/PolynomialEval.t.sol @@ -79,12 +79,12 @@ contract PolynomialEvalTest is Test { cmds[0] = "diff-test"; cmds[1] = "eval-domain-elements"; cmds[2] = vm.toString(logSize); - cmds[3] = vm.toString(uint256(7)); + cmds[3] = vm.toString(uint256(11)); bytes memory result = vm.ffi(cmds); (uint256[] memory elems) = abi.decode(result, (uint256[])); - for (uint256 i = 0; i < 7; i++) { + for (uint256 i = 0; i < 11; i++) { assertEq(elems[i], domain.elements[i]); } } @@ -93,13 +93,13 @@ contract PolynomialEvalTest is Test { contract PolynomialEval_evalDataGen_Test is PolynomialEvalTest { /// @dev Test if evaluations on the vanishing poly, the lagrange one poly, and the public input /// poly are correct. - function testFuzz_evalDataGen_matches(uint256 zeta, uint256[7] memory publicInput) external { + function testFuzz_evalDataGen_matches(uint256 zeta, uint256[11] memory publicInput) external { uint256 logSize = 20; zeta = bound(zeta, 0, BN254.R_MOD - 1); BN254.validateScalarField(BN254.ScalarField.wrap(zeta)); // Since these user-provided `publicInputs` were checked outside before passing in via // `BN254.validateScalarField()`, it suffices to assume they are proper for our test here. - for (uint256 i = 0; i < 7; i++) { + for (uint256 i = 0; i < 11; i++) { publicInput[i] = bound(publicInput[i], 0, BN254.R_MOD - 1); BN254.validateScalarField(BN254.ScalarField.wrap(publicInput[i])); } @@ -165,16 +165,16 @@ contract PolynomialEval_evalDataGen_Test is PolynomialEvalTest { Poly.EvalDomain memory domain = Poly.newEvalDomain(size); uint256[] memory elements = domainElements(domain, size); - uint256[7] memory publicInputs; + uint256[11] memory publicInputs; // arbitrarily pick public input length = 10, and fill in arbitrary values - for (uint256 i = 0; i < 7; i++) { + for (uint256 i = 0; i < 11; i++) { publicInputs[i] = 2 ** i; } for (uint256 i = 0; i < size; i++) { uint256 zeta = elements[i]; uint256 vanishEval = Poly.evaluateVanishingPoly(domain, zeta); - if (i < 7) { + if (i < 11) { assertEq(vanishEval, 0); assertEq( Poly.evaluatePiPoly(domain, publicInputs, zeta, vanishEval), publicInputs[i] diff --git a/contracts/test/StakeTable.t.sol b/contracts/test/StakeTable.t.sol index 0ea688faa8..66800d8299 100644 --- a/contracts/test/StakeTable.t.sol +++ b/contracts/test/StakeTable.t.sol @@ -36,7 +36,7 @@ contract StakeTable_register_Test is Test { uint256 public constant MIN_STAKE_AMOUNT = 10 ether; address public exampleTokenCreator; uint64 public churnRate = 10; - uint64 public hotShotBlocksPerEpoch = 1; + uint64 public constant BLOCKS_PER_EPOCH = 1; function genClientWallet(address sender, string memory seed) private @@ -64,7 +64,7 @@ contract StakeTable_register_Test is Test { ); } - function setUpCustom(uint64 _churnRate, uint64 _blocksPerEpoch) public { + function setUp() public { exampleTokenCreator = makeAddr("tokenCreator"); vm.prank(exampleTokenCreator); token = new ExampleToken(INITIAL_BALANCE); @@ -82,25 +82,9 @@ contract StakeTable_register_Test is Test { LightClientMock.LightClientState memory genesis = state; LightClientMock.StakeTableState memory genesisStakeTableState = stakeState; - lcMock = new LightClientMock(genesis, genesisStakeTableState, 864000); + lcMock = new LightClientMock(genesis, genesisStakeTableState, 864000, BLOCKS_PER_EPOCH); stakeTable = new StakeTableMock( - address(token), - address(lcMock), - _churnRate, - _blocksPerEpoch, - MIN_STAKE_AMOUNT, - exampleTokenCreator - ); - } - - function setUp() public { - setUpCustom(churnRate, hotShotBlocksPerEpoch); - } - - function test_RevertWhen_InvalidHotShotBlocksPerEpoch() external { - vm.expectRevert(S.InvalidHotShotBlocksPerEpoch.selector); - new StakeTableMock( - address(token), address(lcMock), churnRate, 0, MIN_STAKE_AMOUNT, exampleTokenCreator + address(token), address(lcMock), churnRate, MIN_STAKE_AMOUNT, exampleTokenCreator ); } @@ -137,7 +121,7 @@ contract StakeTable_register_Test is Test { // commenting out epoch related tests for now // function testFuzz_RevertWhen_InvalidNextRegistrationEpoch(uint64 rand) external { // LCMock.setCurrentEpoch(3); - // uint64 currentEpoch = stakeTable.currentEpoch(); + // uint64 currentEpoch = lcMock.currentEpoch(); // uint64 depositAmount = 10 ether; // vm.prank(exampleTokenCreator); @@ -735,7 +719,7 @@ contract StakeTable_register_Test is Test { lcMock.setFinalizedState( LightClient.LightClientState(0, node.registerEpoch + 1, BN254.ScalarField.wrap(0)) ); - assertGe(stakeTable.currentEpoch(), node.registerEpoch + 1); + assertGe(lcMock.currentEpoch(), node.registerEpoch + 1); stakeTable.requestExit(); @@ -748,7 +732,7 @@ contract StakeTable_register_Test is Test { lcMock.setFinalizedState( LightClient.LightClientState(0, validWithdrawalEpoch, BN254.ScalarField.wrap(0)) ); - assertGe(stakeTable.currentEpoch(), validWithdrawalEpoch); + assertGe(lcMock.currentEpoch(), validWithdrawalEpoch); // Withdraw the funds vm.startPrank(exampleTokenCreator); @@ -900,85 +884,13 @@ contract StakeTable_register_Test is Test { stakeTable.updateLightClientAddress(address(0)); } - // TESTS FOR CURRENT EPOCH - function test_initialEpoch_isZero() public view { - // assert the current block height is initialBlockHeight - uint64 initialBlockHeight = 0; - (, uint64 currentBlockHeight,) = lcMock.finalizedState(); - assertEq(currentBlockHeight, initialBlockHeight); - - // Calculate the expected epoch - uint64 expectedEpoch = 0; - - // Call the currentEpoch function - uint64 currentEpoch = stakeTable.currentEpoch(); - - // Assert that the current epoch is calculated correctly - assertEq(currentEpoch, expectedEpoch); - assertEq(currentEpoch, 0); - } - - function test_currentEpoch_isUpdated() public { - test_initialEpoch_isZero(); - - // set new finalized state on the light client contract - lcMock.setFinalizedState(LightClient.LightClientState(0, 10, BN254.ScalarField.wrap(0))); - - // verify the current epoch is updated and is non-zero - assertNotEq(stakeTable.currentEpoch(), 0); - - // verify the expected epoch - uint64 expectedEpoch = 10; // 10 / 1 - assertEq(stakeTable.currentEpoch(), expectedEpoch); - } - - function test_currentEpoch_blocksPerEpochNotOne() public { - setUpCustom(10, /*churn*/ 3 /*blocksPerEpoch*/ ); - test_initialEpoch_isZero(); - lcMock.setFinalizedState(LightClient.LightClientState(0, 2, BN254.ScalarField.wrap(0))); - assertEq(stakeTable.currentEpoch(), 0); - lcMock.setFinalizedState(LightClient.LightClientState(0, 3, BN254.ScalarField.wrap(0))); - assertEq(stakeTable.currentEpoch(), 1); - } - - // test various edge cases for the currentEpoch - function test_currentEpoch_edgeCases() public { - // test edge case when the block height is less than the hotShotBlocksPerEpoch - uint64 hotShotBlockHeight = 0; - lcMock.setFinalizedState( - LightClient.LightClientState(0, hotShotBlockHeight, BN254.ScalarField.wrap(0)) - ); - assertEq(stakeTable.currentEpoch(), 0); - - // test edge case when the block height is exactly divisible by the hotShotBlocksPerEpoch - hotShotBlockHeight = 1; - lcMock.setFinalizedState( - LightClient.LightClientState(0, hotShotBlockHeight, BN254.ScalarField.wrap(0)) - ); - assertEq(stakeTable.currentEpoch(), 1); - - // test edge case when the block height is greater than the hotShotBlocksPerEpoch - hotShotBlockHeight = 2; - lcMock.setFinalizedState( - LightClient.LightClientState(0, hotShotBlockHeight, BN254.ScalarField.wrap(0)) - ); - assertEq(stakeTable.currentEpoch(), 2); - - // test edge case when the block height is very large - hotShotBlockHeight = type(uint64).max; - lcMock.setFinalizedState( - LightClient.LightClientState(0, hotShotBlockHeight, BN254.ScalarField.wrap(0)) - ); - assertEq(stakeTable.currentEpoch(), hotShotBlockHeight / hotShotBlocksPerEpoch); - } - // TESTS FOR NEXT REGISTRATION EPOCH /// @notice test the next available epoch (registration/exit) when the current epoch is zero function test_nextAvailableEpoch_whenCurrentEpochIsZero() public { // test for registration // check that the current epoch is zero - assertEq(stakeTable.currentEpoch(), 0); + assertEq(lcMock.currentEpoch(), 0); // check that the first registration epoch is equal to one assertEq(stakeTable.registrationEpoch(), 1); @@ -1005,15 +917,15 @@ contract StakeTable_register_Test is Test { // test for registration // set the current epoch to 1 by updating the latest hotshot block number on the LC contract lcMock.setFinalizedState(LightClient.LightClientState(0, 1, BN254.ScalarField.wrap(0))); - assertEq(stakeTable.currentEpoch(), 1); + assertEq(lcMock.currentEpoch(), 1); // assert that the registrationEpoch is 1 assertEq(stakeTable.registrationEpoch(), 1); - assertGe(stakeTable.currentEpoch() + 1, stakeTable.registrationEpoch()); + assertGe(lcMock.currentEpoch() + 1, stakeTable.registrationEpoch()); - // assert that the next registration epoch is equal to stakeTable.currentEpoch() + 1 + // assert that the next registration epoch is equal to lcMock.currentEpoch() + 1 stakeTable.mockPushToRegistrationQueue(); - assertEq(stakeTable.registrationEpoch(), stakeTable.currentEpoch() + 1); + assertEq(stakeTable.registrationEpoch(), lcMock.currentEpoch() + 1); assertEq(stakeTable.numPendingRegistrationsInEpoch(), 0); // test for exit @@ -1021,7 +933,7 @@ contract StakeTable_register_Test is Test { // assert that the next exit epoch is equal to 2 stakeTable.mockPushToExitQueue(); - assertEq(stakeTable.exitEpoch(), stakeTable.currentEpoch() + 1); + assertEq(stakeTable.exitEpoch(), lcMock.currentEpoch() + 1); assertEq(stakeTable.numPendingExitsInEpoch(), 0); } @@ -1032,14 +944,14 @@ contract StakeTable_register_Test is Test { { // set the current epoch to 1 by updating the latest hotshot block number on the LC contract lcMock.setFinalizedState(LightClient.LightClientState(0, 1, BN254.ScalarField.wrap(0))); - assertEq(stakeTable.currentEpoch(), 1); + assertEq(lcMock.currentEpoch(), 1); // set the registration epoch to 3 uint64 registrationEpoch = 3; stakeTable.setRegistrationEpoch(registrationEpoch); // assert that the next registration epoch is greater than the current epoch - assertGt(stakeTable.registrationEpoch(), stakeTable.currentEpoch()); + assertGt(stakeTable.registrationEpoch(), lcMock.currentEpoch()); // assert that the next registration epoch is equal to 3 stakeTable.mockPushToRegistrationQueue(); @@ -1072,7 +984,7 @@ contract StakeTable_register_Test is Test { // test for registration // set the current epoch to 1 by updating the latest hotshot block number on the LC contract lcMock.setFinalizedState(LightClient.LightClientState(0, 1, BN254.ScalarField.wrap(0))); - assertEq(stakeTable.currentEpoch(), 1); + assertEq(lcMock.currentEpoch(), 1); // set the registration epoch to 2 uint64 registrationEpoch = 2; @@ -1102,12 +1014,12 @@ contract StakeTable_register_Test is Test { lcMock.setFinalizedState( LightClient.LightClientState(0, type(uint64).max, BN254.ScalarField.wrap(0)) ); - assertEq(stakeTable.currentEpoch(), type(uint64).max); + assertEq(lcMock.currentEpoch(), type(uint64).max); // set the hotshot blocks per epoch to 1 vm.prank(exampleTokenCreator); stakeTable.mockUpdateHotShotBlocksPerEpoch(1); - assertEq(stakeTable.hotShotBlocksPerEpoch(), 1); + assertEq(lcMock._blocksPerEpoch(), 1); // push to registration queue and expect a panic due to arithmetic overflow vm.expectRevert(stdError.arithmeticError); diff --git a/contracts/test/mocks/LightClientMock.sol b/contracts/test/mocks/LightClientMock.sol index c8934ac29b..116bca0638 100644 --- a/contracts/test/mocks/LightClientMock.sol +++ b/contracts/test/mocks/LightClientMock.sol @@ -16,9 +16,10 @@ contract LightClientMock is LC { constructor( LC.LightClientState memory genesis, LC.StakeTableState memory genesisStakeTableState, - uint32 maxHistorySeconds + uint32 maxHistorySeconds, + uint64 blocksPerEpoch ) LC() { - _initializeState(genesis, genesisStakeTableState, maxHistorySeconds); + _initializeState(genesis, genesisStakeTableState, maxHistorySeconds, blocksPerEpoch); } /// @dev Directly mutate finalizedState variable for test @@ -27,22 +28,36 @@ contract LightClientMock is LC { } /// @dev override the production-implementation with test VK. - function verifyProof(LC.LightClientState memory state, IPlonkVerifier.PlonkProof memory proof) - internal - view - override - { + function verifyProof( + LC.LightClientState memory state, + StakeTableState memory nextStakeTable, + IPlonkVerifier.PlonkProof memory proof + ) internal view override { IPlonkVerifier.VerifyingKey memory vk = VkLib.getVk(); // Prepare the public input - uint256[7] memory publicInput; + uint256[11] memory publicInput; publicInput[0] = uint256(state.viewNum); publicInput[1] = uint256(state.blockHeight); publicInput[2] = BN254.ScalarField.unwrap(state.blockCommRoot); - publicInput[3] = BN254.ScalarField.unwrap(genesisStakeTableState.blsKeyComm); - publicInput[4] = BN254.ScalarField.unwrap(genesisStakeTableState.schnorrKeyComm); - publicInput[5] = BN254.ScalarField.unwrap(genesisStakeTableState.amountComm); - publicInput[6] = genesisStakeTableState.threshold; + publicInput[3] = BN254.ScalarField.unwrap(votingStakeTableState.blsKeyComm); + publicInput[4] = BN254.ScalarField.unwrap(votingStakeTableState.schnorrKeyComm); + publicInput[5] = BN254.ScalarField.unwrap(votingStakeTableState.amountComm); + publicInput[6] = votingStakeTableState.threshold; + + if (isLastBlockInEpoch(state.blockHeight)) { + // during epoch change: use the next stake table + publicInput[7] = BN254.ScalarField.unwrap(nextStakeTable.blsKeyComm); + publicInput[8] = BN254.ScalarField.unwrap(nextStakeTable.schnorrKeyComm); + publicInput[9] = BN254.ScalarField.unwrap(nextStakeTable.amountComm); + publicInput[10] = nextStakeTable.threshold; + } else { + // use the previous stake table, effectively force nextStakeTable == votingStakeTable + publicInput[7] = BN254.ScalarField.unwrap(votingStakeTableState.blsKeyComm); + publicInput[8] = BN254.ScalarField.unwrap(votingStakeTableState.schnorrKeyComm); + publicInput[9] = BN254.ScalarField.unwrap(votingStakeTableState.amountComm); + publicInput[10] = votingStakeTableState.threshold; + } if (!PlonkVerifier.verify(vk, publicInput, proof)) { revert InvalidProof(); @@ -79,4 +94,8 @@ contract LightClientMock is LC { ? blockNumber - frozenL1Height > threshold : super.lagOverEscapeHatchThreshold(blockNumber, threshold); } + + function setBlocksPerEpoch(uint64 newBlocksPerEpoch) public { + _blocksPerEpoch = newBlocksPerEpoch; + } } diff --git a/contracts/test/mocks/LightClientStateUpdateVKMock.sol b/contracts/test/mocks/LightClientStateUpdateVKMock.sol index 8953597828..57e75676ee 100644 --- a/contracts/test/mocks/LightClientStateUpdateVKMock.sol +++ b/contracts/test/mocks/LightClientStateUpdateVKMock.sol @@ -25,172 +25,172 @@ library LightClientStateUpdateVKMock { // domain size mstore(vk, 65536) // num of public inputs - mstore(add(vk, 0x20), 7) + mstore(add(vk, 0x20), 11) // sigma0 mstore( mload(add(vk, 0x40)), - 8780639620157991547891148805919878543964392540464064685187426147622550545653 + 21568523741873700538599156769763171811590077655784233382517856207887270391828 ) mstore( add(mload(add(vk, 0x40)), 0x20), - 20329703559355367581046659947888846422105739175065087594596260710114283196743 + 11016167378463266194221450403115511925903320597244053618871959577766534234199 ) // sigma1 mstore( mload(add(vk, 0x60)), - 3907156025477632431542339436132810635869646020372000361558947676433399300657 + 6242200717789942119584373442067409085263503996185564664035012246390810049374 ) mstore( add(mload(add(vk, 0x60)), 0x20), - 15166891789069460999276105114477792814715896454647328408547057284442121910762 + 20327639590645078692272366774822595936792010953533322308923376384770099482978 ) // sigma2 mstore( mload(add(vk, 0x80)), - 16117338641398770111163510775377619339331602936228198086195746724908247912987 + 3998473635078201473455318350368891770180585995756646799455275690643804207333 ) mstore( add(mload(add(vk, 0x80)), 0x20), - 16740309672564743380534217813520152592316530015569211886810037896829102066193 + 435348305493647541672866434425509790332355174224577939762604621477279457345 ) // sigma3 mstore( mload(add(vk, 0xa0)), - 12538505105272464906507307944934155800358883434325050138580706870389223251955 + 3841269352791570102400474603697560574291681874429561132362648675857373121779 ) mstore( add(mload(add(vk, 0xa0)), 0x20), - 17087689768744441683235009923517716656172653026276602270807480035069491545755 + 840123309558033808766090647441772828266647129325327385937568594840403800402 ) // sigma4 mstore( mload(add(vk, 0xc0)), - 8454021317091853741146103272343912504762747954666706409528335183296787067868 + 11501871940539373682638729008612832388120417878548445683921885518295556769975 ) mstore( add(mload(add(vk, 0xc0)), 0x20), - 11016751689921538830297286304051364340305496719162309364532472841887958117447 + 10644525444639852934520182216704987991622496935544069265579329239645763191366 ) // q1 mstore( mload(add(vk, 0xe0)), - 15359607559713515060277507574080941419834828987039079827302572287698309504008 + 16543641133393102728401391455145096135635252965596694307893459430506296209868 ) mstore( add(mload(add(vk, 0xe0)), 0x20), - 15591847269596226482414296106962647755691103548771963256694477068178857435064 + 10202059712985677895857664453148396350957313499144632112048293576752099978030 ) // q2 mstore( mload(add(vk, 0x100)), - 3827124881709489188270137163975264995006696000603327038290589744450697834719 + 12369401916991282261299727764167587198575783747286042606526892074312643775722 ) mstore( add(mload(add(vk, 0x100)), 0x20), - 4318865171469939783910279249735693836790096703031897567022798858747771698987 + 15236855189172128334513080725077144519425107247511363386735279405441654072100 ) // q3 mstore( mload(add(vk, 0x120)), - 9913200330357548509998155437749548539621758310017341493550757808590136100654 + 7364193263380897455766225430107140335836933309064165348628087738763726403821 ) mstore( add(mload(add(vk, 0x120)), 0x20), - 6814632498217774714123393660227395994377471940775558778851220352696329643472 + 10520374722381796716143593580980527346574381665802339103600108246431183811624 ) // q4 mstore( mload(add(vk, 0x140)), - 3883191076505672454480590601847891400492344398783540423987354164376670931632 + 18479733680309955613654283517406453256528875728320997185501564901051632514401 ) mstore( add(mload(add(vk, 0x140)), 0x20), - 20839825466680406969762141617626050744698350991971572530895764099779245352021 + 1973557680863202626378704642021529608879486716425499648594259196327586461602 ) // qM12 mstore( mload(add(vk, 0x160)), - 21406269564986737709993597423928286134977055796815775729833412276225603000600 + 11475995542650898524884773749776290586194546575252790479732326812771179079557 ) mstore( add(mload(add(vk, 0x160)), 0x20), - 12772252332970283309865491720722288577802768585231460494194809914065609893146 + 9567823197346095437367808396726144362887555632002875507300058078126865694257 ) // qM34 mstore( mload(add(vk, 0x180)), - 8748719790723850706708743284282732016988453984542999687132033580365028484176 + 7591864667761867251944520292986946642574877428359456709480720079508065575858 ) mstore( add(mload(add(vk, 0x180)), 0x20), - 17544334478919255774333811720072760425376034355353547228796576661540616867477 + 15581624153275255992703995999352372096312627850607230823477988991136629591839 ) // qO mstore( mload(add(vk, 0x1a0)), - 5779426557055774294678280308002088559229695119399763216284786861647635461700 + 9875671957483633815289504312106088033899947632392864245450141494609573181309 ) mstore( add(mload(add(vk, 0x1a0)), 0x20), - 7548438953482540110543430573498065044386548194974128437338762456047175631187 + 5131506440874409933428082397836510549082004432365899248394379477946846192863 ) // qC mstore( mload(add(vk, 0x1c0)), - 11552344496521430760886457728705966546513418701688663336162205885875626038275 + 2285301167483849620357003031221096419897308399537526250455000751545653588401 ) mstore( add(mload(add(vk, 0x1c0)), 0x20), - 16226018892294013424782485757258297775919919344548162680620984645491361418522 + 21710186780187534453410858467085268089583772741717001493902994347048055130211 ) // qH1 mstore( mload(add(vk, 0x1e0)), - 15429474373549821133939594736546140618918804365845388482696898746435810291934 + 8510055999174987348763232246028091899956646187718150438418873158988286282738 ) mstore( add(mload(add(vk, 0x1e0)), 0x20), - 15886779329816613995086957445881288473375121142391270808048598119106627277422 + 11160028652877244584572153327058644848925661982628619657928186658900102698674 ) // qH2 mstore( mload(add(vk, 0x200)), - 20182835776034348669368110619035658941195975223063135746846432037544892224044 + 6812248435914231697797863290383502968775638568963173888613217370691598179790 ) mstore( add(mload(add(vk, 0x200)), 0x20), - 15361728677111385770832136356063861049884090898287914753487082190229852997688 + 10288031744943320195220546183832895314194617344766586077138716301051404942700 ) // qH3 mstore( mload(add(vk, 0x220)), - 14511917864647423306209946980814936857561106729956548326825273767665603910950 + 7073441101526441130326675672872251782623383962596021001856074883490444635729 ) mstore( add(mload(add(vk, 0x220)), 0x20), - 14658715671477677285308444061546079655758155254745238831866071967401023436805 + 10912992294712044685870339796081929127791537178880469654916734246832522853441 ) // qH4 mstore( mload(add(vk, 0x240)), - 14937219945828094206790376190430054771766629914027056408189669916922811947303 + 19759277998863810664024933554928916584313156629896742577450508109085736606052 ) mstore( add(mload(add(vk, 0x240)), 0x20), - 15151784422100780280828965688541219091568989137314100641534271437316997647143 + 18978171626604150823002716117679602054445996916974746838136235438198499993631 ) // qEcc mstore( mload(add(vk, 0x260)), - 12945427393138592243089853673971037111092830343359970781209689043897181434196 + 20666573922540010635242270071163126450457243909857540968737935382270244366724 ) mstore( add(mload(add(vk, 0x260)), 0x20), - 17314669060147862110721119367910762821785110567097188274415984256244098310506 + 12429234064418095971915118978396765378803191095410026012713099669250449537359 ) // g2LSB mstore( diff --git a/contracts/test/mocks/StakeTableMock.sol b/contracts/test/mocks/StakeTableMock.sol index a7da814374..6a7009789c 100644 --- a/contracts/test/mocks/StakeTableMock.sol +++ b/contracts/test/mocks/StakeTableMock.sol @@ -2,24 +2,16 @@ pragma solidity ^0.8.0; import { StakeTable } from "../../src/StakeTable.sol"; +import { LightClientMock } from "./LightClientMock.sol"; contract StakeTableMock is StakeTable { constructor( address token, address lightClientAddress, uint64 churnRate, - uint64 hotShotBlocksPerEpoch, uint256 minStakeAmount, address initialOwner - ) - StakeTable( - token, - lightClientAddress, - churnRate, - hotShotBlocksPerEpoch, - minStakeAmount, - initialOwner - ) + ) StakeTable(token, lightClientAddress, churnRate, minStakeAmount, initialOwner) // solhint-disable-next-line no-empty-blocks { } @@ -46,6 +38,6 @@ contract StakeTableMock is StakeTable { } function mockUpdateHotShotBlocksPerEpoch(uint64 newHotShotBlocksPerEpoch) public { - hotShotBlocksPerEpoch = newHotShotBlocksPerEpoch; + LightClientMock(address(lightClient)).setBlocksPerEpoch(newHotShotBlocksPerEpoch); } } diff --git a/contracts/test/script/LightClientTestScript.s.sol b/contracts/test/script/LightClientTestScript.s.sol index 147662f93c..44c4b39201 100644 --- a/contracts/test/script/LightClientTestScript.s.sol +++ b/contracts/test/script/LightClientTestScript.s.sol @@ -9,10 +9,12 @@ import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy import { LightClientV2 as LCV2 } from "../LightClientV2.sol"; contract DeployLightClientTestScript is Script { - function run(uint64 numInitValidators, uint32 stateHistoryRetentionPeriod, address owner) - external - returns (address payable proxyAddress, address admin, LC.LightClientState memory) - { + function run( + uint64 numInitValidators, + uint32 stateHistoryRetentionPeriod, + address owner, + uint64 blocksPerEpoch + ) external returns (address payable proxyAddress, address admin, LC.LightClientState memory) { // TODO for a production deployment provide the right genesis state and value string[] memory cmds = new string[](3); @@ -24,20 +26,21 @@ contract DeployLightClientTestScript is Script { (LC.LightClientState memory state, LC.StakeTableState memory stakeState) = abi.decode(result, (LC.LightClientState, LC.StakeTableState)); - return deployContract(state, stakeState, stateHistoryRetentionPeriod, owner); + return deployContract(state, stakeState, stateHistoryRetentionPeriod, owner, blocksPerEpoch); } function runBench(uint64 numInitValidators, uint32 stateHistoryRetentionPeriod) external returns (address payable, address, LC.LightClientState memory) { + uint64 blocksPerEpoch = 10; // arbitrary value, won't affect bench address payable lcTestProxy; address admin; LC.LightClientState memory state; string memory seedPhrase = vm.envString("MNEMONIC"); (admin,) = deriveRememberKey(seedPhrase, 0); (lcTestProxy, admin, state) = - this.run(numInitValidators, stateHistoryRetentionPeriod, admin); + this.run(numInitValidators, stateHistoryRetentionPeriod, admin, blocksPerEpoch); LCMock lc = LCMock(lcTestProxy); vm.prank(admin); lc.setPermissionedProver(admin); @@ -49,23 +52,27 @@ contract DeployLightClientTestScript is Script { /// @return proxyAddress The address of the proxy /// @return admin The address of the admin /// @return the light client state + /// @param blocksPerEpoch Number of HotShot block per epoch function deployContract( LC.LightClientState memory state, LC.StakeTableState memory stakeState, uint32 stateHistoryRetentionPeriod, - address owner + address owner, + uint64 blocksPerEpoch ) public returns (address payable proxyAddress, address admin, LC.LightClientState memory) { vm.startBroadcast(owner); - LCMock lightClientContract = new LCMock(state, stakeState, stateHistoryRetentionPeriod); + LCMock lightClientContract = + new LCMock(state, stakeState, stateHistoryRetentionPeriod, blocksPerEpoch); // Encode the initializer function call bytes memory data = abi.encodeWithSignature( - "initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address)", + "initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address,uint64)", state, stakeState, stateHistoryRetentionPeriod, - owner + owner, + blocksPerEpoch ); // our proxy @@ -82,7 +89,11 @@ contract DeployLightClientTestScript is Script { /// the admin is not a multisig wallet but is the same as the associated mnemonic /// used in staging deployments only contract DeployLightClientContractWithoutMultiSigScript is Script { - function run(uint32 numInitValidators, uint32 stateHistoryRetentionPeriod) + function run( + uint32 numInitValidators, + uint32 stateHistoryRetentionPeriod, + uint64 blocksPerEpoch + ) external returns ( address payable proxyAddress, @@ -102,7 +113,7 @@ contract DeployLightClientContractWithoutMultiSigScript is Script { (LC.LightClientState memory state, LC.StakeTableState memory stakeTableState) = abi.decode(result, (LC.LightClientState, LC.StakeTableState)); - return deployContract(state, stakeTableState, stateHistoryRetentionPeriod); + return deployContract(state, stakeTableState, stateHistoryRetentionPeriod, blocksPerEpoch); } /// @notice deploys the impl, proxy & initializes the impl @@ -112,7 +123,8 @@ contract DeployLightClientContractWithoutMultiSigScript is Script { function deployContract( LC.LightClientState memory state, LC.StakeTableState memory stakeTableState, - uint32 stateHistoryRetentionPeriod + uint32 stateHistoryRetentionPeriod, + uint64 blocksPerEpoch ) private returns ( @@ -132,11 +144,12 @@ contract DeployLightClientContractWithoutMultiSigScript is Script { // Encode the initializer function call bytes memory data = abi.encodeWithSignature( - "initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address)", + "initialize((uint64,uint64,uint256),(uint256,uint256,uint256,uint256),uint32,address,uint64)", state, stakeTableState, stateHistoryRetentionPeriod, - admin + admin, + blocksPerEpoch ); // our proxy diff --git a/docker-compose.yaml b/docker-compose.yaml index 9fb6d3a565..9b691aec83 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -42,6 +42,7 @@ services: - ESPRESSO_SEQUENCER_L1_POLLING_INTERVAL - ESPRESSO_SEQUENCER_URL - ESPRESSO_SEQUENCER_STAKE_TABLE_CAPACITY + - ESPRESSO_SEQUENCER_BLOCKS_PER_EPOCH - ESPRESSO_SEQUENCER_PERMISSIONED_PROVER - ESPRESSO_DEPLOYER_ACCOUNT_INDEX - ESPRESSO_SEQUENCER_ETH_MULTISIG_ADDRESS @@ -203,6 +204,7 @@ services: - ESPRESSO_SEQUENCER_ETH_MNEMONIC - ESPRESSO_SEQUENCER_LIGHTCLIENT_ADDRESS - ESPRESSO_SEQUENCER_STAKE_TABLE_CAPACITY + - ESPRESSO_SEQUENCER_BLOCKS_PER_EPOCH - MNEMONIC=$ESPRESSO_SEQUENCER_ETH_MNEMONIC - ESPRESSO_SEQUENCER_STATE_PROVER_ACCOUNT_INDEX - RAYON_NUM_THREADS=$PROVER_RAYON_NUM_THREADS diff --git a/hotshot-stake-table/src/utils.rs b/hotshot-stake-table/src/utils.rs index 07a3d261b3..5c1a11e9cb 100644 --- a/hotshot-stake-table/src/utils.rs +++ b/hotshot-stake-table/src/utils.rs @@ -24,3 +24,9 @@ pub(crate) fn u256_to_field(v: &U256) -> F { v.to_little_endian(&mut bytes); F::from_le_bytes_mod_order(&bytes) } + +#[inline] +/// A helper function to compute the quorum threshold given a total amount of stake. +pub fn one_honest_threshold(total_stake: U256) -> U256 { + total_stake / 3 + 1 +} diff --git a/hotshot-stake-table/src/vec_based.rs b/hotshot-stake-table/src/vec_based.rs index 6267dd21ca..8b96fd0d88 100644 --- a/hotshot-stake-table/src/vec_based.rs +++ b/hotshot-stake-table/src/vec_based.rs @@ -8,6 +8,7 @@ use ark_std::{collections::HashMap, hash::Hash, rand::SeedableRng}; use digest::crypto_common::rand_core::CryptoRngCore; +use hotshot_types::light_client::GenericStakeTableState; use hotshot_types::traits::stake_table::{SnapshotVersion, StakeTableError, StakeTableScheme}; use jf_crhf::CRHF; use jf_rescue::{crhf::VariableLengthRescueCRHF, RescueParameter}; @@ -16,7 +17,7 @@ use serde::{Deserialize, Serialize}; use crate::{ config::STAKE_TABLE_CAPACITY, - utils::{u256_to_field, ToFields}, + utils::{one_honest_threshold, u256_to_field, ToFields}, }; pub mod config; @@ -311,6 +312,32 @@ where } } + /// Returns the stake table state used for voting + pub fn voting_state(&self) -> Result, StakeTableError> { + let (bls_key_comm, schnorr_key_comm, amount_comm) = + self.commitment(SnapshotVersion::LastEpochStart)?; + let threshold = one_honest_threshold(self.total_stake(SnapshotVersion::LastEpochStart)?); + Ok(GenericStakeTableState { + bls_key_comm, + schnorr_key_comm, + amount_comm, + threshold: u256_to_field(&threshold), + }) + } + + /// Returns the stake table state used for voting in the next epoch + pub fn next_voting_state(&self) -> Result, StakeTableError> { + let (bls_key_comm, schnorr_key_comm, amount_comm) = + self.commitment(SnapshotVersion::EpochStart)?; + let threshold = one_honest_threshold(self.total_stake(SnapshotVersion::EpochStart)?); + Ok(GenericStakeTableState { + bls_key_comm, + schnorr_key_comm, + amount_comm, + threshold: u256_to_field(&threshold), + }) + } + /// Helper function to recompute the stake table commitment for head version /// Commitment of a stake table is a triple `(bls_keys_comm, schnorr_keys_comm, stake_amount_comm)` /// TODO(Chengyu): The BLS verification keys doesn't implement Default. Thus we directly pad with `F::default()`. diff --git a/hotshot-state-prover/Cargo.toml b/hotshot-state-prover/Cargo.toml index 2bf05220e5..bb297d469c 100644 --- a/hotshot-state-prover/Cargo.toml +++ b/hotshot-state-prover/Cargo.toml @@ -43,6 +43,7 @@ url = { workspace = true } vbs = { workspace = true } [dev-dependencies] +hotshot-types = { workspace = true } sequencer-utils = { path = "../utils", features = ["testing"] } [features] diff --git a/hotshot-state-prover/src/circuit.rs b/hotshot-state-prover/src/circuit.rs index baf5c8af38..cce5197766 100644 --- a/hotshot-state-prover/src/circuit.rs +++ b/hotshot-state-prover/src/circuit.rs @@ -4,7 +4,10 @@ use ark_ec::twisted_edwards::TECurveConfig; use ark_ff::PrimeField; use ark_std::borrow::Borrow; use ethers::types::U256; -use hotshot_contract_adapter::light_client::{ParsedLightClientState, ParsedStakeTableState}; +use hotshot_contract_adapter::{ + jellyfish::u256_to_field, + light_client::{ParsedLightClientState, ParsedStakeTableState}, +}; use hotshot_types::light_client::{ GenericLightClientState, GenericPublicInput, GenericStakeTableState, }; @@ -16,13 +19,6 @@ use jf_signature::{ schnorr::{Signature, VerKey as SchnorrVerKey}, }; -/// Lossy conversion of a U256 into a field element. -pub(crate) fn u256_to_field(v: &U256) -> F { - let mut bytes = vec![0u8; 32]; - v.to_little_endian(&mut bytes); - F::from_le_bytes_mod_order(&bytes) -} - /// Variable for stake table entry #[derive(Clone, Debug)] pub struct StakeTableEntryVar { @@ -91,7 +87,8 @@ impl LightClientStateVar { /// - a bit vector indicates the signers /// - a list of schnorr signatures of the updated states (`Vec`), default if the node doesn't sign the state /// - updated light client state (`(view_number, block_height, block_comm_root)`) -/// - the static stake table state (containing 3 commitments to the 3 columns of the stake table and a threshold) +/// - voting stake table state (containing 3 commitments to the 3 columns of the stake table and a threshold) +/// - stake table state for the next block (same as the voting stake table except at epoch boundaries) /// /// Lengths of input vectors should not exceed the `stake_table_capacity`. /// The list of stake table entries, bit indicators and signatures will be padded to the `stake_table_capacity`. @@ -113,6 +110,7 @@ pub(crate) fn build( lightclient_state: &GenericLightClientState, stake_table_state: &GenericStakeTableState, stake_table_capacity: usize, + next_stake_table_state: &GenericStakeTableState, ) -> Result<(PlonkCircuit, GenericPublicInput), PlonkError> where F: RescueParameter, @@ -166,7 +164,7 @@ where .map(|item| { let item = item.borrow(); let state_ver_key = circuit.create_signature_vk_variable(&item.0)?; - let stake_amount = circuit.create_variable(u256_to_field::(&item.1))?; + let stake_amount = circuit.create_variable(u256_to_field::(item.1))?; Ok(StakeTableEntryVar { state_ver_key, stake_amount, @@ -217,6 +215,7 @@ where // public inputs let lightclient_state_pub_var = LightClientStateVar::new(&mut circuit, lightclient_state)?; let stake_table_state_pub_var = StakeTableVar::new(&mut circuit, stake_table_state)?; + let next_stake_table_state_pub_var = StakeTableVar::new(&mut circuit, next_stake_table_state)?; // Checking whether the accumulated weight exceeds the quorum threshold let mut signed_amount_var = (0..stake_table_capacity / 2) @@ -284,6 +283,10 @@ where lightclient_state_pub_var.view_num, lightclient_state_pub_var.block_height, lightclient_state_pub_var.block_comm_root, + next_stake_table_state_pub_var.qc_keys_comm, + next_stake_table_state_pub_var.state_keys_comm, + next_stake_table_state_pub_var.stake_amount_comm, + next_stake_table_state_pub_var.threshold, ], &sig, ) @@ -303,7 +306,11 @@ where circuit.finalize_for_arithmetization()?; Ok(( circuit, - GenericPublicInput::new(lightclient_state.clone(), *stake_table_state), + GenericPublicInput::new( + lightclient_state.clone(), + *stake_table_state, + *next_stake_table_state, + ), )) } @@ -325,17 +332,17 @@ where &lightclient_state, &stake_table_state, stake_table_capacity, + &stake_table_state, ) } #[cfg(test)] mod tests { use ark_ed_on_bn254::EdwardsConfig as Config; + use ark_std::UniformRand; use hotshot_types::light_client::LightClientState; use hotshot_types::traits::stake_table::{SnapshotVersion, StakeTableScheme}; - use jf_crhf::CRHF; use jf_relation::Circuit; - use jf_rescue::crhf::VariableLengthRescueCRHF; use jf_signature::{ schnorr::{SchnorrSignatureScheme, Signature}, SignatureScheme, @@ -343,9 +350,7 @@ mod tests { use jf_utils::test_rng; use super::build; - use crate::test_utils::{ - genesis_stake_table_state, key_pairs_for_testing, stake_table_for_testing, - }; + use crate::test_utils::{key_pairs_for_testing, stake_table_for_testing}; type F = ark_ed_on_bn254::Fq; const ST_CAPACITY: usize = 20; @@ -358,7 +363,8 @@ mod tests { let (qc_keys, state_keys) = key_pairs_for_testing(num_validators, &mut prng); let st = stake_table_for_testing(ST_CAPACITY, &qc_keys, &state_keys); - let st_state = genesis_stake_table_state(&st); + let st_state = st.voting_state().unwrap(); + let next_st_state = st_state; let entries = st .try_iter(SnapshotVersion::LastEpochStart) @@ -366,20 +372,20 @@ mod tests { .map(|(_, stake_amount, state_key)| (state_key, stake_amount)) .collect::>(); - let block_comm_root = - VariableLengthRescueCRHF::::evaluate(vec![F::from(1u32), F::from(2u32)]).unwrap() - [0]; - let lightclient_state = LightClientState { view_number: 100, block_height: 73, - block_comm_root, + block_comm_root: F::rand(&mut prng), }; + let mut msg = Vec::with_capacity(7); let state_msg: [F; 3] = lightclient_state.clone().into(); + msg.extend_from_slice(&state_msg); + let next_st_state_msg: [F; 4] = next_st_state.into(); + msg.extend_from_slice(&next_st_state_msg); let sigs = state_keys .iter() - .map(|(key, _)| SchnorrSignatureScheme::::sign(&(), key, state_msg, &mut prng)) + .map(|(key, _)| SchnorrSignatureScheme::::sign(&(), key, &msg, &mut prng)) .collect::, _>>() .unwrap(); @@ -410,10 +416,11 @@ mod tests { &lightclient_state, &st_state, ST_CAPACITY, + &next_st_state, ) .unwrap(); assert!(circuit - .check_circuit_satisfiability(public_inputs.as_ref()) + .check_circuit_satisfiability(&public_inputs.to_vec()) .is_ok()); // lower threshold should also pass @@ -426,25 +433,27 @@ mod tests { &lightclient_state, &good_st_state, ST_CAPACITY, + &next_st_state, ) .unwrap(); assert!(circuit - .check_circuit_satisfiability(public_inputs.as_ref()) + .check_circuit_satisfiability(&public_inputs.to_vec()) .is_ok()); // bad path: feeding non-bit vector - let bit_vec = [F::from(2u64); 10]; + let non_bit_vec = [F::from(2u64); 10]; let (circuit, public_inputs) = build( &entries, - &bit_vec, + &non_bit_vec, &bit_masked_sigs, &lightclient_state, &st_state, ST_CAPACITY, + &next_st_state, ) .unwrap(); assert!(circuit - .check_circuit_satisfiability(public_inputs.as_ref()) + .check_circuit_satisfiability(&public_inputs.to_vec()) .is_err()); // bad path: total weight doesn't meet the threshold @@ -462,7 +471,6 @@ mod tests { } }) .collect::>(); - let bad_bit_vec = bad_bit_vec .into_iter() .map(|b| if b { F::from(1u64) } else { F::from(0u64) }) @@ -474,59 +482,50 @@ mod tests { &lightclient_state, &st_state, ST_CAPACITY, + &next_st_state, ) .unwrap(); assert!(bad_circuit - .check_circuit_satisfiability(public_inputs.as_ref()) + .check_circuit_satisfiability(&public_inputs.to_vec()) .is_err()); // bad path: bad stake table commitment - let bad_lightclient_state = lightclient_state.clone(); - // bad_lightclient_state.stake_table_comm.1 = F::default(); - let bad_state_msg: [F; 3] = bad_lightclient_state.clone().into(); - let sig_for_bad_state = state_keys - .iter() - .map(|(key, _)| { - SchnorrSignatureScheme::::sign(&(), key, bad_state_msg, &mut prng) - }) - .collect::, _>>() - .unwrap(); + let mut bad_lightclient_state = lightclient_state.clone(); + bad_lightclient_state.view_number += 1; + let (bad_circuit, public_inputs) = build( &entries, &bit_vec, - &sig_for_bad_state, + &sigs, &bad_lightclient_state, &st_state, ST_CAPACITY, + &next_st_state, ) .unwrap(); assert!(bad_circuit - .check_circuit_satisfiability(public_inputs.as_ref()) + .check_circuit_satisfiability(&public_inputs.to_vec()) .is_err()); - // bad path: incorrect signatures - let wrong_light_client_state = lightclient_state.clone(); - // state with a different qc key commitment - // wrong_light_client_state.stake_table_comm.0 = F::default(); - let wrong_state_msg: [F; 3] = wrong_light_client_state.into(); - let wrong_sigs = state_keys + // bad path: incorrect signing message + let bad_msg: Vec = msg.iter().map(|_| F::rand(&mut prng)).collect(); + let bad_sigs = state_keys .iter() - .map(|(key, _)| { - SchnorrSignatureScheme::::sign(&(), key, wrong_state_msg, &mut prng) - }) + .map(|(key, _)| SchnorrSignatureScheme::::sign(&(), key, &bad_msg, &mut prng)) .collect::, _>>() .unwrap(); let (bad_circuit, public_inputs) = build( &entries, &bit_vec, - &wrong_sigs, + &bad_sigs, &lightclient_state, &st_state, ST_CAPACITY, + &next_st_state, ) .unwrap(); assert!(bad_circuit - .check_circuit_satisfiability(public_inputs.as_ref()) + .check_circuit_satisfiability(&public_inputs.to_vec()) .is_err()); // bad path: overflowing stake table size @@ -536,7 +535,8 @@ mod tests { &bit_masked_sigs, &lightclient_state, &st_state, - 9 + 9, + &next_st_state, ) .is_err()); } diff --git a/hotshot-state-prover/src/mock_ledger.rs b/hotshot-state-prover/src/mock_ledger.rs index 697c5336b2..21e951d511 100644 --- a/hotshot-state-prover/src/mock_ledger.rs +++ b/hotshot-state-prover/src/mock_ledger.rs @@ -9,15 +9,12 @@ use ark_std::{ UniformRand, }; use ethers::types::U256; -use hotshot_contract_adapter::{ - jellyfish::{open_key, u256_to_field}, - light_client::{ParsedLightClientState, ParsedStakeTableState}, -}; +use hotshot_contract_adapter::jellyfish::{field_to_u256, open_key}; use hotshot_stake_table::vec_based::StakeTable; +use hotshot_types::utils::is_last_block_in_epoch; use hotshot_types::{ light_client::{ GenericLightClientState, GenericPublicInput, GenericStakeTableState, LightClientState, - StakeTableState, }, traits::stake_table::{SnapshotVersion, StakeTableScheme}, }; @@ -35,28 +32,31 @@ use jf_signature::{ }; use jf_utils::test_rng; -use crate::{ - generate_state_update_proof, preprocess, service::one_honest_threshold, Proof, VerifyingKey, -}; +use crate::{generate_state_update_proof, preprocess, Proof, VerifyingKey}; type F = ark_ed_on_bn254::Fq; type SchnorrVerKey = jf_signature::schnorr::VerKey; type SchnorrSignKey = jf_signature::schnorr::SignKey; /// Stake table capacity used for testing -pub const STAKE_TABLE_CAPACITY: usize = 10; +pub const STAKE_TABLE_CAPACITY_FOR_TEST: usize = 10; +/// Number of block per epoch for testing +pub const EPOCH_HEIGHT_FOR_TEST: usize = 4; /// Mock for system parameter of `MockLedger` pub struct MockSystemParam { /// max capacity of stake table st_cap: usize, + /// number of block per epoch + epoch_height: usize, } impl MockSystemParam { /// Init the system parameters (some fixed, some adjustable) pub fn init() -> Self { Self { - st_cap: STAKE_TABLE_CAPACITY, + st_cap: STAKE_TABLE_CAPACITY_FOR_TEST, + epoch_height: EPOCH_HEIGHT_FOR_TEST, } } } @@ -68,9 +68,7 @@ pub struct MockLedger { pub rng: StdRng, epoch: u64, state: GenericLightClientState, - stake_table_state: GenericStakeTableState, pub(crate) st: StakeTable, - threshold: U256, // quorum threshold for SnapShot::LastEpochStart pub(crate) qc_keys: Vec, pub(crate) state_keys: Vec<(SchnorrSignKey, SchnorrVerKey)>, key_archive: HashMap, @@ -87,21 +85,9 @@ impl MockLedger { key_archive.insert(qc_keys[i], state_keys[i].0.clone()); } let st = stake_table_for_testing(&qc_keys, &state_keys); - let (bls_key_comm, schnorr_key_comm, amount_comm) = - st.commitment(SnapshotVersion::LastEpochStart).unwrap(); - let threshold = - one_honest_threshold(st.total_stake(SnapshotVersion::LastEpochStart).unwrap()); - - let stake_table_state = StakeTableState { - threshold: u256_to_field(threshold), - bls_key_comm, - schnorr_key_comm, - amount_comm, - }; // arbitrary commitment values as they don't affect logic being tested let block_comm_root = F::from(1234); - let genesis = LightClientState { view_number: 0, block_height: 0, @@ -113,27 +99,25 @@ impl MockLedger { rng, epoch: 0, state: genesis, - stake_table_state, st, - threshold, qc_keys, state_keys, key_archive, } } - /// Elapse a view with a new finalized block - pub fn elapse_with_block(&mut self) { + /// attempt to advance epoch, should be invoked at the *beginning* of every `fn elapse_xx()` + fn try_advance_epoch(&mut self) { // if the new block is the first block of an epoch, update epoch - if self.state.block_height != 0 { + if is_last_block_in_epoch(self.state.block_height as u64, self.pp.epoch_height as u64) { self.epoch += 1; self.st.advance(); - self.threshold = one_honest_threshold( - self.st - .total_stake(SnapshotVersion::LastEpochStart) - .unwrap(), - ); } + } + + /// Elapse a view with a new finalized block + pub fn elapse_with_block(&mut self) { + self.try_advance_epoch(); let new_root = self.new_dummy_comm(); // let new_fee_ledger_comm = self.new_dummy_comm(); @@ -146,6 +130,7 @@ impl MockLedger { /// Elapse a view without a new finalized block /// (e.g. insufficient votes, malicious leaders or inconsecutive noterized views) pub fn elapse_without_block(&mut self) { + self.try_advance_epoch(); self.state.view_number += 1; } @@ -188,27 +173,16 @@ impl MockLedger { assert!(self.qc_keys.len() == before_st_size + num_reg - num_exit); } - // NOTE: uncomment when we add back epoch logic - // /// Elapse an epoch with `num_reg` of new registration, `num_exit` of key deregistration - // pub fn elapse_epoch(&mut self, num_reg: usize, num_exit: usize) { - // assert!(self.qc_keys.len() + num_reg - num_exit <= self.pp.st_cap); - - // // random number of notarized but not finalized block - // let num_non_blk = self.rng.gen_range(0..10); - // for _ in 0..num_non_blk { - // self.elapse_without_block(); - // } - - // for _ in 0..self.pp.blk_per_epoch { - // self.elapse_with_block(); - // } - - // self.sync_stake_table(num_reg, num_exit); - // } - /// Return the light client state and proof of consensus on this finalized state pub fn gen_state_proof(&mut self) -> (GenericPublicInput, Proof) { + let voting_st_state = self.voting_stake_table_state(); + let next_st_state = self.next_stake_table_state(); + + let mut msg = Vec::with_capacity(7); let state_msg: [F; 3] = self.state.clone().into(); + msg.extend_from_slice(&state_msg); + let st_state_msg: [F; 4] = next_st_state.into(); + msg.extend_from_slice(&st_state_msg); let st: Vec<(BLSVerKey, U256, SchnorrVerKey)> = self .st @@ -220,7 +194,7 @@ impl MockLedger { // find a quorum whose accumulated weights exceed threshold let mut bit_vec = vec![false; st_size]; let mut total_weight = U256::from(0); - while total_weight < self.threshold { + while total_weight < field_to_u256(voting_st_state.threshold) { let signer_idx = self.rng.gen_range(0..st_size); // if already selected, skip to next random sample if bit_vec[signer_idx] { @@ -239,7 +213,7 @@ impl MockLedger { SchnorrSignatureScheme::::sign( &(), self.key_archive.get(&st[i].0).unwrap(), - state_msg, + &msg, &mut self.rng, ) } else { @@ -262,7 +236,7 @@ impl MockLedger { powers_of_h: vec![srs.h, srs.beta_h], } }; - let (pk, _) = preprocess(&srs, STAKE_TABLE_CAPACITY) + let (pk, _) = preprocess(&srs, STAKE_TABLE_CAPACITY_FOR_TEST) .expect("Fail to preprocess state prover circuit"); let stake_table_entries = self .st @@ -277,8 +251,9 @@ impl MockLedger { &bit_vec, &sigs, &self.state, - &self.stake_table_state, - STAKE_TABLE_CAPACITY, + &voting_st_state, + STAKE_TABLE_CAPACITY_FOR_TEST, + &next_st_state, ) .expect("Fail to generate state proof"); @@ -294,19 +269,23 @@ impl MockLedger { let new_state = self.state.clone(); let (adv_qc_keys, adv_state_keys) = - key_pairs_for_testing(STAKE_TABLE_CAPACITY, &mut self.rng); + key_pairs_for_testing(STAKE_TABLE_CAPACITY_FOR_TEST, &mut self.rng); let adv_st = stake_table_for_testing(&adv_qc_keys, &adv_state_keys); + let adv_st_state = adv_st.voting_state().unwrap(); // replace new state with adversarial stake table commitment - // new_state.stake_table_comm = adv_st.commitment(SnapshotVersion::EpochStart).unwrap(); + let mut msg = Vec::with_capacity(7); let state_msg: [F; 3] = new_state.clone().into(); + msg.extend_from_slice(&state_msg); + let adv_st_state_msg: [F; 4] = adv_st_state.into(); + msg.extend_from_slice(&adv_st_state_msg); // every fake stakers sign on the adverarial new state - let bit_vec = vec![true; STAKE_TABLE_CAPACITY]; + let bit_vec = vec![true; STAKE_TABLE_CAPACITY_FOR_TEST]; let sigs = adv_state_keys .iter() .map(|(sk, _)| { - SchnorrSignatureScheme::::sign(&(), sk, state_msg, &mut self.rng) + SchnorrSignatureScheme::::sign(&(), sk, &msg, &mut self.rng) }) .collect::, _>>() .unwrap(); @@ -324,7 +303,7 @@ impl MockLedger { powers_of_h: vec![srs.h, srs.beta_h], } }; - let (pk, _) = preprocess(&srs, STAKE_TABLE_CAPACITY) + let (pk, _) = preprocess(&srs, STAKE_TABLE_CAPACITY_FOR_TEST) .expect("Fail to preprocess state prover circuit"); let stake_table_entries = adv_st .try_iter(SnapshotVersion::LastEpochStart) @@ -338,30 +317,33 @@ impl MockLedger { &bit_vec, &sigs, &new_state, - &self.stake_table_state, - STAKE_TABLE_CAPACITY, + &adv_st_state, + STAKE_TABLE_CAPACITY_FOR_TEST, + &adv_st_state, ) .expect("Fail to generate state proof"); - let (bls_key_comm, schnorr_key_comm, amount_comm) = - adv_st.commitment(SnapshotVersion::LastEpochStart).unwrap(); - let stake_table = StakeTableState { - threshold: u256_to_field(self.threshold), - bls_key_comm, - schnorr_key_comm, - amount_comm, - }; + (pi, proof, adv_st.voting_state().unwrap()) + } - (pi, proof, stake_table) + /// Returns the stake table state for current voting + pub fn voting_stake_table_state(&self) -> GenericStakeTableState { + self.st.voting_state().unwrap() } - /// Returns the `LightClientState` for solidity - pub fn get_state(&self) -> ParsedLightClientState { - self.state.clone().into() + + /// Returns epoch-aware stake table state for the next block. + /// This will be the same most of the time as `self.voting_st_state()` except during epoch change + pub fn next_stake_table_state(&self) -> GenericStakeTableState { + if is_last_block_in_epoch(self.state.block_height as u64, self.pp.epoch_height as u64) { + self.st.next_voting_state().unwrap() + } else { + self.voting_stake_table_state() + } } - /// Returns the `StakeTableState` in solidity - pub fn get_stake_table_state(&self) -> ParsedStakeTableState { - self.stake_table_state.into() + /// Returns the light client state + pub fn light_client_state(&self) -> GenericLightClientState { + self.state.clone() } // return a dummy commitment value @@ -393,7 +375,7 @@ fn stake_table_for_testing( bls_keys: &[BLSVerKey], schnorr_keys: &[(SchnorrSignKey, SchnorrVerKey)], ) -> StakeTable { - let mut st = StakeTable::::new(STAKE_TABLE_CAPACITY); + let mut st = StakeTable::::new(STAKE_TABLE_CAPACITY_FOR_TEST); // Registering keys bls_keys .iter() @@ -499,9 +481,9 @@ pub fn gen_circuit_for_test(m: usize, a0: usize) -> Result U256 { - total_stake / 3 + 1 -} - pub fn init_stake_table( bls_keys: &[BLSPubKey], state_keys: &[StateVerKey], @@ -123,11 +120,13 @@ pub fn init_stake_table( } #[derive(Debug, Deserialize)] +/// Part of the full `PublicHotShotConfig` needed for our state-prover purposes struct PublicHotShotConfig { known_nodes_with_stake: Vec>, } #[derive(Debug, Deserialize)] +/// Part of the full `PublicNetworkConfig` needed for our state-prover purposes struct PublicNetworkConfig { config: PublicHotShotConfig, } @@ -312,9 +311,11 @@ pub async fn submit_state_and_proof( ) -> Result<(), ProverError> { // prepare the input the contract call and the tx itself let proof: ParsedPlonkProof = proof.into(); - let new_state: ParsedLightClientState = public_input.into(); + let new_state: ParsedLightClientState = public_input.lc_state.into(); + let next_stake_table: ParsedStakeTableState = public_input.next_st_state.into(); - let mut tx = contract.new_finalized_state(new_state.into(), proof.into()); + let mut tx = + contract.new_finalized_state(new_state.into(), next_stake_table.into(), proof.into()); // only use gas oracle for mainnet if contract.client_ref().get_chainid().await?.as_u64() == 1 { @@ -422,6 +423,7 @@ pub async fn sync_state( &bundle.state, &st_state, stake_table_capacity, + &st_state, // FIXME: use next_st_state later! ) }) .await @@ -582,14 +584,10 @@ impl std::error::Error for ProverError {} mod test { use anyhow::Result; - use ark_ed_on_bn254::EdwardsConfig; use ethers::utils::{Anvil, AnvilInstance}; use hotshot_contract_adapter::light_client::{ LightClientConstructorArgs, ParsedStakeTableState, }; - use hotshot_stake_table::vec_based::StakeTable; - use hotshot_types::light_client::StateSignKey; - use jf_signature::{schnorr::SchnorrSignatureScheme, SignatureScheme}; use jf_utils::test_rng; use sequencer_utils::{ deployer::{self, test_helpers::deploy_light_client_contract_as_proxy_for_test}, @@ -597,98 +595,11 @@ mod test { }; use super::*; - use crate::mock_ledger::{MockLedger, MockSystemParam}; + use crate::mock_ledger::{MockLedger, MockSystemParam, STAKE_TABLE_CAPACITY_FOR_TEST}; - const STAKE_TABLE_CAPACITY_FOR_TEST: usize = 10; const MAX_HISTORY_SECONDS: u32 = 864000; - - const NUM_INIT_VALIDATORS: u32 = (STAKE_TABLE_CAPACITY_FOR_TEST / 2) as u32; - - /// Init a meaningful ledger state that prover can generate future valid proof. - /// this is used for testing purposes, contract deployed to test proof verification should also be initialized with this genesis - /// - #[allow(clippy::type_complexity)] - fn init_ledger_for_test() -> ( - ParsedLightClientState, - ParsedStakeTableState, - Vec, - Vec<(StateSignKey, StateVerKey)>, - StakeTable, - ) { - let pp = MockSystemParam::init(); - let ledger = MockLedger::init(pp, NUM_INIT_VALIDATORS as usize); - - let genesis = ledger.get_state(); - let stake_genesis = ledger.get_stake_table_state(); - - let qc_keys = ledger.qc_keys; - let state_keys = ledger.state_keys; - let st = ledger.st; - - eprintln!( - "Genesis: view_num: {}, block_height: {}, block_comm_root: {}", - genesis.view_num, genesis.block_height, genesis.block_comm_root, - ); - (genesis, stake_genesis, qc_keys, state_keys, st) - } - - // everybody signs, then generate a proof - fn gen_state_proof( - new_state: ParsedLightClientState, - genesis_stake_state: &ParsedStakeTableState, - state_keypairs: &[(StateSignKey, StateVerKey)], - st: &StakeTable, - ) -> (PublicInput, Proof) { - let mut rng = test_rng(); - - let new_state_msg: [CircuitField; 3] = { - // sorry for the complicated .into() conversion chain, might improve in the future - let pi_msg: LightClientState = new_state.clone().into(); - pi_msg.into() - }; - let bit_vec = vec![true; st.len(SnapshotVersion::LastEpochStart).unwrap()]; - let sigs = state_keypairs - .iter() - .map(|(sk, _)| { - SchnorrSignatureScheme::::sign(&(), sk, new_state_msg, &mut rng) - }) - .collect::, _>>() - .unwrap(); - - let srs = { - // load SRS from Aztec's ceremony - let srs = ark_srs::kzg10::aztec20::setup(2u64.pow(16) as usize + 2) - .expect("Aztec SRS fail to load"); - // convert to Jellyfish type - // TODO: (alex) use constructor instead https://github.com/EspressoSystems/jellyfish/issues/440 - UnivariateUniversalParams { - powers_of_g: srs.powers_of_g, - h: srs.h, - beta_h: srs.beta_h, - powers_of_h: vec![srs.h, srs.beta_h], - } - }; - let (pk, _) = crate::preprocess(&srs, STAKE_TABLE_CAPACITY_FOR_TEST) - .expect("Fail to preprocess state prover circuit"); - let stake_table_entries = st - .try_iter(SnapshotVersion::LastEpochStart) - .unwrap() - .map(|(_, stake_amount, schnorr_key)| (schnorr_key, stake_amount)) - .collect::>(); - let (proof, pi) = crate::generate_state_update_proof::<_, _, _, _>( - &mut rng, - &pk, - &stake_table_entries, - &bit_vec, - &sigs, - &new_state.into(), - &genesis_stake_state.clone().into(), - STAKE_TABLE_CAPACITY_FOR_TEST, - ) - .expect("Fail to generate state proof"); - - (pi, proof) - } + const NUM_INIT_VALIDATORS: usize = STAKE_TABLE_CAPACITY_FOR_TEST / 2; + const BLOCKS_PER_EPOCH_FOR_TEST: u64 = 3; /// deploy LightClientMock.sol on local blockchain (via `anvil`) for testing /// return (signer-loaded wallet, contract instance) @@ -707,6 +618,7 @@ mod test { light_client_state: genesis, stake_table_state: stake_genesis, max_history_seconds: MAX_HISTORY_SECONDS, + blocks_per_epoch: BLOCKS_PER_EPOCH_FOR_TEST, }; let mut contracts = deployer::Contracts::default(); @@ -735,6 +647,7 @@ mod test { light_client_state: genesis, stake_table_state: stake_genesis, max_history_seconds: MAX_HISTORY_SECONDS, + blocks_per_epoch: BLOCKS_PER_EPOCH_FOR_TEST, }; let mut contracts = deployer::Contracts::default(); @@ -881,7 +794,10 @@ mod test { async fn test_submit_state_and_proof() -> Result<()> { setup_test(); - let (genesis, stake_genesis, _qc_keys, state_keys, st) = init_ledger_for_test(); + let pp = MockSystemParam::init(); + let mut ledger = MockLedger::init(pp, NUM_INIT_VALIDATORS); + let genesis: ParsedLightClientState = ledger.light_client_state().into(); + let stake_genesis: ParsedStakeTableState = ledger.voting_stake_table_state().into(); let anvil = Anvil::new().spawn(); let (_wallet, contract) = @@ -892,16 +808,17 @@ mod test { let genesis_l1: ParsedLightClientState = contract.genesis_state().await?.into(); assert_eq!(genesis_l1, genesis, "mismatched genesis, aborting tests"); - let mut new_state = genesis.clone(); - new_state.view_num = 5; - new_state.block_height = 1; + // simulate some block elapsing until the end of epoch 1 + for _ in 0..BLOCKS_PER_EPOCH_FOR_TEST { + ledger.elapse_with_block(); + } - let (pi, proof) = gen_state_proof(new_state.clone(), &stake_genesis, &state_keys, &st); + let (pi, proof) = ledger.gen_state_proof(); tracing::info!("Successfully generated proof for new state."); let contract = super::prepare_contract( - config.provider, - config.signing_key, + config.provider.clone(), + config.signing_key.clone(), config.light_client_address, ) .await?; @@ -909,7 +826,24 @@ mod test { tracing::info!("Successfully submitted new finalized state to L1."); // test if new state is updated in l1 let finalized_l1: ParsedLightClientState = contract.finalized_state().await?.into(); - assert_eq!(finalized_l1, new_state); + let voting_st_l1: ParsedStakeTableState = contract.voting_stake_table_state().await?.into(); + assert_eq!(finalized_l1, ledger.light_client_state().into()); + // test if the new stake table state is synced as the new voting stake table snapshot + assert_eq!(voting_st_l1, ledger.next_stake_table_state().into()); + + // simulate more block elapsing in epoch 2 + ledger.elapse_with_block(); + let (pi, proof) = ledger.gen_state_proof(); + tracing::info!("Successfully generated proof for new state in epoch 2."); + let contract = super::prepare_contract( + config.provider, + config.signing_key, + config.light_client_address, + ) + .await?; + super::submit_state_and_proof(proof, pi, &contract).await?; + tracing::info!("Successfully submitted new finalized state to L1."); + Ok(()) } } diff --git a/hotshot-state-prover/src/snark.rs b/hotshot-state-prover/src/snark.rs index 0f16e5bbae..f3e0df1550 100644 --- a/hotshot-state-prover/src/snark.rs +++ b/hotshot-state-prover/src/snark.rs @@ -43,7 +43,8 @@ pub fn preprocess( /// - a list of stake table entries (`Vec<(BLSVerKey, Amount, SchnorrVerKey)>`) /// - a list of schnorr signatures of the updated states (`Vec`), default if the node doesn't sign the state /// - updated light client state (`(view_number, block_height, block_comm_root)`) -/// - the static stake table state (containing 3 commitments to the 3 columns of the stake table and a threshold) +/// - voting stake table state (containing 3 commitments to the 3 columns of the stake table and a threshold) +/// - stake table state for the next block (same as the voting stake table except at epoch boundaries) /// - a bit vector indicates the signers /// /// Returns error or a pair `(proof, public_inputs)` asserting that @@ -66,6 +67,7 @@ pub fn generate_state_update_proof( lightclient_state: &LightClientState, stake_table_state: &StakeTableState, stake_table_capacity: usize, + next_stake_table_state: &StakeTableState, ) -> Result<(Proof, PublicInput), PlonkError> where STIter: IntoIterator, @@ -94,6 +96,7 @@ where lightclient_state, stake_table_state, stake_table_capacity, + next_stake_table_state, )?; let proof = PlonkKzgSnark::::prove::<_, _, SolidityTranscript>(rng, &circuit, pk, None)?; Ok((proof, public_inputs)) @@ -104,6 +107,7 @@ mod tests { use ark_bn254::Bn254; use ark_ec::pairing::Pairing; use ark_ed_on_bn254::EdwardsConfig as Config; + use ark_std::UniformRand; use ark_std::{ rand::{CryptoRng, RngCore}, One, @@ -112,13 +116,11 @@ mod tests { light_client::LightClientState, traits::stake_table::{SnapshotVersion, StakeTableScheme}, }; - use jf_crhf::CRHF; use jf_plonk::{ proof_system::{PlonkKzgSnark, UniversalSNARK}, transcript::SolidityTranscript, }; use jf_relation::Circuit; - use jf_rescue::crhf::VariableLengthRescueCRHF; use jf_signature::{ schnorr::{SchnorrSignatureScheme, Signature}, SignatureScheme, @@ -128,7 +130,7 @@ mod tests { use super::{generate_state_update_proof, preprocess, CircuitField, UniversalSrs}; use crate::{ circuit::build_for_preprocessing, - test_utils::{genesis_stake_table_state, key_pairs_for_testing, stake_table_for_testing}, + test_utils::{key_pairs_for_testing, stake_table_for_testing}, }; const ST_CAPACITY: usize = 20; @@ -195,7 +197,8 @@ mod tests { let (bls_keys, schnorr_keys) = key_pairs_for_testing(num_validators, &mut prng); let st = stake_table_for_testing(ST_CAPACITY, &bls_keys, &schnorr_keys); - let st_state = genesis_stake_table_state(&st); + let st_state = st.voting_state().unwrap(); + let next_st_state = st_state; let stake_table_entries = st .try_iter(SnapshotVersion::LastEpochStart) @@ -203,22 +206,21 @@ mod tests { .map(|(_, stake_amount, schnorr_key)| (schnorr_key, stake_amount)) .collect::>(); - let block_comm_root = VariableLengthRescueCRHF::::evaluate(vec![ - CircuitField::from(1u32), - CircuitField::from(2u32), - ]) - .unwrap()[0]; - let lightclient_state = LightClientState { view_number: 100, block_height: 73, - block_comm_root, + block_comm_root: CircuitField::rand(&mut prng), }; + + let mut msg = Vec::with_capacity(7); let state_msg: [CircuitField; 3] = lightclient_state.clone().into(); + msg.extend_from_slice(&state_msg); + let next_st_state_msg: [CircuitField; 4] = next_st_state.into(); + msg.extend_from_slice(&next_st_state_msg); let sigs = schnorr_keys .iter() - .map(|(key, _)| SchnorrSignatureScheme::::sign(&(), key, state_msg, &mut prng)) + .map(|(key, _)| SchnorrSignatureScheme::::sign(&(), key, &msg, &mut prng)) .collect::, _>>() .unwrap(); @@ -260,13 +262,14 @@ mod tests { &lightclient_state, &st_state, ST_CAPACITY, + &next_st_state, ); assert!(result.is_ok()); let (proof, public_inputs) = result.unwrap(); assert!(PlonkKzgSnark::::verify::( &vk, - public_inputs.as_ref(), + &public_inputs.to_vec(), &proof, None ) @@ -284,6 +287,7 @@ mod tests { &lightclient_state, &bad_st_state, ST_CAPACITY, + &next_st_state, ); assert!(result.is_err()); } diff --git a/hotshot-state-prover/src/test_utils.rs b/hotshot-state-prover/src/test_utils.rs index 916483da28..6822ae7e9f 100644 --- a/hotshot-state-prover/src/test_utils.rs +++ b/hotshot-state-prover/src/test_utils.rs @@ -2,18 +2,13 @@ use ark_ed_on_bn254::EdwardsConfig; use ark_std::rand::{CryptoRng, RngCore}; use ethers::types::U256; use hotshot_stake_table::vec_based::StakeTable; -use hotshot_types::{ - light_client::GenericStakeTableState, - traits::stake_table::{SnapshotVersion, StakeTableScheme}, -}; +use hotshot_types::traits::stake_table::StakeTableScheme; use jf_signature::{ bls_over_bn254::{BLSOverBN254CurveSignatureScheme, VerKey as BLSVerKey}, schnorr::SchnorrSignatureScheme, SignatureScheme, }; -use crate::{circuit::u256_to_field, service::one_honest_threshold}; - type F = ark_ed_on_bn254::Fq; type SchnorrVerKey = jf_signature::schnorr::VerKey; type SchnorrSignKey = jf_signature::schnorr::SignKey; @@ -58,18 +53,3 @@ pub(crate) fn stake_table_for_testing( st.advance(); st } - -pub(crate) fn genesis_stake_table_state( - st: &StakeTable, -) -> GenericStakeTableState { - let (bls_key_comm, schnorr_key_comm, amount_comm) = - st.commitment(SnapshotVersion::LastEpochStart).unwrap(); - let threshold = one_honest_threshold(st.total_stake(SnapshotVersion::LastEpochStart).unwrap()); - - GenericStakeTableState { - bls_key_comm, - schnorr_key_comm, - amount_comm, - threshold: u256_to_field(&threshold), - } -} diff --git a/hotshot-types/src/light_client.rs b/hotshot-types/src/light_client.rs index 7bafaee784..417a13d01a 100644 --- a/hotshot-types/src/light_client.rs +++ b/hotshot-types/src/light_client.rs @@ -130,6 +130,17 @@ pub struct GenericStakeTableState { pub threshold: F, } +impl From> for [F; 4] { + fn from(state: GenericStakeTableState) -> Self { + [ + state.bls_key_comm, + state.schnorr_key_comm, + state.amount_comm, + state.threshold, + ] + } +} + impl std::ops::Deref for StateKeyPair { type Target = schnorr::KeyPair; @@ -176,82 +187,88 @@ impl From> for StateKeyPair { /// Public input to the light client state prover service #[derive(Clone, Debug)] -pub struct GenericPublicInput(Vec); +pub struct GenericPublicInput { + // new light client state + pub lc_state: GenericLightClientState, + // voting stake table state + pub voting_st_state: GenericStakeTableState, + // next-block stake table state + pub next_st_state: GenericStakeTableState, +} impl GenericPublicInput { /// Construct a public input from light client state and static stake table state - pub fn new(lc_state: GenericLightClientState, st_state: GenericStakeTableState) -> Self { - let lc_state_f: [F; 3] = lc_state.into(); - Self(vec![ - lc_state_f[0], - lc_state_f[1], - lc_state_f[2], - st_state.bls_key_comm, - st_state.schnorr_key_comm, - st_state.amount_comm, - st_state.threshold, - ]) + pub fn new( + lc_state: GenericLightClientState, + voting_st_state: GenericStakeTableState, + next_st_state: GenericStakeTableState, + ) -> Self { + Self { + lc_state, + voting_st_state, + next_st_state, + } } -} -impl AsRef<[F]> for GenericPublicInput { - fn as_ref(&self) -> &[F] { - &self.0 + /// Convert to a vector of field elements + pub fn to_vec(&self) -> Vec { + vec![ + F::from(self.lc_state.view_number as u64), + F::from(self.lc_state.block_height as u64), + self.lc_state.block_comm_root, + self.voting_st_state.bls_key_comm, + self.voting_st_state.schnorr_key_comm, + self.voting_st_state.amount_comm, + self.voting_st_state.threshold, + self.next_st_state.bls_key_comm, + self.next_st_state.schnorr_key_comm, + self.next_st_state.amount_comm, + self.next_st_state.threshold, + ] } } -impl From> for GenericPublicInput { - fn from(v: Vec) -> Self { - Self(v) +impl From> for Vec { + fn from(v: GenericPublicInput) -> Self { + vec![ + F::from(v.lc_state.view_number as u64), + F::from(v.lc_state.block_height as u64), + v.lc_state.block_comm_root, + v.voting_st_state.bls_key_comm, + v.voting_st_state.schnorr_key_comm, + v.voting_st_state.amount_comm, + v.voting_st_state.threshold, + v.next_st_state.bls_key_comm, + v.next_st_state.schnorr_key_comm, + v.next_st_state.amount_comm, + v.next_st_state.threshold, + ] } } -impl GenericPublicInput { - /// Return the view number of the light client state - #[must_use] - pub fn view_number(&self) -> F { - self.0[0] - } - - /// Return the block height of the light client state - #[must_use] - pub fn block_height(&self) -> F { - self.0[1] - } - - /// Return the block commitment root of the light client state - #[must_use] - pub fn block_comm_root(&self) -> F { - self.0[2] - } - - /// Return the stake table commitment of the light client state - #[must_use] - pub fn stake_table_comm(&self) -> (F, F, F) { - (self.0[3], self.0[4], self.0[5]) - } - - /// Return the qc key commitment of the light client state - #[must_use] - pub fn qc_key_comm(&self) -> F { - self.0[3] - } - - /// Return the state key commitment of the light client state - #[must_use] - pub fn state_key_comm(&self) -> F { - self.0[4] - } - - /// Return the stake amount commitment of the light client state - #[must_use] - pub fn stake_amount_comm(&self) -> F { - self.0[5] - } - - /// Return the threshold - #[must_use] - pub fn threshold(&self) -> F { - self.0[6] +impl From> for GenericPublicInput { + fn from(v: Vec) -> Self { + let lc_state = GenericLightClientState { + view_number: v[0].into_bigint().as_ref()[0] as usize, + block_height: v[1].into_bigint().as_ref()[0] as usize, + block_comm_root: v[2], + }; + let voting_st_state = GenericStakeTableState { + bls_key_comm: v[3], + schnorr_key_comm: v[4], + amount_comm: v[5], + threshold: v[6], + }; + let next_st_state = GenericStakeTableState { + bls_key_comm: v[7], + schnorr_key_comm: v[8], + amount_comm: v[9], + threshold: v[10], + }; + Self { + lc_state, + voting_st_state, + next_st_state, + } } } diff --git a/sequencer/api/public-env-vars.toml b/sequencer/api/public-env-vars.toml index 7b9c22eb36..b597ff4642 100644 --- a/sequencer/api/public-env-vars.toml +++ b/sequencer/api/public-env-vars.toml @@ -103,6 +103,7 @@ variables = [ "ESPRESSO_SEQUENCER_STORAGE_PATH", "ESPRESSO_SEQUENCER_STORE_UNDECIDED_STATE", "ESPRESSO_SEQUENCER_URL", + "ESPRESSO_SEQUENCER_BLOCKS_PER_EPOCH", "ESPRESSO_STATE_RELAY_SERVER_URL", "ESPRESSO_SUBMIT_TRANSACTIONS_CHANNEL_BOUND", "ESPRESSO_SUBMIT_TRANSACTIONS_DELAY", diff --git a/sequencer/src/bin/deploy.rs b/sequencer/src/bin/deploy.rs index 8a5916bd43..a436a0c17a 100644 --- a/sequencer/src/bin/deploy.rs +++ b/sequencer/src/bin/deploy.rs @@ -138,6 +138,10 @@ struct Options { #[clap(long, env = "ESPRESSO_SEQUENCER_INITIAL_PERMISSIONED_STAKE_TABLE_PATH")] initial_stake_table_path: Option, + /// Number of HotShot blocks in an epoch within which the same stake table snapshot will be used. + #[clap(long, env = "ESPRESSO_SEQUENCER_BLOCKS_PER_EPOCH")] + blocks_per_epoch: u64, + #[clap(flatten)] logging: logging::Config, } @@ -172,6 +176,7 @@ async fn main() -> anyhow::Result<()> { opt.permissioned_prover, contracts, initial_stake_table, + opt.blocks_per_epoch, ) .await?; diff --git a/sequencer/src/bin/espresso-dev-node.rs b/sequencer/src/bin/espresso-dev-node.rs index 7fed6cec03..e0142b2347 100644 --- a/sequencer/src/bin/espresso-dev-node.rs +++ b/sequencer/src/bin/espresso-dev-node.rs @@ -11,9 +11,8 @@ use ethers::{ types::{Address, H160, U256}, }; use futures::{future::BoxFuture, stream::FuturesUnordered, FutureExt, StreamExt}; -use hotshot_state_prover::service::{ - one_honest_threshold, run_prover_service_with_stake_table, StateProverConfig, -}; +use hotshot_stake_table::utils::one_honest_threshold; +use hotshot_state_prover::service::{run_prover_service_with_stake_table, StateProverConfig}; use hotshot_types::traits::stake_table::{SnapshotVersion, StakeTableScheme}; use portpicker::pick_unused_port; use sequencer::{ @@ -154,6 +153,10 @@ struct Args { )] max_block_size: u64, + /// Number of HotShot blocks in an epoch within which the same stake table snapshot will be used. + #[clap(long, env = "ESPRESSO_SEQUENCER_BLOCKS_PER_EPOCH")] + blocks_per_epoch: u64, + #[clap(flatten)] sql: persistence::sql::Options, @@ -187,6 +190,7 @@ async fn main() -> anyhow::Result<()> { alt_prover_update_intervals, l1_interval, max_block_size, + blocks_per_epoch, } = cli_params; logging.init(); @@ -293,6 +297,7 @@ async fn main() -> anyhow::Result<()> { None, contracts.clone(), None, // initial stake table + blocks_per_epoch, ) .await?; diff --git a/sequencer/src/bin/state-relay-server.rs b/sequencer/src/bin/state-relay-server.rs index 6f668d71b7..669e72bec6 100644 --- a/sequencer/src/bin/state-relay-server.rs +++ b/sequencer/src/bin/state-relay-server.rs @@ -1,6 +1,6 @@ use clap::Parser; use ethers::types::U256; -use hotshot_state_prover::service::one_honest_threshold; +use hotshot_stake_table::utils::one_honest_threshold; use sequencer::{state_signature::relay_server::run_relay_server, SequencerApiVersion}; use sequencer_utils::logging; use vbs::version::StaticVersionType; diff --git a/utils/src/deployer.rs b/utils/src/deployer.rs index b19f249d6b..93cbb7adb8 100644 --- a/utils/src/deployer.rs +++ b/utils/src/deployer.rs @@ -322,6 +322,7 @@ pub async fn deploy( permissioned_prover: Option
, mut contracts: Contracts, initial_stake_table: Option>, + blocks_per_epoch: u64, ) -> anyhow::Result { let provider = Provider::::try_from(l1url.to_string())?.interval(l1_interval); let chain_id = provider.get_chainid().await?.as_u64(); @@ -376,7 +377,13 @@ pub async fn deploy( let (genesis_lc, genesis_stake) = genesis.await?.clone(); let data = light_client - .initialize(genesis_lc.into(), genesis_stake.into(), 864000, deployer) + .initialize( + genesis_lc.into(), + genesis_stake.into(), + 864000, + deployer, + blocks_per_epoch, + ) .calldata() .context("calldata for initialize transaction not available")?; let light_client_proxy_address = contracts @@ -607,6 +614,7 @@ pub mod test_helpers { constructor_args.stake_table_state.into(), constructor_args.max_history_seconds, deployer, + constructor_args.blocks_per_epoch, ) .calldata() .context("calldata for initialize transaction not available")?;