@keep-network/tbtc-v2 1.4.0-dev.0 → 1.4.0-dev.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/artifacts/BLS.json +1 -1
- package/artifacts/Bank.json +3 -3
- package/artifacts/BeaconAuthorization.json +1 -1
- package/artifacts/BeaconDkg.json +1 -1
- package/artifacts/BeaconDkgValidator.json +1 -1
- package/artifacts/BeaconInactivity.json +1 -1
- package/artifacts/BeaconSortitionPool.json +3 -3
- package/artifacts/Bridge.json +5 -5
- package/artifacts/BridgeGovernance.json +2 -2
- package/artifacts/BridgeGovernanceParameters.json +2 -2
- package/artifacts/Deposit.json +2 -2
- package/artifacts/DepositSweep.json +2 -2
- package/artifacts/DonationVault.json +3 -3
- package/artifacts/EcdsaDkgValidator.json +1 -1
- package/artifacts/EcdsaInactivity.json +1 -1
- package/artifacts/EcdsaSortitionPool.json +3 -3
- package/artifacts/Fraud.json +2 -2
- package/artifacts/KeepRegistry.json +1 -1
- package/artifacts/KeepStake.json +2 -2
- package/artifacts/KeepToken.json +2 -2
- package/artifacts/KeepTokenStaking.json +1 -1
- package/artifacts/LightRelay.json +3 -3
- package/artifacts/LightRelayMaintainerProxy.json +3 -3
- package/artifacts/MaintainerProxy.json +3 -3
- package/artifacts/MovingFunds.json +2 -2
- package/artifacts/NuCypherStakingEscrow.json +1 -1
- package/artifacts/NuCypherToken.json +2 -2
- package/artifacts/RandomBeacon.json +2 -2
- package/artifacts/RandomBeaconChaosnet.json +2 -2
- package/artifacts/RandomBeaconGovernance.json +2 -2
- package/artifacts/Redemption.json +2 -2
- package/artifacts/ReimbursementPool.json +2 -2
- package/artifacts/T.json +2 -2
- package/artifacts/TBTC.json +3 -3
- package/artifacts/TBTCToken.json +3 -3
- package/artifacts/TBTCVault.json +23 -23
- package/artifacts/TokenStaking.json +1 -1
- package/artifacts/TokenholderGovernor.json +9 -9
- package/artifacts/TokenholderTimelock.json +8 -8
- package/artifacts/VendingMachine.json +3 -3
- package/artifacts/VendingMachineKeep.json +1 -1
- package/artifacts/VendingMachineNuCypher.json +1 -1
- package/artifacts/VendingMachineV2.json +3 -3
- package/artifacts/VendingMachineV3.json +3 -3
- package/artifacts/WalletCoordinator.json +5 -5
- package/artifacts/WalletRegistry.json +5 -5
- package/artifacts/WalletRegistryGovernance.json +2 -2
- package/artifacts/Wallets.json +2 -2
- package/artifacts/solcInputs/{b9b4ee8a11a84e1668f3a48e30a96de7.json → 1c7cac85dbeb82f81e7a7bc7e98aa32f.json} +2 -2
- package/build/contracts/GovernanceUtils.sol/GovernanceUtils.dbg.json +1 -1
- package/build/contracts/bank/Bank.sol/Bank.dbg.json +1 -1
- package/build/contracts/bank/IReceiveBalanceApproval.sol/IReceiveBalanceApproval.dbg.json +1 -1
- package/build/contracts/bridge/BitcoinTx.sol/BitcoinTx.dbg.json +1 -1
- package/build/contracts/bridge/Bridge.sol/Bridge.dbg.json +1 -1
- package/build/contracts/bridge/BridgeGovernanceParameters.sol/BridgeGovernanceParameters.dbg.json +1 -1
- package/build/contracts/bridge/BridgeState.sol/BridgeState.dbg.json +1 -1
- package/build/contracts/bridge/Deposit.sol/Deposit.dbg.json +1 -1
- package/build/contracts/bridge/DepositSweep.sol/DepositSweep.dbg.json +1 -1
- package/build/contracts/bridge/EcdsaLib.sol/EcdsaLib.dbg.json +1 -1
- package/build/contracts/bridge/Fraud.sol/Fraud.dbg.json +1 -1
- package/build/contracts/bridge/Heartbeat.sol/Heartbeat.dbg.json +1 -1
- package/build/contracts/bridge/IRelay.sol/IRelay.dbg.json +1 -1
- package/build/contracts/bridge/MovingFunds.sol/MovingFunds.dbg.json +1 -1
- package/build/contracts/bridge/Redemption.sol/OutboundTx.dbg.json +1 -1
- package/build/contracts/bridge/Redemption.sol/Redemption.dbg.json +1 -1
- package/build/contracts/bridge/VendingMachine.sol/VendingMachine.dbg.json +1 -1
- package/build/contracts/bridge/VendingMachineV2.sol/VendingMachineV2.dbg.json +1 -1
- package/build/contracts/bridge/VendingMachineV3.sol/VendingMachineV3.dbg.json +1 -1
- package/build/contracts/bridge/WalletCoordinator.sol/WalletCoordinator.dbg.json +1 -1
- package/build/contracts/bridge/WalletCoordinator.sol/WalletCoordinator.json +2 -2
- package/build/contracts/bridge/Wallets.sol/Wallets.dbg.json +1 -1
- package/build/contracts/l2/L2TBTC.sol/L2TBTC.dbg.json +1 -1
- package/build/contracts/l2/L2WormholeGateway.sol/IWormholeTokenBridge.dbg.json +1 -1
- package/build/contracts/l2/L2WormholeGateway.sol/L2WormholeGateway.dbg.json +1 -1
- package/build/contracts/maintainer/MaintainerProxy.sol/MaintainerProxy.dbg.json +1 -1
- package/build/contracts/relay/LightRelay.sol/ILightRelay.dbg.json +1 -1
- package/build/contracts/relay/LightRelay.sol/LightRelay.dbg.json +1 -1
- package/build/contracts/relay/LightRelay.sol/RelayUtils.dbg.json +1 -1
- package/build/contracts/relay/LightRelayMaintainerProxy.sol/LightRelayMaintainerProxy.dbg.json +1 -1
- package/build/contracts/token/TBTC.sol/TBTC.dbg.json +1 -1
- package/build/contracts/vault/DonationVault.sol/DonationVault.dbg.json +1 -1
- package/build/contracts/vault/IVault.sol/IVault.dbg.json +1 -1
- package/build/contracts/vault/TBTCOptimisticMinting.sol/TBTCOptimisticMinting.dbg.json +1 -1
- package/build/contracts/vault/TBTCVault.sol/TBTCVault.dbg.json +1 -1
- package/contracts/bridge/WalletCoordinator.sol +2 -2
- package/export/artifacts/contracts/bridge/VendingMachine.sol/VendingMachine.json +6 -6
- package/export/artifacts/contracts/bridge/VendingMachineV2.sol/VendingMachineV2.json +6 -6
- package/export/artifacts/contracts/bridge/VendingMachineV3.sol/VendingMachineV3.json +6 -6
- package/export/artifacts/contracts/bridge/WalletCoordinator.sol/WalletCoordinator.json +7 -7
- package/export/artifacts/contracts/test/GoerliLightRelay.sol/GoerliLightRelay.json +114 -78
- package/export/artifacts/contracts/test/HeartbeatStub.sol/HeartbeatStub.json +2 -2
- package/export/artifacts/contracts/test/LightRelayStub.sol/LightRelayStub.json +2 -2
- package/export/artifacts/contracts/test/ReceiveApprovalStub.sol/ReceiveApprovalStub.json +7 -7
- package/export/artifacts/contracts/test/SystemTestRelay.sol/SystemTestRelay.json +14 -14
- package/export/artifacts/contracts/test/TestERC20.sol/TestERC20.json +6 -6
- package/export/artifacts/contracts/test/TestERC721.sol/TestERC721.json +8 -8
- package/export/artifacts/contracts/test/TestEcdsaLib.sol/TestEcdsaLib.json +2 -2
- package/export/artifacts/contracts/test/WormholeBridgeStub.sol/WormholeBridgeStub.json +33 -33
- package/export/artifacts/contracts/token/TBTC.sol/TBTC.json +2 -2
- package/export/artifacts/contracts/vault/DonationVault.sol/DonationVault.json +11 -11
- package/export/artifacts/contracts/vault/TBTCVault.sol/TBTCVault.json +135 -135
- package/export/typechain/factories/GoerliLightRelay__factory.js +14 -1
- package/export/typechain/factories/WalletCoordinator__factory.js +1 -1
- package/export.json +274 -0
- package/package.json +1 -1
|
@@ -384,6 +384,19 @@
|
|
|
384
384
|
"stateMutability": "nonpayable",
|
|
385
385
|
"type": "function"
|
|
386
386
|
},
|
|
387
|
+
{
|
|
388
|
+
"inputs": [
|
|
389
|
+
{
|
|
390
|
+
"internalType": "bytes",
|
|
391
|
+
"name": "bitcoinHeaders",
|
|
392
|
+
"type": "bytes"
|
|
393
|
+
}
|
|
394
|
+
],
|
|
395
|
+
"name": "setDifficultyFromHeaders",
|
|
396
|
+
"outputs": [],
|
|
397
|
+
"stateMutability": "nonpayable",
|
|
398
|
+
"type": "function"
|
|
399
|
+
},
|
|
387
400
|
{
|
|
388
401
|
"inputs": [
|
|
389
402
|
{
|
|
@@ -435,12 +448,12 @@
|
|
|
435
448
|
"type": "function"
|
|
436
449
|
}
|
|
437
450
|
],
|
|
438
|
-
"bytecode": "0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6120878061007e6000396000f3fe608060405234801561001057600080fd5b50600436106101825760003560e01c8063715018a6116100d8578063b6a5d7de1161008c578063f2fde38b11610066578063f2fde38b14610319578063f5619fda1461032c578063fe9fbb801461034757600080fd5b8063b6a5d7de146102df578063b70e6be6146102f2578063eb8695ef1461030657600080fd5b80637ca5b1dd116100bd5780637ca5b1dd1461029d5780638da5cb5b146102b057806395410d2b146102cb57600080fd5b8063715018a614610261578063766718081461026957600080fd5b806327c97fa51161013a5780634ca49f51116101145780634ca49f5114610217578063620414e61461022a5780636defbf801461023d57600080fd5b806327c97fa5146101f95780632b97be24146101ca5780633a1b77b01461020c57600080fd5b8063113764be1161016b578063113764be146101ca578063189179a3146101d157806319c9aa32146101e457600080fd5b806306a274221461018757806310b76ed8146101ad575b600080fd5b61019a610195366004611c27565b61036a565b6040519081526020015b60405180910390f35b6101b5610381565b604080519283526020830191909152016101a4565b600161019a565b6101b56101df366004611c56565b6103e1565b6101f76101f2366004611d24565b6107d9565b005b6101f7610207366004611d3f565b6109cc565b6002546003546101b5565b6101f7610225366004611d68565b610a25565b61019a610238366004611c27565b610dee565b60005461025190600160a01b900460ff1681565b60405190151581526020016101a4565b6101f7610efe565b60015461028490600160401b900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101a4565b6101f76102ab366004611c56565b610f12565b6000546040516001600160a01b0390911681526020016101a4565b60005461025190600160a81b900460ff1681565b6101f76102ed366004611d3f565b6114b0565b6001546102849067ffffffffffffffff1681565b6101f7610314366004611df1565b61150c565b6101f7610327366004611d3f565b61157c565b60005461028490600160b01b900467ffffffffffffffff1681565b610251610355366004611d3f565b60056020526000908152604090205460ff1681565b600061037b6102386107e084611e3f565b92915050565b600154600090819061039f9067ffffffffffffffff166107e0611e53565b60015467ffffffffffffffff91821693506103c591600160401b909104166107e0611e53565b6103d1906107df611e7f565b67ffffffffffffffff1690509091565b600080605083516103f29190611ea7565b156104445760405162461bcd60e51b815260206004820152601560248201527f496e76616c696420686561646572206c656e677468000000000000000000000060448201526064015b60405180910390fd5b605083516104529190611e3f565b905060018111801561046557506107e081105b6104b15760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964206e756d626572206f66206865616465727300000000000000604482015260640161043b565b6104ba8361160c565b63ffffffff1691506000806104d0858280611640565b6040805180820182526000808252602080830182905260015467ffffffffffffffff600160401b90910416808352600482529184902084518086019095525463ffffffff8116855264010000000090046001600160e01b031690840152939550919350909190825b815163ffffffff1688101561059657610552600184611ebb565b60008181526004602090815260409182902082518084019093525463ffffffff8116835264010000000090046001600160e01b031690820152909350919050610538565b815163ffffffff166106105760405162461bcd60e51b815260206004820152602b60248201527f43616e6e6f742076616c696461746520636861696e73206265666f726520726560448201527f6c61792067656e65736973000000000000000000000000000000000000000000606482015260840161043b565b81602001516001600160e01b031685146106da5780602001516001600160e01b03168503610640579050826106da565b61064b600184611ebb565b60008181526004602090815260409182902082518084019093525463ffffffff8116835264010000000090046001600160e01b031690820181905291945092915085146106da5760405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642074617267657420696e2068656164657220636861696e0000604482015260640161043b565b60015b878110156107cd5760006106fc8b6106f6846050611ece565b8a611640565b60208601519098509091506001600160e01b031687146107b957600061072d610726846050611ece565b8d90611718565b845163ffffffff91821692501615801590610754575083602001516001600160e01b031688145b80156107665750835163ffffffff1681145b6107b25760405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642074617267657420696e2068656164657220636861696e0000604482015260640161043b565b5091925084915b9650806107c581611ee5565b9150506106dd565b50505050505050915091565b600054600160a01b900460ff166108325760405162461bcd60e51b815260206004820152601a60248201527f52656c6179206973206e6f7420726561647920666f7220757365000000000000604482015260640161043b565b61083a611739565b6107e08167ffffffffffffffff16106108955760405162461bcd60e51b815260206004820152601660248201527f50726f6f66206c656e6774682065786365737369766500000000000000000000604482015260640161043b565b60008167ffffffffffffffff16116108ef5760405162461bcd60e51b815260206004820152601c60248201527f50726f6f66206c656e677468206d6179206e6f74206265207a65726f00000000604482015260640161043b565b60005467ffffffffffffffff600160b01b9091048116908216036109555760405162461bcd60e51b815260206004820152601660248201527f50726f6f66206c656e67746820756e6368616e67656400000000000000000000604482015260640161043b565b600080547fffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff16600160b01b67ffffffffffffffff8416908102919091179091556040519081527f3e9f904d8cf11753c79b67c8259c582056d4a7d8af120f81257a59eeb8824b96906020015b60405180910390a150565b6109d4611739565b6001600160a01b038116600081815260056020908152604091829020805460ff1916905590519182527f7498b96beeabea5ad3139f1a2861a03e480034254e36b10aae2e6e42ad7b4b6891016109c1565b610a2d611739565b600054600160a01b900460ff1615610a875760405162461bcd60e51b815260206004820152601960248201527f47656e6573697320616c726561647920706572666f726d656400000000000000604482015260640161043b565b60508314610ad75760405162461bcd60e51b815260206004820152601d60248201527f496e76616c69642067656e6573697320686561646572206c656e677468000000604482015260640161043b565b610ae36107e083611ea7565b15610b565760405162461bcd60e51b815260206004820152602560248201527f496e76616c696420686569676874206f662072656c61792067656e657369732060448201527f626c6f636b000000000000000000000000000000000000000000000000000000606482015260840161043b565b6107e08167ffffffffffffffff1610610bb15760405162461bcd60e51b815260206004820152601660248201527f50726f6f66206c656e6774682065786365737369766500000000000000000000604482015260640161043b565b60008167ffffffffffffffff1611610c0b5760405162461bcd60e51b815260206004820152601c60248201527f50726f6f66206c656e677468206d6179206e6f74206265207a65726f00000000604482015260640161043b565b610c176107e083611e3f565b600180547fffffffffffffffffffffffffffffffff000000000000000000000000000000001667ffffffffffffffff92909216918217600160401b92909202919091179055604080516020601f8601819004810282018101909252848152600091610c9d9190879087908190840183828082843760009201919091525061179392505050565b90506000610ce086868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061160c92505050565b60408051808201825263ffffffff9283168082526001600160e01b03808716602080850191825260015467ffffffffffffffff9081166000908152600490925295812094519151909216640100000000029516949094179091558254918616600160b01b027fffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff909216919091179091559050610d7b826117a0565b600255600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790556040517f2381d16925551c2fb1a5edfcf4fce2f6d085e1f85f4b88340c09c9d191f9d4e990610dde9086815260200190565b60405180910390a1505050505050565b60015460009067ffffffffffffffff16821015610e4d5760405162461bcd60e51b815260206004820152601d60248201527f45706f6368206973206265666f72652072656c61792067656e65736973000000604482015260640161043b565b600154600160401b900467ffffffffffffffff16821115610ed55760405162461bcd60e51b8152602060048201526024808201527f45706f6368206973206e6f742070726f76656e20746f207468652072656c617960448201527f2079657400000000000000000000000000000000000000000000000000000000606482015260840161043b565b60008281526004602052604090205461037b9064010000000090046001600160e01b03166117a0565b610f06611739565b610f1060006117c8565b565b600054600160a01b900460ff16610f6b5760405162461bcd60e51b815260206004820152601a60248201527f52656c6179206973206e6f7420726561647920666f7220757365000000000000604482015260640161043b565b600054600160a81b900460ff1615610fdc573360009081526005602052604090205460ff16610fdc5760405162461bcd60e51b815260206004820152601660248201527f5375626d697474657220756e617574686f72697a656400000000000000000000604482015260640161043b565b600054610ffb90600160b01b900467ffffffffffffffff166002611e53565b611006906050611e53565b67ffffffffffffffff1681511461105f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c696420686561646572206c656e6774680000000000000000000000604482015260640161043b565b600154600160401b900467ffffffffffffffff166000908152600460205260408120805490916401000000009091046001600160e01b031690805b600054600160b01b900467ffffffffffffffff1681101561115b576000806110cd876110c7856050611ece565b86611640565b915091508481146111465760405162461bcd60e51b815260206004820152602660248201527f496e76616c69642074617267657420696e207072652d7265746172676574206860448201527f6561646572730000000000000000000000000000000000000000000000000000606482015260840161043b565b5091508061115381611ee5565b91505061109a565b506000805461119d9061118190600190600160b01b900467ffffffffffffffff16611efe565b61118c906050611e53565b869067ffffffffffffffff16611718565b63ffffffff1690504281106111f45760405162461bcd60e51b815260206004820152601e60248201527f45706f63682063616e6e6f7420656e6420696e20746865206675747572650000604482015260640161043b565b835460009061120b90859063ffffffff1684611830565b9050600080611247600060169054906101000a900467ffffffffffffffff1660506112369190611e53565b899067ffffffffffffffff16611718565b60005463ffffffff919091169150600160b01b900467ffffffffffffffff165b60005461128690600160b01b900467ffffffffffffffff166002611e53565b67ffffffffffffffff16811015611398576000806112a98b6106f6856050611ece565b915091508460000361130e5780945080861681146113095760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642074617267657420696e206e65772065706f63680000000000604482015260640161043b565b611383565b8481146113835760405162461bcd60e51b815260206004820152602760248201527f556e657870656374656420746172676574206368616e6765206166746572207260448201527f6574617267657400000000000000000000000000000000000000000000000000606482015260840161043b565b5095508061139081611ee5565b915050611267565b50600160089054906101000a900467ffffffffffffffff1660016113bc9190611e7f565b6001805467ffffffffffffffff928316600160401b9081027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179182905560408051808201825263ffffffff80871682526001600160e01b038089166020808501918252959096049096166000908152600490945291832090519351909416640100000000029216919091179091556002549061145e846117a0565b6003839055600281905560408051848152602081018390529192507fa282ee798b132f9dc11e06cd4d8e767e562be8709602ca14fea7ab3392acbdab910160405180910390a150505050505050505050565b6114b8611739565b6001600160a01b038116600081815260056020908152604091829020805460ff1916600117905590519182527fd53649b492f738bb59d6825099b5955073efda0bf9e3a7ad20da22e110122e2991016109c1565b611514611739565b60008054821515600160a81b027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff9091161790556040517fd813b248d49c8bf08be2b6947126da6763df310beed7bea97756456c5727419a906109c190831515815260200190565b611584611739565b6001600160a01b0381166116005760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161043b565b611609816117c8565b50565b600061037b61161a836118c4565b60d881901c63ff00ff001662ff00ff60e89290921c9190911617601081811b91901c1790565b60008082156116a0576116548585856118d1565b6116a05760405162461bcd60e51b815260206004820152600d60248201527f496e76616c696420636861696e00000000000000000000000000000000000000604482015260640161043b565b6116aa85856118fc565b90506116b88585605061199e565b91506116c482826119c8565b6117105760405162461bcd60e51b815260206004820152600c60248201527f496e76616c696420776f726b0000000000000000000000000000000000000000604482015260640161043b565b935093915050565b600061173261161a61172b846044611f1f565b8590611b21565b9392505050565b6000546001600160a01b03163314610f105760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161043b565b600061037b8260006118fc565b600061037b7bffff000000000000000000000000000000000000000000000000000083611b30565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008061183d8385611b3c565b905061184d621275006004611b30565b81101561186557611862621275006004611b30565b90505b611873621275006004611b98565b81111561188b57611888621275006004611b98565b90505b60006118a48261189e8862010000611b30565b90611b98565b90506118ba6201000061189e8362127500611b30565b9695505050505050565b600061037b826044611b21565b6000806118de8585611c0e565b90508281146118f1576000915050611732565b506001949350505050565b60008061190d61172b846048611f1f565b60e81c905060008461192085604b611f1f565b8151811061193057611930611f32565b016020015160f81c9050600061196483600060108262ffffff16901c8261ff001660108462ffffff16901b17179050919050565b62ffffff1690506000611978600384611f48565b60ff16905061198981610100612045565b6119939083611ece565b979650505050505050565b6000602060008385602001870160025afa50602060006020600060025afa50506000519392505050565b6000826119d75750600061037b565b81611b198460008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b600882901c7eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff161790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b601082901c7dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff161790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b602082901c7bffffffff00000000ffffffff00000000ffffffff00000000ffffffff1617905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b604082901c77ffffffffffffffff0000000000000000ffffffffffffffff16179050608081901b608082901c179050919050565b109392505050565b60006117328383016020015190565b60006117328284611e3f565b600082821115611b8e5760405162461bcd60e51b815260206004820152601d60248201527f556e646572666c6f7720647572696e67207375627472616374696f6e2e000000604482015260640161043b565b6117328284611ebb565b600082600003611baa5750600061037b565b611bb48284611ece565b905081611bc18483611e3f565b1461037b5760405162461bcd60e51b815260206004820152601f60248201527f4f766572666c6f7720647572696e67206d756c7469706c69636174696f6e2e00604482015260640161043b565b6000611732611c1e836004611f1f565b84016020015190565b600060208284031215611c3957600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215611c6857600080fd5b813567ffffffffffffffff80821115611c8057600080fd5b818401915084601f830112611c9457600080fd5b813581811115611ca657611ca6611c40565b604051601f8201601f19908116603f01168101908382118183101715611cce57611cce611c40565b81604052828152876020848701011115611ce757600080fd5b826020860160208301376000928101602001929092525095945050505050565b803567ffffffffffffffff81168114611d1f57600080fd5b919050565b600060208284031215611d3657600080fd5b61173282611d07565b600060208284031215611d5157600080fd5b81356001600160a01b038116811461173257600080fd5b60008060008060608587031215611d7e57600080fd5b843567ffffffffffffffff80821115611d9657600080fd5b818701915087601f830112611daa57600080fd5b813581811115611db957600080fd5b886020828501011115611dcb57600080fd5b602092830196509450508501359150611de660408601611d07565b905092959194509250565b600060208284031215611e0357600080fd5b8135801515811461173257600080fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082611e4e57611e4e611e13565b500490565b67ffffffffffffffff818116838216028082169190828114611e7757611e77611e29565b505092915050565b67ffffffffffffffff818116838216019080821115611ea057611ea0611e29565b5092915050565b600082611eb657611eb6611e13565b500690565b8181038181111561037b5761037b611e29565b808202811582820484141761037b5761037b611e29565b600060018201611ef757611ef7611e29565b5060010190565b67ffffffffffffffff828116828216039080821115611ea057611ea0611e29565b8082018082111561037b5761037b611e29565b634e487b7160e01b600052603260045260246000fd5b60ff828116828216039081111561037b5761037b611e29565b600181815b80851115611f9c578160001904821115611f8257611f82611e29565b80851615611f8f57918102915b93841c9390800290611f66565b509250929050565b600082611fb35750600161037b565b81611fc05750600061037b565b8160018114611fd65760028114611fe057611ffc565b600191505061037b565b60ff841115611ff157611ff1611e29565b50506001821b61037b565b5060208310610133831016604e8410600b841016171561201f575081810a61037b565b6120298383611f61565b806000190482111561203d5761203d611e29565b029392505050565b60006117328383611fa456fea26469706673582212209c6fe81415d65fe4b021f66eac01b0e7367bd7a0ca8832f0cc02f628969100b464736f6c63430008110033",
|
|
439
|
-
"deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101825760003560e01c8063715018a6116100d8578063b6a5d7de1161008c578063f2fde38b11610066578063f2fde38b14610319578063f5619fda1461032c578063fe9fbb801461034757600080fd5b8063b6a5d7de146102df578063b70e6be6146102f2578063eb8695ef1461030657600080fd5b80637ca5b1dd116100bd5780637ca5b1dd1461029d5780638da5cb5b146102b057806395410d2b146102cb57600080fd5b8063715018a614610261578063766718081461026957600080fd5b806327c97fa51161013a5780634ca49f51116101145780634ca49f5114610217578063620414e61461022a5780636defbf801461023d57600080fd5b806327c97fa5146101f95780632b97be24146101ca5780633a1b77b01461020c57600080fd5b8063113764be1161016b578063113764be146101ca578063189179a3146101d157806319c9aa32146101e457600080fd5b806306a274221461018757806310b76ed8146101ad575b600080fd5b61019a610195366004611c27565b61036a565b6040519081526020015b60405180910390f35b6101b5610381565b604080519283526020830191909152016101a4565b600161019a565b6101b56101df366004611c56565b6103e1565b6101f76101f2366004611d24565b6107d9565b005b6101f7610207366004611d3f565b6109cc565b6002546003546101b5565b6101f7610225366004611d68565b610a25565b61019a610238366004611c27565b610dee565b60005461025190600160a01b900460ff1681565b60405190151581526020016101a4565b6101f7610efe565b60015461028490600160401b900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101a4565b6101f76102ab366004611c56565b610f12565b6000546040516001600160a01b0390911681526020016101a4565b60005461025190600160a81b900460ff1681565b6101f76102ed366004611d3f565b6114b0565b6001546102849067ffffffffffffffff1681565b6101f7610314366004611df1565b61150c565b6101f7610327366004611d3f565b61157c565b60005461028490600160b01b900467ffffffffffffffff1681565b610251610355366004611d3f565b60056020526000908152604090205460ff1681565b600061037b6102386107e084611e3f565b92915050565b600154600090819061039f9067ffffffffffffffff166107e0611e53565b60015467ffffffffffffffff91821693506103c591600160401b909104166107e0611e53565b6103d1906107df611e7f565b67ffffffffffffffff1690509091565b600080605083516103f29190611ea7565b156104445760405162461bcd60e51b815260206004820152601560248201527f496e76616c696420686561646572206c656e677468000000000000000000000060448201526064015b60405180910390fd5b605083516104529190611e3f565b905060018111801561046557506107e081105b6104b15760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964206e756d626572206f66206865616465727300000000000000604482015260640161043b565b6104ba8361160c565b63ffffffff1691506000806104d0858280611640565b6040805180820182526000808252602080830182905260015467ffffffffffffffff600160401b90910416808352600482529184902084518086019095525463ffffffff8116855264010000000090046001600160e01b031690840152939550919350909190825b815163ffffffff1688101561059657610552600184611ebb565b60008181526004602090815260409182902082518084019093525463ffffffff8116835264010000000090046001600160e01b031690820152909350919050610538565b815163ffffffff166106105760405162461bcd60e51b815260206004820152602b60248201527f43616e6e6f742076616c696461746520636861696e73206265666f726520726560448201527f6c61792067656e65736973000000000000000000000000000000000000000000606482015260840161043b565b81602001516001600160e01b031685146106da5780602001516001600160e01b03168503610640579050826106da565b61064b600184611ebb565b60008181526004602090815260409182902082518084019093525463ffffffff8116835264010000000090046001600160e01b031690820181905291945092915085146106da5760405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642074617267657420696e2068656164657220636861696e0000604482015260640161043b565b60015b878110156107cd5760006106fc8b6106f6846050611ece565b8a611640565b60208601519098509091506001600160e01b031687146107b957600061072d610726846050611ece565b8d90611718565b845163ffffffff91821692501615801590610754575083602001516001600160e01b031688145b80156107665750835163ffffffff1681145b6107b25760405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642074617267657420696e2068656164657220636861696e0000604482015260640161043b565b5091925084915b9650806107c581611ee5565b9150506106dd565b50505050505050915091565b600054600160a01b900460ff166108325760405162461bcd60e51b815260206004820152601a60248201527f52656c6179206973206e6f7420726561647920666f7220757365000000000000604482015260640161043b565b61083a611739565b6107e08167ffffffffffffffff16106108955760405162461bcd60e51b815260206004820152601660248201527f50726f6f66206c656e6774682065786365737369766500000000000000000000604482015260640161043b565b60008167ffffffffffffffff16116108ef5760405162461bcd60e51b815260206004820152601c60248201527f50726f6f66206c656e677468206d6179206e6f74206265207a65726f00000000604482015260640161043b565b60005467ffffffffffffffff600160b01b9091048116908216036109555760405162461bcd60e51b815260206004820152601660248201527f50726f6f66206c656e67746820756e6368616e67656400000000000000000000604482015260640161043b565b600080547fffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff16600160b01b67ffffffffffffffff8416908102919091179091556040519081527f3e9f904d8cf11753c79b67c8259c582056d4a7d8af120f81257a59eeb8824b96906020015b60405180910390a150565b6109d4611739565b6001600160a01b038116600081815260056020908152604091829020805460ff1916905590519182527f7498b96beeabea5ad3139f1a2861a03e480034254e36b10aae2e6e42ad7b4b6891016109c1565b610a2d611739565b600054600160a01b900460ff1615610a875760405162461bcd60e51b815260206004820152601960248201527f47656e6573697320616c726561647920706572666f726d656400000000000000604482015260640161043b565b60508314610ad75760405162461bcd60e51b815260206004820152601d60248201527f496e76616c69642067656e6573697320686561646572206c656e677468000000604482015260640161043b565b610ae36107e083611ea7565b15610b565760405162461bcd60e51b815260206004820152602560248201527f496e76616c696420686569676874206f662072656c61792067656e657369732060448201527f626c6f636b000000000000000000000000000000000000000000000000000000606482015260840161043b565b6107e08167ffffffffffffffff1610610bb15760405162461bcd60e51b815260206004820152601660248201527f50726f6f66206c656e6774682065786365737369766500000000000000000000604482015260640161043b565b60008167ffffffffffffffff1611610c0b5760405162461bcd60e51b815260206004820152601c60248201527f50726f6f66206c656e677468206d6179206e6f74206265207a65726f00000000604482015260640161043b565b610c176107e083611e3f565b600180547fffffffffffffffffffffffffffffffff000000000000000000000000000000001667ffffffffffffffff92909216918217600160401b92909202919091179055604080516020601f8601819004810282018101909252848152600091610c9d9190879087908190840183828082843760009201919091525061179392505050565b90506000610ce086868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061160c92505050565b60408051808201825263ffffffff9283168082526001600160e01b03808716602080850191825260015467ffffffffffffffff9081166000908152600490925295812094519151909216640100000000029516949094179091558254918616600160b01b027fffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff909216919091179091559050610d7b826117a0565b600255600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790556040517f2381d16925551c2fb1a5edfcf4fce2f6d085e1f85f4b88340c09c9d191f9d4e990610dde9086815260200190565b60405180910390a1505050505050565b60015460009067ffffffffffffffff16821015610e4d5760405162461bcd60e51b815260206004820152601d60248201527f45706f6368206973206265666f72652072656c61792067656e65736973000000604482015260640161043b565b600154600160401b900467ffffffffffffffff16821115610ed55760405162461bcd60e51b8152602060048201526024808201527f45706f6368206973206e6f742070726f76656e20746f207468652072656c617960448201527f2079657400000000000000000000000000000000000000000000000000000000606482015260840161043b565b60008281526004602052604090205461037b9064010000000090046001600160e01b03166117a0565b610f06611739565b610f1060006117c8565b565b600054600160a01b900460ff16610f6b5760405162461bcd60e51b815260206004820152601a60248201527f52656c6179206973206e6f7420726561647920666f7220757365000000000000604482015260640161043b565b600054600160a81b900460ff1615610fdc573360009081526005602052604090205460ff16610fdc5760405162461bcd60e51b815260206004820152601660248201527f5375626d697474657220756e617574686f72697a656400000000000000000000604482015260640161043b565b600054610ffb90600160b01b900467ffffffffffffffff166002611e53565b611006906050611e53565b67ffffffffffffffff1681511461105f5760405162461bcd60e51b815260206004820152601560248201527f496e76616c696420686561646572206c656e6774680000000000000000000000604482015260640161043b565b600154600160401b900467ffffffffffffffff166000908152600460205260408120805490916401000000009091046001600160e01b031690805b600054600160b01b900467ffffffffffffffff1681101561115b576000806110cd876110c7856050611ece565b86611640565b915091508481146111465760405162461bcd60e51b815260206004820152602660248201527f496e76616c69642074617267657420696e207072652d7265746172676574206860448201527f6561646572730000000000000000000000000000000000000000000000000000606482015260840161043b565b5091508061115381611ee5565b91505061109a565b506000805461119d9061118190600190600160b01b900467ffffffffffffffff16611efe565b61118c906050611e53565b869067ffffffffffffffff16611718565b63ffffffff1690504281106111f45760405162461bcd60e51b815260206004820152601e60248201527f45706f63682063616e6e6f7420656e6420696e20746865206675747572650000604482015260640161043b565b835460009061120b90859063ffffffff1684611830565b9050600080611247600060169054906101000a900467ffffffffffffffff1660506112369190611e53565b899067ffffffffffffffff16611718565b60005463ffffffff919091169150600160b01b900467ffffffffffffffff165b60005461128690600160b01b900467ffffffffffffffff166002611e53565b67ffffffffffffffff16811015611398576000806112a98b6106f6856050611ece565b915091508460000361130e5780945080861681146113095760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642074617267657420696e206e65772065706f63680000000000604482015260640161043b565b611383565b8481146113835760405162461bcd60e51b815260206004820152602760248201527f556e657870656374656420746172676574206368616e6765206166746572207260448201527f6574617267657400000000000000000000000000000000000000000000000000606482015260840161043b565b5095508061139081611ee5565b915050611267565b50600160089054906101000a900467ffffffffffffffff1660016113bc9190611e7f565b6001805467ffffffffffffffff928316600160401b9081027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179182905560408051808201825263ffffffff80871682526001600160e01b038089166020808501918252959096049096166000908152600490945291832090519351909416640100000000029216919091179091556002549061145e846117a0565b6003839055600281905560408051848152602081018390529192507fa282ee798b132f9dc11e06cd4d8e767e562be8709602ca14fea7ab3392acbdab910160405180910390a150505050505050505050565b6114b8611739565b6001600160a01b038116600081815260056020908152604091829020805460ff1916600117905590519182527fd53649b492f738bb59d6825099b5955073efda0bf9e3a7ad20da22e110122e2991016109c1565b611514611739565b60008054821515600160a81b027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff9091161790556040517fd813b248d49c8bf08be2b6947126da6763df310beed7bea97756456c5727419a906109c190831515815260200190565b611584611739565b6001600160a01b0381166116005760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161043b565b611609816117c8565b50565b600061037b61161a836118c4565b60d881901c63ff00ff001662ff00ff60e89290921c9190911617601081811b91901c1790565b60008082156116a0576116548585856118d1565b6116a05760405162461bcd60e51b815260206004820152600d60248201527f496e76616c696420636861696e00000000000000000000000000000000000000604482015260640161043b565b6116aa85856118fc565b90506116b88585605061199e565b91506116c482826119c8565b6117105760405162461bcd60e51b815260206004820152600c60248201527f496e76616c696420776f726b0000000000000000000000000000000000000000604482015260640161043b565b935093915050565b600061173261161a61172b846044611f1f565b8590611b21565b9392505050565b6000546001600160a01b03163314610f105760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161043b565b600061037b8260006118fc565b600061037b7bffff000000000000000000000000000000000000000000000000000083611b30565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008061183d8385611b3c565b905061184d621275006004611b30565b81101561186557611862621275006004611b30565b90505b611873621275006004611b98565b81111561188b57611888621275006004611b98565b90505b60006118a48261189e8862010000611b30565b90611b98565b90506118ba6201000061189e8362127500611b30565b9695505050505050565b600061037b826044611b21565b6000806118de8585611c0e565b90508281146118f1576000915050611732565b506001949350505050565b60008061190d61172b846048611f1f565b60e81c905060008461192085604b611f1f565b8151811061193057611930611f32565b016020015160f81c9050600061196483600060108262ffffff16901c8261ff001660108462ffffff16901b17179050919050565b62ffffff1690506000611978600384611f48565b60ff16905061198981610100612045565b6119939083611ece565b979650505050505050565b6000602060008385602001870160025afa50602060006020600060025afa50506000519392505050565b6000826119d75750600061037b565b81611b198460008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b600882901c7eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff161790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b601082901c7dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff161790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b602082901c7bffffffff00000000ffffffff00000000ffffffff00000000ffffffff1617905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b604082901c77ffffffffffffffff0000000000000000ffffffffffffffff16179050608081901b608082901c179050919050565b109392505050565b60006117328383016020015190565b60006117328284611e3f565b600082821115611b8e5760405162461bcd60e51b815260206004820152601d60248201527f556e646572666c6f7720647572696e67207375627472616374696f6e2e000000604482015260640161043b565b6117328284611ebb565b600082600003611baa5750600061037b565b611bb48284611ece565b905081611bc18483611e3f565b1461037b5760405162461bcd60e51b815260206004820152601f60248201527f4f766572666c6f7720647572696e67206d756c7469706c69636174696f6e2e00604482015260640161043b565b6000611732611c1e836004611f1f565b84016020015190565b600060208284031215611c3957600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215611c6857600080fd5b813567ffffffffffffffff80821115611c8057600080fd5b818401915084601f830112611c9457600080fd5b813581811115611ca657611ca6611c40565b604051601f8201601f19908116603f01168101908382118183101715611cce57611cce611c40565b81604052828152876020848701011115611ce757600080fd5b826020860160208301376000928101602001929092525095945050505050565b803567ffffffffffffffff81168114611d1f57600080fd5b919050565b600060208284031215611d3657600080fd5b61173282611d07565b600060208284031215611d5157600080fd5b81356001600160a01b038116811461173257600080fd5b60008060008060608587031215611d7e57600080fd5b843567ffffffffffffffff80821115611d9657600080fd5b818701915087601f830112611daa57600080fd5b813581811115611db957600080fd5b886020828501011115611dcb57600080fd5b602092830196509450508501359150611de660408601611d07565b905092959194509250565b600060208284031215611e0357600080fd5b8135801515811461173257600080fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082611e4e57611e4e611e13565b500490565b67ffffffffffffffff818116838216028082169190828114611e7757611e77611e29565b505092915050565b67ffffffffffffffff818116838216019080821115611ea057611ea0611e29565b5092915050565b600082611eb657611eb6611e13565b500690565b8181038181111561037b5761037b611e29565b808202811582820484141761037b5761037b611e29565b600060018201611ef757611ef7611e29565b5060010190565b67ffffffffffffffff828116828216039080821115611ea057611ea0611e29565b8082018082111561037b5761037b611e29565b634e487b7160e01b600052603260045260246000fd5b60ff828116828216039081111561037b5761037b611e29565b600181815b80851115611f9c578160001904821115611f8257611f82611e29565b80851615611f8f57918102915b93841c9390800290611f66565b509250929050565b600082611fb35750600161037b565b81611fc05750600061037b565b8160018114611fd65760028114611fe057611ffc565b600191505061037b565b60ff841115611ff157611ff1611e29565b50506001821b61037b565b5060208310610133831016604e8410600b841016171561201f575081810a61037b565b6120298383611f61565b806000190482111561203d5761203d611e29565b029392505050565b60006117328383611fa456fea26469706673582212209c6fe81415d65fe4b021f66eac01b0e7367bd7a0ca8832f0cc02f628969100b464736f6c63430008110033",
|
|
451
|
+
"bytecode": "0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6120d58061007e6000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c8063715018a6116100e3578063b70e6be61161008c578063f2fde38b11610066578063f2fde38b14610340578063f5619fda14610353578063fe9fbb801461036e57600080fd5b8063b70e6be614610306578063d38c29a11461031a578063eb8695ef1461032d57600080fd5b80638da5cb5b116100bd5780638da5cb5b146102c457806395410d2b146102df578063b6a5d7de146102f357600080fd5b8063715018a614610275578063766718081461027d5780637ca5b1dd146102b157600080fd5b806327c97fa5116101455780634ca49f511161011f5780634ca49f511461022b578063620414e61461023e5780636defbf801461025157600080fd5b806327c97fa5146102055780632b97be24146102185780633a1b77b01461022057600080fd5b8063113764be11610176578063113764be146101d5578063189179a3146101dd57806319c9aa32146101f057600080fd5b806306a274221461019257806310b76ed8146101b8575b600080fd5b6101a56101a0366004611c75565b610391565b6040519081526020015b60405180910390f35b6101c06103a8565b604080519283526020830191909152016101af565b6002546101a5565b6101c06101eb366004611ca4565b610408565b6102036101fe366004611d72565b610800565b005b610203610213366004611d8d565b6109f3565b6003546101a5565b6002546003546101c0565b610203610239366004611db6565b610a4c565b6101a561024c366004611c75565b610e15565b60005461026590600160a01b900460ff1681565b60405190151581526020016101af565b610203610f25565b60015461029890600160401b900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101af565b6102036102bf366004611ca4565b610f39565b6000546040516001600160a01b0390911681526020016101af565b60005461026590600160a81b900460ff1681565b610203610301366004611d8d565b6114d7565b6001546102989067ffffffffffffffff1681565b610203610328366004611ca4565b611533565b61020361033b366004611e3f565b61155a565b61020361034e366004611d8d565b6115ca565b60005461029890600160b01b900467ffffffffffffffff1681565b61026561037c366004611d8d565b60056020526000908152604090205460ff1681565b60006103a261024c6107e084611e8d565b92915050565b60015460009081906103c69067ffffffffffffffff166107e0611ea1565b60015467ffffffffffffffff91821693506103ec91600160401b909104166107e0611ea1565b6103f8906107df611ecd565b67ffffffffffffffff1690509091565b600080605083516104199190611ef5565b1561046b5760405162461bcd60e51b815260206004820152601560248201527f496e76616c696420686561646572206c656e677468000000000000000000000060448201526064015b60405180910390fd5b605083516104799190611e8d565b905060018111801561048c57506107e081105b6104d85760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964206e756d626572206f662068656164657273000000000000006044820152606401610462565b6104e18361165a565b63ffffffff1691506000806104f785828061168e565b6040805180820182526000808252602080830182905260015467ffffffffffffffff600160401b90910416808352600482529184902084518086019095525463ffffffff8116855264010000000090046001600160e01b031690840152939550919350909190825b815163ffffffff168810156105bd57610579600184611f09565b60008181526004602090815260409182902082518084019093525463ffffffff8116835264010000000090046001600160e01b03169082015290935091905061055f565b815163ffffffff166106375760405162461bcd60e51b815260206004820152602b60248201527f43616e6e6f742076616c696461746520636861696e73206265666f726520726560448201527f6c61792067656e657369730000000000000000000000000000000000000000006064820152608401610462565b81602001516001600160e01b031685146107015780602001516001600160e01b0316850361066757905082610701565b610672600184611f09565b60008181526004602090815260409182902082518084019093525463ffffffff8116835264010000000090046001600160e01b031690820181905291945092915085146107015760405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642074617267657420696e2068656164657220636861696e00006044820152606401610462565b60015b878110156107f45760006107238b61071d846050611f1c565b8a61168e565b60208601519098509091506001600160e01b031687146107e057600061075461074d846050611f1c565b8d90611766565b845163ffffffff9182169250161580159061077b575083602001516001600160e01b031688145b801561078d5750835163ffffffff1681145b6107d95760405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642074617267657420696e2068656164657220636861696e00006044820152606401610462565b5091925084915b9650806107ec81611f33565b915050610704565b50505050505050915091565b600054600160a01b900460ff166108595760405162461bcd60e51b815260206004820152601a60248201527f52656c6179206973206e6f7420726561647920666f72207573650000000000006044820152606401610462565b610861611787565b6107e08167ffffffffffffffff16106108bc5760405162461bcd60e51b815260206004820152601660248201527f50726f6f66206c656e67746820657863657373697665000000000000000000006044820152606401610462565b60008167ffffffffffffffff16116109165760405162461bcd60e51b815260206004820152601c60248201527f50726f6f66206c656e677468206d6179206e6f74206265207a65726f000000006044820152606401610462565b60005467ffffffffffffffff600160b01b90910481169082160361097c5760405162461bcd60e51b815260206004820152601660248201527f50726f6f66206c656e67746820756e6368616e676564000000000000000000006044820152606401610462565b600080547fffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff16600160b01b67ffffffffffffffff8416908102919091179091556040519081527f3e9f904d8cf11753c79b67c8259c582056d4a7d8af120f81257a59eeb8824b96906020015b60405180910390a150565b6109fb611787565b6001600160a01b038116600081815260056020908152604091829020805460ff1916905590519182527f7498b96beeabea5ad3139f1a2861a03e480034254e36b10aae2e6e42ad7b4b6891016109e8565b610a54611787565b600054600160a01b900460ff1615610aae5760405162461bcd60e51b815260206004820152601960248201527f47656e6573697320616c726561647920706572666f726d6564000000000000006044820152606401610462565b60508314610afe5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c69642067656e6573697320686561646572206c656e6774680000006044820152606401610462565b610b0a6107e083611ef5565b15610b7d5760405162461bcd60e51b815260206004820152602560248201527f496e76616c696420686569676874206f662072656c61792067656e657369732060448201527f626c6f636b0000000000000000000000000000000000000000000000000000006064820152608401610462565b6107e08167ffffffffffffffff1610610bd85760405162461bcd60e51b815260206004820152601660248201527f50726f6f66206c656e67746820657863657373697665000000000000000000006044820152606401610462565b60008167ffffffffffffffff1611610c325760405162461bcd60e51b815260206004820152601c60248201527f50726f6f66206c656e677468206d6179206e6f74206265207a65726f000000006044820152606401610462565b610c3e6107e083611e8d565b600180547fffffffffffffffffffffffffffffffff000000000000000000000000000000001667ffffffffffffffff92909216918217600160401b92909202919091179055604080516020601f8601819004810282018101909252848152600091610cc4919087908790819084018382808284376000920191909152506117e192505050565b90506000610d0786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061165a92505050565b60408051808201825263ffffffff9283168082526001600160e01b03808716602080850191825260015467ffffffffffffffff9081166000908152600490925295812094519151909216640100000000029516949094179091558254918616600160b01b027fffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff909216919091179091559050610da2826117ee565b600255600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790556040517f2381d16925551c2fb1a5edfcf4fce2f6d085e1f85f4b88340c09c9d191f9d4e990610e059086815260200190565b60405180910390a1505050505050565b60015460009067ffffffffffffffff16821015610e745760405162461bcd60e51b815260206004820152601d60248201527f45706f6368206973206265666f72652072656c61792067656e657369730000006044820152606401610462565b600154600160401b900467ffffffffffffffff16821115610efc5760405162461bcd60e51b8152602060048201526024808201527f45706f6368206973206e6f742070726f76656e20746f207468652072656c617960448201527f20796574000000000000000000000000000000000000000000000000000000006064820152608401610462565b6000828152600460205260409020546103a29064010000000090046001600160e01b03166117ee565b610f2d611787565b610f376000611816565b565b600054600160a01b900460ff16610f925760405162461bcd60e51b815260206004820152601a60248201527f52656c6179206973206e6f7420726561647920666f72207573650000000000006044820152606401610462565b600054600160a81b900460ff1615611003573360009081526005602052604090205460ff166110035760405162461bcd60e51b815260206004820152601660248201527f5375626d697474657220756e617574686f72697a6564000000000000000000006044820152606401610462565b60005461102290600160b01b900467ffffffffffffffff166002611ea1565b61102d906050611ea1565b67ffffffffffffffff168151146110865760405162461bcd60e51b815260206004820152601560248201527f496e76616c696420686561646572206c656e67746800000000000000000000006044820152606401610462565b600154600160401b900467ffffffffffffffff166000908152600460205260408120805490916401000000009091046001600160e01b031690805b600054600160b01b900467ffffffffffffffff16811015611182576000806110f4876110ee856050611f1c565b8661168e565b9150915084811461116d5760405162461bcd60e51b815260206004820152602660248201527f496e76616c69642074617267657420696e207072652d7265746172676574206860448201527f65616465727300000000000000000000000000000000000000000000000000006064820152608401610462565b5091508061117a81611f33565b9150506110c1565b50600080546111c4906111a890600190600160b01b900467ffffffffffffffff16611f4c565b6111b3906050611ea1565b869067ffffffffffffffff16611766565b63ffffffff16905042811061121b5760405162461bcd60e51b815260206004820152601e60248201527f45706f63682063616e6e6f7420656e6420696e207468652066757475726500006044820152606401610462565b835460009061123290859063ffffffff168461187e565b905060008061126e600060169054906101000a900467ffffffffffffffff16605061125d9190611ea1565b899067ffffffffffffffff16611766565b60005463ffffffff919091169150600160b01b900467ffffffffffffffff165b6000546112ad90600160b01b900467ffffffffffffffff166002611ea1565b67ffffffffffffffff168110156113bf576000806112d08b61071d856050611f1c565b91509150846000036113355780945080861681146113305760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642074617267657420696e206e65772065706f636800000000006044820152606401610462565b6113aa565b8481146113aa5760405162461bcd60e51b815260206004820152602760248201527f556e657870656374656420746172676574206368616e6765206166746572207260448201527f65746172676574000000000000000000000000000000000000000000000000006064820152608401610462565b509550806113b781611f33565b91505061128e565b50600160089054906101000a900467ffffffffffffffff1660016113e39190611ecd565b6001805467ffffffffffffffff928316600160401b9081027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179182905560408051808201825263ffffffff80871682526001600160e01b0380891660208085019182529590960490961660009081526004909452918320905193519094166401000000000292169190911790915560025490611485846117ee565b6003839055600281905560408051848152602081018390529192507fa282ee798b132f9dc11e06cd4d8e767e562be8709602ca14fea7ab3392acbdab910160405180910390a150505050505050505050565b6114df611787565b6001600160a01b038116600081815260056020908152604091829020805460ff1916600117905590519182527fd53649b492f738bb59d6825099b5955073efda0bf9e3a7ad20da22e110122e2991016109e8565b61153b611787565b600061154e611549836117e1565b6117ee565b60028190556003555050565b611562611787565b60008054821515600160a81b027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff9091161790556040517fd813b248d49c8bf08be2b6947126da6763df310beed7bea97756456c5727419a906109e890831515815260200190565b6115d2611787565b6001600160a01b03811661164e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610462565b61165781611816565b50565b60006103a261166883611912565b60d881901c63ff00ff001662ff00ff60e89290921c9190911617601081811b91901c1790565b60008082156116ee576116a285858561191f565b6116ee5760405162461bcd60e51b815260206004820152600d60248201527f496e76616c696420636861696e000000000000000000000000000000000000006044820152606401610462565b6116f8858561194a565b9050611706858560506119ec565b91506117128282611a16565b61175e5760405162461bcd60e51b815260206004820152600c60248201527f496e76616c696420776f726b00000000000000000000000000000000000000006044820152606401610462565b935093915050565b6000611780611668611779846044611f6d565b8590611b6f565b9392505050565b6000546001600160a01b03163314610f375760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610462565b60006103a282600061194a565b60006103a27bffff000000000000000000000000000000000000000000000000000083611b7e565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008061188b8385611b8a565b905061189b621275006004611b7e565b8110156118b3576118b0621275006004611b7e565b90505b6118c1621275006004611be6565b8111156118d9576118d6621275006004611be6565b90505b60006118f2826118ec8862010000611b7e565b90611be6565b9050611908620100006118ec8362127500611b7e565b9695505050505050565b60006103a2826044611b6f565b60008061192c8585611c5c565b905082811461193f576000915050611780565b506001949350505050565b60008061195b611779846048611f6d565b60e81c905060008461196e85604b611f6d565b8151811061197e5761197e611f80565b016020015160f81c905060006119b283600060108262ffffff16901c8261ff001660108462ffffff16901b17179050919050565b62ffffff16905060006119c6600384611f96565b60ff1690506119d781610100612093565b6119e19083611f1c565b979650505050505050565b6000602060008385602001870160025afa50602060006020600060025afa50506000519392505050565b600082611a25575060006103a2565b81611b678460008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b600882901c7eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff161790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b601082901c7dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff161790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b602082901c7bffffffff00000000ffffffff00000000ffffffff00000000ffffffff1617905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b604082901c77ffffffffffffffff0000000000000000ffffffffffffffff16179050608081901b608082901c179050919050565b109392505050565b60006117808383016020015190565b60006117808284611e8d565b600082821115611bdc5760405162461bcd60e51b815260206004820152601d60248201527f556e646572666c6f7720647572696e67207375627472616374696f6e2e0000006044820152606401610462565b6117808284611f09565b600082600003611bf8575060006103a2565b611c028284611f1c565b905081611c0f8483611e8d565b146103a25760405162461bcd60e51b815260206004820152601f60248201527f4f766572666c6f7720647572696e67206d756c7469706c69636174696f6e2e006044820152606401610462565b6000611780611c6c836004611f6d565b84016020015190565b600060208284031215611c8757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215611cb657600080fd5b813567ffffffffffffffff80821115611cce57600080fd5b818401915084601f830112611ce257600080fd5b813581811115611cf457611cf4611c8e565b604051601f8201601f19908116603f01168101908382118183101715611d1c57611d1c611c8e565b81604052828152876020848701011115611d3557600080fd5b826020860160208301376000928101602001929092525095945050505050565b803567ffffffffffffffff81168114611d6d57600080fd5b919050565b600060208284031215611d8457600080fd5b61178082611d55565b600060208284031215611d9f57600080fd5b81356001600160a01b038116811461178057600080fd5b60008060008060608587031215611dcc57600080fd5b843567ffffffffffffffff80821115611de457600080fd5b818701915087601f830112611df857600080fd5b813581811115611e0757600080fd5b886020828501011115611e1957600080fd5b602092830196509450508501359150611e3460408601611d55565b905092959194509250565b600060208284031215611e5157600080fd5b8135801515811461178057600080fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082611e9c57611e9c611e61565b500490565b67ffffffffffffffff818116838216028082169190828114611ec557611ec5611e77565b505092915050565b67ffffffffffffffff818116838216019080821115611eee57611eee611e77565b5092915050565b600082611f0457611f04611e61565b500690565b818103818111156103a2576103a2611e77565b80820281158282048414176103a2576103a2611e77565b600060018201611f4557611f45611e77565b5060010190565b67ffffffffffffffff828116828216039080821115611eee57611eee611e77565b808201808211156103a2576103a2611e77565b634e487b7160e01b600052603260045260246000fd5b60ff82811682821603908111156103a2576103a2611e77565b600181815b80851115611fea578160001904821115611fd057611fd0611e77565b80851615611fdd57918102915b93841c9390800290611fb4565b509250929050565b600082612001575060016103a2565b8161200e575060006103a2565b8160018114612024576002811461202e5761204a565b60019150506103a2565b60ff84111561203f5761203f611e77565b50506001821b6103a2565b5060208310610133831016604e8410600b841016171561206d575081810a6103a2565b6120778383611faf565b806000190482111561208b5761208b611e77565b029392505050565b60006117808383611ff256fea26469706673582212202606e767c86058f121fb4bbc42812c919a513f29a231e5b98b843fe61a656e4764736f6c63430008110033",
|
|
452
|
+
"deployedBytecode": "0x608060405234801561001057600080fd5b506004361061018d5760003560e01c8063715018a6116100e3578063b70e6be61161008c578063f2fde38b11610066578063f2fde38b14610340578063f5619fda14610353578063fe9fbb801461036e57600080fd5b8063b70e6be614610306578063d38c29a11461031a578063eb8695ef1461032d57600080fd5b80638da5cb5b116100bd5780638da5cb5b146102c457806395410d2b146102df578063b6a5d7de146102f357600080fd5b8063715018a614610275578063766718081461027d5780637ca5b1dd146102b157600080fd5b806327c97fa5116101455780634ca49f511161011f5780634ca49f511461022b578063620414e61461023e5780636defbf801461025157600080fd5b806327c97fa5146102055780632b97be24146102185780633a1b77b01461022057600080fd5b8063113764be11610176578063113764be146101d5578063189179a3146101dd57806319c9aa32146101f057600080fd5b806306a274221461019257806310b76ed8146101b8575b600080fd5b6101a56101a0366004611c75565b610391565b6040519081526020015b60405180910390f35b6101c06103a8565b604080519283526020830191909152016101af565b6002546101a5565b6101c06101eb366004611ca4565b610408565b6102036101fe366004611d72565b610800565b005b610203610213366004611d8d565b6109f3565b6003546101a5565b6002546003546101c0565b610203610239366004611db6565b610a4c565b6101a561024c366004611c75565b610e15565b60005461026590600160a01b900460ff1681565b60405190151581526020016101af565b610203610f25565b60015461029890600160401b900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101af565b6102036102bf366004611ca4565b610f39565b6000546040516001600160a01b0390911681526020016101af565b60005461026590600160a81b900460ff1681565b610203610301366004611d8d565b6114d7565b6001546102989067ffffffffffffffff1681565b610203610328366004611ca4565b611533565b61020361033b366004611e3f565b61155a565b61020361034e366004611d8d565b6115ca565b60005461029890600160b01b900467ffffffffffffffff1681565b61026561037c366004611d8d565b60056020526000908152604090205460ff1681565b60006103a261024c6107e084611e8d565b92915050565b60015460009081906103c69067ffffffffffffffff166107e0611ea1565b60015467ffffffffffffffff91821693506103ec91600160401b909104166107e0611ea1565b6103f8906107df611ecd565b67ffffffffffffffff1690509091565b600080605083516104199190611ef5565b1561046b5760405162461bcd60e51b815260206004820152601560248201527f496e76616c696420686561646572206c656e677468000000000000000000000060448201526064015b60405180910390fd5b605083516104799190611e8d565b905060018111801561048c57506107e081105b6104d85760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964206e756d626572206f662068656164657273000000000000006044820152606401610462565b6104e18361165a565b63ffffffff1691506000806104f785828061168e565b6040805180820182526000808252602080830182905260015467ffffffffffffffff600160401b90910416808352600482529184902084518086019095525463ffffffff8116855264010000000090046001600160e01b031690840152939550919350909190825b815163ffffffff168810156105bd57610579600184611f09565b60008181526004602090815260409182902082518084019093525463ffffffff8116835264010000000090046001600160e01b03169082015290935091905061055f565b815163ffffffff166106375760405162461bcd60e51b815260206004820152602b60248201527f43616e6e6f742076616c696461746520636861696e73206265666f726520726560448201527f6c61792067656e657369730000000000000000000000000000000000000000006064820152608401610462565b81602001516001600160e01b031685146107015780602001516001600160e01b0316850361066757905082610701565b610672600184611f09565b60008181526004602090815260409182902082518084019093525463ffffffff8116835264010000000090046001600160e01b031690820181905291945092915085146107015760405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642074617267657420696e2068656164657220636861696e00006044820152606401610462565b60015b878110156107f45760006107238b61071d846050611f1c565b8a61168e565b60208601519098509091506001600160e01b031687146107e057600061075461074d846050611f1c565b8d90611766565b845163ffffffff9182169250161580159061077b575083602001516001600160e01b031688145b801561078d5750835163ffffffff1681145b6107d95760405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642074617267657420696e2068656164657220636861696e00006044820152606401610462565b5091925084915b9650806107ec81611f33565b915050610704565b50505050505050915091565b600054600160a01b900460ff166108595760405162461bcd60e51b815260206004820152601a60248201527f52656c6179206973206e6f7420726561647920666f72207573650000000000006044820152606401610462565b610861611787565b6107e08167ffffffffffffffff16106108bc5760405162461bcd60e51b815260206004820152601660248201527f50726f6f66206c656e67746820657863657373697665000000000000000000006044820152606401610462565b60008167ffffffffffffffff16116109165760405162461bcd60e51b815260206004820152601c60248201527f50726f6f66206c656e677468206d6179206e6f74206265207a65726f000000006044820152606401610462565b60005467ffffffffffffffff600160b01b90910481169082160361097c5760405162461bcd60e51b815260206004820152601660248201527f50726f6f66206c656e67746820756e6368616e676564000000000000000000006044820152606401610462565b600080547fffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff16600160b01b67ffffffffffffffff8416908102919091179091556040519081527f3e9f904d8cf11753c79b67c8259c582056d4a7d8af120f81257a59eeb8824b96906020015b60405180910390a150565b6109fb611787565b6001600160a01b038116600081815260056020908152604091829020805460ff1916905590519182527f7498b96beeabea5ad3139f1a2861a03e480034254e36b10aae2e6e42ad7b4b6891016109e8565b610a54611787565b600054600160a01b900460ff1615610aae5760405162461bcd60e51b815260206004820152601960248201527f47656e6573697320616c726561647920706572666f726d6564000000000000006044820152606401610462565b60508314610afe5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c69642067656e6573697320686561646572206c656e6774680000006044820152606401610462565b610b0a6107e083611ef5565b15610b7d5760405162461bcd60e51b815260206004820152602560248201527f496e76616c696420686569676874206f662072656c61792067656e657369732060448201527f626c6f636b0000000000000000000000000000000000000000000000000000006064820152608401610462565b6107e08167ffffffffffffffff1610610bd85760405162461bcd60e51b815260206004820152601660248201527f50726f6f66206c656e67746820657863657373697665000000000000000000006044820152606401610462565b60008167ffffffffffffffff1611610c325760405162461bcd60e51b815260206004820152601c60248201527f50726f6f66206c656e677468206d6179206e6f74206265207a65726f000000006044820152606401610462565b610c3e6107e083611e8d565b600180547fffffffffffffffffffffffffffffffff000000000000000000000000000000001667ffffffffffffffff92909216918217600160401b92909202919091179055604080516020601f8601819004810282018101909252848152600091610cc4919087908790819084018382808284376000920191909152506117e192505050565b90506000610d0786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061165a92505050565b60408051808201825263ffffffff9283168082526001600160e01b03808716602080850191825260015467ffffffffffffffff9081166000908152600490925295812094519151909216640100000000029516949094179091558254918616600160b01b027fffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff909216919091179091559050610da2826117ee565b600255600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790556040517f2381d16925551c2fb1a5edfcf4fce2f6d085e1f85f4b88340c09c9d191f9d4e990610e059086815260200190565b60405180910390a1505050505050565b60015460009067ffffffffffffffff16821015610e745760405162461bcd60e51b815260206004820152601d60248201527f45706f6368206973206265666f72652072656c61792067656e657369730000006044820152606401610462565b600154600160401b900467ffffffffffffffff16821115610efc5760405162461bcd60e51b8152602060048201526024808201527f45706f6368206973206e6f742070726f76656e20746f207468652072656c617960448201527f20796574000000000000000000000000000000000000000000000000000000006064820152608401610462565b6000828152600460205260409020546103a29064010000000090046001600160e01b03166117ee565b610f2d611787565b610f376000611816565b565b600054600160a01b900460ff16610f925760405162461bcd60e51b815260206004820152601a60248201527f52656c6179206973206e6f7420726561647920666f72207573650000000000006044820152606401610462565b600054600160a81b900460ff1615611003573360009081526005602052604090205460ff166110035760405162461bcd60e51b815260206004820152601660248201527f5375626d697474657220756e617574686f72697a6564000000000000000000006044820152606401610462565b60005461102290600160b01b900467ffffffffffffffff166002611ea1565b61102d906050611ea1565b67ffffffffffffffff168151146110865760405162461bcd60e51b815260206004820152601560248201527f496e76616c696420686561646572206c656e67746800000000000000000000006044820152606401610462565b600154600160401b900467ffffffffffffffff166000908152600460205260408120805490916401000000009091046001600160e01b031690805b600054600160b01b900467ffffffffffffffff16811015611182576000806110f4876110ee856050611f1c565b8661168e565b9150915084811461116d5760405162461bcd60e51b815260206004820152602660248201527f496e76616c69642074617267657420696e207072652d7265746172676574206860448201527f65616465727300000000000000000000000000000000000000000000000000006064820152608401610462565b5091508061117a81611f33565b9150506110c1565b50600080546111c4906111a890600190600160b01b900467ffffffffffffffff16611f4c565b6111b3906050611ea1565b869067ffffffffffffffff16611766565b63ffffffff16905042811061121b5760405162461bcd60e51b815260206004820152601e60248201527f45706f63682063616e6e6f7420656e6420696e207468652066757475726500006044820152606401610462565b835460009061123290859063ffffffff168461187e565b905060008061126e600060169054906101000a900467ffffffffffffffff16605061125d9190611ea1565b899067ffffffffffffffff16611766565b60005463ffffffff919091169150600160b01b900467ffffffffffffffff165b6000546112ad90600160b01b900467ffffffffffffffff166002611ea1565b67ffffffffffffffff168110156113bf576000806112d08b61071d856050611f1c565b91509150846000036113355780945080861681146113305760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642074617267657420696e206e65772065706f636800000000006044820152606401610462565b6113aa565b8481146113aa5760405162461bcd60e51b815260206004820152602760248201527f556e657870656374656420746172676574206368616e6765206166746572207260448201527f65746172676574000000000000000000000000000000000000000000000000006064820152608401610462565b509550806113b781611f33565b91505061128e565b50600160089054906101000a900467ffffffffffffffff1660016113e39190611ecd565b6001805467ffffffffffffffff928316600160401b9081027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179182905560408051808201825263ffffffff80871682526001600160e01b0380891660208085019182529590960490961660009081526004909452918320905193519094166401000000000292169190911790915560025490611485846117ee565b6003839055600281905560408051848152602081018390529192507fa282ee798b132f9dc11e06cd4d8e767e562be8709602ca14fea7ab3392acbdab910160405180910390a150505050505050505050565b6114df611787565b6001600160a01b038116600081815260056020908152604091829020805460ff1916600117905590519182527fd53649b492f738bb59d6825099b5955073efda0bf9e3a7ad20da22e110122e2991016109e8565b61153b611787565b600061154e611549836117e1565b6117ee565b60028190556003555050565b611562611787565b60008054821515600160a81b027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff9091161790556040517fd813b248d49c8bf08be2b6947126da6763df310beed7bea97756456c5727419a906109e890831515815260200190565b6115d2611787565b6001600160a01b03811661164e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610462565b61165781611816565b50565b60006103a261166883611912565b60d881901c63ff00ff001662ff00ff60e89290921c9190911617601081811b91901c1790565b60008082156116ee576116a285858561191f565b6116ee5760405162461bcd60e51b815260206004820152600d60248201527f496e76616c696420636861696e000000000000000000000000000000000000006044820152606401610462565b6116f8858561194a565b9050611706858560506119ec565b91506117128282611a16565b61175e5760405162461bcd60e51b815260206004820152600c60248201527f496e76616c696420776f726b00000000000000000000000000000000000000006044820152606401610462565b935093915050565b6000611780611668611779846044611f6d565b8590611b6f565b9392505050565b6000546001600160a01b03163314610f375760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610462565b60006103a282600061194a565b60006103a27bffff000000000000000000000000000000000000000000000000000083611b7e565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008061188b8385611b8a565b905061189b621275006004611b7e565b8110156118b3576118b0621275006004611b7e565b90505b6118c1621275006004611be6565b8111156118d9576118d6621275006004611be6565b90505b60006118f2826118ec8862010000611b7e565b90611be6565b9050611908620100006118ec8362127500611b7e565b9695505050505050565b60006103a2826044611b6f565b60008061192c8585611c5c565b905082811461193f576000915050611780565b506001949350505050565b60008061195b611779846048611f6d565b60e81c905060008461196e85604b611f6d565b8151811061197e5761197e611f80565b016020015160f81c905060006119b283600060108262ffffff16901c8261ff001660108462ffffff16901b17179050919050565b62ffffff16905060006119c6600384611f96565b60ff1690506119d781610100612093565b6119e19083611f1c565b979650505050505050565b6000602060008385602001870160025afa50602060006020600060025afa50506000519392505050565b600082611a25575060006103a2565b81611b678460008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b600882901c7eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff161790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b601082901c7dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff161790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b602082901c7bffffffff00000000ffffffff00000000ffffffff00000000ffffffff1617905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b604082901c77ffffffffffffffff0000000000000000ffffffffffffffff16179050608081901b608082901c179050919050565b109392505050565b60006117808383016020015190565b60006117808284611e8d565b600082821115611bdc5760405162461bcd60e51b815260206004820152601d60248201527f556e646572666c6f7720647572696e67207375627472616374696f6e2e0000006044820152606401610462565b6117808284611f09565b600082600003611bf8575060006103a2565b611c028284611f1c565b905081611c0f8483611e8d565b146103a25760405162461bcd60e51b815260206004820152601f60248201527f4f766572666c6f7720647572696e67206d756c7469706c69636174696f6e2e006044820152606401610462565b6000611780611c6c836004611f6d565b84016020015190565b600060208284031215611c8757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215611cb657600080fd5b813567ffffffffffffffff80821115611cce57600080fd5b818401915084601f830112611ce257600080fd5b813581811115611cf457611cf4611c8e565b604051601f8201601f19908116603f01168101908382118183101715611d1c57611d1c611c8e565b81604052828152876020848701011115611d3557600080fd5b826020860160208301376000928101602001929092525095945050505050565b803567ffffffffffffffff81168114611d6d57600080fd5b919050565b600060208284031215611d8457600080fd5b61178082611d55565b600060208284031215611d9f57600080fd5b81356001600160a01b038116811461178057600080fd5b60008060008060608587031215611dcc57600080fd5b843567ffffffffffffffff80821115611de457600080fd5b818701915087601f830112611df857600080fd5b813581811115611e0757600080fd5b886020828501011115611e1957600080fd5b602092830196509450508501359150611e3460408601611d55565b905092959194509250565b600060208284031215611e5157600080fd5b8135801515811461178057600080fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082611e9c57611e9c611e61565b500490565b67ffffffffffffffff818116838216028082169190828114611ec557611ec5611e77565b505092915050565b67ffffffffffffffff818116838216019080821115611eee57611eee611e77565b5092915050565b600082611f0457611f04611e61565b500690565b818103818111156103a2576103a2611e77565b80820281158282048414176103a2576103a2611e77565b600060018201611f4557611f45611e77565b5060010190565b67ffffffffffffffff828116828216039080821115611eee57611eee611e77565b808201808211156103a2576103a2611e77565b634e487b7160e01b600052603260045260246000fd5b60ff82811682821603908111156103a2576103a2611e77565b600181815b80851115611fea578160001904821115611fd057611fd0611e77565b80851615611fdd57918102915b93841c9390800290611fb4565b509250929050565b600082612001575060016103a2565b8161200e575060006103a2565b8160018114612024576002811461202e5761204a565b60019150506103a2565b60ff84111561203f5761203f611e77565b50506001821b6103a2565b5060208310610133831016604e8410600b841016171561206d575081810a6103a2565b6120778383611faf565b806000190482111561208b5761208b611e77565b029392505050565b60006117808383611ff256fea26469706673582212202606e767c86058f121fb4bbc42812c919a513f29a231e5b98b843fe61a656e4764736f6c63430008110033",
|
|
440
453
|
"linkReferences": {},
|
|
441
454
|
"deployedLinkReferences": {},
|
|
442
455
|
"devdoc": {
|
|
443
|
-
"details": "
|
|
456
|
+
"details": "Notice that GoerliLightRelay is derived from LightRelay so that the two contracts have the same API and correct bindings can be generated.",
|
|
444
457
|
"kind": "dev",
|
|
445
458
|
"methods": {
|
|
446
459
|
"authorize(address)": {
|
|
@@ -469,6 +482,12 @@
|
|
|
469
482
|
"_0": "The difficulty of the epoch."
|
|
470
483
|
}
|
|
471
484
|
},
|
|
485
|
+
"getCurrentEpochDifficulty()": {
|
|
486
|
+
"details": "returns 0 if the relay is not ready.",
|
|
487
|
+
"returns": {
|
|
488
|
+
"_0": "The difficulty of the current epoch."
|
|
489
|
+
}
|
|
490
|
+
},
|
|
472
491
|
"getEpochDifficulty(uint256)": {
|
|
473
492
|
"params": {
|
|
474
493
|
"epochNumber": "The number of the epoch (the height of the first block of the epoch, divided by 2016). Must fall within the relay range."
|
|
@@ -477,6 +496,12 @@
|
|
|
477
496
|
"_0": "The difficulty of the epoch."
|
|
478
497
|
}
|
|
479
498
|
},
|
|
499
|
+
"getPrevEpochDifficulty()": {
|
|
500
|
+
"details": "Returns 0 if the relay is not ready or has not had a retarget.",
|
|
501
|
+
"returns": {
|
|
502
|
+
"_0": "The difficulty of the previous epoch."
|
|
503
|
+
}
|
|
504
|
+
},
|
|
480
505
|
"getRelayRange()": {
|
|
481
506
|
"details": "Assumes that the genesis has been set correctly. Additionally, if the next epoch after the current one has the exact same difficulty, headers for it can be validated as well. This function should be used for informative purposes, e.g. to determine whether a retarget must be provided before submitting a header chain for validation.",
|
|
482
507
|
"returns": {
|
|
@@ -548,13 +573,13 @@
|
|
|
548
573
|
},
|
|
549
574
|
"generatedSources": [],
|
|
550
575
|
"linkReferences": {},
|
|
551
|
-
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A CALLER PUSH2 0x1F JUMP JUMPDEST PUSH2 0x6F JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH2 0x2087 DUP1 PUSH2 0x7E PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x182 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x715018A6 GT PUSH2 0xD8 JUMPI DUP1 PUSH4 0xB6A5D7DE GT PUSH2 0x8C JUMPI DUP1 PUSH4 0xF2FDE38B GT PUSH2 0x66 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x319 JUMPI DUP1 PUSH4 0xF5619FDA EQ PUSH2 0x32C JUMPI DUP1 PUSH4 0xFE9FBB80 EQ PUSH2 0x347 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xB6A5D7DE EQ PUSH2 0x2DF JUMPI DUP1 PUSH4 0xB70E6BE6 EQ PUSH2 0x2F2 JUMPI DUP1 PUSH4 0xEB8695EF EQ PUSH2 0x306 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x7CA5B1DD GT PUSH2 0xBD JUMPI DUP1 PUSH4 0x7CA5B1DD EQ PUSH2 0x29D JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x2B0 JUMPI DUP1 PUSH4 0x95410D2B EQ PUSH2 0x2CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x715018A6 EQ PUSH2 0x261 JUMPI DUP1 PUSH4 0x76671808 EQ PUSH2 0x269 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x27C97FA5 GT PUSH2 0x13A JUMPI DUP1 PUSH4 0x4CA49F51 GT PUSH2 0x114 JUMPI DUP1 PUSH4 0x4CA49F51 EQ PUSH2 0x217 JUMPI DUP1 PUSH4 0x620414E6 EQ PUSH2 0x22A JUMPI DUP1 PUSH4 0x6DEFBF80 EQ PUSH2 0x23D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x27C97FA5 EQ PUSH2 0x1F9 JUMPI DUP1 PUSH4 0x2B97BE24 EQ PUSH2 0x1CA JUMPI DUP1 PUSH4 0x3A1B77B0 EQ PUSH2 0x20C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x113764BE GT PUSH2 0x16B JUMPI DUP1 PUSH4 0x113764BE EQ PUSH2 0x1CA JUMPI DUP1 PUSH4 0x189179A3 EQ PUSH2 0x1D1 JUMPI DUP1 PUSH4 0x19C9AA32 EQ PUSH2 0x1E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x6A27422 EQ PUSH2 0x187 JUMPI DUP1 PUSH4 0x10B76ED8 EQ PUSH2 0x1AD JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x19A PUSH2 0x195 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C27 JUMP JUMPDEST PUSH2 0x36A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1B5 PUSH2 0x381 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE ADD PUSH2 0x1A4 JUMP JUMPDEST PUSH1 0x1 PUSH2 0x19A JUMP JUMPDEST PUSH2 0x1B5 PUSH2 0x1DF CALLDATASIZE PUSH1 0x4 PUSH2 0x1C56 JUMP JUMPDEST PUSH2 0x3E1 JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x1F2 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D24 JUMP JUMPDEST PUSH2 0x7D9 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x1F7 PUSH2 0x207 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D3F JUMP JUMPDEST PUSH2 0x9CC JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x3 SLOAD PUSH2 0x1B5 JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x225 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D68 JUMP JUMPDEST PUSH2 0xA25 JUMP JUMPDEST PUSH2 0x19A PUSH2 0x238 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C27 JUMP JUMPDEST PUSH2 0xDEE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x251 SWAP1 PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1A4 JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0xEFE JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH2 0x284 SWAP1 PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1A4 JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x2AB CALLDATASIZE PUSH1 0x4 PUSH2 0x1C56 JUMP JUMPDEST PUSH2 0xF12 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1A4 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x251 SWAP1 PUSH1 0x1 PUSH1 0xA8 SHL SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x2ED CALLDATASIZE PUSH1 0x4 PUSH2 0x1D3F JUMP JUMPDEST PUSH2 0x14B0 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH2 0x284 SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x314 CALLDATASIZE PUSH1 0x4 PUSH2 0x1DF1 JUMP JUMPDEST PUSH2 0x150C JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x327 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D3F JUMP JUMPDEST PUSH2 0x157C JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x284 SWAP1 PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x251 PUSH2 0x355 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D3F JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x37B PUSH2 0x238 PUSH2 0x7E0 DUP5 PUSH2 0x1E3F JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH2 0x39F SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH2 0x7E0 PUSH2 0x1E53 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF SWAP2 DUP3 AND SWAP4 POP PUSH2 0x3C5 SWAP2 PUSH1 0x1 PUSH1 0x40 SHL SWAP1 SWAP2 DIV AND PUSH2 0x7E0 PUSH2 0x1E53 JUMP JUMPDEST PUSH2 0x3D1 SWAP1 PUSH2 0x7DF PUSH2 0x1E7F JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF AND SWAP1 POP SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x50 DUP4 MLOAD PUSH2 0x3F2 SWAP2 SWAP1 PUSH2 0x1EA7 JUMP JUMPDEST ISZERO PUSH2 0x444 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C696420686561646572206C656E6774680000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x50 DUP4 MLOAD PUSH2 0x452 SWAP2 SWAP1 PUSH2 0x1E3F JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP2 GT DUP1 ISZERO PUSH2 0x465 JUMPI POP PUSH2 0x7E0 DUP2 LT JUMPDEST PUSH2 0x4B1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C6964206E756D626572206F66206865616465727300000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH2 0x4BA DUP4 PUSH2 0x160C JUMP JUMPDEST PUSH4 0xFFFFFFFF AND SWAP2 POP PUSH1 0x0 DUP1 PUSH2 0x4D0 DUP6 DUP3 DUP1 PUSH2 0x1640 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x1 PUSH1 0x40 SHL SWAP1 SWAP2 DIV AND DUP1 DUP4 MSTORE PUSH1 0x4 DUP3 MSTORE SWAP2 DUP5 SWAP1 KECCAK256 DUP5 MLOAD DUP1 DUP7 ADD SWAP1 SWAP6 MSTORE SLOAD PUSH4 0xFFFFFFFF DUP2 AND DUP6 MSTORE PUSH5 0x100000000 SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND SWAP1 DUP5 ADD MSTORE SWAP4 SWAP6 POP SWAP2 SWAP4 POP SWAP1 SWAP2 SWAP1 DUP3 JUMPDEST DUP2 MLOAD PUSH4 0xFFFFFFFF AND DUP9 LT ISZERO PUSH2 0x596 JUMPI PUSH2 0x552 PUSH1 0x1 DUP5 PUSH2 0x1EBB JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE SLOAD PUSH4 0xFFFFFFFF DUP2 AND DUP4 MSTORE PUSH5 0x100000000 SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND SWAP1 DUP3 ADD MSTORE SWAP1 SWAP4 POP SWAP2 SWAP1 POP PUSH2 0x538 JUMP JUMPDEST DUP2 MLOAD PUSH4 0xFFFFFFFF AND PUSH2 0x610 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x43616E6E6F742076616C696461746520636861696E73206265666F7265207265 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6C61792067656E65736973000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x43B JUMP JUMPDEST DUP2 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND DUP6 EQ PUSH2 0x6DA JUMPI DUP1 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND DUP6 SUB PUSH2 0x640 JUMPI SWAP1 POP DUP3 PUSH2 0x6DA JUMP JUMPDEST PUSH2 0x64B PUSH1 0x1 DUP5 PUSH2 0x1EBB JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE SLOAD PUSH4 0xFFFFFFFF DUP2 AND DUP4 MSTORE PUSH5 0x100000000 SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 SWAP5 POP SWAP3 SWAP2 POP DUP6 EQ PUSH2 0x6DA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C69642074617267657420696E2068656164657220636861696E0000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH1 0x1 JUMPDEST DUP8 DUP2 LT ISZERO PUSH2 0x7CD JUMPI PUSH1 0x0 PUSH2 0x6FC DUP12 PUSH2 0x6F6 DUP5 PUSH1 0x50 PUSH2 0x1ECE JUMP JUMPDEST DUP11 PUSH2 0x1640 JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD SWAP1 SWAP9 POP SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND DUP8 EQ PUSH2 0x7B9 JUMPI PUSH1 0x0 PUSH2 0x72D PUSH2 0x726 DUP5 PUSH1 0x50 PUSH2 0x1ECE JUMP JUMPDEST DUP14 SWAP1 PUSH2 0x1718 JUMP JUMPDEST DUP5 MLOAD PUSH4 0xFFFFFFFF SWAP2 DUP3 AND SWAP3 POP AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x754 JUMPI POP DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND DUP9 EQ JUMPDEST DUP1 ISZERO PUSH2 0x766 JUMPI POP DUP4 MLOAD PUSH4 0xFFFFFFFF AND DUP2 EQ JUMPDEST PUSH2 0x7B2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C69642074617267657420696E2068656164657220636861696E0000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST POP SWAP2 SWAP3 POP DUP5 SWAP2 JUMPDEST SWAP7 POP DUP1 PUSH2 0x7C5 DUP2 PUSH2 0x1EE5 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x6DD JUMP JUMPDEST POP POP POP POP POP POP POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x832 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x52656C6179206973206E6F7420726561647920666F7220757365000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH2 0x83A PUSH2 0x1739 JUMP JUMPDEST PUSH2 0x7E0 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF AND LT PUSH2 0x895 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x50726F6F66206C656E6774682065786365737369766500000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF AND GT PUSH2 0x8EF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x50726F6F66206C656E677468206D6179206E6F74206265207A65726F00000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 SWAP2 DIV DUP2 AND SWAP1 DUP3 AND SUB PUSH2 0x955 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x50726F6F66206C656E67746820756E6368616E67656400000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x1 PUSH1 0xB0 SHL PUSH8 0xFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0x3E9F904D8CF11753C79B67C8259C582056D4A7D8AF120F81257A59EEB8824B96 SWAP1 PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH2 0x9D4 PUSH2 0x1739 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE SWAP1 MLOAD SWAP2 DUP3 MSTORE PUSH32 0x7498B96BEEABEA5AD3139F1A2861A03E480034254E36B10AAE2E6E42AD7B4B68 SWAP2 ADD PUSH2 0x9C1 JUMP JUMPDEST PUSH2 0xA2D PUSH2 0x1739 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xA87 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x47656E6573697320616C726561647920706572666F726D656400000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH1 0x50 DUP4 EQ PUSH2 0xAD7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C69642067656E6573697320686561646572206C656E677468000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH2 0xAE3 PUSH2 0x7E0 DUP4 PUSH2 0x1EA7 JUMP JUMPDEST ISZERO PUSH2 0xB56 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C696420686569676874206F662072656C61792067656E6573697320 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x626C6F636B000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x43B JUMP JUMPDEST PUSH2 0x7E0 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF AND LT PUSH2 0xBB1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x50726F6F66206C656E6774682065786365737369766500000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF AND GT PUSH2 0xC0B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x50726F6F66206C656E677468206D6179206E6F74206265207A65726F00000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH2 0xC17 PUSH2 0x7E0 DUP4 PUSH2 0x1E3F JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 AND PUSH8 0xFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 DUP3 OR PUSH1 0x1 PUSH1 0x40 SHL SWAP3 SWAP1 SWAP3 MUL SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP7 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP5 DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH2 0xC9D SWAP2 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x1793 SWAP3 POP POP POP JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xCE0 DUP7 DUP7 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x160C SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH4 0xFFFFFFFF SWAP3 DUP4 AND DUP1 DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP1 DUP8 AND PUSH1 0x20 DUP1 DUP6 ADD SWAP2 DUP3 MSTORE PUSH1 0x1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 SWAP1 SWAP3 MSTORE SWAP6 DUP2 KECCAK256 SWAP5 MLOAD SWAP2 MLOAD SWAP1 SWAP3 AND PUSH5 0x100000000 MUL SWAP6 AND SWAP5 SWAP1 SWAP5 OR SWAP1 SWAP2 SSTORE DUP3 SLOAD SWAP2 DUP7 AND PUSH1 0x1 PUSH1 0xB0 SHL MUL PUSH32 0xFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SWAP2 SSTORE SWAP1 POP PUSH2 0xD7B DUP3 PUSH2 0x17A0 JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x1 PUSH1 0xA0 SHL OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x2381D16925551C2FB1A5EDFCF4FCE2F6D085E1F85F4B88340C09C9D191F9D4E9 SWAP1 PUSH2 0xDDE SWAP1 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x0 SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF AND DUP3 LT ISZERO PUSH2 0xE4D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45706F6368206973206265666F72652072656C61792067656E65736973000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND DUP3 GT ISZERO PUSH2 0xED5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x45706F6368206973206E6F742070726F76656E20746F207468652072656C6179 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2079657400000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x43B JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x37B SWAP1 PUSH5 0x100000000 SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH2 0x17A0 JUMP JUMPDEST PUSH2 0xF06 PUSH2 0x1739 JUMP JUMPDEST PUSH2 0xF10 PUSH1 0x0 PUSH2 0x17C8 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0xF6B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x52656C6179206973206E6F7420726561647920666F7220757365000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA8 SHL SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xFDC JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0xFDC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5375626D697474657220756E617574686F72697A656400000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0xFFB SWAP1 PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH1 0x2 PUSH2 0x1E53 JUMP JUMPDEST PUSH2 0x1006 SWAP1 PUSH1 0x50 PUSH2 0x1E53 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 MLOAD EQ PUSH2 0x105F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C696420686561646572206C656E6774680000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD SWAP1 SWAP2 PUSH5 0x100000000 SWAP1 SWAP2 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND SWAP1 DUP1 JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 LT ISZERO PUSH2 0x115B JUMPI PUSH1 0x0 DUP1 PUSH2 0x10CD DUP8 PUSH2 0x10C7 DUP6 PUSH1 0x50 PUSH2 0x1ECE JUMP JUMPDEST DUP7 PUSH2 0x1640 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 DUP2 EQ PUSH2 0x1146 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C69642074617267657420696E207072652D72657461726765742068 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6561646572730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x43B JUMP JUMPDEST POP SWAP2 POP DUP1 PUSH2 0x1153 DUP2 PUSH2 0x1EE5 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x109A JUMP JUMPDEST POP PUSH1 0x0 DUP1 SLOAD PUSH2 0x119D SWAP1 PUSH2 0x1181 SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH2 0x1EFE JUMP JUMPDEST PUSH2 0x118C SWAP1 PUSH1 0x50 PUSH2 0x1E53 JUMP JUMPDEST DUP7 SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH2 0x1718 JUMP JUMPDEST PUSH4 0xFFFFFFFF AND SWAP1 POP TIMESTAMP DUP2 LT PUSH2 0x11F4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45706F63682063616E6E6F7420656E6420696E20746865206675747572650000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST DUP4 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x120B SWAP1 DUP6 SWAP1 PUSH4 0xFFFFFFFF AND DUP5 PUSH2 0x1830 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP1 PUSH2 0x1247 PUSH1 0x0 PUSH1 0x16 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH1 0x50 PUSH2 0x1236 SWAP2 SWAP1 PUSH2 0x1E53 JUMP JUMPDEST DUP10 SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH2 0x1718 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH4 0xFFFFFFFF SWAP2 SWAP1 SWAP2 AND SWAP2 POP PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x1286 SWAP1 PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH1 0x2 PUSH2 0x1E53 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 LT ISZERO PUSH2 0x1398 JUMPI PUSH1 0x0 DUP1 PUSH2 0x12A9 DUP12 PUSH2 0x6F6 DUP6 PUSH1 0x50 PUSH2 0x1ECE JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 PUSH1 0x0 SUB PUSH2 0x130E JUMPI DUP1 SWAP5 POP DUP1 DUP7 AND DUP2 EQ PUSH2 0x1309 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C69642074617267657420696E206E65772065706F63680000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH2 0x1383 JUMP JUMPDEST DUP5 DUP2 EQ PUSH2 0x1383 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x27 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E657870656374656420746172676574206368616E67652061667465722072 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6574617267657400000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x43B JUMP JUMPDEST POP SWAP6 POP DUP1 PUSH2 0x1390 DUP2 PUSH2 0x1EE5 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x1267 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x8 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH1 0x1 PUSH2 0x13BC SWAP2 SWAP1 PUSH2 0x1E7F JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DUP2 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH4 0xFFFFFFFF DUP1 DUP8 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP1 DUP10 AND PUSH1 0x20 DUP1 DUP6 ADD SWAP2 DUP3 MSTORE SWAP6 SWAP1 SWAP7 DIV SWAP1 SWAP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 SWAP1 SWAP5 MSTORE SWAP2 DUP4 KECCAK256 SWAP1 MLOAD SWAP4 MLOAD SWAP1 SWAP5 AND PUSH5 0x100000000 MUL SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x2 SLOAD SWAP1 PUSH2 0x145E DUP5 PUSH2 0x17A0 JUMP JUMPDEST PUSH1 0x3 DUP4 SWAP1 SSTORE PUSH1 0x2 DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP4 SWAP1 MSTORE SWAP2 SWAP3 POP PUSH32 0xA282EE798B132F9DC11E06CD4D8E767E562BE8709602CA14FEA7AB3392ACBDAB SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x14B8 PUSH2 0x1739 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE SWAP1 MLOAD SWAP2 DUP3 MSTORE PUSH32 0xD53649B492F738BB59D6825099B5955073EFDA0BF9E3A7AD20DA22E110122E29 SWAP2 ADD PUSH2 0x9C1 JUMP JUMPDEST PUSH2 0x1514 PUSH2 0x1739 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD DUP3 ISZERO ISZERO PUSH1 0x1 PUSH1 0xA8 SHL MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0xD813B248D49C8BF08BE2B6947126DA6763DF310BEED7BEA97756456C5727419A SWAP1 PUSH2 0x9C1 SWAP1 DUP4 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH2 0x1584 PUSH2 0x1739 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1600 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x43B JUMP JUMPDEST PUSH2 0x1609 DUP2 PUSH2 0x17C8 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x37B PUSH2 0x161A DUP4 PUSH2 0x18C4 JUMP JUMPDEST PUSH1 0xD8 DUP2 SWAP1 SHR PUSH4 0xFF00FF00 AND PUSH3 0xFF00FF PUSH1 0xE8 SWAP3 SWAP1 SWAP3 SHR SWAP2 SWAP1 SWAP2 AND OR PUSH1 0x10 DUP2 DUP2 SHL SWAP2 SWAP1 SHR OR SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 ISZERO PUSH2 0x16A0 JUMPI PUSH2 0x1654 DUP6 DUP6 DUP6 PUSH2 0x18D1 JUMP JUMPDEST PUSH2 0x16A0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xD PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C696420636861696E00000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH2 0x16AA DUP6 DUP6 PUSH2 0x18FC JUMP JUMPDEST SWAP1 POP PUSH2 0x16B8 DUP6 DUP6 PUSH1 0x50 PUSH2 0x199E JUMP JUMPDEST SWAP2 POP PUSH2 0x16C4 DUP3 DUP3 PUSH2 0x19C8 JUMP JUMPDEST PUSH2 0x1710 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xC PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C696420776F726B0000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1732 PUSH2 0x161A PUSH2 0x172B DUP5 PUSH1 0x44 PUSH2 0x1F1F JUMP JUMPDEST DUP6 SWAP1 PUSH2 0x1B21 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xF10 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH1 0x0 PUSH2 0x37B DUP3 PUSH1 0x0 PUSH2 0x18FC JUMP JUMPDEST PUSH1 0x0 PUSH2 0x37B PUSH28 0xFFFF0000000000000000000000000000000000000000000000000000 DUP4 PUSH2 0x1B30 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x183D DUP4 DUP6 PUSH2 0x1B3C JUMP JUMPDEST SWAP1 POP PUSH2 0x184D PUSH3 0x127500 PUSH1 0x4 PUSH2 0x1B30 JUMP JUMPDEST DUP2 LT ISZERO PUSH2 0x1865 JUMPI PUSH2 0x1862 PUSH3 0x127500 PUSH1 0x4 PUSH2 0x1B30 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH2 0x1873 PUSH3 0x127500 PUSH1 0x4 PUSH2 0x1B98 JUMP JUMPDEST DUP2 GT ISZERO PUSH2 0x188B JUMPI PUSH2 0x1888 PUSH3 0x127500 PUSH1 0x4 PUSH2 0x1B98 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x0 PUSH2 0x18A4 DUP3 PUSH2 0x189E DUP9 PUSH3 0x10000 PUSH2 0x1B30 JUMP JUMPDEST SWAP1 PUSH2 0x1B98 JUMP JUMPDEST SWAP1 POP PUSH2 0x18BA PUSH3 0x10000 PUSH2 0x189E DUP4 PUSH3 0x127500 PUSH2 0x1B30 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x37B DUP3 PUSH1 0x44 PUSH2 0x1B21 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x18DE DUP6 DUP6 PUSH2 0x1C0E JUMP JUMPDEST SWAP1 POP DUP3 DUP2 EQ PUSH2 0x18F1 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x1732 JUMP JUMPDEST POP PUSH1 0x1 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x190D PUSH2 0x172B DUP5 PUSH1 0x48 PUSH2 0x1F1F JUMP JUMPDEST PUSH1 0xE8 SHR SWAP1 POP PUSH1 0x0 DUP5 PUSH2 0x1920 DUP6 PUSH1 0x4B PUSH2 0x1F1F JUMP JUMPDEST DUP2 MLOAD DUP2 LT PUSH2 0x1930 JUMPI PUSH2 0x1930 PUSH2 0x1F32 JUMP JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 SHR SWAP1 POP PUSH1 0x0 PUSH2 0x1964 DUP4 PUSH1 0x0 PUSH1 0x10 DUP3 PUSH3 0xFFFFFF AND SWAP1 SHR DUP3 PUSH2 0xFF00 AND PUSH1 0x10 DUP5 PUSH3 0xFFFFFF AND SWAP1 SHL OR OR SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH3 0xFFFFFF AND SWAP1 POP PUSH1 0x0 PUSH2 0x1978 PUSH1 0x3 DUP5 PUSH2 0x1F48 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 POP PUSH2 0x1989 DUP2 PUSH2 0x100 PUSH2 0x2045 JUMP JUMPDEST PUSH2 0x1993 SWAP1 DUP4 PUSH2 0x1ECE JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 PUSH1 0x0 DUP4 DUP6 PUSH1 0x20 ADD DUP8 ADD PUSH1 0x2 GAS STATICCALL POP PUSH1 0x20 PUSH1 0x0 PUSH1 0x20 PUSH1 0x0 PUSH1 0x2 GAS STATICCALL POP POP PUSH1 0x0 MLOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x19D7 JUMPI POP PUSH1 0x0 PUSH2 0x37B JUMP JUMPDEST DUP2 PUSH2 0x1B19 DUP5 PUSH1 0x0 DUP2 SWAP1 POP PUSH1 0x8 DUP2 PUSH31 0xFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF AND SWAP1 SHL PUSH1 0x8 DUP3 SWAP1 SHR PUSH31 0xFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF AND OR SWAP1 POP PUSH1 0x10 DUP2 PUSH30 0xFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF AND SWAP1 SHL PUSH1 0x10 DUP3 SWAP1 SHR PUSH30 0xFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF AND OR SWAP1 POP PUSH1 0x20 DUP2 PUSH28 0xFFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF AND SWAP1 SHL PUSH1 0x20 DUP3 SWAP1 SHR PUSH28 0xFFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF AND OR SWAP1 POP PUSH1 0x40 DUP2 PUSH24 0xFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF AND SWAP1 SHL PUSH1 0x40 DUP3 SWAP1 SHR PUSH24 0xFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF AND OR SWAP1 POP PUSH1 0x80 DUP2 SWAP1 SHL PUSH1 0x80 DUP3 SWAP1 SHR OR SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST LT SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1732 DUP4 DUP4 ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1732 DUP3 DUP5 PUSH2 0x1E3F JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1B8E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E646572666C6F7720647572696E67207375627472616374696F6E2E000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH2 0x1732 DUP3 DUP5 PUSH2 0x1EBB JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x0 SUB PUSH2 0x1BAA JUMPI POP PUSH1 0x0 PUSH2 0x37B JUMP JUMPDEST PUSH2 0x1BB4 DUP3 DUP5 PUSH2 0x1ECE JUMP JUMPDEST SWAP1 POP DUP2 PUSH2 0x1BC1 DUP5 DUP4 PUSH2 0x1E3F JUMP JUMPDEST EQ PUSH2 0x37B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F766572666C6F7720647572696E67206D756C7469706C69636174696F6E2E00 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1732 PUSH2 0x1C1E DUP4 PUSH1 0x4 PUSH2 0x1F1F JUMP JUMPDEST DUP5 ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1C39 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1C68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1C80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP5 ADD SWAP2 POP DUP5 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1C94 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1CA6 JUMPI PUSH2 0x1CA6 PUSH2 0x1C40 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x1CCE JUMPI PUSH2 0x1CCE PUSH2 0x1C40 JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP8 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x1CE7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 SWAP3 DUP2 ADD PUSH1 0x20 ADD SWAP3 SWAP1 SWAP3 MSTORE POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1D1F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1D36 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1732 DUP3 PUSH2 0x1D07 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1D51 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x1732 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1D7E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1D96 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1DAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1DB9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1DCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 SWAP3 DUP4 ADD SWAP7 POP SWAP5 POP POP DUP6 ADD CALLDATALOAD SWAP2 POP PUSH2 0x1DE6 PUSH1 0x40 DUP7 ADD PUSH2 0x1D07 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1E03 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x1732 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1E4E JUMPI PUSH2 0x1E4E PUSH2 0x1E13 JUMP JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 DUP2 AND DUP4 DUP3 AND MUL DUP1 DUP3 AND SWAP2 SWAP1 DUP3 DUP2 EQ PUSH2 0x1E77 JUMPI PUSH2 0x1E77 PUSH2 0x1E29 JUMP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 DUP2 AND DUP4 DUP3 AND ADD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x1EA0 JUMPI PUSH2 0x1EA0 PUSH2 0x1E29 JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1EB6 JUMPI PUSH2 0x1EB6 PUSH2 0x1E13 JUMP JUMPDEST POP MOD SWAP1 JUMP JUMPDEST DUP2 DUP2 SUB DUP2 DUP2 GT ISZERO PUSH2 0x37B JUMPI PUSH2 0x37B PUSH2 0x1E29 JUMP JUMPDEST DUP1 DUP3 MUL DUP2 ISZERO DUP3 DUP3 DIV DUP5 EQ OR PUSH2 0x37B JUMPI PUSH2 0x37B PUSH2 0x1E29 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP3 ADD PUSH2 0x1EF7 JUMPI PUSH2 0x1EF7 PUSH2 0x1E29 JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP3 DUP2 AND DUP3 DUP3 AND SUB SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x1EA0 JUMPI PUSH2 0x1EA0 PUSH2 0x1E29 JUMP JUMPDEST DUP1 DUP3 ADD DUP1 DUP3 GT ISZERO PUSH2 0x37B JUMPI PUSH2 0x37B PUSH2 0x1E29 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0xFF DUP3 DUP2 AND DUP3 DUP3 AND SUB SWAP1 DUP2 GT ISZERO PUSH2 0x37B JUMPI PUSH2 0x37B PUSH2 0x1E29 JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 JUMPDEST DUP1 DUP6 GT ISZERO PUSH2 0x1F9C JUMPI DUP2 PUSH1 0x0 NOT DIV DUP3 GT ISZERO PUSH2 0x1F82 JUMPI PUSH2 0x1F82 PUSH2 0x1E29 JUMP JUMPDEST DUP1 DUP6 AND ISZERO PUSH2 0x1F8F JUMPI SWAP2 DUP2 MUL SWAP2 JUMPDEST SWAP4 DUP5 SHR SWAP4 SWAP1 DUP1 MUL SWAP1 PUSH2 0x1F66 JUMP JUMPDEST POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1FB3 JUMPI POP PUSH1 0x1 PUSH2 0x37B JUMP JUMPDEST DUP2 PUSH2 0x1FC0 JUMPI POP PUSH1 0x0 PUSH2 0x37B JUMP JUMPDEST DUP2 PUSH1 0x1 DUP2 EQ PUSH2 0x1FD6 JUMPI PUSH1 0x2 DUP2 EQ PUSH2 0x1FE0 JUMPI PUSH2 0x1FFC JUMP JUMPDEST PUSH1 0x1 SWAP2 POP POP PUSH2 0x37B JUMP JUMPDEST PUSH1 0xFF DUP5 GT ISZERO PUSH2 0x1FF1 JUMPI PUSH2 0x1FF1 PUSH2 0x1E29 JUMP JUMPDEST POP POP PUSH1 0x1 DUP3 SHL PUSH2 0x37B JUMP JUMPDEST POP PUSH1 0x20 DUP4 LT PUSH2 0x133 DUP4 LT AND PUSH1 0x4E DUP5 LT PUSH1 0xB DUP5 LT AND OR ISZERO PUSH2 0x201F JUMPI POP DUP2 DUP2 EXP PUSH2 0x37B JUMP JUMPDEST PUSH2 0x2029 DUP4 DUP4 PUSH2 0x1F61 JUMP JUMPDEST DUP1 PUSH1 0x0 NOT DIV DUP3 GT ISZERO PUSH2 0x203D JUMPI PUSH2 0x203D PUSH2 0x1E29 JUMP JUMPDEST MUL SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1732 DUP4 DUP4 PUSH2 0x1FA4 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP13 PUSH16 0xE81415D65FE4B021F66EAC01B0E7367B 0xD7 LOG0 0xCA DUP9 ORIGIN CREATE 0xCC MUL 0xF6 0x28 SWAP7 SWAP2 STOP 0xB4 PUSH5 0x736F6C6343 STOP ADDMOD GT STOP CALLER ",
|
|
552
|
-
"sourceMap": "
|
|
576
|
+
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1A CALLER PUSH2 0x1F JUMP JUMPDEST PUSH2 0x6F JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH2 0x20D5 DUP1 PUSH2 0x7E PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x18D JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x715018A6 GT PUSH2 0xE3 JUMPI DUP1 PUSH4 0xB70E6BE6 GT PUSH2 0x8C JUMPI DUP1 PUSH4 0xF2FDE38B GT PUSH2 0x66 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x340 JUMPI DUP1 PUSH4 0xF5619FDA EQ PUSH2 0x353 JUMPI DUP1 PUSH4 0xFE9FBB80 EQ PUSH2 0x36E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xB70E6BE6 EQ PUSH2 0x306 JUMPI DUP1 PUSH4 0xD38C29A1 EQ PUSH2 0x31A JUMPI DUP1 PUSH4 0xEB8695EF EQ PUSH2 0x32D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0xBD JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x2C4 JUMPI DUP1 PUSH4 0x95410D2B EQ PUSH2 0x2DF JUMPI DUP1 PUSH4 0xB6A5D7DE EQ PUSH2 0x2F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x715018A6 EQ PUSH2 0x275 JUMPI DUP1 PUSH4 0x76671808 EQ PUSH2 0x27D JUMPI DUP1 PUSH4 0x7CA5B1DD EQ PUSH2 0x2B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x27C97FA5 GT PUSH2 0x145 JUMPI DUP1 PUSH4 0x4CA49F51 GT PUSH2 0x11F JUMPI DUP1 PUSH4 0x4CA49F51 EQ PUSH2 0x22B JUMPI DUP1 PUSH4 0x620414E6 EQ PUSH2 0x23E JUMPI DUP1 PUSH4 0x6DEFBF80 EQ PUSH2 0x251 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x27C97FA5 EQ PUSH2 0x205 JUMPI DUP1 PUSH4 0x2B97BE24 EQ PUSH2 0x218 JUMPI DUP1 PUSH4 0x3A1B77B0 EQ PUSH2 0x220 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x113764BE GT PUSH2 0x176 JUMPI DUP1 PUSH4 0x113764BE EQ PUSH2 0x1D5 JUMPI DUP1 PUSH4 0x189179A3 EQ PUSH2 0x1DD JUMPI DUP1 PUSH4 0x19C9AA32 EQ PUSH2 0x1F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x6A27422 EQ PUSH2 0x192 JUMPI DUP1 PUSH4 0x10B76ED8 EQ PUSH2 0x1B8 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A5 PUSH2 0x1A0 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C75 JUMP JUMPDEST PUSH2 0x391 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1C0 PUSH2 0x3A8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE ADD PUSH2 0x1AF JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH2 0x1A5 JUMP JUMPDEST PUSH2 0x1C0 PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0x1CA4 JUMP JUMPDEST PUSH2 0x408 JUMP JUMPDEST PUSH2 0x203 PUSH2 0x1FE CALLDATASIZE PUSH1 0x4 PUSH2 0x1D72 JUMP JUMPDEST PUSH2 0x800 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x203 PUSH2 0x213 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D8D JUMP JUMPDEST PUSH2 0x9F3 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH2 0x1A5 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x3 SLOAD PUSH2 0x1C0 JUMP JUMPDEST PUSH2 0x203 PUSH2 0x239 CALLDATASIZE PUSH1 0x4 PUSH2 0x1DB6 JUMP JUMPDEST PUSH2 0xA4C JUMP JUMPDEST PUSH2 0x1A5 PUSH2 0x24C CALLDATASIZE PUSH1 0x4 PUSH2 0x1C75 JUMP JUMPDEST PUSH2 0xE15 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x265 SWAP1 PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1AF JUMP JUMPDEST PUSH2 0x203 PUSH2 0xF25 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH2 0x298 SWAP1 PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1AF JUMP JUMPDEST PUSH2 0x203 PUSH2 0x2BF CALLDATASIZE PUSH1 0x4 PUSH2 0x1CA4 JUMP JUMPDEST PUSH2 0xF39 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1AF JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x265 SWAP1 PUSH1 0x1 PUSH1 0xA8 SHL SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x203 PUSH2 0x301 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D8D JUMP JUMPDEST PUSH2 0x14D7 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH2 0x298 SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x203 PUSH2 0x328 CALLDATASIZE PUSH1 0x4 PUSH2 0x1CA4 JUMP JUMPDEST PUSH2 0x1533 JUMP JUMPDEST PUSH2 0x203 PUSH2 0x33B CALLDATASIZE PUSH1 0x4 PUSH2 0x1E3F JUMP JUMPDEST PUSH2 0x155A JUMP JUMPDEST PUSH2 0x203 PUSH2 0x34E CALLDATASIZE PUSH1 0x4 PUSH2 0x1D8D JUMP JUMPDEST PUSH2 0x15CA JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x298 SWAP1 PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x265 PUSH2 0x37C CALLDATASIZE PUSH1 0x4 PUSH2 0x1D8D JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3A2 PUSH2 0x24C PUSH2 0x7E0 DUP5 PUSH2 0x1E8D JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH2 0x3C6 SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH2 0x7E0 PUSH2 0x1EA1 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF SWAP2 DUP3 AND SWAP4 POP PUSH2 0x3EC SWAP2 PUSH1 0x1 PUSH1 0x40 SHL SWAP1 SWAP2 DIV AND PUSH2 0x7E0 PUSH2 0x1EA1 JUMP JUMPDEST PUSH2 0x3F8 SWAP1 PUSH2 0x7DF PUSH2 0x1ECD JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF AND SWAP1 POP SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x50 DUP4 MLOAD PUSH2 0x419 SWAP2 SWAP1 PUSH2 0x1EF5 JUMP JUMPDEST ISZERO PUSH2 0x46B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C696420686561646572206C656E6774680000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x50 DUP4 MLOAD PUSH2 0x479 SWAP2 SWAP1 PUSH2 0x1E8D JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP2 GT DUP1 ISZERO PUSH2 0x48C JUMPI POP PUSH2 0x7E0 DUP2 LT JUMPDEST PUSH2 0x4D8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C6964206E756D626572206F66206865616465727300000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH2 0x4E1 DUP4 PUSH2 0x165A JUMP JUMPDEST PUSH4 0xFFFFFFFF AND SWAP2 POP PUSH1 0x0 DUP1 PUSH2 0x4F7 DUP6 DUP3 DUP1 PUSH2 0x168E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x1 PUSH1 0x40 SHL SWAP1 SWAP2 DIV AND DUP1 DUP4 MSTORE PUSH1 0x4 DUP3 MSTORE SWAP2 DUP5 SWAP1 KECCAK256 DUP5 MLOAD DUP1 DUP7 ADD SWAP1 SWAP6 MSTORE SLOAD PUSH4 0xFFFFFFFF DUP2 AND DUP6 MSTORE PUSH5 0x100000000 SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND SWAP1 DUP5 ADD MSTORE SWAP4 SWAP6 POP SWAP2 SWAP4 POP SWAP1 SWAP2 SWAP1 DUP3 JUMPDEST DUP2 MLOAD PUSH4 0xFFFFFFFF AND DUP9 LT ISZERO PUSH2 0x5BD JUMPI PUSH2 0x579 PUSH1 0x1 DUP5 PUSH2 0x1F09 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE SLOAD PUSH4 0xFFFFFFFF DUP2 AND DUP4 MSTORE PUSH5 0x100000000 SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND SWAP1 DUP3 ADD MSTORE SWAP1 SWAP4 POP SWAP2 SWAP1 POP PUSH2 0x55F JUMP JUMPDEST DUP2 MLOAD PUSH4 0xFFFFFFFF AND PUSH2 0x637 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x43616E6E6F742076616C696461746520636861696E73206265666F7265207265 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6C61792067656E65736973000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x462 JUMP JUMPDEST DUP2 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND DUP6 EQ PUSH2 0x701 JUMPI DUP1 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND DUP6 SUB PUSH2 0x667 JUMPI SWAP1 POP DUP3 PUSH2 0x701 JUMP JUMPDEST PUSH2 0x672 PUSH1 0x1 DUP5 PUSH2 0x1F09 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE SLOAD PUSH4 0xFFFFFFFF DUP2 AND DUP4 MSTORE PUSH5 0x100000000 SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 SWAP5 POP SWAP3 SWAP2 POP DUP6 EQ PUSH2 0x701 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C69642074617267657420696E2068656164657220636861696E0000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH1 0x1 JUMPDEST DUP8 DUP2 LT ISZERO PUSH2 0x7F4 JUMPI PUSH1 0x0 PUSH2 0x723 DUP12 PUSH2 0x71D DUP5 PUSH1 0x50 PUSH2 0x1F1C JUMP JUMPDEST DUP11 PUSH2 0x168E JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD SWAP1 SWAP9 POP SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND DUP8 EQ PUSH2 0x7E0 JUMPI PUSH1 0x0 PUSH2 0x754 PUSH2 0x74D DUP5 PUSH1 0x50 PUSH2 0x1F1C JUMP JUMPDEST DUP14 SWAP1 PUSH2 0x1766 JUMP JUMPDEST DUP5 MLOAD PUSH4 0xFFFFFFFF SWAP2 DUP3 AND SWAP3 POP AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x77B JUMPI POP DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND DUP9 EQ JUMPDEST DUP1 ISZERO PUSH2 0x78D JUMPI POP DUP4 MLOAD PUSH4 0xFFFFFFFF AND DUP2 EQ JUMPDEST PUSH2 0x7D9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C69642074617267657420696E2068656164657220636861696E0000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST POP SWAP2 SWAP3 POP DUP5 SWAP2 JUMPDEST SWAP7 POP DUP1 PUSH2 0x7EC DUP2 PUSH2 0x1F33 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x704 JUMP JUMPDEST POP POP POP POP POP POP POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x859 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x52656C6179206973206E6F7420726561647920666F7220757365000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH2 0x861 PUSH2 0x1787 JUMP JUMPDEST PUSH2 0x7E0 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF AND LT PUSH2 0x8BC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x50726F6F66206C656E6774682065786365737369766500000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF AND GT PUSH2 0x916 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x50726F6F66206C656E677468206D6179206E6F74206265207A65726F00000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 SWAP2 DIV DUP2 AND SWAP1 DUP3 AND SUB PUSH2 0x97C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x50726F6F66206C656E67746820756E6368616E67656400000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x1 PUSH1 0xB0 SHL PUSH8 0xFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0x3E9F904D8CF11753C79B67C8259C582056D4A7D8AF120F81257A59EEB8824B96 SWAP1 PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH2 0x9FB PUSH2 0x1787 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE SWAP1 MLOAD SWAP2 DUP3 MSTORE PUSH32 0x7498B96BEEABEA5AD3139F1A2861A03E480034254E36B10AAE2E6E42AD7B4B68 SWAP2 ADD PUSH2 0x9E8 JUMP JUMPDEST PUSH2 0xA54 PUSH2 0x1787 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xAAE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x47656E6573697320616C726561647920706572666F726D656400000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH1 0x50 DUP4 EQ PUSH2 0xAFE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C69642067656E6573697320686561646572206C656E677468000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH2 0xB0A PUSH2 0x7E0 DUP4 PUSH2 0x1EF5 JUMP JUMPDEST ISZERO PUSH2 0xB7D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C696420686569676874206F662072656C61792067656E6573697320 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x626C6F636B000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x462 JUMP JUMPDEST PUSH2 0x7E0 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF AND LT PUSH2 0xBD8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x50726F6F66206C656E6774682065786365737369766500000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF AND GT PUSH2 0xC32 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x50726F6F66206C656E677468206D6179206E6F74206265207A65726F00000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH2 0xC3E PUSH2 0x7E0 DUP4 PUSH2 0x1E8D JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 AND PUSH8 0xFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 DUP3 OR PUSH1 0x1 PUSH1 0x40 SHL SWAP3 SWAP1 SWAP3 MUL SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP7 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP5 DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH2 0xCC4 SWAP2 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x17E1 SWAP3 POP POP POP JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xD07 DUP7 DUP7 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x165A SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH4 0xFFFFFFFF SWAP3 DUP4 AND DUP1 DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP1 DUP8 AND PUSH1 0x20 DUP1 DUP6 ADD SWAP2 DUP3 MSTORE PUSH1 0x1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 SWAP1 SWAP3 MSTORE SWAP6 DUP2 KECCAK256 SWAP5 MLOAD SWAP2 MLOAD SWAP1 SWAP3 AND PUSH5 0x100000000 MUL SWAP6 AND SWAP5 SWAP1 SWAP5 OR SWAP1 SWAP2 SSTORE DUP3 SLOAD SWAP2 DUP7 AND PUSH1 0x1 PUSH1 0xB0 SHL MUL PUSH32 0xFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SWAP2 SSTORE SWAP1 POP PUSH2 0xDA2 DUP3 PUSH2 0x17EE JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x1 PUSH1 0xA0 SHL OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x2381D16925551C2FB1A5EDFCF4FCE2F6D085E1F85F4B88340C09C9D191F9D4E9 SWAP1 PUSH2 0xE05 SWAP1 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x0 SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF AND DUP3 LT ISZERO PUSH2 0xE74 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45706F6368206973206265666F72652072656C61792067656E65736973000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND DUP3 GT ISZERO PUSH2 0xEFC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x45706F6368206973206E6F742070726F76656E20746F207468652072656C6179 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2079657400000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x462 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x3A2 SWAP1 PUSH5 0x100000000 SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH2 0x17EE JUMP JUMPDEST PUSH2 0xF2D PUSH2 0x1787 JUMP JUMPDEST PUSH2 0xF37 PUSH1 0x0 PUSH2 0x1816 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0xF92 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x52656C6179206973206E6F7420726561647920666F7220757365000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA8 SHL SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1003 JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x1003 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5375626D697474657220756E617574686F72697A656400000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x1022 SWAP1 PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH1 0x2 PUSH2 0x1EA1 JUMP JUMPDEST PUSH2 0x102D SWAP1 PUSH1 0x50 PUSH2 0x1EA1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 MLOAD EQ PUSH2 0x1086 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C696420686561646572206C656E6774680000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD SWAP1 SWAP2 PUSH5 0x100000000 SWAP1 SWAP2 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND SWAP1 DUP1 JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 LT ISZERO PUSH2 0x1182 JUMPI PUSH1 0x0 DUP1 PUSH2 0x10F4 DUP8 PUSH2 0x10EE DUP6 PUSH1 0x50 PUSH2 0x1F1C JUMP JUMPDEST DUP7 PUSH2 0x168E JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 DUP2 EQ PUSH2 0x116D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C69642074617267657420696E207072652D72657461726765742068 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6561646572730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x462 JUMP JUMPDEST POP SWAP2 POP DUP1 PUSH2 0x117A DUP2 PUSH2 0x1F33 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x10C1 JUMP JUMPDEST POP PUSH1 0x0 DUP1 SLOAD PUSH2 0x11C4 SWAP1 PUSH2 0x11A8 SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH2 0x1F4C JUMP JUMPDEST PUSH2 0x11B3 SWAP1 PUSH1 0x50 PUSH2 0x1EA1 JUMP JUMPDEST DUP7 SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH2 0x1766 JUMP JUMPDEST PUSH4 0xFFFFFFFF AND SWAP1 POP TIMESTAMP DUP2 LT PUSH2 0x121B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45706F63682063616E6E6F7420656E6420696E20746865206675747572650000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST DUP4 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x1232 SWAP1 DUP6 SWAP1 PUSH4 0xFFFFFFFF AND DUP5 PUSH2 0x187E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP1 PUSH2 0x126E PUSH1 0x0 PUSH1 0x16 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH1 0x50 PUSH2 0x125D SWAP2 SWAP1 PUSH2 0x1EA1 JUMP JUMPDEST DUP10 SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH2 0x1766 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH4 0xFFFFFFFF SWAP2 SWAP1 SWAP2 AND SWAP2 POP PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x12AD SWAP1 PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH1 0x2 PUSH2 0x1EA1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 LT ISZERO PUSH2 0x13BF JUMPI PUSH1 0x0 DUP1 PUSH2 0x12D0 DUP12 PUSH2 0x71D DUP6 PUSH1 0x50 PUSH2 0x1F1C JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 PUSH1 0x0 SUB PUSH2 0x1335 JUMPI DUP1 SWAP5 POP DUP1 DUP7 AND DUP2 EQ PUSH2 0x1330 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C69642074617267657420696E206E65772065706F63680000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH2 0x13AA JUMP JUMPDEST DUP5 DUP2 EQ PUSH2 0x13AA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x27 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E657870656374656420746172676574206368616E67652061667465722072 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6574617267657400000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x462 JUMP JUMPDEST POP SWAP6 POP DUP1 PUSH2 0x13B7 DUP2 PUSH2 0x1F33 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x128E JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x8 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH1 0x1 PUSH2 0x13E3 SWAP2 SWAP1 PUSH2 0x1ECD JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DUP2 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH4 0xFFFFFFFF DUP1 DUP8 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP1 DUP10 AND PUSH1 0x20 DUP1 DUP6 ADD SWAP2 DUP3 MSTORE SWAP6 SWAP1 SWAP7 DIV SWAP1 SWAP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 SWAP1 SWAP5 MSTORE SWAP2 DUP4 KECCAK256 SWAP1 MLOAD SWAP4 MLOAD SWAP1 SWAP5 AND PUSH5 0x100000000 MUL SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x2 SLOAD SWAP1 PUSH2 0x1485 DUP5 PUSH2 0x17EE JUMP JUMPDEST PUSH1 0x3 DUP4 SWAP1 SSTORE PUSH1 0x2 DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP4 SWAP1 MSTORE SWAP2 SWAP3 POP PUSH32 0xA282EE798B132F9DC11E06CD4D8E767E562BE8709602CA14FEA7AB3392ACBDAB SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x14DF PUSH2 0x1787 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE SWAP1 MLOAD SWAP2 DUP3 MSTORE PUSH32 0xD53649B492F738BB59D6825099B5955073EFDA0BF9E3A7AD20DA22E110122E29 SWAP2 ADD PUSH2 0x9E8 JUMP JUMPDEST PUSH2 0x153B PUSH2 0x1787 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x154E PUSH2 0x1549 DUP4 PUSH2 0x17E1 JUMP JUMPDEST PUSH2 0x17EE JUMP JUMPDEST PUSH1 0x2 DUP2 SWAP1 SSTORE PUSH1 0x3 SSTORE POP POP JUMP JUMPDEST PUSH2 0x1562 PUSH2 0x1787 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD DUP3 ISZERO ISZERO PUSH1 0x1 PUSH1 0xA8 SHL MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0xD813B248D49C8BF08BE2B6947126DA6763DF310BEED7BEA97756456C5727419A SWAP1 PUSH2 0x9E8 SWAP1 DUP4 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH2 0x15D2 PUSH2 0x1787 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x164E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x462 JUMP JUMPDEST PUSH2 0x1657 DUP2 PUSH2 0x1816 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3A2 PUSH2 0x1668 DUP4 PUSH2 0x1912 JUMP JUMPDEST PUSH1 0xD8 DUP2 SWAP1 SHR PUSH4 0xFF00FF00 AND PUSH3 0xFF00FF PUSH1 0xE8 SWAP3 SWAP1 SWAP3 SHR SWAP2 SWAP1 SWAP2 AND OR PUSH1 0x10 DUP2 DUP2 SHL SWAP2 SWAP1 SHR OR SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 ISZERO PUSH2 0x16EE JUMPI PUSH2 0x16A2 DUP6 DUP6 DUP6 PUSH2 0x191F JUMP JUMPDEST PUSH2 0x16EE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xD PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C696420636861696E00000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH2 0x16F8 DUP6 DUP6 PUSH2 0x194A JUMP JUMPDEST SWAP1 POP PUSH2 0x1706 DUP6 DUP6 PUSH1 0x50 PUSH2 0x19EC JUMP JUMPDEST SWAP2 POP PUSH2 0x1712 DUP3 DUP3 PUSH2 0x1A16 JUMP JUMPDEST PUSH2 0x175E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xC PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C696420776F726B0000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1780 PUSH2 0x1668 PUSH2 0x1779 DUP5 PUSH1 0x44 PUSH2 0x1F6D JUMP JUMPDEST DUP6 SWAP1 PUSH2 0x1B6F JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xF37 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3A2 DUP3 PUSH1 0x0 PUSH2 0x194A JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3A2 PUSH28 0xFFFF0000000000000000000000000000000000000000000000000000 DUP4 PUSH2 0x1B7E JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x188B DUP4 DUP6 PUSH2 0x1B8A JUMP JUMPDEST SWAP1 POP PUSH2 0x189B PUSH3 0x127500 PUSH1 0x4 PUSH2 0x1B7E JUMP JUMPDEST DUP2 LT ISZERO PUSH2 0x18B3 JUMPI PUSH2 0x18B0 PUSH3 0x127500 PUSH1 0x4 PUSH2 0x1B7E JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH2 0x18C1 PUSH3 0x127500 PUSH1 0x4 PUSH2 0x1BE6 JUMP JUMPDEST DUP2 GT ISZERO PUSH2 0x18D9 JUMPI PUSH2 0x18D6 PUSH3 0x127500 PUSH1 0x4 PUSH2 0x1BE6 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x0 PUSH2 0x18F2 DUP3 PUSH2 0x18EC DUP9 PUSH3 0x10000 PUSH2 0x1B7E JUMP JUMPDEST SWAP1 PUSH2 0x1BE6 JUMP JUMPDEST SWAP1 POP PUSH2 0x1908 PUSH3 0x10000 PUSH2 0x18EC DUP4 PUSH3 0x127500 PUSH2 0x1B7E JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3A2 DUP3 PUSH1 0x44 PUSH2 0x1B6F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x192C DUP6 DUP6 PUSH2 0x1C5C JUMP JUMPDEST SWAP1 POP DUP3 DUP2 EQ PUSH2 0x193F JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x1780 JUMP JUMPDEST POP PUSH1 0x1 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x195B PUSH2 0x1779 DUP5 PUSH1 0x48 PUSH2 0x1F6D JUMP JUMPDEST PUSH1 0xE8 SHR SWAP1 POP PUSH1 0x0 DUP5 PUSH2 0x196E DUP6 PUSH1 0x4B PUSH2 0x1F6D JUMP JUMPDEST DUP2 MLOAD DUP2 LT PUSH2 0x197E JUMPI PUSH2 0x197E PUSH2 0x1F80 JUMP JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 SHR SWAP1 POP PUSH1 0x0 PUSH2 0x19B2 DUP4 PUSH1 0x0 PUSH1 0x10 DUP3 PUSH3 0xFFFFFF AND SWAP1 SHR DUP3 PUSH2 0xFF00 AND PUSH1 0x10 DUP5 PUSH3 0xFFFFFF AND SWAP1 SHL OR OR SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH3 0xFFFFFF AND SWAP1 POP PUSH1 0x0 PUSH2 0x19C6 PUSH1 0x3 DUP5 PUSH2 0x1F96 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 POP PUSH2 0x19D7 DUP2 PUSH2 0x100 PUSH2 0x2093 JUMP JUMPDEST PUSH2 0x19E1 SWAP1 DUP4 PUSH2 0x1F1C JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 PUSH1 0x0 DUP4 DUP6 PUSH1 0x20 ADD DUP8 ADD PUSH1 0x2 GAS STATICCALL POP PUSH1 0x20 PUSH1 0x0 PUSH1 0x20 PUSH1 0x0 PUSH1 0x2 GAS STATICCALL POP POP PUSH1 0x0 MLOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1A25 JUMPI POP PUSH1 0x0 PUSH2 0x3A2 JUMP JUMPDEST DUP2 PUSH2 0x1B67 DUP5 PUSH1 0x0 DUP2 SWAP1 POP PUSH1 0x8 DUP2 PUSH31 0xFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF AND SWAP1 SHL PUSH1 0x8 DUP3 SWAP1 SHR PUSH31 0xFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF AND OR SWAP1 POP PUSH1 0x10 DUP2 PUSH30 0xFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF AND SWAP1 SHL PUSH1 0x10 DUP3 SWAP1 SHR PUSH30 0xFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF AND OR SWAP1 POP PUSH1 0x20 DUP2 PUSH28 0xFFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF AND SWAP1 SHL PUSH1 0x20 DUP3 SWAP1 SHR PUSH28 0xFFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF AND OR SWAP1 POP PUSH1 0x40 DUP2 PUSH24 0xFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF AND SWAP1 SHL PUSH1 0x40 DUP3 SWAP1 SHR PUSH24 0xFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF AND OR SWAP1 POP PUSH1 0x80 DUP2 SWAP1 SHL PUSH1 0x80 DUP3 SWAP1 SHR OR SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST LT SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1780 DUP4 DUP4 ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1780 DUP3 DUP5 PUSH2 0x1E8D JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1BDC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E646572666C6F7720647572696E67207375627472616374696F6E2E000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH2 0x1780 DUP3 DUP5 PUSH2 0x1F09 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x0 SUB PUSH2 0x1BF8 JUMPI POP PUSH1 0x0 PUSH2 0x3A2 JUMP JUMPDEST PUSH2 0x1C02 DUP3 DUP5 PUSH2 0x1F1C JUMP JUMPDEST SWAP1 POP DUP2 PUSH2 0x1C0F DUP5 DUP4 PUSH2 0x1E8D JUMP JUMPDEST EQ PUSH2 0x3A2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F766572666C6F7720647572696E67206D756C7469706C69636174696F6E2E00 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1780 PUSH2 0x1C6C DUP4 PUSH1 0x4 PUSH2 0x1F6D JUMP JUMPDEST DUP5 ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1C87 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1CB6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1CCE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP5 ADD SWAP2 POP DUP5 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1CE2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1CF4 JUMPI PUSH2 0x1CF4 PUSH2 0x1C8E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x1D1C JUMPI PUSH2 0x1D1C PUSH2 0x1C8E JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP8 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x1D35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 SWAP3 DUP2 ADD PUSH1 0x20 ADD SWAP3 SWAP1 SWAP3 MSTORE POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1D6D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1D84 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1780 DUP3 PUSH2 0x1D55 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1D9F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x1780 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1DCC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1DE4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1DF8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1E07 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1E19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 SWAP3 DUP4 ADD SWAP7 POP SWAP5 POP POP DUP6 ADD CALLDATALOAD SWAP2 POP PUSH2 0x1E34 PUSH1 0x40 DUP7 ADD PUSH2 0x1D55 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1E51 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x1780 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1E9C JUMPI PUSH2 0x1E9C PUSH2 0x1E61 JUMP JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 DUP2 AND DUP4 DUP3 AND MUL DUP1 DUP3 AND SWAP2 SWAP1 DUP3 DUP2 EQ PUSH2 0x1EC5 JUMPI PUSH2 0x1EC5 PUSH2 0x1E77 JUMP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 DUP2 AND DUP4 DUP3 AND ADD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x1EEE JUMPI PUSH2 0x1EEE PUSH2 0x1E77 JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1F04 JUMPI PUSH2 0x1F04 PUSH2 0x1E61 JUMP JUMPDEST POP MOD SWAP1 JUMP JUMPDEST DUP2 DUP2 SUB DUP2 DUP2 GT ISZERO PUSH2 0x3A2 JUMPI PUSH2 0x3A2 PUSH2 0x1E77 JUMP JUMPDEST DUP1 DUP3 MUL DUP2 ISZERO DUP3 DUP3 DIV DUP5 EQ OR PUSH2 0x3A2 JUMPI PUSH2 0x3A2 PUSH2 0x1E77 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP3 ADD PUSH2 0x1F45 JUMPI PUSH2 0x1F45 PUSH2 0x1E77 JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP3 DUP2 AND DUP3 DUP3 AND SUB SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x1EEE JUMPI PUSH2 0x1EEE PUSH2 0x1E77 JUMP JUMPDEST DUP1 DUP3 ADD DUP1 DUP3 GT ISZERO PUSH2 0x3A2 JUMPI PUSH2 0x3A2 PUSH2 0x1E77 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0xFF DUP3 DUP2 AND DUP3 DUP3 AND SUB SWAP1 DUP2 GT ISZERO PUSH2 0x3A2 JUMPI PUSH2 0x3A2 PUSH2 0x1E77 JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 JUMPDEST DUP1 DUP6 GT ISZERO PUSH2 0x1FEA JUMPI DUP2 PUSH1 0x0 NOT DIV DUP3 GT ISZERO PUSH2 0x1FD0 JUMPI PUSH2 0x1FD0 PUSH2 0x1E77 JUMP JUMPDEST DUP1 DUP6 AND ISZERO PUSH2 0x1FDD JUMPI SWAP2 DUP2 MUL SWAP2 JUMPDEST SWAP4 DUP5 SHR SWAP4 SWAP1 DUP1 MUL SWAP1 PUSH2 0x1FB4 JUMP JUMPDEST POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x2001 JUMPI POP PUSH1 0x1 PUSH2 0x3A2 JUMP JUMPDEST DUP2 PUSH2 0x200E JUMPI POP PUSH1 0x0 PUSH2 0x3A2 JUMP JUMPDEST DUP2 PUSH1 0x1 DUP2 EQ PUSH2 0x2024 JUMPI PUSH1 0x2 DUP2 EQ PUSH2 0x202E JUMPI PUSH2 0x204A JUMP JUMPDEST PUSH1 0x1 SWAP2 POP POP PUSH2 0x3A2 JUMP JUMPDEST PUSH1 0xFF DUP5 GT ISZERO PUSH2 0x203F JUMPI PUSH2 0x203F PUSH2 0x1E77 JUMP JUMPDEST POP POP PUSH1 0x1 DUP3 SHL PUSH2 0x3A2 JUMP JUMPDEST POP PUSH1 0x20 DUP4 LT PUSH2 0x133 DUP4 LT AND PUSH1 0x4E DUP5 LT PUSH1 0xB DUP5 LT AND OR ISZERO PUSH2 0x206D JUMPI POP DUP2 DUP2 EXP PUSH2 0x3A2 JUMP JUMPDEST PUSH2 0x2077 DUP4 DUP4 PUSH2 0x1FAF JUMP JUMPDEST DUP1 PUSH1 0x0 NOT DIV DUP3 GT ISZERO PUSH2 0x208B JUMPI PUSH2 0x208B PUSH2 0x1E77 JUMP JUMPDEST MUL SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1780 DUP4 DUP4 PUSH2 0x1FF2 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x26 MOD 0xE7 PUSH8 0xC86058F121FB4BBC TIMESTAMP DUP2 0x2C SWAP2 SWAP11 MLOAD EXTCODEHASH 0x29 LOG2 BALANCE 0xE5 0xB9 DUP12 DUP5 EXTCODEHASH 0xE6 BYTE PUSH6 0x6E4764736F6C PUSH4 0x43000811 STOP CALLER ",
|
|
577
|
+
"sourceMap": "1749:573:111:-:0;;;;;;;;;;;;-1:-1:-1;936:32:49;719:10:67;936:18:49;:32::i;:::-;1749:573:111;;2433:187:49;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:49;;;-1:-1:-1;;;;;;2541:17:49;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;1749:573:111:-;;;;;;;"
|
|
553
578
|
},
|
|
554
579
|
"deployedBytecode": {
|
|
555
580
|
"functionDebugData": {
|
|
556
581
|
"@_checkOwner_17318": {
|
|
557
|
-
"entryPoint":
|
|
582
|
+
"entryPoint": 6023,
|
|
558
583
|
"id": 17318,
|
|
559
584
|
"parameterSlots": 0,
|
|
560
585
|
"returnSlots": 0
|
|
@@ -566,7 +591,7 @@
|
|
|
566
591
|
"returnSlots": 1
|
|
567
592
|
},
|
|
568
593
|
"@_transferOwnership_17375": {
|
|
569
|
-
"entryPoint":
|
|
594
|
+
"entryPoint": 6166,
|
|
570
595
|
"id": 17375,
|
|
571
596
|
"parameterSlots": 1,
|
|
572
597
|
"returnSlots": 0
|
|
@@ -578,13 +603,13 @@
|
|
|
578
603
|
"returnSlots": 0
|
|
579
604
|
},
|
|
580
605
|
"@authorize_38984": {
|
|
581
|
-
"entryPoint":
|
|
606
|
+
"entryPoint": 5335,
|
|
582
607
|
"id": 38984,
|
|
583
608
|
"parameterSlots": 1,
|
|
584
609
|
"returnSlots": 0
|
|
585
610
|
},
|
|
586
611
|
"@calculateDifficulty_1854": {
|
|
587
|
-
"entryPoint":
|
|
612
|
+
"entryPoint": 6126,
|
|
588
613
|
"id": 1854,
|
|
589
614
|
"parameterSlots": 1,
|
|
590
615
|
"returnSlots": 1
|
|
@@ -596,49 +621,49 @@
|
|
|
596
621
|
"returnSlots": 0
|
|
597
622
|
},
|
|
598
623
|
"@deauthorize_39003": {
|
|
599
|
-
"entryPoint":
|
|
624
|
+
"entryPoint": 2547,
|
|
600
625
|
"id": 39003,
|
|
601
626
|
"parameterSlots": 1,
|
|
602
627
|
"returnSlots": 0
|
|
603
628
|
},
|
|
604
629
|
"@div_3013": {
|
|
605
|
-
"entryPoint":
|
|
630
|
+
"entryPoint": 7038,
|
|
606
631
|
"id": 3013,
|
|
607
632
|
"parameterSlots": 2,
|
|
608
633
|
"returnSlots": 1
|
|
609
634
|
},
|
|
610
635
|
"@extractPrevBlockLEAt_1886": {
|
|
611
|
-
"entryPoint":
|
|
636
|
+
"entryPoint": 7260,
|
|
612
637
|
"id": 1886,
|
|
613
638
|
"parameterSlots": 2,
|
|
614
639
|
"returnSlots": 1
|
|
615
640
|
},
|
|
616
641
|
"@extractTargetAt_1840": {
|
|
617
|
-
"entryPoint":
|
|
642
|
+
"entryPoint": 6474,
|
|
618
643
|
"id": 1840,
|
|
619
644
|
"parameterSlots": 2,
|
|
620
645
|
"returnSlots": 1
|
|
621
646
|
},
|
|
622
647
|
"@extractTarget_1784": {
|
|
623
|
-
"entryPoint":
|
|
648
|
+
"entryPoint": 6113,
|
|
624
649
|
"id": 1784,
|
|
625
650
|
"parameterSlots": 1,
|
|
626
651
|
"returnSlots": 1
|
|
627
652
|
},
|
|
628
653
|
"@extractTimestampAt_38749": {
|
|
629
|
-
"entryPoint":
|
|
654
|
+
"entryPoint": 5990,
|
|
630
655
|
"id": 38749,
|
|
631
656
|
"parameterSlots": 2,
|
|
632
657
|
"returnSlots": 1
|
|
633
658
|
},
|
|
634
659
|
"@extractTimestampLE_1900": {
|
|
635
|
-
"entryPoint":
|
|
660
|
+
"entryPoint": 6418,
|
|
636
661
|
"id": 1900,
|
|
637
662
|
"parameterSlots": 1,
|
|
638
663
|
"returnSlots": 1
|
|
639
664
|
},
|
|
640
665
|
"@extractTimestamp_1918": {
|
|
641
|
-
"entryPoint":
|
|
666
|
+
"entryPoint": 5722,
|
|
642
667
|
"id": 1918,
|
|
643
668
|
"parameterSlots": 1,
|
|
644
669
|
"returnSlots": 1
|
|
@@ -650,13 +675,13 @@
|
|
|
650
675
|
"returnSlots": 0
|
|
651
676
|
},
|
|
652
677
|
"@genesis_38908": {
|
|
653
|
-
"entryPoint":
|
|
678
|
+
"entryPoint": 2636,
|
|
654
679
|
"id": 38908,
|
|
655
680
|
"parameterSlots": 4,
|
|
656
681
|
"returnSlots": 0
|
|
657
682
|
},
|
|
658
683
|
"@getBlockDifficulty_39479": {
|
|
659
|
-
"entryPoint":
|
|
684
|
+
"entryPoint": 913,
|
|
660
685
|
"id": 39479,
|
|
661
686
|
"parameterSlots": 1,
|
|
662
687
|
"returnSlots": 1
|
|
@@ -667,32 +692,32 @@
|
|
|
667
692
|
"parameterSlots": 0,
|
|
668
693
|
"returnSlots": 2
|
|
669
694
|
},
|
|
670
|
-
"@
|
|
695
|
+
"@getCurrentEpochDifficulty_39512": {
|
|
671
696
|
"entryPoint": null,
|
|
672
|
-
"id":
|
|
697
|
+
"id": 39512,
|
|
673
698
|
"parameterSlots": 0,
|
|
674
699
|
"returnSlots": 1
|
|
675
700
|
},
|
|
676
701
|
"@getEpochDifficulty_39564": {
|
|
677
|
-
"entryPoint":
|
|
702
|
+
"entryPoint": 3605,
|
|
678
703
|
"id": 39564,
|
|
679
704
|
"parameterSlots": 1,
|
|
680
705
|
"returnSlots": 1
|
|
681
706
|
},
|
|
682
|
-
"@
|
|
707
|
+
"@getPrevEpochDifficulty_39521": {
|
|
683
708
|
"entryPoint": null,
|
|
684
|
-
"id":
|
|
709
|
+
"id": 39521,
|
|
685
710
|
"parameterSlots": 0,
|
|
686
711
|
"returnSlots": 1
|
|
687
712
|
},
|
|
688
713
|
"@getRelayRange_39503": {
|
|
689
|
-
"entryPoint":
|
|
714
|
+
"entryPoint": 936,
|
|
690
715
|
"id": 39503,
|
|
691
716
|
"parameterSlots": 0,
|
|
692
717
|
"returnSlots": 2
|
|
693
718
|
},
|
|
694
719
|
"@hash256Slice_678": {
|
|
695
|
-
"entryPoint":
|
|
720
|
+
"entryPoint": 6636,
|
|
696
721
|
"id": 678,
|
|
697
722
|
"parameterSlots": 3,
|
|
698
723
|
"returnSlots": 1
|
|
@@ -704,7 +729,7 @@
|
|
|
704
729
|
"returnSlots": 0
|
|
705
730
|
},
|
|
706
731
|
"@mul_2998": {
|
|
707
|
-
"entryPoint":
|
|
732
|
+
"entryPoint": 7142,
|
|
708
733
|
"id": 2998,
|
|
709
734
|
"parameterSlots": 2,
|
|
710
735
|
"returnSlots": 1
|
|
@@ -728,19 +753,19 @@
|
|
|
728
753
|
"returnSlots": 0
|
|
729
754
|
},
|
|
730
755
|
"@renounceOwnership_17332": {
|
|
731
|
-
"entryPoint":
|
|
756
|
+
"entryPoint": 3877,
|
|
732
757
|
"id": 17332,
|
|
733
758
|
"parameterSlots": 0,
|
|
734
759
|
"returnSlots": 0
|
|
735
760
|
},
|
|
736
761
|
"@retargetAlgorithm_2201": {
|
|
737
|
-
"entryPoint":
|
|
762
|
+
"entryPoint": 6270,
|
|
738
763
|
"id": 2201,
|
|
739
764
|
"parameterSlots": 3,
|
|
740
765
|
"returnSlots": 1
|
|
741
766
|
},
|
|
742
767
|
"@retarget_39235": {
|
|
743
|
-
"entryPoint":
|
|
768
|
+
"entryPoint": 3897,
|
|
744
769
|
"id": 39235,
|
|
745
770
|
"parameterSlots": 1,
|
|
746
771
|
"returnSlots": 0
|
|
@@ -764,13 +789,19 @@
|
|
|
764
789
|
"returnSlots": 1
|
|
765
790
|
},
|
|
766
791
|
"@setAuthorizationStatus_38965": {
|
|
767
|
-
"entryPoint":
|
|
792
|
+
"entryPoint": 5466,
|
|
768
793
|
"id": 38965,
|
|
769
794
|
"parameterSlots": 1,
|
|
770
795
|
"returnSlots": 0
|
|
771
796
|
},
|
|
797
|
+
"@setDifficultyFromHeaders_40407": {
|
|
798
|
+
"entryPoint": 5427,
|
|
799
|
+
"id": 40407,
|
|
800
|
+
"parameterSlots": 1,
|
|
801
|
+
"returnSlots": 0
|
|
802
|
+
},
|
|
772
803
|
"@setProofLength_38948": {
|
|
773
|
-
"entryPoint":
|
|
804
|
+
"entryPoint": 2048,
|
|
774
805
|
"id": 38948,
|
|
775
806
|
"parameterSlots": 1,
|
|
776
807
|
"returnSlots": 0
|
|
@@ -788,85 +819,85 @@
|
|
|
788
819
|
"returnSlots": 1
|
|
789
820
|
},
|
|
790
821
|
"@slice4_2372": {
|
|
791
|
-
"entryPoint":
|
|
822
|
+
"entryPoint": 7023,
|
|
792
823
|
"id": 2372,
|
|
793
824
|
"parameterSlots": 2,
|
|
794
825
|
"returnSlots": 1
|
|
795
826
|
},
|
|
796
827
|
"@sub_3035": {
|
|
797
|
-
"entryPoint":
|
|
828
|
+
"entryPoint": 7050,
|
|
798
829
|
"id": 3035,
|
|
799
830
|
"parameterSlots": 2,
|
|
800
831
|
"returnSlots": 1
|
|
801
832
|
},
|
|
802
833
|
"@transferOwnership_17355": {
|
|
803
|
-
"entryPoint":
|
|
834
|
+
"entryPoint": 5578,
|
|
804
835
|
"id": 17355,
|
|
805
836
|
"parameterSlots": 1,
|
|
806
837
|
"returnSlots": 0
|
|
807
838
|
},
|
|
808
839
|
"@validateChain_39464": {
|
|
809
|
-
"entryPoint":
|
|
840
|
+
"entryPoint": 1032,
|
|
810
841
|
"id": 39464,
|
|
811
842
|
"parameterSlots": 1,
|
|
812
843
|
"returnSlots": 2
|
|
813
844
|
},
|
|
814
845
|
"@validateHeaderPrevHash_3342": {
|
|
815
|
-
"entryPoint":
|
|
846
|
+
"entryPoint": 6431,
|
|
816
847
|
"id": 3342,
|
|
817
848
|
"parameterSlots": 3,
|
|
818
849
|
"returnSlots": 1
|
|
819
850
|
},
|
|
820
851
|
"@validateHeaderWork_3313": {
|
|
821
|
-
"entryPoint":
|
|
852
|
+
"entryPoint": 6678,
|
|
822
853
|
"id": 3313,
|
|
823
854
|
"parameterSlots": 2,
|
|
824
855
|
"returnSlots": 1
|
|
825
856
|
},
|
|
826
857
|
"@validateHeader_39624": {
|
|
827
|
-
"entryPoint":
|
|
858
|
+
"entryPoint": 5774,
|
|
828
859
|
"id": 39624,
|
|
829
860
|
"parameterSlots": 3,
|
|
830
861
|
"returnSlots": 2
|
|
831
862
|
},
|
|
832
863
|
"abi_decode_tuple_t_address": {
|
|
833
|
-
"entryPoint":
|
|
864
|
+
"entryPoint": 7565,
|
|
834
865
|
"id": null,
|
|
835
866
|
"parameterSlots": 2,
|
|
836
867
|
"returnSlots": 1
|
|
837
868
|
},
|
|
838
869
|
"abi_decode_tuple_t_bool": {
|
|
839
|
-
"entryPoint":
|
|
870
|
+
"entryPoint": 7743,
|
|
840
871
|
"id": null,
|
|
841
872
|
"parameterSlots": 2,
|
|
842
873
|
"returnSlots": 1
|
|
843
874
|
},
|
|
844
875
|
"abi_decode_tuple_t_bytes_calldata_ptrt_uint256t_uint64": {
|
|
845
|
-
"entryPoint":
|
|
876
|
+
"entryPoint": 7606,
|
|
846
877
|
"id": null,
|
|
847
878
|
"parameterSlots": 2,
|
|
848
879
|
"returnSlots": 4
|
|
849
880
|
},
|
|
850
881
|
"abi_decode_tuple_t_bytes_memory_ptr": {
|
|
851
|
-
"entryPoint":
|
|
882
|
+
"entryPoint": 7332,
|
|
852
883
|
"id": null,
|
|
853
884
|
"parameterSlots": 2,
|
|
854
885
|
"returnSlots": 1
|
|
855
886
|
},
|
|
856
887
|
"abi_decode_tuple_t_uint256": {
|
|
857
|
-
"entryPoint":
|
|
888
|
+
"entryPoint": 7285,
|
|
858
889
|
"id": null,
|
|
859
890
|
"parameterSlots": 2,
|
|
860
891
|
"returnSlots": 1
|
|
861
892
|
},
|
|
862
893
|
"abi_decode_tuple_t_uint64": {
|
|
863
|
-
"entryPoint":
|
|
894
|
+
"entryPoint": 7538,
|
|
864
895
|
"id": null,
|
|
865
896
|
"parameterSlots": 2,
|
|
866
897
|
"returnSlots": 1
|
|
867
898
|
},
|
|
868
899
|
"abi_decode_uint64": {
|
|
869
|
-
"entryPoint":
|
|
900
|
+
"entryPoint": 7509,
|
|
870
901
|
"id": null,
|
|
871
902
|
"parameterSlots": 1,
|
|
872
903
|
"returnSlots": 1
|
|
@@ -1052,103 +1083,103 @@
|
|
|
1052
1083
|
"returnSlots": 1
|
|
1053
1084
|
},
|
|
1054
1085
|
"checked_add_t_uint256": {
|
|
1055
|
-
"entryPoint":
|
|
1086
|
+
"entryPoint": 8045,
|
|
1056
1087
|
"id": null,
|
|
1057
1088
|
"parameterSlots": 2,
|
|
1058
1089
|
"returnSlots": 1
|
|
1059
1090
|
},
|
|
1060
1091
|
"checked_add_t_uint64": {
|
|
1061
|
-
"entryPoint":
|
|
1092
|
+
"entryPoint": 7885,
|
|
1062
1093
|
"id": null,
|
|
1063
1094
|
"parameterSlots": 2,
|
|
1064
1095
|
"returnSlots": 1
|
|
1065
1096
|
},
|
|
1066
1097
|
"checked_div_t_uint256": {
|
|
1067
|
-
"entryPoint":
|
|
1098
|
+
"entryPoint": 7821,
|
|
1068
1099
|
"id": null,
|
|
1069
1100
|
"parameterSlots": 2,
|
|
1070
1101
|
"returnSlots": 1
|
|
1071
1102
|
},
|
|
1072
1103
|
"checked_exp_helper": {
|
|
1073
|
-
"entryPoint":
|
|
1104
|
+
"entryPoint": 8111,
|
|
1074
1105
|
"id": null,
|
|
1075
1106
|
"parameterSlots": 2,
|
|
1076
1107
|
"returnSlots": 2
|
|
1077
1108
|
},
|
|
1078
1109
|
"checked_exp_t_uint256_t_uint256": {
|
|
1079
|
-
"entryPoint":
|
|
1110
|
+
"entryPoint": 8339,
|
|
1080
1111
|
"id": null,
|
|
1081
1112
|
"parameterSlots": 2,
|
|
1082
1113
|
"returnSlots": 1
|
|
1083
1114
|
},
|
|
1084
1115
|
"checked_exp_unsigned": {
|
|
1085
|
-
"entryPoint":
|
|
1116
|
+
"entryPoint": 8178,
|
|
1086
1117
|
"id": null,
|
|
1087
1118
|
"parameterSlots": 2,
|
|
1088
1119
|
"returnSlots": 1
|
|
1089
1120
|
},
|
|
1090
1121
|
"checked_mul_t_uint256": {
|
|
1091
|
-
"entryPoint":
|
|
1122
|
+
"entryPoint": 7964,
|
|
1092
1123
|
"id": null,
|
|
1093
1124
|
"parameterSlots": 2,
|
|
1094
1125
|
"returnSlots": 1
|
|
1095
1126
|
},
|
|
1096
1127
|
"checked_mul_t_uint64": {
|
|
1097
|
-
"entryPoint":
|
|
1128
|
+
"entryPoint": 7841,
|
|
1098
1129
|
"id": null,
|
|
1099
1130
|
"parameterSlots": 2,
|
|
1100
1131
|
"returnSlots": 1
|
|
1101
1132
|
},
|
|
1102
1133
|
"checked_sub_t_uint256": {
|
|
1103
|
-
"entryPoint":
|
|
1134
|
+
"entryPoint": 7945,
|
|
1104
1135
|
"id": null,
|
|
1105
1136
|
"parameterSlots": 2,
|
|
1106
1137
|
"returnSlots": 1
|
|
1107
1138
|
},
|
|
1108
1139
|
"checked_sub_t_uint64": {
|
|
1109
|
-
"entryPoint":
|
|
1140
|
+
"entryPoint": 8012,
|
|
1110
1141
|
"id": null,
|
|
1111
1142
|
"parameterSlots": 2,
|
|
1112
1143
|
"returnSlots": 1
|
|
1113
1144
|
},
|
|
1114
1145
|
"checked_sub_t_uint8": {
|
|
1115
|
-
"entryPoint":
|
|
1146
|
+
"entryPoint": 8086,
|
|
1116
1147
|
"id": null,
|
|
1117
1148
|
"parameterSlots": 2,
|
|
1118
1149
|
"returnSlots": 1
|
|
1119
1150
|
},
|
|
1120
1151
|
"increment_t_uint256": {
|
|
1121
|
-
"entryPoint":
|
|
1152
|
+
"entryPoint": 7987,
|
|
1122
1153
|
"id": null,
|
|
1123
1154
|
"parameterSlots": 1,
|
|
1124
1155
|
"returnSlots": 1
|
|
1125
1156
|
},
|
|
1126
1157
|
"mod_t_uint256": {
|
|
1127
|
-
"entryPoint":
|
|
1158
|
+
"entryPoint": 7925,
|
|
1128
1159
|
"id": null,
|
|
1129
1160
|
"parameterSlots": 2,
|
|
1130
1161
|
"returnSlots": 1
|
|
1131
1162
|
},
|
|
1132
1163
|
"panic_error_0x11": {
|
|
1133
|
-
"entryPoint":
|
|
1164
|
+
"entryPoint": 7799,
|
|
1134
1165
|
"id": null,
|
|
1135
1166
|
"parameterSlots": 0,
|
|
1136
1167
|
"returnSlots": 0
|
|
1137
1168
|
},
|
|
1138
1169
|
"panic_error_0x12": {
|
|
1139
|
-
"entryPoint":
|
|
1170
|
+
"entryPoint": 7777,
|
|
1140
1171
|
"id": null,
|
|
1141
1172
|
"parameterSlots": 0,
|
|
1142
1173
|
"returnSlots": 0
|
|
1143
1174
|
},
|
|
1144
1175
|
"panic_error_0x32": {
|
|
1145
|
-
"entryPoint":
|
|
1176
|
+
"entryPoint": 8064,
|
|
1146
1177
|
"id": null,
|
|
1147
1178
|
"parameterSlots": 0,
|
|
1148
1179
|
"returnSlots": 0
|
|
1149
1180
|
},
|
|
1150
1181
|
"panic_error_0x41": {
|
|
1151
|
-
"entryPoint":
|
|
1182
|
+
"entryPoint": 7310,
|
|
1152
1183
|
"id": null,
|
|
1153
1184
|
"parameterSlots": 0,
|
|
1154
1185
|
"returnSlots": 0
|
|
@@ -11729,35 +11760,36 @@
|
|
|
11729
11760
|
],
|
|
11730
11761
|
"immutableReferences": {},
|
|
11731
11762
|
"linkReferences": {},
|
|
11732
|
-
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x182 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x715018A6 GT PUSH2 0xD8 JUMPI DUP1 PUSH4 0xB6A5D7DE GT PUSH2 0x8C JUMPI DUP1 PUSH4 0xF2FDE38B GT PUSH2 0x66 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x319 JUMPI DUP1 PUSH4 0xF5619FDA EQ PUSH2 0x32C JUMPI DUP1 PUSH4 0xFE9FBB80 EQ PUSH2 0x347 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xB6A5D7DE EQ PUSH2 0x2DF JUMPI DUP1 PUSH4 0xB70E6BE6 EQ PUSH2 0x2F2 JUMPI DUP1 PUSH4 0xEB8695EF EQ PUSH2 0x306 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x7CA5B1DD GT PUSH2 0xBD JUMPI DUP1 PUSH4 0x7CA5B1DD EQ PUSH2 0x29D JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x2B0 JUMPI DUP1 PUSH4 0x95410D2B EQ PUSH2 0x2CB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x715018A6 EQ PUSH2 0x261 JUMPI DUP1 PUSH4 0x76671808 EQ PUSH2 0x269 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x27C97FA5 GT PUSH2 0x13A JUMPI DUP1 PUSH4 0x4CA49F51 GT PUSH2 0x114 JUMPI DUP1 PUSH4 0x4CA49F51 EQ PUSH2 0x217 JUMPI DUP1 PUSH4 0x620414E6 EQ PUSH2 0x22A JUMPI DUP1 PUSH4 0x6DEFBF80 EQ PUSH2 0x23D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x27C97FA5 EQ PUSH2 0x1F9 JUMPI DUP1 PUSH4 0x2B97BE24 EQ PUSH2 0x1CA JUMPI DUP1 PUSH4 0x3A1B77B0 EQ PUSH2 0x20C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x113764BE GT PUSH2 0x16B JUMPI DUP1 PUSH4 0x113764BE EQ PUSH2 0x1CA JUMPI DUP1 PUSH4 0x189179A3 EQ PUSH2 0x1D1 JUMPI DUP1 PUSH4 0x19C9AA32 EQ PUSH2 0x1E4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x6A27422 EQ PUSH2 0x187 JUMPI DUP1 PUSH4 0x10B76ED8 EQ PUSH2 0x1AD JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x19A PUSH2 0x195 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C27 JUMP JUMPDEST PUSH2 0x36A JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1B5 PUSH2 0x381 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE ADD PUSH2 0x1A4 JUMP JUMPDEST PUSH1 0x1 PUSH2 0x19A JUMP JUMPDEST PUSH2 0x1B5 PUSH2 0x1DF CALLDATASIZE PUSH1 0x4 PUSH2 0x1C56 JUMP JUMPDEST PUSH2 0x3E1 JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x1F2 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D24 JUMP JUMPDEST PUSH2 0x7D9 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x1F7 PUSH2 0x207 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D3F JUMP JUMPDEST PUSH2 0x9CC JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x3 SLOAD PUSH2 0x1B5 JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x225 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D68 JUMP JUMPDEST PUSH2 0xA25 JUMP JUMPDEST PUSH2 0x19A PUSH2 0x238 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C27 JUMP JUMPDEST PUSH2 0xDEE JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x251 SWAP1 PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1A4 JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0xEFE JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH2 0x284 SWAP1 PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1A4 JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x2AB CALLDATASIZE PUSH1 0x4 PUSH2 0x1C56 JUMP JUMPDEST PUSH2 0xF12 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1A4 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x251 SWAP1 PUSH1 0x1 PUSH1 0xA8 SHL SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x2ED CALLDATASIZE PUSH1 0x4 PUSH2 0x1D3F JUMP JUMPDEST PUSH2 0x14B0 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH2 0x284 SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x314 CALLDATASIZE PUSH1 0x4 PUSH2 0x1DF1 JUMP JUMPDEST PUSH2 0x150C JUMP JUMPDEST PUSH2 0x1F7 PUSH2 0x327 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D3F JUMP JUMPDEST PUSH2 0x157C JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x284 SWAP1 PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x251 PUSH2 0x355 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D3F JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x37B PUSH2 0x238 PUSH2 0x7E0 DUP5 PUSH2 0x1E3F JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH2 0x39F SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH2 0x7E0 PUSH2 0x1E53 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF SWAP2 DUP3 AND SWAP4 POP PUSH2 0x3C5 SWAP2 PUSH1 0x1 PUSH1 0x40 SHL SWAP1 SWAP2 DIV AND PUSH2 0x7E0 PUSH2 0x1E53 JUMP JUMPDEST PUSH2 0x3D1 SWAP1 PUSH2 0x7DF PUSH2 0x1E7F JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF AND SWAP1 POP SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x50 DUP4 MLOAD PUSH2 0x3F2 SWAP2 SWAP1 PUSH2 0x1EA7 JUMP JUMPDEST ISZERO PUSH2 0x444 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C696420686561646572206C656E6774680000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x50 DUP4 MLOAD PUSH2 0x452 SWAP2 SWAP1 PUSH2 0x1E3F JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP2 GT DUP1 ISZERO PUSH2 0x465 JUMPI POP PUSH2 0x7E0 DUP2 LT JUMPDEST PUSH2 0x4B1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C6964206E756D626572206F66206865616465727300000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH2 0x4BA DUP4 PUSH2 0x160C JUMP JUMPDEST PUSH4 0xFFFFFFFF AND SWAP2 POP PUSH1 0x0 DUP1 PUSH2 0x4D0 DUP6 DUP3 DUP1 PUSH2 0x1640 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x1 PUSH1 0x40 SHL SWAP1 SWAP2 DIV AND DUP1 DUP4 MSTORE PUSH1 0x4 DUP3 MSTORE SWAP2 DUP5 SWAP1 KECCAK256 DUP5 MLOAD DUP1 DUP7 ADD SWAP1 SWAP6 MSTORE SLOAD PUSH4 0xFFFFFFFF DUP2 AND DUP6 MSTORE PUSH5 0x100000000 SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND SWAP1 DUP5 ADD MSTORE SWAP4 SWAP6 POP SWAP2 SWAP4 POP SWAP1 SWAP2 SWAP1 DUP3 JUMPDEST DUP2 MLOAD PUSH4 0xFFFFFFFF AND DUP9 LT ISZERO PUSH2 0x596 JUMPI PUSH2 0x552 PUSH1 0x1 DUP5 PUSH2 0x1EBB JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE SLOAD PUSH4 0xFFFFFFFF DUP2 AND DUP4 MSTORE PUSH5 0x100000000 SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND SWAP1 DUP3 ADD MSTORE SWAP1 SWAP4 POP SWAP2 SWAP1 POP PUSH2 0x538 JUMP JUMPDEST DUP2 MLOAD PUSH4 0xFFFFFFFF AND PUSH2 0x610 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x43616E6E6F742076616C696461746520636861696E73206265666F7265207265 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6C61792067656E65736973000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x43B JUMP JUMPDEST DUP2 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND DUP6 EQ PUSH2 0x6DA JUMPI DUP1 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND DUP6 SUB PUSH2 0x640 JUMPI SWAP1 POP DUP3 PUSH2 0x6DA JUMP JUMPDEST PUSH2 0x64B PUSH1 0x1 DUP5 PUSH2 0x1EBB JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE SLOAD PUSH4 0xFFFFFFFF DUP2 AND DUP4 MSTORE PUSH5 0x100000000 SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 SWAP5 POP SWAP3 SWAP2 POP DUP6 EQ PUSH2 0x6DA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C69642074617267657420696E2068656164657220636861696E0000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH1 0x1 JUMPDEST DUP8 DUP2 LT ISZERO PUSH2 0x7CD JUMPI PUSH1 0x0 PUSH2 0x6FC DUP12 PUSH2 0x6F6 DUP5 PUSH1 0x50 PUSH2 0x1ECE JUMP JUMPDEST DUP11 PUSH2 0x1640 JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD SWAP1 SWAP9 POP SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND DUP8 EQ PUSH2 0x7B9 JUMPI PUSH1 0x0 PUSH2 0x72D PUSH2 0x726 DUP5 PUSH1 0x50 PUSH2 0x1ECE JUMP JUMPDEST DUP14 SWAP1 PUSH2 0x1718 JUMP JUMPDEST DUP5 MLOAD PUSH4 0xFFFFFFFF SWAP2 DUP3 AND SWAP3 POP AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x754 JUMPI POP DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND DUP9 EQ JUMPDEST DUP1 ISZERO PUSH2 0x766 JUMPI POP DUP4 MLOAD PUSH4 0xFFFFFFFF AND DUP2 EQ JUMPDEST PUSH2 0x7B2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C69642074617267657420696E2068656164657220636861696E0000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST POP SWAP2 SWAP3 POP DUP5 SWAP2 JUMPDEST SWAP7 POP DUP1 PUSH2 0x7C5 DUP2 PUSH2 0x1EE5 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x6DD JUMP JUMPDEST POP POP POP POP POP POP POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x832 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x52656C6179206973206E6F7420726561647920666F7220757365000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH2 0x83A PUSH2 0x1739 JUMP JUMPDEST PUSH2 0x7E0 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF AND LT PUSH2 0x895 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x50726F6F66206C656E6774682065786365737369766500000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF AND GT PUSH2 0x8EF JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x50726F6F66206C656E677468206D6179206E6F74206265207A65726F00000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 SWAP2 DIV DUP2 AND SWAP1 DUP3 AND SUB PUSH2 0x955 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x50726F6F66206C656E67746820756E6368616E67656400000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x1 PUSH1 0xB0 SHL PUSH8 0xFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0x3E9F904D8CF11753C79B67C8259C582056D4A7D8AF120F81257A59EEB8824B96 SWAP1 PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH2 0x9D4 PUSH2 0x1739 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE SWAP1 MLOAD SWAP2 DUP3 MSTORE PUSH32 0x7498B96BEEABEA5AD3139F1A2861A03E480034254E36B10AAE2E6E42AD7B4B68 SWAP2 ADD PUSH2 0x9C1 JUMP JUMPDEST PUSH2 0xA2D PUSH2 0x1739 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xA87 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x47656E6573697320616C726561647920706572666F726D656400000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH1 0x50 DUP4 EQ PUSH2 0xAD7 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C69642067656E6573697320686561646572206C656E677468000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH2 0xAE3 PUSH2 0x7E0 DUP4 PUSH2 0x1EA7 JUMP JUMPDEST ISZERO PUSH2 0xB56 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C696420686569676874206F662072656C61792067656E6573697320 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x626C6F636B000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x43B JUMP JUMPDEST PUSH2 0x7E0 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF AND LT PUSH2 0xBB1 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x50726F6F66206C656E6774682065786365737369766500000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF AND GT PUSH2 0xC0B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x50726F6F66206C656E677468206D6179206E6F74206265207A65726F00000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH2 0xC17 PUSH2 0x7E0 DUP4 PUSH2 0x1E3F JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 AND PUSH8 0xFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 DUP3 OR PUSH1 0x1 PUSH1 0x40 SHL SWAP3 SWAP1 SWAP3 MUL SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP7 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP5 DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH2 0xC9D SWAP2 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x1793 SWAP3 POP POP POP JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xCE0 DUP7 DUP7 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x160C SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH4 0xFFFFFFFF SWAP3 DUP4 AND DUP1 DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP1 DUP8 AND PUSH1 0x20 DUP1 DUP6 ADD SWAP2 DUP3 MSTORE PUSH1 0x1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 SWAP1 SWAP3 MSTORE SWAP6 DUP2 KECCAK256 SWAP5 MLOAD SWAP2 MLOAD SWAP1 SWAP3 AND PUSH5 0x100000000 MUL SWAP6 AND SWAP5 SWAP1 SWAP5 OR SWAP1 SWAP2 SSTORE DUP3 SLOAD SWAP2 DUP7 AND PUSH1 0x1 PUSH1 0xB0 SHL MUL PUSH32 0xFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SWAP2 SSTORE SWAP1 POP PUSH2 0xD7B DUP3 PUSH2 0x17A0 JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x1 PUSH1 0xA0 SHL OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x2381D16925551C2FB1A5EDFCF4FCE2F6D085E1F85F4B88340C09C9D191F9D4E9 SWAP1 PUSH2 0xDDE SWAP1 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x0 SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF AND DUP3 LT ISZERO PUSH2 0xE4D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45706F6368206973206265666F72652072656C61792067656E65736973000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND DUP3 GT ISZERO PUSH2 0xED5 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x45706F6368206973206E6F742070726F76656E20746F207468652072656C6179 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2079657400000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x43B JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x37B SWAP1 PUSH5 0x100000000 SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH2 0x17A0 JUMP JUMPDEST PUSH2 0xF06 PUSH2 0x1739 JUMP JUMPDEST PUSH2 0xF10 PUSH1 0x0 PUSH2 0x17C8 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0xF6B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x52656C6179206973206E6F7420726561647920666F7220757365000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA8 SHL SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xFDC JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0xFDC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5375626D697474657220756E617574686F72697A656400000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0xFFB SWAP1 PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH1 0x2 PUSH2 0x1E53 JUMP JUMPDEST PUSH2 0x1006 SWAP1 PUSH1 0x50 PUSH2 0x1E53 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 MLOAD EQ PUSH2 0x105F JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C696420686561646572206C656E6774680000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD SWAP1 SWAP2 PUSH5 0x100000000 SWAP1 SWAP2 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND SWAP1 DUP1 JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 LT ISZERO PUSH2 0x115B JUMPI PUSH1 0x0 DUP1 PUSH2 0x10CD DUP8 PUSH2 0x10C7 DUP6 PUSH1 0x50 PUSH2 0x1ECE JUMP JUMPDEST DUP7 PUSH2 0x1640 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 DUP2 EQ PUSH2 0x1146 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C69642074617267657420696E207072652D72657461726765742068 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6561646572730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x43B JUMP JUMPDEST POP SWAP2 POP DUP1 PUSH2 0x1153 DUP2 PUSH2 0x1EE5 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x109A JUMP JUMPDEST POP PUSH1 0x0 DUP1 SLOAD PUSH2 0x119D SWAP1 PUSH2 0x1181 SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH2 0x1EFE JUMP JUMPDEST PUSH2 0x118C SWAP1 PUSH1 0x50 PUSH2 0x1E53 JUMP JUMPDEST DUP7 SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH2 0x1718 JUMP JUMPDEST PUSH4 0xFFFFFFFF AND SWAP1 POP TIMESTAMP DUP2 LT PUSH2 0x11F4 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45706F63682063616E6E6F7420656E6420696E20746865206675747572650000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST DUP4 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x120B SWAP1 DUP6 SWAP1 PUSH4 0xFFFFFFFF AND DUP5 PUSH2 0x1830 JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP1 PUSH2 0x1247 PUSH1 0x0 PUSH1 0x16 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH1 0x50 PUSH2 0x1236 SWAP2 SWAP1 PUSH2 0x1E53 JUMP JUMPDEST DUP10 SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH2 0x1718 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH4 0xFFFFFFFF SWAP2 SWAP1 SWAP2 AND SWAP2 POP PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x1286 SWAP1 PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH1 0x2 PUSH2 0x1E53 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 LT ISZERO PUSH2 0x1398 JUMPI PUSH1 0x0 DUP1 PUSH2 0x12A9 DUP12 PUSH2 0x6F6 DUP6 PUSH1 0x50 PUSH2 0x1ECE JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 PUSH1 0x0 SUB PUSH2 0x130E JUMPI DUP1 SWAP5 POP DUP1 DUP7 AND DUP2 EQ PUSH2 0x1309 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C69642074617267657420696E206E65772065706F63680000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH2 0x1383 JUMP JUMPDEST DUP5 DUP2 EQ PUSH2 0x1383 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x27 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E657870656374656420746172676574206368616E67652061667465722072 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6574617267657400000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x43B JUMP JUMPDEST POP SWAP6 POP DUP1 PUSH2 0x1390 DUP2 PUSH2 0x1EE5 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x1267 JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x8 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH1 0x1 PUSH2 0x13BC SWAP2 SWAP1 PUSH2 0x1E7F JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DUP2 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH4 0xFFFFFFFF DUP1 DUP8 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP1 DUP10 AND PUSH1 0x20 DUP1 DUP6 ADD SWAP2 DUP3 MSTORE SWAP6 SWAP1 SWAP7 DIV SWAP1 SWAP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 SWAP1 SWAP5 MSTORE SWAP2 DUP4 KECCAK256 SWAP1 MLOAD SWAP4 MLOAD SWAP1 SWAP5 AND PUSH5 0x100000000 MUL SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x2 SLOAD SWAP1 PUSH2 0x145E DUP5 PUSH2 0x17A0 JUMP JUMPDEST PUSH1 0x3 DUP4 SWAP1 SSTORE PUSH1 0x2 DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP4 SWAP1 MSTORE SWAP2 SWAP3 POP PUSH32 0xA282EE798B132F9DC11E06CD4D8E767E562BE8709602CA14FEA7AB3392ACBDAB SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x14B8 PUSH2 0x1739 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE SWAP1 MLOAD SWAP2 DUP3 MSTORE PUSH32 0xD53649B492F738BB59D6825099B5955073EFDA0BF9E3A7AD20DA22E110122E29 SWAP2 ADD PUSH2 0x9C1 JUMP JUMPDEST PUSH2 0x1514 PUSH2 0x1739 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD DUP3 ISZERO ISZERO PUSH1 0x1 PUSH1 0xA8 SHL MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0xD813B248D49C8BF08BE2B6947126DA6763DF310BEED7BEA97756456C5727419A SWAP1 PUSH2 0x9C1 SWAP1 DUP4 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH2 0x1584 PUSH2 0x1739 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x1600 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x43B JUMP JUMPDEST PUSH2 0x1609 DUP2 PUSH2 0x17C8 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x37B PUSH2 0x161A DUP4 PUSH2 0x18C4 JUMP JUMPDEST PUSH1 0xD8 DUP2 SWAP1 SHR PUSH4 0xFF00FF00 AND PUSH3 0xFF00FF PUSH1 0xE8 SWAP3 SWAP1 SWAP3 SHR SWAP2 SWAP1 SWAP2 AND OR PUSH1 0x10 DUP2 DUP2 SHL SWAP2 SWAP1 SHR OR SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 ISZERO PUSH2 0x16A0 JUMPI PUSH2 0x1654 DUP6 DUP6 DUP6 PUSH2 0x18D1 JUMP JUMPDEST PUSH2 0x16A0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xD PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C696420636861696E00000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH2 0x16AA DUP6 DUP6 PUSH2 0x18FC JUMP JUMPDEST SWAP1 POP PUSH2 0x16B8 DUP6 DUP6 PUSH1 0x50 PUSH2 0x199E JUMP JUMPDEST SWAP2 POP PUSH2 0x16C4 DUP3 DUP3 PUSH2 0x19C8 JUMP JUMPDEST PUSH2 0x1710 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xC PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C696420776F726B0000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1732 PUSH2 0x161A PUSH2 0x172B DUP5 PUSH1 0x44 PUSH2 0x1F1F JUMP JUMPDEST DUP6 SWAP1 PUSH2 0x1B21 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xF10 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH1 0x0 PUSH2 0x37B DUP3 PUSH1 0x0 PUSH2 0x18FC JUMP JUMPDEST PUSH1 0x0 PUSH2 0x37B PUSH28 0xFFFF0000000000000000000000000000000000000000000000000000 DUP4 PUSH2 0x1B30 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x183D DUP4 DUP6 PUSH2 0x1B3C JUMP JUMPDEST SWAP1 POP PUSH2 0x184D PUSH3 0x127500 PUSH1 0x4 PUSH2 0x1B30 JUMP JUMPDEST DUP2 LT ISZERO PUSH2 0x1865 JUMPI PUSH2 0x1862 PUSH3 0x127500 PUSH1 0x4 PUSH2 0x1B30 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH2 0x1873 PUSH3 0x127500 PUSH1 0x4 PUSH2 0x1B98 JUMP JUMPDEST DUP2 GT ISZERO PUSH2 0x188B JUMPI PUSH2 0x1888 PUSH3 0x127500 PUSH1 0x4 PUSH2 0x1B98 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x0 PUSH2 0x18A4 DUP3 PUSH2 0x189E DUP9 PUSH3 0x10000 PUSH2 0x1B30 JUMP JUMPDEST SWAP1 PUSH2 0x1B98 JUMP JUMPDEST SWAP1 POP PUSH2 0x18BA PUSH3 0x10000 PUSH2 0x189E DUP4 PUSH3 0x127500 PUSH2 0x1B30 JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x37B DUP3 PUSH1 0x44 PUSH2 0x1B21 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x18DE DUP6 DUP6 PUSH2 0x1C0E JUMP JUMPDEST SWAP1 POP DUP3 DUP2 EQ PUSH2 0x18F1 JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x1732 JUMP JUMPDEST POP PUSH1 0x1 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x190D PUSH2 0x172B DUP5 PUSH1 0x48 PUSH2 0x1F1F JUMP JUMPDEST PUSH1 0xE8 SHR SWAP1 POP PUSH1 0x0 DUP5 PUSH2 0x1920 DUP6 PUSH1 0x4B PUSH2 0x1F1F JUMP JUMPDEST DUP2 MLOAD DUP2 LT PUSH2 0x1930 JUMPI PUSH2 0x1930 PUSH2 0x1F32 JUMP JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 SHR SWAP1 POP PUSH1 0x0 PUSH2 0x1964 DUP4 PUSH1 0x0 PUSH1 0x10 DUP3 PUSH3 0xFFFFFF AND SWAP1 SHR DUP3 PUSH2 0xFF00 AND PUSH1 0x10 DUP5 PUSH3 0xFFFFFF AND SWAP1 SHL OR OR SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH3 0xFFFFFF AND SWAP1 POP PUSH1 0x0 PUSH2 0x1978 PUSH1 0x3 DUP5 PUSH2 0x1F48 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 POP PUSH2 0x1989 DUP2 PUSH2 0x100 PUSH2 0x2045 JUMP JUMPDEST PUSH2 0x1993 SWAP1 DUP4 PUSH2 0x1ECE JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 PUSH1 0x0 DUP4 DUP6 PUSH1 0x20 ADD DUP8 ADD PUSH1 0x2 GAS STATICCALL POP PUSH1 0x20 PUSH1 0x0 PUSH1 0x20 PUSH1 0x0 PUSH1 0x2 GAS STATICCALL POP POP PUSH1 0x0 MLOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x19D7 JUMPI POP PUSH1 0x0 PUSH2 0x37B JUMP JUMPDEST DUP2 PUSH2 0x1B19 DUP5 PUSH1 0x0 DUP2 SWAP1 POP PUSH1 0x8 DUP2 PUSH31 0xFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF AND SWAP1 SHL PUSH1 0x8 DUP3 SWAP1 SHR PUSH31 0xFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF AND OR SWAP1 POP PUSH1 0x10 DUP2 PUSH30 0xFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF AND SWAP1 SHL PUSH1 0x10 DUP3 SWAP1 SHR PUSH30 0xFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF AND OR SWAP1 POP PUSH1 0x20 DUP2 PUSH28 0xFFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF AND SWAP1 SHL PUSH1 0x20 DUP3 SWAP1 SHR PUSH28 0xFFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF AND OR SWAP1 POP PUSH1 0x40 DUP2 PUSH24 0xFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF AND SWAP1 SHL PUSH1 0x40 DUP3 SWAP1 SHR PUSH24 0xFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF AND OR SWAP1 POP PUSH1 0x80 DUP2 SWAP1 SHL PUSH1 0x80 DUP3 SWAP1 SHR OR SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST LT SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1732 DUP4 DUP4 ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1732 DUP3 DUP5 PUSH2 0x1E3F JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1B8E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E646572666C6F7720647572696E67207375627472616374696F6E2E000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH2 0x1732 DUP3 DUP5 PUSH2 0x1EBB JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x0 SUB PUSH2 0x1BAA JUMPI POP PUSH1 0x0 PUSH2 0x37B JUMP JUMPDEST PUSH2 0x1BB4 DUP3 DUP5 PUSH2 0x1ECE JUMP JUMPDEST SWAP1 POP DUP2 PUSH2 0x1BC1 DUP5 DUP4 PUSH2 0x1E3F JUMP JUMPDEST EQ PUSH2 0x37B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F766572666C6F7720647572696E67206D756C7469706C69636174696F6E2E00 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x43B JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1732 PUSH2 0x1C1E DUP4 PUSH1 0x4 PUSH2 0x1F1F JUMP JUMPDEST DUP5 ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1C39 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1C68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1C80 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP5 ADD SWAP2 POP DUP5 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1C94 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1CA6 JUMPI PUSH2 0x1CA6 PUSH2 0x1C40 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x1CCE JUMPI PUSH2 0x1CCE PUSH2 0x1C40 JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP8 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x1CE7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 SWAP3 DUP2 ADD PUSH1 0x20 ADD SWAP3 SWAP1 SWAP3 MSTORE POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1D1F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1D36 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1732 DUP3 PUSH2 0x1D07 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1D51 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x1732 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1D7E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1D96 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1DAA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1DB9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1DCB JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 SWAP3 DUP4 ADD SWAP7 POP SWAP5 POP POP DUP6 ADD CALLDATALOAD SWAP2 POP PUSH2 0x1DE6 PUSH1 0x40 DUP7 ADD PUSH2 0x1D07 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1E03 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x1732 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1E4E JUMPI PUSH2 0x1E4E PUSH2 0x1E13 JUMP JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 DUP2 AND DUP4 DUP3 AND MUL DUP1 DUP3 AND SWAP2 SWAP1 DUP3 DUP2 EQ PUSH2 0x1E77 JUMPI PUSH2 0x1E77 PUSH2 0x1E29 JUMP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 DUP2 AND DUP4 DUP3 AND ADD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x1EA0 JUMPI PUSH2 0x1EA0 PUSH2 0x1E29 JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1EB6 JUMPI PUSH2 0x1EB6 PUSH2 0x1E13 JUMP JUMPDEST POP MOD SWAP1 JUMP JUMPDEST DUP2 DUP2 SUB DUP2 DUP2 GT ISZERO PUSH2 0x37B JUMPI PUSH2 0x37B PUSH2 0x1E29 JUMP JUMPDEST DUP1 DUP3 MUL DUP2 ISZERO DUP3 DUP3 DIV DUP5 EQ OR PUSH2 0x37B JUMPI PUSH2 0x37B PUSH2 0x1E29 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP3 ADD PUSH2 0x1EF7 JUMPI PUSH2 0x1EF7 PUSH2 0x1E29 JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP3 DUP2 AND DUP3 DUP3 AND SUB SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x1EA0 JUMPI PUSH2 0x1EA0 PUSH2 0x1E29 JUMP JUMPDEST DUP1 DUP3 ADD DUP1 DUP3 GT ISZERO PUSH2 0x37B JUMPI PUSH2 0x37B PUSH2 0x1E29 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0xFF DUP3 DUP2 AND DUP3 DUP3 AND SUB SWAP1 DUP2 GT ISZERO PUSH2 0x37B JUMPI PUSH2 0x37B PUSH2 0x1E29 JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 JUMPDEST DUP1 DUP6 GT ISZERO PUSH2 0x1F9C JUMPI DUP2 PUSH1 0x0 NOT DIV DUP3 GT ISZERO PUSH2 0x1F82 JUMPI PUSH2 0x1F82 PUSH2 0x1E29 JUMP JUMPDEST DUP1 DUP6 AND ISZERO PUSH2 0x1F8F JUMPI SWAP2 DUP2 MUL SWAP2 JUMPDEST SWAP4 DUP5 SHR SWAP4 SWAP1 DUP1 MUL SWAP1 PUSH2 0x1F66 JUMP JUMPDEST POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1FB3 JUMPI POP PUSH1 0x1 PUSH2 0x37B JUMP JUMPDEST DUP2 PUSH2 0x1FC0 JUMPI POP PUSH1 0x0 PUSH2 0x37B JUMP JUMPDEST DUP2 PUSH1 0x1 DUP2 EQ PUSH2 0x1FD6 JUMPI PUSH1 0x2 DUP2 EQ PUSH2 0x1FE0 JUMPI PUSH2 0x1FFC JUMP JUMPDEST PUSH1 0x1 SWAP2 POP POP PUSH2 0x37B JUMP JUMPDEST PUSH1 0xFF DUP5 GT ISZERO PUSH2 0x1FF1 JUMPI PUSH2 0x1FF1 PUSH2 0x1E29 JUMP JUMPDEST POP POP PUSH1 0x1 DUP3 SHL PUSH2 0x37B JUMP JUMPDEST POP PUSH1 0x20 DUP4 LT PUSH2 0x133 DUP4 LT AND PUSH1 0x4E DUP5 LT PUSH1 0xB DUP5 LT AND OR ISZERO PUSH2 0x201F JUMPI POP DUP2 DUP2 EXP PUSH2 0x37B JUMP JUMPDEST PUSH2 0x2029 DUP4 DUP4 PUSH2 0x1F61 JUMP JUMPDEST DUP1 PUSH1 0x0 NOT DIV DUP3 GT ISZERO PUSH2 0x203D JUMPI PUSH2 0x203D PUSH2 0x1E29 JUMP JUMPDEST MUL SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1732 DUP4 DUP4 PUSH2 0x1FA4 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP13 PUSH16 0xE81415D65FE4B021F66EAC01B0E7367B 0xD7 LOG0 0xCA DUP9 ORIGIN CREATE 0xCC MUL 0xF6 0x28 SWAP7 SWAP2 STOP 0xB4 PUSH5 0x736F6C6343 STOP ADDMOD GT STOP CALLER ",
|
|
11733
|
-
"sourceMap": "1891:430:111:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21960:171:107;;;;;;:::i;:::-;;:::i;:::-;;;345:25:125;;;333:2;318:18;21960:171:107;;;;;;;;22865:230;;;:::i;:::-;;;;555:25:125;;;611:2;596:18;;589:34;;;;528:18;22865:230:107;381:248:125;2180:139:111;2311:1;2180:139;;16209:5436:107;;;;;;:::i;:::-;;:::i;6780:351::-;;;;;;:::i;:::-;;:::i;:::-;;7906:154;;;;;;:::i;:::-;;:::i;23745:199::-;23893:22;;23917:19;;23745:199;;5399:1075;;;;;;:::i;:::-;;:::i;24210:386::-;;;;;;:::i;:::-;;:::i;3314:17::-;;;;;-1:-1:-1;;;3314:17:107;;;;;;;;;3335:14:125;;3328:22;3310:41;;3298:2;3283:18;3314:17:107;3170:187:125;1831:101:49;;;:::i;4359:26:107:-;;;;;-1:-1:-1;;;4359:26:107;;;;;;;;;3536:18:125;3524:31;;;3506:50;;3494:2;3479:18;4359:26:107;3362:200:125;9685:4685:107;;;;;;:::i;:::-;;:::i;1201:85:49:-;1247:7;1273:6;1201:85;;-1:-1:-1;;;;;1273:6:49;;;3713:74:125;;3701:2;3686:18;1201:85:49;3567:226:125;3455:33:107;;;;;-1:-1:-1;;;3455:33:107;;;;;;7622:149;;;;;;:::i;:::-;;:::i;4044:26::-;;;;;;;;;7325:165;;;;;;:::i;:::-;;:::i;2081:198:49:-;;;;;;:::i;:::-;;:::i;3767:25:107:-;;;;;-1:-1:-1;;;3767:25:107;;;;;;4603:44;;;;;;:::i;:::-;;;;;;;;;;;;;;;;21960:171;22056:7;22086:38;22105:18;22119:4;22105:11;:18;:::i;22086:38::-;22079:45;21960:171;-1:-1:-1;;21960:171:107:o;22865:230::-;23013:12;;22937:20;;;;23013:19;;:12;;23028:4;23013:19;:::i;:::-;23061:12;;22998:34;;;;;-1:-1:-1;23061:19:107;;-1:-1:-1;;;23061:12:107;;;;23076:4;23061:19;:::i;:::-;23060:28;;23084:4;23060:28;:::i;:::-;23042:46;;;;22865:230;;:::o;16209:5436::-;16301:31;16334:19;16394:2;16377:7;:14;:19;;;;:::i;:::-;:24;16369:58;;;;-1:-1:-1;;;16369:58:107;;5345:2:125;16369:58:107;;;5327:21:125;5384:2;5364:18;;;5357:30;5423:23;5403:18;;;5396:51;5464:18;;16369:58:107;;;;;;;;;16469:2;16452:7;:14;:19;;;;:::i;:::-;16438:33;;16517:1;16503:11;:15;:37;;;;;16536:4;16522:11;:18;16503:37;16482:109;;;;-1:-1:-1;;;16482:109:107;;5695:2:125;16482:109:107;;;5677:21:125;5734:2;5714:18;;;5707:30;5773:27;5753:18;;;5746:55;5818:18;;16482:109:107;5493:349:125;16482:109:107;16628:26;:7;:24;:26::i;:::-;16602:52;;;-1:-1:-1;16852:28:107;;16934:38;16949:7;16852:28;;16934:14;:38::i;:::-;17008:11;;;;;;;;16983:22;17008:11;;;;;;;;;;17060:12;;;-1:-1:-1;;;17060:12:107;;;;17111:27;;;:6;:27;;;;;;17082:56;;;;;;;;;17008:11;17082:56;;;;;;;-1:-1:-1;;;;;17082:56:107;;;;;16838:134;;-1:-1:-1;16838:134:107;;-1:-1:-1;17008:11:107;;17060:12;17008:11;17918:203;17951:23;;17925:49;;;;17918:203;;;17990:24;18013:1;17990:24;;:::i;:::-;18083:27;;;;:6;:27;;;;;;;;;18067:43;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18067:43:107;;;;;18083:27;;-1:-1:-1;18067:43:107;;-1:-1:-1;17918:203:107;;;18406:23;;:27;;18385:117;;;;-1:-1:-1;;;18385:117:107;;6182:2:125;18385:117:107;;;6164:21:125;6221:2;6201:18;;;6194:30;6260:34;6240:18;;;6233:62;6331:13;6311:18;;;6304:41;6362:19;;18385:117:107;5980:407:125;18385:117:107;18739:13;:20;;;-1:-1:-1;;;;;18716:43:107;:19;:43;18712:1166;;18997:9;:16;;;-1:-1:-1;;;;;18974:39:107;:19;:39;18970:898;;19049:9;-1:-1:-1;19088:9:107;18970:898;;;19452:24;19475:1;19452:24;;:::i;:::-;19553:27;;;;:6;:27;;;;;;;;;19537:43;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19537:43:107;;;;;;;19553:27;;-1:-1:-1;19537:43:107;;-1:-1:-1;19738:43:107;;19709:144;;;;-1:-1:-1;;;19709:144:107;;6594:2:125;19709:144:107;;;6576:21:125;6633:2;6613:18;;;6606:30;6672:32;6652:18;;;6645:60;6722:18;;19709:144:107;6392:354:125;19709:144:107;19998:1;19981:1602;20005:11;20001:1;:15;19981:1602;;;20037:21;20111:115;20143:7;20168:6;:1;20172:2;20168:6;:::i;:::-;20192:20;20111:14;:115::i;:::-;20995:20;;;;20072:154;;-1:-1:-1;20072:154:107;;-1:-1:-1;;;;;;20972:43:107;;;20968:554;;21035:30;21068:72;21116:6;:1;21120:2;21116:6;:::i;:::-;21068:7;;:26;:72::i;:::-;21188:19;;21035:105;;;;;-1:-1:-1;21188:24:107;;;;;:91;;;21263:9;:16;;;-1:-1:-1;;;;;21240:39:107;:19;:39;21188:91;:164;;;;-1:-1:-1;21333:19:107;;21307:45;;;;21188:164;21159:265;;;;-1:-1:-1;;;21159:265:107;;6594:2:125;21159:265:107;;;6576:21:125;6633:2;6613:18;;;6606:30;6672:32;6652:18;;;6645:60;6722:18;;21159:265:107;6392:354:125;21159:265:107;-1:-1:-1;21459:9:107;;-1:-1:-1;21498:9:107;;20968:554;21559:13;-1:-1:-1;20018:3:107;;;;:::i;:::-;;;;19981:1602;;;;21593:45;;;;;;16209:5436;;;:::o;6780:351::-;4695:5;;-1:-1:-1;;;4695:5:107;;;;4687:44;;;;-1:-1:-1;;;4687:44:107;;7266:2:125;4687:44:107;;;7248:21:125;7305:2;7285:18;;;7278:30;7344:28;7324:18;;;7317:56;7390:18;;4687:44:107;7064:350:125;4687:44:107;1094:13:49::1;:11;:13::i;:::-;6883:4:107::2;6871:9;:16;;;6863:51;;;::::0;-1:-1:-1;;;6863:51:107;;7621:2:125;6863:51:107::2;::::0;::::2;7603:21:125::0;7660:2;7640:18;;;7633:30;7699:24;7679:18;;;7672:52;7741:18;;6863:51:107::2;7419:346:125::0;6863:51:107::2;6944:1;6932:9;:13;;;6924:54;;;::::0;-1:-1:-1;;;6924:54:107;;7972:2:125;6924:54:107::2;::::0;::::2;7954:21:125::0;8011:2;7991:18;;;7984:30;8050;8030:18;;;8023:58;8098:18;;6924:54:107::2;7770:352:125::0;6924:54:107::2;7009:11;::::0;::::2;-1:-1:-1::0;;;7009:11:107;;::::2;::::0;::::2;6996:24:::0;;::::2;::::0;6988:59:::2;;;::::0;-1:-1:-1;;;6988:59:107;;8329:2:125;6988:59:107::2;::::0;::::2;8311:21:125::0;8368:2;8348:18;;;8341:30;8407:24;8387:18;;;8380:52;8449:18;;6988:59:107::2;8127:346:125::0;6988:59:107::2;7057:11;:23:::0;;;::::2;-1:-1:-1::0;;;7057:23:107::2;::::0;::::2;::::0;;::::2;::::0;;;::::2;::::0;;;7095:29:::2;::::0;3506:50:125;;;7095:29:107::2;::::0;3494:2:125;3479:18;7095:29:107::2;;;;;;;;6780:351:::0;:::o;7906:154::-;1094:13:49;:11;:13::i;:::-;-1:-1:-1;;;;;7975:23:107;::::1;8001:5;7975:23:::0;;;:12:::1;:23;::::0;;;;;;;;:31;;-1:-1:-1;;7975:31:107::1;::::0;;8021:32;;3713:74:125;;;8021:32:107::1;::::0;3686:18:125;8021:32:107::1;3567:226:125::0;5399:1075:107;1094:13:49;:11;:13::i;:::-;5564:5:107::1;::::0;-1:-1:-1;;;5564:5:107;::::1;;;5563:6;5555:44;;;::::0;-1:-1:-1;;;5555:44:107;;8886:2:125;5555:44:107::1;::::0;::::1;8868:21:125::0;8925:2;8905:18;;;8898:30;8964:27;8944:18;;;8937:55;9009:18;;5555:44:107::1;8684:349:125::0;5555:44:107::1;5642:2;5618:26:::0;::::1;5610:68;;;::::0;-1:-1:-1;;;5610:68:107;;9240:2:125;5610:68:107::1;::::0;::::1;9222:21:125::0;9279:2;9259:18;;;9252:30;9318:31;9298:18;;;9291:59;9367:18;;5610:68:107::1;9038:353:125::0;5610:68:107::1;5710:20;5726:4;5710:13:::0;:20:::1;:::i;:::-;:25:::0;5689:109:::1;;;::::0;-1:-1:-1;;;5689:109:107;;9598:2:125;5689:109:107::1;::::0;::::1;9580:21:125::0;9637:2;9617:18;;;9610:30;9676:34;9656:18;;;9649:62;9747:7;9727:18;;;9720:35;9772:19;;5689:109:107::1;9396:401:125::0;5689:109:107::1;5838:4;5817:18;:25;;;5809:60;;;::::0;-1:-1:-1;;;5809:60:107;;7621:2:125;5809:60:107::1;::::0;::::1;7603:21:125::0;7660:2;7640:18;;;7633:30;7699:24;7679:18;;;7672:52;7741:18;;5809:60:107::1;7419:346:125::0;5809:60:107::1;5908:1;5887:18;:22;;;5879:63;;;::::0;-1:-1:-1;;;5879:63:107;;7972:2:125;5879:63:107::1;::::0;::::1;7954:21:125::0;8011:2;7991:18;;;7984:30;8050;8030:18;;;8023:58;8098:18;;5879:63:107::1;7770:352:125::0;5879:63:107::1;5975:20;5991:4;5975:13:::0;:20:::1;:::i;:::-;5953:12;:43:::0;;6006:27;;5953:43:::1;::::0;;;::::1;6006:27:::0;;;-1:-1:-1;;;6006:27:107;;;::::1;::::0;;;::::1;::::0;;6067::::1;::::0;;::::1;;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;-1:-1:-1;;6067:29:107::1;::::0;:27;:13;;:27;;;;;::::1;:13:::0;:27;;:13;:27;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;6067:27:107::1;::::0;-1:-1:-1;;;6067:29:107:i:1;:::-;6043:53;;6106:24;6133:32;:13;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;6133:30:107::1;::::0;-1:-1:-1;;;6133:32:107:i:1;:::-;6198:89;::::0;;;;::::1;::::0;;6106:59:::1;::::0;;::::1;6198:89:::0;;;-1:-1:-1;;;;;6198:89:107;;::::1;;::::0;;::::1;::::0;;;6182:12:::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;6175:20:107;;;:6:::1;:20:::0;;;;;;:112;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;6297:32;;;;::::1;-1:-1:-1::0;;;6297:32:107::1;::::0;;;::::1;::::0;;;::::1;::::0;;;6106:59;-1:-1:-1;6364:43:107::1;6263:13:::0;6364:28:::1;:43::i;:::-;6339:22;:68:::0;6417:5:::1;:12:::0;;;::::1;-1:-1:-1::0;;;6417:12:107::1;::::0;;6445:22:::1;::::0;::::1;::::0;::::1;::::0;6453:13;345:25:125;;333:2;318:18;;199:177;6445:22:107::1;;;;;;;;5545:929;;5399:1075:::0;;;;:::o;24210:386::-;24350:12;;24304:7;;24350:12;;24335:27;;;24327:69;;;;-1:-1:-1;;;24327:69:107;;10004:2:125;24327:69:107;;;9986:21:125;10043:2;10023:18;;;10016:30;10082:31;10062:18;;;10055:59;10131:18;;24327:69:107;9802:353:125;24327:69:107;24442:12;;-1:-1:-1;;;24442:12:107;;;;24427:27;;;24406:110;;;;-1:-1:-1;;;24406:110:107;;10362:2:125;24406:110:107;;;10344:21:125;10401:2;10381:18;;;10374:30;10440:34;10420:18;;;10413:62;10511:6;10491:18;;;10484:34;10535:19;;24406:110:107;10160:400:125;24406:110:107;24562:19;;;;:6;:19;;;;;:26;24533:56;;24562:26;;;-1:-1:-1;;;;;24562:26:107;24533:28;:56::i;1831:101:49:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;9685:4685:107:-;4695:5;;-1:-1:-1;;;4695:5:107;;;;4687:44;;;;-1:-1:-1;;;4687:44:107;;7266:2:125;4687:44:107;;;7248:21:125;7305:2;7285:18;;;7278:30;7344:28;7324:18;;;7317:56;7390:18;;4687:44:107;7064:350:125;4687:44:107;9760:21:::1;::::0;-1:-1:-1;;;9760:21:107;::::1;;;9756:111;;;9818:10;9805:24;::::0;;;:12:::1;:24;::::0;;;;;::::1;;9797:59;;;::::0;-1:-1:-1;;;9797:59:107;;10767:2:125;9797:59:107::1;::::0;::::1;10749:21:125::0;10806:2;10786:18;;;10779:30;10845:24;10825:18;;;10818:52;10887:18;;9797:59:107::1;10565:346:125::0;9797:59:107::1;9990:11;::::0;:15:::1;::::0;-1:-1:-1;;;9990:11:107;::::1;;;10004:1;9990:15;:::i;:::-;:20;::::0;10008:2:::1;9990:20;:::i;:::-;9971:40;;:7;:14;:40;9877:181;;;::::0;-1:-1:-1;;;9877:181:107;;5345:2:125;9877:181:107::1;::::0;::::1;5327:21:125::0;5384:2;5364:18;;;5357:30;5423:23;5403:18;;;5396:51;5464:18;;9877:181:107::1;5143:345:125::0;9877:181:107::1;10099:12;::::0;-1:-1:-1;;;10099:12:107;::::1;;;10069:20;10092::::0;;;:6:::1;:20;::::0;;;;10143:13;;10092:20;;10143:13;;;::::1;-1:-1:-1::0;;;;;10143:13:107::1;::::0;10069:20;10249:416:::1;10273:11;::::0;-1:-1:-1;;;10273:11:107;::::1;;;10269:15:::0;::::1;10249:416;;;10323:21;::::0;10406:53:::1;10421:7:::0;10430:6:::1;:1:::0;10434:2:::1;10430:6;:::i;:::-;10438:20;10406:14;:53::i;:::-;10305:154;;;;10522:9;10499:19;:32;10474:129;;;::::0;-1:-1:-1;;;10474:129:107;;11118:2:125;10474:129:107::1;::::0;::::1;11100:21:125::0;11157:2;11137:18;;;11130:30;11196:34;11176:18;;;11169:62;11267:8;11247:18;;;11240:36;11293:19;;10474:129:107::1;10916:402:125::0;10474:129:107::1;-1:-1:-1::0;10641:13:107;-1:-1:-1;10286:3:107;::::1;::::0;::::1;:::i;:::-;;;;10249:416;;;-1:-1:-1::0;10718:25:107::1;10787:11:::0;;10746:72:::1;::::0;10787:15:::1;::::0;10801:1:::1;::::0;-1:-1:-1;;;10787:11:107;::::1;;;:15;:::i;:::-;10786:22;::::0;10806:2:::1;10786:22;:::i;:::-;10746:7:::0;;:72:::1;;:26;:72::i;:::-;10718:100;;;;11475:15;11455:17;:35;11373:173;;;::::0;-1:-1:-1;;;11373:173:107;;11713:2:125;11373:173:107::1;::::0;::::1;11695:21:125::0;11752:2;11732:18;;;11725:30;11791:32;11771:18;;;11764:60;11841:18;;11373:173:107::1;11511:354:125::0;11373:173:107::1;11698:16:::0;;11610:22:::1;::::0;11635:120:::1;::::0;11675:9;;11698:16:::1;;11728:17:::0;11635:26:::1;:120::i;:::-;11610:145;;11819:19;11853:27:::0;11883:66:::1;11923:11;;;;;;;;;;;11937:2;11923:16;;;;:::i;:::-;11883:7:::0;;:66:::1;;:26;:66::i;:::-;11995:9;12007:11:::0;11853:96:::1;::::0;;;::::1;::::0;-1:-1:-1;;;;12007:11:107;::::1;;;11990:1928;12024:11;::::0;:15:::1;::::0;-1:-1:-1;;;12024:11:107;::::1;;;12038:1;12024:15;:::i;:::-;12020:19;;:1;:19;11990:1928;;;12078:22;::::0;12163:53:::1;12178:7:::0;12187:6:::1;:1:::0;12191:2:::1;12187:6;:::i;12163:53::-;12060:156;;;;12235:11;12250:1;12235:16:::0;12231:1625:::1;;12362:20;12348:34;;13484:20;13467:14;:37;13418:20;:87;12400:1174;;;::::0;-1:-1:-1;;;12400:1174:107;;12072:2:125;12400:1174:107::1;::::0;::::1;12054:21:125::0;12111:2;12091:18;;;12084:30;12150:29;12130:18;;;12123:57;12197:18;;12400:1174:107::1;11870:351:125::0;12400:1174:107::1;12231:1625;;;13749:11;13725:20;:35;13696:145;;;::::0;-1:-1:-1;;;13696:145:107;;12428:2:125;13696:145:107::1;::::0;::::1;12410:21:125::0;12467:2;12447:18;;;12440:30;12506:34;12486:18;;;12479:62;12577:9;12557:18;;;12550:37;12604:19;;13696:145:107::1;12226:403:125::0;13696:145:107::1;-1:-1:-1::0;13893:14:107;-1:-1:-1;12041:3:107;::::1;::::0;::::1;:::i;:::-;;;;11990:1928;;;;13943:12;;;;;;;;;;;13958:1;13943:16;;;;:::i;:::-;13928:12;:31:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;13928:31:107;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;;13993:90:::1;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;13993:90:107;;::::1;;::::0;;::::1;::::0;;;13977:12;;;::::1;::::0;;::::1;-1:-1:-1::0;13970:20:107;;;:6:::1;:20:::0;;;;;;:113;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;14118:22:::1;::::0;;14174:41:::1;14061:11:::0;14174:28:::1;:41::i;:::-;14226:19;:35:::0;;;14271:22:::1;:38:::0;;;14325::::1;::::0;;555:25:125;;;611:2;596:18;;589:34;;;14271:38:107;;-1:-1:-1;14325:38:107::1;::::0;528:18:125;14325:38:107::1;;;;;;;9746:4624;;;;;;;;;9685:4685:::0;:::o;7622:149::-;1094:13:49;:11;:13::i;:::-;-1:-1:-1;;;;;7689:23:107;::::1;;::::0;;;:12:::1;:23;::::0;;;;;;;;:30;;-1:-1:-1;;7689:30:107::1;7715:4;7689:30;::::0;;7734;;3713:74:125;;;7734:30:107::1;::::0;3686:18:125;7734:30:107::1;3567:226:125::0;7325:165:107;1094:13:49;:11;:13::i;:::-;7399:21:107::1;:30:::0;;;::::1;;-1:-1:-1::0;;;7399:30:107::1;::::0;;;::::1;;::::0;;7444:39:::1;::::0;::::1;::::0;::::1;::::0;7423:6;3335:14:125;3328:22;3310:41;;3298:2;3283:18;;3170:187;2081:198:49;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:49;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:49;;12836:2:125;2161:73:49::1;::::0;::::1;12818:21:125::0;12875:2;12855:18;;;12848:30;12914:34;12894:18;;;12887:62;12985:8;12965:18;;;12958:36;13011:19;;2161:73:49::1;12634:402:125::0;2161:73:49::1;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;33545:153:0:-;33616:6;33641:50;33662:27;33681:7;33662:18;:27::i;:::-;6397:21;;;;;;6402:10;6360:6;;;;;6359:21;;;;6358:61;6485:2;6480:7;;;6468;;;6467:21;;6238:257;25242:729:107;25376:14;;25501:24;;25497:176;;25566:49;:7;25597:5;25604:10;25566:30;:49::i;:::-;25541:121;;;;-1:-1:-1;;;25541:121:107;;13243:2:125;25541:121:107;;;13225:21:125;13282:2;13262:18;;;13255:30;13321:15;13301:18;;;13294:43;13354:18;;25541:121:107;13041:337:125;25541:121:107;25769:30;:7;25793:5;25769:23;:30::i;:::-;25760:39;-1:-1:-1;25818:31:107;:7;25839:5;25846:2;25818:20;:31::i;:::-;25809:40;;25867:46;25898:6;25906;25867:30;:46::i;:::-;25859:71;;;;-1:-1:-1;;;25859:71:107;;13585:2:125;25859:71:107;;;13567:21:125;13624:2;13604:18;;;13597:30;13663:14;13643:18;;;13636:42;13695:18;;25859:71:107;13383:336:125;25859:71:107;25242:729;;;;;;:::o;2856:200::-;2965:6;2994:55;3024:23;3039:7;3044:2;3039;:7;:::i;:::-;3024;;:14;:23::i;2994:55::-;2987:62;2856:200;-1:-1:-1;;;2856:200:107:o;1359:130:49:-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:49;719:10:67;1422:23:49;1414:68;;;;-1:-1:-1;;;1414:68:49;;14056:2:125;1414:68:49;;;14038:21:125;;;14075:18;;;14068:30;14134:34;14114:18;;;14107:62;14186:18;;1414:68:49;13854:356:125;30774:128:0;30842:7;30868:27;30884:7;30893:1;30868:15;:27::i;31938:178::-;32007:7;32084:25;378:58;32101:7;32084:16;:25::i;2433:187:49:-;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:49;;;;;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;37944:920:0:-;38100:7;;38142:37;:16;38163:15;38142:20;:37::i;:::-;38119:60;-1:-1:-1;38278:22:0;485:20;38298:1;38278:19;:22::i;:::-;38263:12;:37;38259:105;;;38331:22;485:20;38351:1;38331:19;:22::i;:::-;38316:37;;38259:105;38392:22;485:20;38412:1;38392:19;:22::i;:::-;38377:12;:37;38373:105;;;38445:22;485:20;38465:1;38445:19;:22::i;:::-;38430:37;;38373:105;38735:17;38755:44;38786:12;38755:26;:15;38775:5;38755:19;:26::i;:::-;:30;;:44::i;:::-;38735:64;-1:-1:-1;38816:41:0;38851:5;38816:30;38735:64;485:20;38816:13;:30::i;:41::-;38809:48;37944:920;-1:-1:-1;;;;;;37944:920:0:o;33215:123::-;33288:6;33313:18;:7;33328:2;33313:14;:18::i;5321:421:4:-;5466:4;;5548:32;:7;5577:2;5548:28;:32::i;:::-;5529:51;;5681:16;5669:8;:28;5665:49;;5707:5;5700:12;;;;;5665:49;-1:-1:-1;5731:4:4;;5321:421;-1:-1:-1;;;;5321:421:4:o;31226:332:0:-;31308:7;;31346:23;31361:7;31366:2;31361;:7;:::i;31346:23::-;31339:31;;;-1:-1:-1;31380:8:0;31397:7;31405;31410:2;31405;:7;:::i;:::-;31397:16;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;31424:17:0;31452;31466:2;6719:8;6782:2;6776;:8;;;;6758:2;6763:8;6758:13;6751:2;6745;:8;;;;6744:28;:41;6739:46;;6662:130;;;;31452:17;31444:26;;;-1:-1:-1;31480:14:0;31497:6;31502:1;31497:2;:6;:::i;:::-;31480:23;;;-1:-1:-1;31534:16:0;31480:23;31534:3;:16;:::i;:::-;31521:30;;:9;:30;:::i;:::-;31514:37;31226:332;-1:-1:-1;;;;;;;31226:332:0:o;11007:394::-;11124:11;11292:2;11286:4;11281:3;11275:2;11271;11267:11;11263:2;11259:20;11256:1;11249:5;11238:57;11234:62;11350:2;11344:4;11340:2;11334:4;11331:1;11324:5;11313:40;-1:-1:-1;;11380:4:0;11374:11;;11007:394;-1:-1:-1;;;11007:394:0:o;4634:228:4:-;4739:4;4759:6;4755:41;;-1:-1:-1;4789:5:4;4782:12;;4755:41;4848:6;4813:32;4821:6;4519:9:0;4544:2;4540:6;;4754:1;4679;4683:66;4679:70;4678:77;;4590:1;4585;:6;;4595:66;4584:77;4583:173;4579:177;;4976:2;4901:1;4905:66;4901:70;4900:78;;4811:2;4806:1;:7;;4817:66;4805:78;4804:175;4800:179;;5199:2;5124:1;5128:66;5124:70;5123:78;;5034:2;5029:1;:7;;5040:66;5028:78;5027:175;5023:179;;5422:2;5347:1;5351:66;5347:70;5346:78;;5257:2;5252:1;:7;;5263:66;5251:78;5250:175;5246:179;;5493:3;5488:1;:8;;5480:3;5475:1;:8;;5474:23;5470:27;;4460:1044;;;;4813:32:4;:41;;4634:228;-1:-1:-1;;;4634:228:4:o;13081:136:1:-;13154:6;13186:23;13194:6;13202;12550:28;12566:2;12550:28;12544:35;;12417:178;1864:301:3;1924:7;2151;2156:2;2151;:7;:::i;2287:160::-;2347:7;2380:2;2374;:8;;2366:50;;;;-1:-1:-1;;;2366:50:3;;16136:2:125;2366:50:3;;;16118:21:125;16175:2;16155:18;;;16148:30;16214:31;16194:18;;;16187:59;16263:18;;2366:50:3;15934:353:125;2366:50:3;2433:7;2438:2;2433;:7;:::i;1316:456::-;1376:9;1618:2;1624:1;1618:7;1614:46;;-1:-1:-1;1648:1:3;1641:8;;1614:46;1674:7;1679:2;1674;:7;:::i;:::-;1670:11;-1:-1:-1;1709:2:3;1699:6;1703:2;1670:11;1699:6;:::i;:::-;:12;1691:56;;;;-1:-1:-1;;;1691:56:3;;16494:2:125;1691:56:3;;;16476:21:125;16533:2;16513:18;;;16506:30;16572:33;16552:18;;;16545:61;16623:18;;1691:56:3;16292:355:125;32828:165:0;32937:7;32963:23;32979:6;32983:2;32979:1;:6;:::i;:::-;32963:7;12550:28:1;12566:2;12550:28;12544:35;;12417:178::o;14:180:125:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:125;;14:180;-1:-1:-1;14:180:125:o;634:184::-;-1:-1:-1;;;683:1:125;676:88;783:4;780:1;773:15;807:4;804:1;797:15;823:921;891:6;944:2;932:9;923:7;919:23;915:32;912:52;;;960:1;957;950:12;912:52;1000:9;987:23;1029:18;1070:2;1062:6;1059:14;1056:34;;;1086:1;1083;1076:12;1056:34;1124:6;1113:9;1109:22;1099:32;;1169:7;1162:4;1158:2;1154:13;1150:27;1140:55;;1191:1;1188;1181:12;1140:55;1227:2;1214:16;1249:2;1245;1242:10;1239:36;;;1255:18;;:::i;:::-;1330:2;1324:9;1298:2;1384:13;;-1:-1:-1;;1380:22:125;;;1404:2;1376:31;1372:40;1360:53;;;1428:18;;;1448:22;;;1425:46;1422:72;;;1474:18;;:::i;:::-;1514:10;1510:2;1503:22;1549:2;1541:6;1534:18;1589:7;1584:2;1579;1575;1571:11;1567:20;1564:33;1561:53;;;1610:1;1607;1600:12;1561:53;1666:2;1661;1657;1653:11;1648:2;1640:6;1636:15;1623:46;1711:1;1689:15;;;1706:2;1685:24;1678:35;;;;-1:-1:-1;1693:6:125;823:921;-1:-1:-1;;;;;823:921:125:o;1749:171::-;1816:20;;1876:18;1865:30;;1855:41;;1845:69;;1910:1;1907;1900:12;1845:69;1749:171;;;:::o;1925:184::-;1983:6;2036:2;2024:9;2015:7;2011:23;2007:32;2004:52;;;2052:1;2049;2042:12;2004:52;2075:28;2093:9;2075:28;:::i;2114:309::-;2173:6;2226:2;2214:9;2205:7;2201:23;2197:32;2194:52;;;2242:1;2239;2232:12;2194:52;2281:9;2268:23;-1:-1:-1;;;;;2324:5:125;2320:54;2313:5;2310:65;2300:93;;2389:1;2386;2379:12;2428:737;2515:6;2523;2531;2539;2592:2;2580:9;2571:7;2567:23;2563:32;2560:52;;;2608:1;2605;2598:12;2560:52;2648:9;2635:23;2677:18;2718:2;2710:6;2707:14;2704:34;;;2734:1;2731;2724:12;2704:34;2772:6;2761:9;2757:22;2747:32;;2817:7;2810:4;2806:2;2802:13;2798:27;2788:55;;2839:1;2836;2829:12;2788:55;2879:2;2866:16;2905:2;2897:6;2894:14;2891:34;;;2921:1;2918;2911:12;2891:34;2968:7;2961:4;2952:6;2948:2;2944:15;2940:26;2937:39;2934:59;;;2989:1;2986;2979:12;2934:59;3020:4;3012:13;;;;-1:-1:-1;3044:6:125;-1:-1:-1;;3082:20:125;;3069:34;;-1:-1:-1;3122:37:125;3155:2;3140:18;;3122:37;:::i;:::-;3112:47;;2428:737;;;;;;;:::o;3798:273::-;3854:6;3907:2;3895:9;3886:7;3882:23;3878:32;3875:52;;;3923:1;3920;3913:12;3875:52;3962:9;3949:23;4015:5;4008:13;4001:21;3994:5;3991:32;3981:60;;4037:1;4034;4027:12;4076:184;-1:-1:-1;;;4125:1:125;4118:88;4225:4;4222:1;4215:15;4249:4;4246:1;4239:15;4265:184;-1:-1:-1;;;4314:1:125;4307:88;4414:4;4411:1;4404:15;4438:4;4435:1;4428:15;4454:120;4494:1;4520;4510:35;;4525:18;;:::i;:::-;-1:-1:-1;4559:9:125;;4454:120::o;4579:257::-;4650:18;4700:10;;;4712;;;4696:27;4743:20;;;;4650:18;4782:24;;;4772:58;;4810:18;;:::i;:::-;4772:58;;4579:257;;;;:::o;4841:180::-;4908:18;4946:10;;;4958;;;4942:27;;4981:11;;;4978:37;;;4995:18;;:::i;:::-;4978:37;4841:180;;;;:::o;5026:112::-;5058:1;5084;5074:35;;5089:18;;:::i;:::-;-1:-1:-1;5123:9:125;;5026:112::o;5847:128::-;5914:9;;;5935:11;;;5932:37;;;5949:18;;:::i;6751:168::-;6824:9;;;6855;;6872:15;;;6866:22;;6852:37;6842:71;;6893:18;;:::i;6924:135::-;6963:3;6984:17;;;6981:43;;7004:18;;:::i;:::-;-1:-1:-1;7051:1:125;7040:13;;6924:135::o;11323:183::-;11391:18;11442:10;;;11430;;;11426:27;;11465:12;;;11462:38;;;11480:18;;:::i;13724:125::-;13789:9;;;13810:10;;;13807:36;;;13823:18;;:::i;14215:184::-;-1:-1:-1;;;14264:1:125;14257:88;14364:4;14361:1;14354:15;14388:4;14385:1;14378:15;14404:151;14494:4;14487:12;;;14473;;;14469:31;;14512:14;;14509:40;;;14529:18;;:::i;14560:422::-;14649:1;14692:5;14649:1;14706:270;14727:7;14717:8;14714:21;14706:270;;;14786:4;14782:1;14778:6;14774:17;14768:4;14765:27;14762:53;;;14795:18;;:::i;:::-;14845:7;14835:8;14831:22;14828:55;;;14865:16;;;;14828:55;14944:22;;;;14904:15;;;;14706:270;;;14710:3;14560:422;;;;;:::o;14987:806::-;15036:5;15066:8;15056:80;;-1:-1:-1;15107:1:125;15121:5;;15056:80;15155:4;15145:76;;-1:-1:-1;15192:1:125;15206:5;;15145:76;15237:4;15255:1;15250:59;;;;15323:1;15318:130;;;;15230:218;;15250:59;15280:1;15271:10;;15294:5;;;15318:130;15355:3;15345:8;15342:17;15339:43;;;15362:18;;:::i;:::-;-1:-1:-1;;15418:1:125;15404:16;;15433:5;;15230:218;;15532:2;15522:8;15519:16;15513:3;15507:4;15504:13;15500:36;15494:2;15484:8;15481:16;15476:2;15470:4;15467:12;15463:35;15460:77;15457:159;;;-1:-1:-1;15569:19:125;;;15601:5;;15457:159;15648:34;15673:8;15667:4;15648:34;:::i;:::-;15718:6;15714:1;15710:6;15706:19;15697:7;15694:32;15691:58;;;15729:18;;:::i;:::-;15767:20;;14987:806;-1:-1:-1;;;14987:806:125:o;15798:131::-;15858:5;15887:36;15914:8;15908:4;15887:36;:::i"
|
|
11763
|
+
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x18D JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x715018A6 GT PUSH2 0xE3 JUMPI DUP1 PUSH4 0xB70E6BE6 GT PUSH2 0x8C JUMPI DUP1 PUSH4 0xF2FDE38B GT PUSH2 0x66 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x340 JUMPI DUP1 PUSH4 0xF5619FDA EQ PUSH2 0x353 JUMPI DUP1 PUSH4 0xFE9FBB80 EQ PUSH2 0x36E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0xB70E6BE6 EQ PUSH2 0x306 JUMPI DUP1 PUSH4 0xD38C29A1 EQ PUSH2 0x31A JUMPI DUP1 PUSH4 0xEB8695EF EQ PUSH2 0x32D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x8DA5CB5B GT PUSH2 0xBD JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x2C4 JUMPI DUP1 PUSH4 0x95410D2B EQ PUSH2 0x2DF JUMPI DUP1 PUSH4 0xB6A5D7DE EQ PUSH2 0x2F3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x715018A6 EQ PUSH2 0x275 JUMPI DUP1 PUSH4 0x76671808 EQ PUSH2 0x27D JUMPI DUP1 PUSH4 0x7CA5B1DD EQ PUSH2 0x2B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x27C97FA5 GT PUSH2 0x145 JUMPI DUP1 PUSH4 0x4CA49F51 GT PUSH2 0x11F JUMPI DUP1 PUSH4 0x4CA49F51 EQ PUSH2 0x22B JUMPI DUP1 PUSH4 0x620414E6 EQ PUSH2 0x23E JUMPI DUP1 PUSH4 0x6DEFBF80 EQ PUSH2 0x251 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x27C97FA5 EQ PUSH2 0x205 JUMPI DUP1 PUSH4 0x2B97BE24 EQ PUSH2 0x218 JUMPI DUP1 PUSH4 0x3A1B77B0 EQ PUSH2 0x220 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x113764BE GT PUSH2 0x176 JUMPI DUP1 PUSH4 0x113764BE EQ PUSH2 0x1D5 JUMPI DUP1 PUSH4 0x189179A3 EQ PUSH2 0x1DD JUMPI DUP1 PUSH4 0x19C9AA32 EQ PUSH2 0x1F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 PUSH4 0x6A27422 EQ PUSH2 0x192 JUMPI DUP1 PUSH4 0x10B76ED8 EQ PUSH2 0x1B8 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1A5 PUSH2 0x1A0 CALLDATASIZE PUSH1 0x4 PUSH2 0x1C75 JUMP JUMPDEST PUSH2 0x391 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1C0 PUSH2 0x3A8 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD SWAP3 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE ADD PUSH2 0x1AF JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH2 0x1A5 JUMP JUMPDEST PUSH2 0x1C0 PUSH2 0x1EB CALLDATASIZE PUSH1 0x4 PUSH2 0x1CA4 JUMP JUMPDEST PUSH2 0x408 JUMP JUMPDEST PUSH2 0x203 PUSH2 0x1FE CALLDATASIZE PUSH1 0x4 PUSH2 0x1D72 JUMP JUMPDEST PUSH2 0x800 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x203 PUSH2 0x213 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D8D JUMP JUMPDEST PUSH2 0x9F3 JUMP JUMPDEST PUSH1 0x3 SLOAD PUSH2 0x1A5 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x3 SLOAD PUSH2 0x1C0 JUMP JUMPDEST PUSH2 0x203 PUSH2 0x239 CALLDATASIZE PUSH1 0x4 PUSH2 0x1DB6 JUMP JUMPDEST PUSH2 0xA4C JUMP JUMPDEST PUSH2 0x1A5 PUSH2 0x24C CALLDATASIZE PUSH1 0x4 PUSH2 0x1C75 JUMP JUMPDEST PUSH2 0xE15 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x265 SWAP1 PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1AF JUMP JUMPDEST PUSH2 0x203 PUSH2 0xF25 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH2 0x298 SWAP1 PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH8 0xFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1AF JUMP JUMPDEST PUSH2 0x203 PUSH2 0x2BF CALLDATASIZE PUSH1 0x4 PUSH2 0x1CA4 JUMP JUMPDEST PUSH2 0xF39 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x1AF JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x265 SWAP1 PUSH1 0x1 PUSH1 0xA8 SHL SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH2 0x203 PUSH2 0x301 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D8D JUMP JUMPDEST PUSH2 0x14D7 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH2 0x298 SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x203 PUSH2 0x328 CALLDATASIZE PUSH1 0x4 PUSH2 0x1CA4 JUMP JUMPDEST PUSH2 0x1533 JUMP JUMPDEST PUSH2 0x203 PUSH2 0x33B CALLDATASIZE PUSH1 0x4 PUSH2 0x1E3F JUMP JUMPDEST PUSH2 0x155A JUMP JUMPDEST PUSH2 0x203 PUSH2 0x34E CALLDATASIZE PUSH1 0x4 PUSH2 0x1D8D JUMP JUMPDEST PUSH2 0x15CA JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x298 SWAP1 PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH2 0x265 PUSH2 0x37C CALLDATASIZE PUSH1 0x4 PUSH2 0x1D8D JUMP JUMPDEST PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3A2 PUSH2 0x24C PUSH2 0x7E0 DUP5 PUSH2 0x1E8D JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x0 SWAP1 DUP2 SWAP1 PUSH2 0x3C6 SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH2 0x7E0 PUSH2 0x1EA1 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF SWAP2 DUP3 AND SWAP4 POP PUSH2 0x3EC SWAP2 PUSH1 0x1 PUSH1 0x40 SHL SWAP1 SWAP2 DIV AND PUSH2 0x7E0 PUSH2 0x1EA1 JUMP JUMPDEST PUSH2 0x3F8 SWAP1 PUSH2 0x7DF PUSH2 0x1ECD JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF AND SWAP1 POP SWAP1 SWAP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x50 DUP4 MLOAD PUSH2 0x419 SWAP2 SWAP1 PUSH2 0x1EF5 JUMP JUMPDEST ISZERO PUSH2 0x46B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C696420686561646572206C656E6774680000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x50 DUP4 MLOAD PUSH2 0x479 SWAP2 SWAP1 PUSH2 0x1E8D JUMP JUMPDEST SWAP1 POP PUSH1 0x1 DUP2 GT DUP1 ISZERO PUSH2 0x48C JUMPI POP PUSH2 0x7E0 DUP2 LT JUMPDEST PUSH2 0x4D8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C6964206E756D626572206F66206865616465727300000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH2 0x4E1 DUP4 PUSH2 0x165A JUMP JUMPDEST PUSH4 0xFFFFFFFF AND SWAP2 POP PUSH1 0x0 DUP1 PUSH2 0x4F7 DUP6 DUP3 DUP1 PUSH2 0x168E JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD DUP3 SWAP1 MSTORE PUSH1 0x1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x1 PUSH1 0x40 SHL SWAP1 SWAP2 DIV AND DUP1 DUP4 MSTORE PUSH1 0x4 DUP3 MSTORE SWAP2 DUP5 SWAP1 KECCAK256 DUP5 MLOAD DUP1 DUP7 ADD SWAP1 SWAP6 MSTORE SLOAD PUSH4 0xFFFFFFFF DUP2 AND DUP6 MSTORE PUSH5 0x100000000 SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND SWAP1 DUP5 ADD MSTORE SWAP4 SWAP6 POP SWAP2 SWAP4 POP SWAP1 SWAP2 SWAP1 DUP3 JUMPDEST DUP2 MLOAD PUSH4 0xFFFFFFFF AND DUP9 LT ISZERO PUSH2 0x5BD JUMPI PUSH2 0x579 PUSH1 0x1 DUP5 PUSH2 0x1F09 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE SLOAD PUSH4 0xFFFFFFFF DUP2 AND DUP4 MSTORE PUSH5 0x100000000 SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND SWAP1 DUP3 ADD MSTORE SWAP1 SWAP4 POP SWAP2 SWAP1 POP PUSH2 0x55F JUMP JUMPDEST DUP2 MLOAD PUSH4 0xFFFFFFFF AND PUSH2 0x637 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x2B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x43616E6E6F742076616C696461746520636861696E73206265666F7265207265 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6C61792067656E65736973000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x462 JUMP JUMPDEST DUP2 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND DUP6 EQ PUSH2 0x701 JUMPI DUP1 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND DUP6 SUB PUSH2 0x667 JUMPI SWAP1 POP DUP3 PUSH2 0x701 JUMP JUMPDEST PUSH2 0x672 PUSH1 0x1 DUP5 PUSH2 0x1F09 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP3 MLOAD DUP1 DUP5 ADD SWAP1 SWAP4 MSTORE SLOAD PUSH4 0xFFFFFFFF DUP2 AND DUP4 MSTORE PUSH5 0x100000000 SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND SWAP1 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 SWAP5 POP SWAP3 SWAP2 POP DUP6 EQ PUSH2 0x701 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C69642074617267657420696E2068656164657220636861696E0000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH1 0x1 JUMPDEST DUP8 DUP2 LT ISZERO PUSH2 0x7F4 JUMPI PUSH1 0x0 PUSH2 0x723 DUP12 PUSH2 0x71D DUP5 PUSH1 0x50 PUSH2 0x1F1C JUMP JUMPDEST DUP11 PUSH2 0x168E JUMP JUMPDEST PUSH1 0x20 DUP7 ADD MLOAD SWAP1 SWAP9 POP SWAP1 SWAP2 POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND DUP8 EQ PUSH2 0x7E0 JUMPI PUSH1 0x0 PUSH2 0x754 PUSH2 0x74D DUP5 PUSH1 0x50 PUSH2 0x1F1C JUMP JUMPDEST DUP14 SWAP1 PUSH2 0x1766 JUMP JUMPDEST DUP5 MLOAD PUSH4 0xFFFFFFFF SWAP2 DUP3 AND SWAP3 POP AND ISZERO DUP1 ISZERO SWAP1 PUSH2 0x77B JUMPI POP DUP4 PUSH1 0x20 ADD MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND DUP9 EQ JUMPDEST DUP1 ISZERO PUSH2 0x78D JUMPI POP DUP4 MLOAD PUSH4 0xFFFFFFFF AND DUP2 EQ JUMPDEST PUSH2 0x7D9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C69642074617267657420696E2068656164657220636861696E0000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST POP SWAP2 SWAP3 POP DUP5 SWAP2 JUMPDEST SWAP7 POP DUP1 PUSH2 0x7EC DUP2 PUSH2 0x1F33 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x704 JUMP JUMPDEST POP POP POP POP POP POP POP SWAP2 POP SWAP2 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0x859 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x52656C6179206973206E6F7420726561647920666F7220757365000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH2 0x861 PUSH2 0x1787 JUMP JUMPDEST PUSH2 0x7E0 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF AND LT PUSH2 0x8BC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x50726F6F66206C656E6774682065786365737369766500000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF AND GT PUSH2 0x916 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x50726F6F66206C656E677468206D6179206E6F74206265207A65726F00000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 SWAP2 DIV DUP2 AND SWAP1 DUP3 AND SUB PUSH2 0x97C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x50726F6F66206C656E67746820756E6368616E67656400000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x1 PUSH1 0xB0 SHL PUSH8 0xFFFFFFFFFFFFFFFF DUP5 AND SWAP1 DUP2 MUL SWAP2 SWAP1 SWAP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP1 DUP2 MSTORE PUSH32 0x3E9F904D8CF11753C79B67C8259C582056D4A7D8AF120F81257A59EEB8824B96 SWAP1 PUSH1 0x20 ADD JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH2 0x9FB PUSH2 0x1787 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE SWAP1 MLOAD SWAP2 DUP3 MSTORE PUSH32 0x7498B96BEEABEA5AD3139F1A2861A03E480034254E36B10AAE2E6E42AD7B4B68 SWAP2 ADD PUSH2 0x9E8 JUMP JUMPDEST PUSH2 0xA54 PUSH2 0x1787 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0xAAE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x19 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x47656E6573697320616C726561647920706572666F726D656400000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH1 0x50 DUP4 EQ PUSH2 0xAFE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C69642067656E6573697320686561646572206C656E677468000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH2 0xB0A PUSH2 0x7E0 DUP4 PUSH2 0x1EF5 JUMP JUMPDEST ISZERO PUSH2 0xB7D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x25 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C696420686569676874206F662072656C61792067656E6573697320 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x626C6F636B000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x462 JUMP JUMPDEST PUSH2 0x7E0 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF AND LT PUSH2 0xBD8 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x50726F6F66206C656E6774682065786365737369766500000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH8 0xFFFFFFFFFFFFFFFF AND GT PUSH2 0xC32 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1C PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x50726F6F66206C656E677468206D6179206E6F74206265207A65726F00000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH2 0xC3E PUSH2 0x7E0 DUP4 PUSH2 0x1E8D JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 AND PUSH8 0xFFFFFFFFFFFFFFFF SWAP3 SWAP1 SWAP3 AND SWAP2 DUP3 OR PUSH1 0x1 PUSH1 0x40 SHL SWAP3 SWAP1 SWAP3 MUL SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP7 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP5 DUP2 MSTORE PUSH1 0x0 SWAP2 PUSH2 0xCC4 SWAP2 SWAP1 DUP8 SWAP1 DUP8 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x17E1 SWAP3 POP POP POP JUMP JUMPDEST SWAP1 POP PUSH1 0x0 PUSH2 0xD07 DUP7 DUP7 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 SWAP3 ADD SWAP2 SWAP1 SWAP2 MSTORE POP PUSH2 0x165A SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH4 0xFFFFFFFF SWAP3 DUP4 AND DUP1 DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP1 DUP8 AND PUSH1 0x20 DUP1 DUP6 ADD SWAP2 DUP3 MSTORE PUSH1 0x1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 SWAP1 SWAP3 MSTORE SWAP6 DUP2 KECCAK256 SWAP5 MLOAD SWAP2 MLOAD SWAP1 SWAP3 AND PUSH5 0x100000000 MUL SWAP6 AND SWAP5 SWAP1 SWAP5 OR SWAP1 SWAP2 SSTORE DUP3 SLOAD SWAP2 DUP7 AND PUSH1 0x1 PUSH1 0xB0 SHL MUL PUSH32 0xFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SWAP2 SSTORE SWAP1 POP PUSH2 0xDA2 DUP3 PUSH2 0x17EE JUMP JUMPDEST PUSH1 0x2 SSTORE PUSH1 0x0 DUP1 SLOAD PUSH32 0xFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x1 PUSH1 0xA0 SHL OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x2381D16925551C2FB1A5EDFCF4FCE2F6D085E1F85F4B88340C09C9D191F9D4E9 SWAP1 PUSH2 0xE05 SWAP1 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x0 SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF AND DUP3 LT ISZERO PUSH2 0xE74 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45706F6368206973206265666F72652072656C61792067656E65736973000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND DUP3 GT ISZERO PUSH2 0xEFC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x24 DUP1 DUP3 ADD MSTORE PUSH32 0x45706F6368206973206E6F742070726F76656E20746F207468652072656C6179 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x2079657400000000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x462 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH2 0x3A2 SWAP1 PUSH5 0x100000000 SWAP1 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND PUSH2 0x17EE JUMP JUMPDEST PUSH2 0xF2D PUSH2 0x1787 JUMP JUMPDEST PUSH2 0xF37 PUSH1 0x0 PUSH2 0x1816 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0xFF AND PUSH2 0xF92 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1A PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x52656C6179206973206E6F7420726561647920666F7220757365000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA8 SHL SWAP1 DIV PUSH1 0xFF AND ISZERO PUSH2 0x1003 JUMPI CALLER PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD PUSH1 0xFF AND PUSH2 0x1003 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x16 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x5375626D697474657220756E617574686F72697A656400000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x1022 SWAP1 PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH1 0x2 PUSH2 0x1EA1 JUMP JUMPDEST PUSH2 0x102D SWAP1 PUSH1 0x50 PUSH2 0x1EA1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 MLOAD EQ PUSH2 0x1086 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x15 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C696420686561646572206C656E6774680000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH1 0x1 SLOAD PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD SWAP1 SWAP2 PUSH5 0x100000000 SWAP1 SWAP2 DIV PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB AND SWAP1 DUP1 JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 LT ISZERO PUSH2 0x1182 JUMPI PUSH1 0x0 DUP1 PUSH2 0x10F4 DUP8 PUSH2 0x10EE DUP6 PUSH1 0x50 PUSH2 0x1F1C JUMP JUMPDEST DUP7 PUSH2 0x168E JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 DUP2 EQ PUSH2 0x116D JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C69642074617267657420696E207072652D72657461726765742068 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6561646572730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x462 JUMP JUMPDEST POP SWAP2 POP DUP1 PUSH2 0x117A DUP2 PUSH2 0x1F33 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x10C1 JUMP JUMPDEST POP PUSH1 0x0 DUP1 SLOAD PUSH2 0x11C4 SWAP1 PUSH2 0x11A8 SWAP1 PUSH1 0x1 SWAP1 PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH2 0x1F4C JUMP JUMPDEST PUSH2 0x11B3 SWAP1 PUSH1 0x50 PUSH2 0x1EA1 JUMP JUMPDEST DUP7 SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH2 0x1766 JUMP JUMPDEST PUSH4 0xFFFFFFFF AND SWAP1 POP TIMESTAMP DUP2 LT PUSH2 0x121B JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1E PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x45706F63682063616E6E6F7420656E6420696E20746865206675747572650000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST DUP4 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x1232 SWAP1 DUP6 SWAP1 PUSH4 0xFFFFFFFF AND DUP5 PUSH2 0x187E JUMP JUMPDEST SWAP1 POP PUSH1 0x0 DUP1 PUSH2 0x126E PUSH1 0x0 PUSH1 0x16 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH1 0x50 PUSH2 0x125D SWAP2 SWAP1 PUSH2 0x1EA1 JUMP JUMPDEST DUP10 SWAP1 PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH2 0x1766 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH4 0xFFFFFFFF SWAP2 SWAP1 SWAP2 AND SWAP2 POP PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND JUMPDEST PUSH1 0x0 SLOAD PUSH2 0x12AD SWAP1 PUSH1 0x1 PUSH1 0xB0 SHL SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH1 0x2 PUSH2 0x1EA1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF AND DUP2 LT ISZERO PUSH2 0x13BF JUMPI PUSH1 0x0 DUP1 PUSH2 0x12D0 DUP12 PUSH2 0x71D DUP6 PUSH1 0x50 PUSH2 0x1F1C JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP5 PUSH1 0x0 SUB PUSH2 0x1335 JUMPI DUP1 SWAP5 POP DUP1 DUP7 AND DUP2 EQ PUSH2 0x1330 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1B PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C69642074617267657420696E206E65772065706F63680000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH2 0x13AA JUMP JUMPDEST DUP5 DUP2 EQ PUSH2 0x13AA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x27 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E657870656374656420746172676574206368616E67652061667465722072 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6574617267657400000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x462 JUMP JUMPDEST POP SWAP6 POP DUP1 PUSH2 0x13B7 DUP2 PUSH2 0x1F33 JUMP JUMPDEST SWAP2 POP POP PUSH2 0x128E JUMP JUMPDEST POP PUSH1 0x1 PUSH1 0x8 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH8 0xFFFFFFFFFFFFFFFF AND PUSH1 0x1 PUSH2 0x13E3 SWAP2 SWAP1 PUSH2 0x1ECD JUMP JUMPDEST PUSH1 0x1 DUP1 SLOAD PUSH8 0xFFFFFFFFFFFFFFFF SWAP3 DUP4 AND PUSH1 0x1 PUSH1 0x40 SHL SWAP1 DUP2 MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP2 DUP3 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH4 0xFFFFFFFF DUP1 DUP8 AND DUP3 MSTORE PUSH1 0x1 PUSH1 0x1 PUSH1 0xE0 SHL SUB DUP1 DUP10 AND PUSH1 0x20 DUP1 DUP6 ADD SWAP2 DUP3 MSTORE SWAP6 SWAP1 SWAP7 DIV SWAP1 SWAP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x4 SWAP1 SWAP5 MSTORE SWAP2 DUP4 KECCAK256 SWAP1 MLOAD SWAP4 MLOAD SWAP1 SWAP5 AND PUSH5 0x100000000 MUL SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x2 SLOAD SWAP1 PUSH2 0x1485 DUP5 PUSH2 0x17EE JUMP JUMPDEST PUSH1 0x3 DUP4 SWAP1 SSTORE PUSH1 0x2 DUP2 SWAP1 SSTORE PUSH1 0x40 DUP1 MLOAD DUP5 DUP2 MSTORE PUSH1 0x20 DUP2 ADD DUP4 SWAP1 MSTORE SWAP2 SWAP3 POP PUSH32 0xA282EE798B132F9DC11E06CD4D8E767E562BE8709602CA14FEA7AB3392ACBDAB SWAP2 ADD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH2 0x14DF PUSH2 0x1787 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 SWAP2 DUP3 SWAP1 KECCAK256 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE SWAP1 MLOAD SWAP2 DUP3 MSTORE PUSH32 0xD53649B492F738BB59D6825099B5955073EFDA0BF9E3A7AD20DA22E110122E29 SWAP2 ADD PUSH2 0x9E8 JUMP JUMPDEST PUSH2 0x153B PUSH2 0x1787 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x154E PUSH2 0x1549 DUP4 PUSH2 0x17E1 JUMP JUMPDEST PUSH2 0x17EE JUMP JUMPDEST PUSH1 0x2 DUP2 SWAP1 SSTORE PUSH1 0x3 SSTORE POP POP JUMP JUMPDEST PUSH2 0x1562 PUSH2 0x1787 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD DUP3 ISZERO ISZERO PUSH1 0x1 PUSH1 0xA8 SHL MUL PUSH32 0xFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP2 AND OR SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0xD813B248D49C8BF08BE2B6947126DA6763DF310BEED7BEA97756456C5727419A SWAP1 PUSH2 0x9E8 SWAP1 DUP4 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH2 0x15D2 PUSH2 0x1787 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x164E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x26 PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x44 DUP3 ADD MSTORE PUSH32 0x6464726573730000000000000000000000000000000000000000000000000000 PUSH1 0x64 DUP3 ADD MSTORE PUSH1 0x84 ADD PUSH2 0x462 JUMP JUMPDEST PUSH2 0x1657 DUP2 PUSH2 0x1816 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3A2 PUSH2 0x1668 DUP4 PUSH2 0x1912 JUMP JUMPDEST PUSH1 0xD8 DUP2 SWAP1 SHR PUSH4 0xFF00FF00 AND PUSH3 0xFF00FF PUSH1 0xE8 SWAP3 SWAP1 SWAP3 SHR SWAP2 SWAP1 SWAP2 AND OR PUSH1 0x10 DUP2 DUP2 SHL SWAP2 SWAP1 SHR OR SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 ISZERO PUSH2 0x16EE JUMPI PUSH2 0x16A2 DUP6 DUP6 DUP6 PUSH2 0x191F JUMP JUMPDEST PUSH2 0x16EE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xD PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C696420636861696E00000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH2 0x16F8 DUP6 DUP6 PUSH2 0x194A JUMP JUMPDEST SWAP1 POP PUSH2 0x1706 DUP6 DUP6 PUSH1 0x50 PUSH2 0x19EC JUMP JUMPDEST SWAP2 POP PUSH2 0x1712 DUP3 DUP3 PUSH2 0x1A16 JUMP JUMPDEST PUSH2 0x175E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0xC PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x496E76616C696420776F726B0000000000000000000000000000000000000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST SWAP4 POP SWAP4 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1780 PUSH2 0x1668 PUSH2 0x1779 DUP5 PUSH1 0x44 PUSH2 0x1F6D JUMP JUMPDEST DUP6 SWAP1 PUSH2 0x1B6F JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND CALLER EQ PUSH2 0xF37 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD DUP2 SWAP1 MSTORE PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3A2 DUP3 PUSH1 0x0 PUSH2 0x194A JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3A2 PUSH28 0xFFFF0000000000000000000000000000000000000000000000000000 DUP4 PUSH2 0x1B7E JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 DUP2 AND PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000 DUP4 AND DUP2 OR DUP5 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP1 SWAP3 AND SWAP3 DUP4 SWAP2 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP2 SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x188B DUP4 DUP6 PUSH2 0x1B8A JUMP JUMPDEST SWAP1 POP PUSH2 0x189B PUSH3 0x127500 PUSH1 0x4 PUSH2 0x1B7E JUMP JUMPDEST DUP2 LT ISZERO PUSH2 0x18B3 JUMPI PUSH2 0x18B0 PUSH3 0x127500 PUSH1 0x4 PUSH2 0x1B7E JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH2 0x18C1 PUSH3 0x127500 PUSH1 0x4 PUSH2 0x1BE6 JUMP JUMPDEST DUP2 GT ISZERO PUSH2 0x18D9 JUMPI PUSH2 0x18D6 PUSH3 0x127500 PUSH1 0x4 PUSH2 0x1BE6 JUMP JUMPDEST SWAP1 POP JUMPDEST PUSH1 0x0 PUSH2 0x18F2 DUP3 PUSH2 0x18EC DUP9 PUSH3 0x10000 PUSH2 0x1B7E JUMP JUMPDEST SWAP1 PUSH2 0x1BE6 JUMP JUMPDEST SWAP1 POP PUSH2 0x1908 PUSH3 0x10000 PUSH2 0x18EC DUP4 PUSH3 0x127500 PUSH2 0x1B7E JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3A2 DUP3 PUSH1 0x44 PUSH2 0x1B6F JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x192C DUP6 DUP6 PUSH2 0x1C5C JUMP JUMPDEST SWAP1 POP DUP3 DUP2 EQ PUSH2 0x193F JUMPI PUSH1 0x0 SWAP2 POP POP PUSH2 0x1780 JUMP JUMPDEST POP PUSH1 0x1 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH2 0x195B PUSH2 0x1779 DUP5 PUSH1 0x48 PUSH2 0x1F6D JUMP JUMPDEST PUSH1 0xE8 SHR SWAP1 POP PUSH1 0x0 DUP5 PUSH2 0x196E DUP6 PUSH1 0x4B PUSH2 0x1F6D JUMP JUMPDEST DUP2 MLOAD DUP2 LT PUSH2 0x197E JUMPI PUSH2 0x197E PUSH2 0x1F80 JUMP JUMPDEST ADD PUSH1 0x20 ADD MLOAD PUSH1 0xF8 SHR SWAP1 POP PUSH1 0x0 PUSH2 0x19B2 DUP4 PUSH1 0x0 PUSH1 0x10 DUP3 PUSH3 0xFFFFFF AND SWAP1 SHR DUP3 PUSH2 0xFF00 AND PUSH1 0x10 DUP5 PUSH3 0xFFFFFF AND SWAP1 SHL OR OR SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH3 0xFFFFFF AND SWAP1 POP PUSH1 0x0 PUSH2 0x19C6 PUSH1 0x3 DUP5 PUSH2 0x1F96 JUMP JUMPDEST PUSH1 0xFF AND SWAP1 POP PUSH2 0x19D7 DUP2 PUSH2 0x100 PUSH2 0x2093 JUMP JUMPDEST PUSH2 0x19E1 SWAP1 DUP4 PUSH2 0x1F1C JUMP JUMPDEST SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 PUSH1 0x0 DUP4 DUP6 PUSH1 0x20 ADD DUP8 ADD PUSH1 0x2 GAS STATICCALL POP PUSH1 0x20 PUSH1 0x0 PUSH1 0x20 PUSH1 0x0 PUSH1 0x2 GAS STATICCALL POP POP PUSH1 0x0 MLOAD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1A25 JUMPI POP PUSH1 0x0 PUSH2 0x3A2 JUMP JUMPDEST DUP2 PUSH2 0x1B67 DUP5 PUSH1 0x0 DUP2 SWAP1 POP PUSH1 0x8 DUP2 PUSH31 0xFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF AND SWAP1 SHL PUSH1 0x8 DUP3 SWAP1 SHR PUSH31 0xFF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF AND OR SWAP1 POP PUSH1 0x10 DUP2 PUSH30 0xFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF AND SWAP1 SHL PUSH1 0x10 DUP3 SWAP1 SHR PUSH30 0xFFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF AND OR SWAP1 POP PUSH1 0x20 DUP2 PUSH28 0xFFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF AND SWAP1 SHL PUSH1 0x20 DUP3 SWAP1 SHR PUSH28 0xFFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF AND OR SWAP1 POP PUSH1 0x40 DUP2 PUSH24 0xFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF AND SWAP1 SHL PUSH1 0x40 DUP3 SWAP1 SHR PUSH24 0xFFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF AND OR SWAP1 POP PUSH1 0x80 DUP2 SWAP1 SHL PUSH1 0x80 DUP3 SWAP1 SHR OR SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST LT SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1780 DUP4 DUP4 ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1780 DUP3 DUP5 PUSH2 0x1E8D JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1BDC JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1D PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x556E646572666C6F7720647572696E67207375627472616374696F6E2E000000 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH2 0x1780 DUP3 DUP5 PUSH2 0x1F09 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH1 0x0 SUB PUSH2 0x1BF8 JUMPI POP PUSH1 0x0 PUSH2 0x3A2 JUMP JUMPDEST PUSH2 0x1C02 DUP3 DUP5 PUSH2 0x1F1C JUMP JUMPDEST SWAP1 POP DUP2 PUSH2 0x1C0F DUP5 DUP4 PUSH2 0x1E8D JUMP JUMPDEST EQ PUSH2 0x3A2 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x20 PUSH1 0x4 DUP3 ADD MSTORE PUSH1 0x1F PUSH1 0x24 DUP3 ADD MSTORE PUSH32 0x4F766572666C6F7720647572696E67206D756C7469706C69636174696F6E2E00 PUSH1 0x44 DUP3 ADD MSTORE PUSH1 0x64 ADD PUSH2 0x462 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1780 PUSH2 0x1C6C DUP4 PUSH1 0x4 PUSH2 0x1F6D JUMP JUMPDEST DUP5 ADD PUSH1 0x20 ADD MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1C87 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x41 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1CB6 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1CCE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP5 ADD SWAP2 POP DUP5 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1CE2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1CF4 JUMPI PUSH2 0x1CF4 PUSH2 0x1C8E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x1F DUP3 ADD PUSH1 0x1F NOT SWAP1 DUP2 AND PUSH1 0x3F ADD AND DUP2 ADD SWAP1 DUP4 DUP3 GT DUP2 DUP4 LT OR ISZERO PUSH2 0x1D1C JUMPI PUSH2 0x1D1C PUSH2 0x1C8E JUMP JUMPDEST DUP2 PUSH1 0x40 MSTORE DUP3 DUP2 MSTORE DUP8 PUSH1 0x20 DUP5 DUP8 ADD ADD GT ISZERO PUSH2 0x1D35 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP4 ADD CALLDATACOPY PUSH1 0x0 SWAP3 DUP2 ADD PUSH1 0x20 ADD SWAP3 SWAP1 SWAP3 MSTORE POP SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST DUP1 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 AND DUP2 EQ PUSH2 0x1D6D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1D84 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x1780 DUP3 PUSH2 0x1D55 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1D9F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x1780 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x60 DUP6 DUP8 SUB SLT ISZERO PUSH2 0x1DCC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP1 DUP3 GT ISZERO PUSH2 0x1DE4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP8 ADD SWAP2 POP DUP8 PUSH1 0x1F DUP4 ADD SLT PUSH2 0x1DF8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP2 DUP2 GT ISZERO PUSH2 0x1E07 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP9 PUSH1 0x20 DUP3 DUP6 ADD ADD GT ISZERO PUSH2 0x1E19 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x20 SWAP3 DUP4 ADD SWAP7 POP SWAP5 POP POP DUP6 ADD CALLDATALOAD SWAP2 POP PUSH2 0x1E34 PUSH1 0x40 DUP7 ADD PUSH2 0x1D55 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP6 SWAP2 SWAP5 POP SWAP3 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1E51 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD DUP1 ISZERO ISZERO DUP2 EQ PUSH2 0x1780 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1E9C JUMPI PUSH2 0x1E9C PUSH2 0x1E61 JUMP JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 DUP2 AND DUP4 DUP3 AND MUL DUP1 DUP3 AND SWAP2 SWAP1 DUP3 DUP2 EQ PUSH2 0x1EC5 JUMPI PUSH2 0x1EC5 PUSH2 0x1E77 JUMP JUMPDEST POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 DUP2 AND DUP4 DUP3 AND ADD SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x1EEE JUMPI PUSH2 0x1EEE PUSH2 0x1E77 JUMP JUMPDEST POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1F04 JUMPI PUSH2 0x1F04 PUSH2 0x1E61 JUMP JUMPDEST POP MOD SWAP1 JUMP JUMPDEST DUP2 DUP2 SUB DUP2 DUP2 GT ISZERO PUSH2 0x3A2 JUMPI PUSH2 0x3A2 PUSH2 0x1E77 JUMP JUMPDEST DUP1 DUP3 MUL DUP2 ISZERO DUP3 DUP3 DIV DUP5 EQ OR PUSH2 0x3A2 JUMPI PUSH2 0x3A2 PUSH2 0x1E77 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP3 ADD PUSH2 0x1F45 JUMPI PUSH2 0x1F45 PUSH2 0x1E77 JUMP JUMPDEST POP PUSH1 0x1 ADD SWAP1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP3 DUP2 AND DUP3 DUP3 AND SUB SWAP1 DUP1 DUP3 GT ISZERO PUSH2 0x1EEE JUMPI PUSH2 0x1EEE PUSH2 0x1E77 JUMP JUMPDEST DUP1 DUP3 ADD DUP1 DUP3 GT ISZERO PUSH2 0x3A2 JUMPI PUSH2 0x3A2 PUSH2 0x1E77 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0xFF DUP3 DUP2 AND DUP3 DUP3 AND SUB SWAP1 DUP2 GT ISZERO PUSH2 0x3A2 JUMPI PUSH2 0x3A2 PUSH2 0x1E77 JUMP JUMPDEST PUSH1 0x1 DUP2 DUP2 JUMPDEST DUP1 DUP6 GT ISZERO PUSH2 0x1FEA JUMPI DUP2 PUSH1 0x0 NOT DIV DUP3 GT ISZERO PUSH2 0x1FD0 JUMPI PUSH2 0x1FD0 PUSH2 0x1E77 JUMP JUMPDEST DUP1 DUP6 AND ISZERO PUSH2 0x1FDD JUMPI SWAP2 DUP2 MUL SWAP2 JUMPDEST SWAP4 DUP5 SHR SWAP4 SWAP1 DUP1 MUL SWAP1 PUSH2 0x1FB4 JUMP JUMPDEST POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x2001 JUMPI POP PUSH1 0x1 PUSH2 0x3A2 JUMP JUMPDEST DUP2 PUSH2 0x200E JUMPI POP PUSH1 0x0 PUSH2 0x3A2 JUMP JUMPDEST DUP2 PUSH1 0x1 DUP2 EQ PUSH2 0x2024 JUMPI PUSH1 0x2 DUP2 EQ PUSH2 0x202E JUMPI PUSH2 0x204A JUMP JUMPDEST PUSH1 0x1 SWAP2 POP POP PUSH2 0x3A2 JUMP JUMPDEST PUSH1 0xFF DUP5 GT ISZERO PUSH2 0x203F JUMPI PUSH2 0x203F PUSH2 0x1E77 JUMP JUMPDEST POP POP PUSH1 0x1 DUP3 SHL PUSH2 0x3A2 JUMP JUMPDEST POP PUSH1 0x20 DUP4 LT PUSH2 0x133 DUP4 LT AND PUSH1 0x4E DUP5 LT PUSH1 0xB DUP5 LT AND OR ISZERO PUSH2 0x206D JUMPI POP DUP2 DUP2 EXP PUSH2 0x3A2 JUMP JUMPDEST PUSH2 0x2077 DUP4 DUP4 PUSH2 0x1FAF JUMP JUMPDEST DUP1 PUSH1 0x0 NOT DIV DUP3 GT ISZERO PUSH2 0x208B JUMPI PUSH2 0x208B PUSH2 0x1E77 JUMP JUMPDEST MUL SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1780 DUP4 DUP4 PUSH2 0x1FF2 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x26 MOD 0xE7 PUSH8 0xC86058F121FB4BBC TIMESTAMP DUP2 0x2C SWAP2 SWAP11 MLOAD EXTCODEHASH 0x29 LOG2 BALANCE 0xE5 0xB9 DUP12 DUP5 EXTCODEHASH 0xE6 BYTE PUSH6 0x6E4764736F6C PUSH4 0x43000811 STOP CALLER ",
|
|
11764
|
+
"sourceMap": "1749:573:111:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21960:171:107;;;;;;:::i;:::-;;:::i;:::-;;;345:25:125;;;333:2;318:18;21960:171:107;;;;;;;;22865:230;;;:::i;:::-;;;;555:25:125;;;611:2;596:18;;589:34;;;;528:18;22865:230:107;381:248:125;23265:159:107;23395:22;;23265:159;;16209:5436;;;;;;:::i;:::-;;:::i;6780:351::-;;;;;;:::i;:::-;;:::i;:::-;;7906:154;;;;;;:::i;:::-;;:::i;23622:117::-;23713:19;;23622:117;;23745:199;23893:22;;23917:19;;23745:199;;5399:1075;;;;;;:::i;:::-;;:::i;24210:386::-;;;;;;:::i;:::-;;:::i;3314:17::-;;;;;-1:-1:-1;;;3314:17:107;;;;;;;;;3335:14:125;;3328:22;3310:41;;3298:2;3283:18;3314:17:107;3170:187:125;1831:101:49;;;:::i;4359:26:107:-;;;;;-1:-1:-1;;;4359:26:107;;;;;;;;;3536:18:125;3524:31;;;3506:50;;3494:2;3479:18;4359:26:107;3362:200:125;9685:4685:107;;;;;;:::i;:::-;;:::i;1201:85:49:-;1247:7;1273:6;1201:85;;-1:-1:-1;;;;;1273:6:49;;;3713:74:125;;3701:2;3686:18;1201:85:49;3567:226:125;3455:33:107;;;;;-1:-1:-1;;;3455:33:107;;;;;;7622:149;;;;;;:::i;:::-;;:::i;4044:26::-;;;;;;;;;1999:321:111;;;;;;:::i;:::-;;:::i;7325:165:107:-;;;;;;:::i;:::-;;:::i;2081:198:49:-;;;;;;:::i;:::-;;:::i;3767:25:107:-;;;;;-1:-1:-1;;;3767:25:107;;;;;;4603:44;;;;;;:::i;:::-;;;;;;;;;;;;;;;;21960:171;22056:7;22086:38;22105:18;22119:4;22105:11;:18;:::i;22086:38::-;22079:45;21960:171;-1:-1:-1;;21960:171:107:o;22865:230::-;23013:12;;22937:20;;;;23013:19;;:12;;23028:4;23013:19;:::i;:::-;23061:12;;22998:34;;;;;-1:-1:-1;23061:19:107;;-1:-1:-1;;;23061:12:107;;;;23076:4;23061:19;:::i;:::-;23060:28;;23084:4;23060:28;:::i;:::-;23042:46;;;;22865:230;;:::o;16209:5436::-;16301:31;16334:19;16394:2;16377:7;:14;:19;;;;:::i;:::-;:24;16369:58;;;;-1:-1:-1;;;16369:58:107;;5345:2:125;16369:58:107;;;5327:21:125;5384:2;5364:18;;;5357:30;5423:23;5403:18;;;5396:51;5464:18;;16369:58:107;;;;;;;;;16469:2;16452:7;:14;:19;;;;:::i;:::-;16438:33;;16517:1;16503:11;:15;:37;;;;;16536:4;16522:11;:18;16503:37;16482:109;;;;-1:-1:-1;;;16482:109:107;;5695:2:125;16482:109:107;;;5677:21:125;5734:2;5714:18;;;5707:30;5773:27;5753:18;;;5746:55;5818:18;;16482:109:107;5493:349:125;16482:109:107;16628:26;:7;:24;:26::i;:::-;16602:52;;;-1:-1:-1;16852:28:107;;16934:38;16949:7;16852:28;;16934:14;:38::i;:::-;17008:11;;;;;;;;16983:22;17008:11;;;;;;;;;;17060:12;;;-1:-1:-1;;;17060:12:107;;;;17111:27;;;:6;:27;;;;;;17082:56;;;;;;;;;17008:11;17082:56;;;;;;;-1:-1:-1;;;;;17082:56:107;;;;;16838:134;;-1:-1:-1;16838:134:107;;-1:-1:-1;17008:11:107;;17060:12;17008:11;17918:203;17951:23;;17925:49;;;;17918:203;;;17990:24;18013:1;17990:24;;:::i;:::-;18083:27;;;;:6;:27;;;;;;;;;18067:43;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18067:43:107;;;;;18083:27;;-1:-1:-1;18067:43:107;;-1:-1:-1;17918:203:107;;;18406:23;;:27;;18385:117;;;;-1:-1:-1;;;18385:117:107;;6182:2:125;18385:117:107;;;6164:21:125;6221:2;6201:18;;;6194:30;6260:34;6240:18;;;6233:62;6331:13;6311:18;;;6304:41;6362:19;;18385:117:107;5980:407:125;18385:117:107;18739:13;:20;;;-1:-1:-1;;;;;18716:43:107;:19;:43;18712:1166;;18997:9;:16;;;-1:-1:-1;;;;;18974:39:107;:19;:39;18970:898;;19049:9;-1:-1:-1;19088:9:107;18970:898;;;19452:24;19475:1;19452:24;;:::i;:::-;19553:27;;;;:6;:27;;;;;;;;;19537:43;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19537:43:107;;;;;;;19553:27;;-1:-1:-1;19537:43:107;;-1:-1:-1;19738:43:107;;19709:144;;;;-1:-1:-1;;;19709:144:107;;6594:2:125;19709:144:107;;;6576:21:125;6633:2;6613:18;;;6606:30;6672:32;6652:18;;;6645:60;6722:18;;19709:144:107;6392:354:125;19709:144:107;19998:1;19981:1602;20005:11;20001:1;:15;19981:1602;;;20037:21;20111:115;20143:7;20168:6;:1;20172:2;20168:6;:::i;:::-;20192:20;20111:14;:115::i;:::-;20995:20;;;;20072:154;;-1:-1:-1;20072:154:107;;-1:-1:-1;;;;;;20972:43:107;;;20968:554;;21035:30;21068:72;21116:6;:1;21120:2;21116:6;:::i;:::-;21068:7;;:26;:72::i;:::-;21188:19;;21035:105;;;;;-1:-1:-1;21188:24:107;;;;;:91;;;21263:9;:16;;;-1:-1:-1;;;;;21240:39:107;:19;:39;21188:91;:164;;;;-1:-1:-1;21333:19:107;;21307:45;;;;21188:164;21159:265;;;;-1:-1:-1;;;21159:265:107;;6594:2:125;21159:265:107;;;6576:21:125;6633:2;6613:18;;;6606:30;6672:32;6652:18;;;6645:60;6722:18;;21159:265:107;6392:354:125;21159:265:107;-1:-1:-1;21459:9:107;;-1:-1:-1;21498:9:107;;20968:554;21559:13;-1:-1:-1;20018:3:107;;;;:::i;:::-;;;;19981:1602;;;;21593:45;;;;;;16209:5436;;;:::o;6780:351::-;4695:5;;-1:-1:-1;;;4695:5:107;;;;4687:44;;;;-1:-1:-1;;;4687:44:107;;7266:2:125;4687:44:107;;;7248:21:125;7305:2;7285:18;;;7278:30;7344:28;7324:18;;;7317:56;7390:18;;4687:44:107;7064:350:125;4687:44:107;1094:13:49::1;:11;:13::i;:::-;6883:4:107::2;6871:9;:16;;;6863:51;;;::::0;-1:-1:-1;;;6863:51:107;;7621:2:125;6863:51:107::2;::::0;::::2;7603:21:125::0;7660:2;7640:18;;;7633:30;7699:24;7679:18;;;7672:52;7741:18;;6863:51:107::2;7419:346:125::0;6863:51:107::2;6944:1;6932:9;:13;;;6924:54;;;::::0;-1:-1:-1;;;6924:54:107;;7972:2:125;6924:54:107::2;::::0;::::2;7954:21:125::0;8011:2;7991:18;;;7984:30;8050;8030:18;;;8023:58;8098:18;;6924:54:107::2;7770:352:125::0;6924:54:107::2;7009:11;::::0;::::2;-1:-1:-1::0;;;7009:11:107;;::::2;::::0;::::2;6996:24:::0;;::::2;::::0;6988:59:::2;;;::::0;-1:-1:-1;;;6988:59:107;;8329:2:125;6988:59:107::2;::::0;::::2;8311:21:125::0;8368:2;8348:18;;;8341:30;8407:24;8387:18;;;8380:52;8449:18;;6988:59:107::2;8127:346:125::0;6988:59:107::2;7057:11;:23:::0;;;::::2;-1:-1:-1::0;;;7057:23:107::2;::::0;::::2;::::0;;::::2;::::0;;;::::2;::::0;;;7095:29:::2;::::0;3506:50:125;;;7095:29:107::2;::::0;3494:2:125;3479:18;7095:29:107::2;;;;;;;;6780:351:::0;:::o;7906:154::-;1094:13:49;:11;:13::i;:::-;-1:-1:-1;;;;;7975:23:107;::::1;8001:5;7975:23:::0;;;:12:::1;:23;::::0;;;;;;;;:31;;-1:-1:-1;;7975:31:107::1;::::0;;8021:32;;3713:74:125;;;8021:32:107::1;::::0;3686:18:125;8021:32:107::1;3567:226:125::0;5399:1075:107;1094:13:49;:11;:13::i;:::-;5564:5:107::1;::::0;-1:-1:-1;;;5564:5:107;::::1;;;5563:6;5555:44;;;::::0;-1:-1:-1;;;5555:44:107;;8886:2:125;5555:44:107::1;::::0;::::1;8868:21:125::0;8925:2;8905:18;;;8898:30;8964:27;8944:18;;;8937:55;9009:18;;5555:44:107::1;8684:349:125::0;5555:44:107::1;5642:2;5618:26:::0;::::1;5610:68;;;::::0;-1:-1:-1;;;5610:68:107;;9240:2:125;5610:68:107::1;::::0;::::1;9222:21:125::0;9279:2;9259:18;;;9252:30;9318:31;9298:18;;;9291:59;9367:18;;5610:68:107::1;9038:353:125::0;5610:68:107::1;5710:20;5726:4;5710:13:::0;:20:::1;:::i;:::-;:25:::0;5689:109:::1;;;::::0;-1:-1:-1;;;5689:109:107;;9598:2:125;5689:109:107::1;::::0;::::1;9580:21:125::0;9637:2;9617:18;;;9610:30;9676:34;9656:18;;;9649:62;9747:7;9727:18;;;9720:35;9772:19;;5689:109:107::1;9396:401:125::0;5689:109:107::1;5838:4;5817:18;:25;;;5809:60;;;::::0;-1:-1:-1;;;5809:60:107;;7621:2:125;5809:60:107::1;::::0;::::1;7603:21:125::0;7660:2;7640:18;;;7633:30;7699:24;7679:18;;;7672:52;7741:18;;5809:60:107::1;7419:346:125::0;5809:60:107::1;5908:1;5887:18;:22;;;5879:63;;;::::0;-1:-1:-1;;;5879:63:107;;7972:2:125;5879:63:107::1;::::0;::::1;7954:21:125::0;8011:2;7991:18;;;7984:30;8050;8030:18;;;8023:58;8098:18;;5879:63:107::1;7770:352:125::0;5879:63:107::1;5975:20;5991:4;5975:13:::0;:20:::1;:::i;:::-;5953:12;:43:::0;;6006:27;;5953:43:::1;::::0;;;::::1;6006:27:::0;;;-1:-1:-1;;;6006:27:107;;;::::1;::::0;;;::::1;::::0;;6067::::1;::::0;;::::1;;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;-1:-1:-1;;6067:29:107::1;::::0;:27;:13;;:27;;;;;::::1;:13:::0;:27;;:13;:27;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;6067:27:107::1;::::0;-1:-1:-1;;;6067:29:107:i:1;:::-;6043:53;;6106:24;6133:32;:13;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;6133:30:107::1;::::0;-1:-1:-1;;;6133:32:107:i:1;:::-;6198:89;::::0;;;;::::1;::::0;;6106:59:::1;::::0;;::::1;6198:89:::0;;;-1:-1:-1;;;;;6198:89:107;;::::1;;::::0;;::::1;::::0;;;6182:12:::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;6175:20:107;;;:6:::1;:20:::0;;;;;;:112;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;6297:32;;;;::::1;-1:-1:-1::0;;;6297:32:107::1;::::0;;;::::1;::::0;;;::::1;::::0;;;6106:59;-1:-1:-1;6364:43:107::1;6263:13:::0;6364:28:::1;:43::i;:::-;6339:22;:68:::0;6417:5:::1;:12:::0;;;::::1;-1:-1:-1::0;;;6417:12:107::1;::::0;;6445:22:::1;::::0;::::1;::::0;::::1;::::0;6453:13;345:25:125;;333:2;318:18;;199:177;6445:22:107::1;;;;;;;;5545:929;;5399:1075:::0;;;;:::o;24210:386::-;24350:12;;24304:7;;24350:12;;24335:27;;;24327:69;;;;-1:-1:-1;;;24327:69:107;;10004:2:125;24327:69:107;;;9986:21:125;10043:2;10023:18;;;10016:30;10082:31;10062:18;;;10055:59;10131:18;;24327:69:107;9802:353:125;24327:69:107;24442:12;;-1:-1:-1;;;24442:12:107;;;;24427:27;;;24406:110;;;;-1:-1:-1;;;24406:110:107;;10362:2:125;24406:110:107;;;10344:21:125;10401:2;10381:18;;;10374:30;10440:34;10420:18;;;10413:62;10511:6;10491:18;;;10484:34;10535:19;;24406:110:107;10160:400:125;24406:110:107;24562:19;;;;:6;:19;;;;;:26;24533:56;;24562:26;;;-1:-1:-1;;;;;24562:26:107;24533:28;:56::i;1831:101:49:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;9685:4685:107:-;4695:5;;-1:-1:-1;;;4695:5:107;;;;4687:44;;;;-1:-1:-1;;;4687:44:107;;7266:2:125;4687:44:107;;;7248:21:125;7305:2;7285:18;;;7278:30;7344:28;7324:18;;;7317:56;7390:18;;4687:44:107;7064:350:125;4687:44:107;9760:21:::1;::::0;-1:-1:-1;;;9760:21:107;::::1;;;9756:111;;;9818:10;9805:24;::::0;;;:12:::1;:24;::::0;;;;;::::1;;9797:59;;;::::0;-1:-1:-1;;;9797:59:107;;10767:2:125;9797:59:107::1;::::0;::::1;10749:21:125::0;10806:2;10786:18;;;10779:30;10845:24;10825:18;;;10818:52;10887:18;;9797:59:107::1;10565:346:125::0;9797:59:107::1;9990:11;::::0;:15:::1;::::0;-1:-1:-1;;;9990:11:107;::::1;;;10004:1;9990:15;:::i;:::-;:20;::::0;10008:2:::1;9990:20;:::i;:::-;9971:40;;:7;:14;:40;9877:181;;;::::0;-1:-1:-1;;;9877:181:107;;5345:2:125;9877:181:107::1;::::0;::::1;5327:21:125::0;5384:2;5364:18;;;5357:30;5423:23;5403:18;;;5396:51;5464:18;;9877:181:107::1;5143:345:125::0;9877:181:107::1;10099:12;::::0;-1:-1:-1;;;10099:12:107;::::1;;;10069:20;10092::::0;;;:6:::1;:20;::::0;;;;10143:13;;10092:20;;10143:13;;;::::1;-1:-1:-1::0;;;;;10143:13:107::1;::::0;10069:20;10249:416:::1;10273:11;::::0;-1:-1:-1;;;10273:11:107;::::1;;;10269:15:::0;::::1;10249:416;;;10323:21;::::0;10406:53:::1;10421:7:::0;10430:6:::1;:1:::0;10434:2:::1;10430:6;:::i;:::-;10438:20;10406:14;:53::i;:::-;10305:154;;;;10522:9;10499:19;:32;10474:129;;;::::0;-1:-1:-1;;;10474:129:107;;11118:2:125;10474:129:107::1;::::0;::::1;11100:21:125::0;11157:2;11137:18;;;11130:30;11196:34;11176:18;;;11169:62;11267:8;11247:18;;;11240:36;11293:19;;10474:129:107::1;10916:402:125::0;10474:129:107::1;-1:-1:-1::0;10641:13:107;-1:-1:-1;10286:3:107;::::1;::::0;::::1;:::i;:::-;;;;10249:416;;;-1:-1:-1::0;10718:25:107::1;10787:11:::0;;10746:72:::1;::::0;10787:15:::1;::::0;10801:1:::1;::::0;-1:-1:-1;;;10787:11:107;::::1;;;:15;:::i;:::-;10786:22;::::0;10806:2:::1;10786:22;:::i;:::-;10746:7:::0;;:72:::1;;:26;:72::i;:::-;10718:100;;;;11475:15;11455:17;:35;11373:173;;;::::0;-1:-1:-1;;;11373:173:107;;11713:2:125;11373:173:107::1;::::0;::::1;11695:21:125::0;11752:2;11732:18;;;11725:30;11791:32;11771:18;;;11764:60;11841:18;;11373:173:107::1;11511:354:125::0;11373:173:107::1;11698:16:::0;;11610:22:::1;::::0;11635:120:::1;::::0;11675:9;;11698:16:::1;;11728:17:::0;11635:26:::1;:120::i;:::-;11610:145;;11819:19;11853:27:::0;11883:66:::1;11923:11;;;;;;;;;;;11937:2;11923:16;;;;:::i;:::-;11883:7:::0;;:66:::1;;:26;:66::i;:::-;11995:9;12007:11:::0;11853:96:::1;::::0;;;::::1;::::0;-1:-1:-1;;;;12007:11:107;::::1;;;11990:1928;12024:11;::::0;:15:::1;::::0;-1:-1:-1;;;12024:11:107;::::1;;;12038:1;12024:15;:::i;:::-;12020:19;;:1;:19;11990:1928;;;12078:22;::::0;12163:53:::1;12178:7:::0;12187:6:::1;:1:::0;12191:2:::1;12187:6;:::i;12163:53::-;12060:156;;;;12235:11;12250:1;12235:16:::0;12231:1625:::1;;12362:20;12348:34;;13484:20;13467:14;:37;13418:20;:87;12400:1174;;;::::0;-1:-1:-1;;;12400:1174:107;;12072:2:125;12400:1174:107::1;::::0;::::1;12054:21:125::0;12111:2;12091:18;;;12084:30;12150:29;12130:18;;;12123:57;12197:18;;12400:1174:107::1;11870:351:125::0;12400:1174:107::1;12231:1625;;;13749:11;13725:20;:35;13696:145;;;::::0;-1:-1:-1;;;13696:145:107;;12428:2:125;13696:145:107::1;::::0;::::1;12410:21:125::0;12467:2;12447:18;;;12440:30;12506:34;12486:18;;;12479:62;12577:9;12557:18;;;12550:37;12604:19;;13696:145:107::1;12226:403:125::0;13696:145:107::1;-1:-1:-1::0;13893:14:107;-1:-1:-1;12041:3:107;::::1;::::0;::::1;:::i;:::-;;;;11990:1928;;;;13943:12;;;;;;;;;;;13958:1;13943:16;;;;:::i;:::-;13928:12;:31:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;13928:31:107;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;;13993:90:::1;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;13993:90:107;;::::1;;::::0;;::::1;::::0;;;13977:12;;;::::1;::::0;;::::1;-1:-1:-1::0;13970:20:107;;;:6:::1;:20:::0;;;;;;:113;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;14118:22:::1;::::0;;14174:41:::1;14061:11:::0;14174:28:::1;:41::i;:::-;14226:19;:35:::0;;;14271:22:::1;:38:::0;;;14325::::1;::::0;;555:25:125;;;611:2;596:18;;589:34;;;14271:38:107;;-1:-1:-1;14325:38:107::1;::::0;528:18:125;14325:38:107::1;;;;;;;9746:4624;;;;;;;;;9685:4685:::0;:::o;7622:149::-;1094:13:49;:11;:13::i;:::-;-1:-1:-1;;;;;7689:23:107;::::1;;::::0;;;:12:::1;:23;::::0;;;;;;;;:30;;-1:-1:-1;;7689:30:107::1;7715:4;7689:30;::::0;;7734;;3713:74:125;;;7734:30:107::1;::::0;3686:18:125;7734:30:107::1;3567:226:125::0;1999:321:111;1094:13:49;:11;:13::i;:::-;2111:23:111::1;2137:78;:43;:14;:41;:43::i;:::-;:76;:78::i;:::-;2226:22;:40:::0;;;2276:19:::1;:37:::0;-1:-1:-1;;1999:321:111:o;7325:165:107:-;1094:13:49;:11;:13::i;:::-;7399:21:107::1;:30:::0;;;::::1;;-1:-1:-1::0;;;7399:30:107::1;::::0;;;::::1;;::::0;;7444:39:::1;::::0;::::1;::::0;::::1;::::0;7423:6;3335:14:125;3328:22;3310:41;;3298:2;3283:18;;3170:187;2081:198:49;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:49;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:49;;12836:2:125;2161:73:49::1;::::0;::::1;12818:21:125::0;12875:2;12855:18;;;12848:30;12914:34;12894:18;;;12887:62;12985:8;12965:18;;;12958:36;13011:19;;2161:73:49::1;12634:402:125::0;2161:73:49::1;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;33545:153:0:-;33616:6;33641:50;33662:27;33681:7;33662:18;:27::i;:::-;6397:21;;;;;;6402:10;6360:6;;;;;6359:21;;;;6358:61;6485:2;6480:7;;;6468;;;6467:21;;6238:257;25242:729:107;25376:14;;25501:24;;25497:176;;25566:49;:7;25597:5;25604:10;25566:30;:49::i;:::-;25541:121;;;;-1:-1:-1;;;25541:121:107;;13243:2:125;25541:121:107;;;13225:21:125;13282:2;13262:18;;;13255:30;13321:15;13301:18;;;13294:43;13354:18;;25541:121:107;13041:337:125;25541:121:107;25769:30;:7;25793:5;25769:23;:30::i;:::-;25760:39;-1:-1:-1;25818:31:107;:7;25839:5;25846:2;25818:20;:31::i;:::-;25809:40;;25867:46;25898:6;25906;25867:30;:46::i;:::-;25859:71;;;;-1:-1:-1;;;25859:71:107;;13585:2:125;25859:71:107;;;13567:21:125;13624:2;13604:18;;;13597:30;13663:14;13643:18;;;13636:42;13695:18;;25859:71:107;13383:336:125;25859:71:107;25242:729;;;;;;:::o;2856:200::-;2965:6;2994:55;3024:23;3039:7;3044:2;3039;:7;:::i;:::-;3024;;:14;:23::i;2994:55::-;2987:62;2856:200;-1:-1:-1;;;2856:200:107:o;1359:130:49:-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:49;719:10:67;1422:23:49;1414:68;;;;-1:-1:-1;;;1414:68:49;;14056:2:125;1414:68:49;;;14038:21:125;;;14075:18;;;14068:30;14134:34;14114:18;;;14107:62;14186:18;;1414:68:49;13854:356:125;30774:128:0;30842:7;30868:27;30884:7;30893:1;30868:15;:27::i;31938:178::-;32007:7;32084:25;378:58;32101:7;32084:16;:25::i;2433:187:49:-;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:49;;;;;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;37944:920:0:-;38100:7;;38142:37;:16;38163:15;38142:20;:37::i;:::-;38119:60;-1:-1:-1;38278:22:0;485:20;38298:1;38278:19;:22::i;:::-;38263:12;:37;38259:105;;;38331:22;485:20;38351:1;38331:19;:22::i;:::-;38316:37;;38259:105;38392:22;485:20;38412:1;38392:19;:22::i;:::-;38377:12;:37;38373:105;;;38445:22;485:20;38465:1;38445:19;:22::i;:::-;38430:37;;38373:105;38735:17;38755:44;38786:12;38755:26;:15;38775:5;38755:19;:26::i;:::-;:30;;:44::i;:::-;38735:64;-1:-1:-1;38816:41:0;38851:5;38816:30;38735:64;485:20;38816:13;:30::i;:41::-;38809:48;37944:920;-1:-1:-1;;;;;;37944:920:0:o;33215:123::-;33288:6;33313:18;:7;33328:2;33313:14;:18::i;5321:421:4:-;5466:4;;5548:32;:7;5577:2;5548:28;:32::i;:::-;5529:51;;5681:16;5669:8;:28;5665:49;;5707:5;5700:12;;;;;5665:49;-1:-1:-1;5731:4:4;;5321:421;-1:-1:-1;;;;5321:421:4:o;31226:332:0:-;31308:7;;31346:23;31361:7;31366:2;31361;:7;:::i;31346:23::-;31339:31;;;-1:-1:-1;31380:8:0;31397:7;31405;31410:2;31405;:7;:::i;:::-;31397:16;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;31424:17:0;31452;31466:2;6719:8;6782:2;6776;:8;;;;6758:2;6763:8;6758:13;6751:2;6745;:8;;;;6744:28;:41;6739:46;;6662:130;;;;31452:17;31444:26;;;-1:-1:-1;31480:14:0;31497:6;31502:1;31497:2;:6;:::i;:::-;31480:23;;;-1:-1:-1;31534:16:0;31480:23;31534:3;:16;:::i;:::-;31521:30;;:9;:30;:::i;:::-;31514:37;31226:332;-1:-1:-1;;;;;;;31226:332:0:o;11007:394::-;11124:11;11292:2;11286:4;11281:3;11275:2;11271;11267:11;11263:2;11259:20;11256:1;11249:5;11238:57;11234:62;11350:2;11344:4;11340:2;11334:4;11331:1;11324:5;11313:40;-1:-1:-1;;11380:4:0;11374:11;;11007:394;-1:-1:-1;;;11007:394:0:o;4634:228:4:-;4739:4;4759:6;4755:41;;-1:-1:-1;4789:5:4;4782:12;;4755:41;4848:6;4813:32;4821:6;4519:9:0;4544:2;4540:6;;4754:1;4679;4683:66;4679:70;4678:77;;4590:1;4585;:6;;4595:66;4584:77;4583:173;4579:177;;4976:2;4901:1;4905:66;4901:70;4900:78;;4811:2;4806:1;:7;;4817:66;4805:78;4804:175;4800:179;;5199:2;5124:1;5128:66;5124:70;5123:78;;5034:2;5029:1;:7;;5040:66;5028:78;5027:175;5023:179;;5422:2;5347:1;5351:66;5347:70;5346:78;;5257:2;5252:1;:7;;5263:66;5251:78;5250:175;5246:179;;5493:3;5488:1;:8;;5480:3;5475:1;:8;;5474:23;5470:27;;4460:1044;;;;4813:32:4;:41;;4634:228;-1:-1:-1;;;4634:228:4:o;13081:136:1:-;13154:6;13186:23;13194:6;13202;12550:28;12566:2;12550:28;12544:35;;12417:178;1864:301:3;1924:7;2151;2156:2;2151;:7;:::i;2287:160::-;2347:7;2380:2;2374;:8;;2366:50;;;;-1:-1:-1;;;2366:50:3;;16136:2:125;2366:50:3;;;16118:21:125;16175:2;16155:18;;;16148:30;16214:31;16194:18;;;16187:59;16263:18;;2366:50:3;15934:353:125;2366:50:3;2433:7;2438:2;2433;:7;:::i;1316:456::-;1376:9;1618:2;1624:1;1618:7;1614:46;;-1:-1:-1;1648:1:3;1641:8;;1614:46;1674:7;1679:2;1674;:7;:::i;:::-;1670:11;-1:-1:-1;1709:2:3;1699:6;1703:2;1670:11;1699:6;:::i;:::-;:12;1691:56;;;;-1:-1:-1;;;1691:56:3;;16494:2:125;1691:56:3;;;16476:21:125;16533:2;16513:18;;;16506:30;16572:33;16552:18;;;16545:61;16623:18;;1691:56:3;16292:355:125;32828:165:0;32937:7;32963:23;32979:6;32983:2;32979:1;:6;:::i;:::-;32963:7;12550:28:1;12566:2;12550:28;12544:35;;12417:178::o;14:180:125:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:125;;14:180;-1:-1:-1;14:180:125:o;634:184::-;-1:-1:-1;;;683:1:125;676:88;783:4;780:1;773:15;807:4;804:1;797:15;823:921;891:6;944:2;932:9;923:7;919:23;915:32;912:52;;;960:1;957;950:12;912:52;1000:9;987:23;1029:18;1070:2;1062:6;1059:14;1056:34;;;1086:1;1083;1076:12;1056:34;1124:6;1113:9;1109:22;1099:32;;1169:7;1162:4;1158:2;1154:13;1150:27;1140:55;;1191:1;1188;1181:12;1140:55;1227:2;1214:16;1249:2;1245;1242:10;1239:36;;;1255:18;;:::i;:::-;1330:2;1324:9;1298:2;1384:13;;-1:-1:-1;;1380:22:125;;;1404:2;1376:31;1372:40;1360:53;;;1428:18;;;1448:22;;;1425:46;1422:72;;;1474:18;;:::i;:::-;1514:10;1510:2;1503:22;1549:2;1541:6;1534:18;1589:7;1584:2;1579;1575;1571:11;1567:20;1564:33;1561:53;;;1610:1;1607;1600:12;1561:53;1666:2;1661;1657;1653:11;1648:2;1640:6;1636:15;1623:46;1711:1;1689:15;;;1706:2;1685:24;1678:35;;;;-1:-1:-1;1693:6:125;823:921;-1:-1:-1;;;;;823:921:125:o;1749:171::-;1816:20;;1876:18;1865:30;;1855:41;;1845:69;;1910:1;1907;1900:12;1845:69;1749:171;;;:::o;1925:184::-;1983:6;2036:2;2024:9;2015:7;2011:23;2007:32;2004:52;;;2052:1;2049;2042:12;2004:52;2075:28;2093:9;2075:28;:::i;2114:309::-;2173:6;2226:2;2214:9;2205:7;2201:23;2197:32;2194:52;;;2242:1;2239;2232:12;2194:52;2281:9;2268:23;-1:-1:-1;;;;;2324:5:125;2320:54;2313:5;2310:65;2300:93;;2389:1;2386;2379:12;2428:737;2515:6;2523;2531;2539;2592:2;2580:9;2571:7;2567:23;2563:32;2560:52;;;2608:1;2605;2598:12;2560:52;2648:9;2635:23;2677:18;2718:2;2710:6;2707:14;2704:34;;;2734:1;2731;2724:12;2704:34;2772:6;2761:9;2757:22;2747:32;;2817:7;2810:4;2806:2;2802:13;2798:27;2788:55;;2839:1;2836;2829:12;2788:55;2879:2;2866:16;2905:2;2897:6;2894:14;2891:34;;;2921:1;2918;2911:12;2891:34;2968:7;2961:4;2952:6;2948:2;2944:15;2940:26;2937:39;2934:59;;;2989:1;2986;2979:12;2934:59;3020:4;3012:13;;;;-1:-1:-1;3044:6:125;-1:-1:-1;;3082:20:125;;3069:34;;-1:-1:-1;3122:37:125;3155:2;3140:18;;3122:37;:::i;:::-;3112:47;;2428:737;;;;;;;:::o;3798:273::-;3854:6;3907:2;3895:9;3886:7;3882:23;3878:32;3875:52;;;3923:1;3920;3913:12;3875:52;3962:9;3949:23;4015:5;4008:13;4001:21;3994:5;3991:32;3981:60;;4037:1;4034;4027:12;4076:184;-1:-1:-1;;;4125:1:125;4118:88;4225:4;4222:1;4215:15;4249:4;4246:1;4239:15;4265:184;-1:-1:-1;;;4314:1:125;4307:88;4414:4;4411:1;4404:15;4438:4;4435:1;4428:15;4454:120;4494:1;4520;4510:35;;4525:18;;:::i;:::-;-1:-1:-1;4559:9:125;;4454:120::o;4579:257::-;4650:18;4700:10;;;4712;;;4696:27;4743:20;;;;4650:18;4782:24;;;4772:58;;4810:18;;:::i;:::-;4772:58;;4579:257;;;;:::o;4841:180::-;4908:18;4946:10;;;4958;;;4942:27;;4981:11;;;4978:37;;;4995:18;;:::i;:::-;4978:37;4841:180;;;;:::o;5026:112::-;5058:1;5084;5074:35;;5089:18;;:::i;:::-;-1:-1:-1;5123:9:125;;5026:112::o;5847:128::-;5914:9;;;5935:11;;;5932:37;;;5949:18;;:::i;6751:168::-;6824:9;;;6855;;6872:15;;;6866:22;;6852:37;6842:71;;6893:18;;:::i;6924:135::-;6963:3;6984:17;;;6981:43;;7004:18;;:::i;:::-;-1:-1:-1;7051:1:125;7040:13;;6924:135::o;11323:183::-;11391:18;11442:10;;;11430;;;11426:27;;11465:12;;;11462:38;;;11480:18;;:::i;13724:125::-;13789:9;;;13810:10;;;13807:36;;;13823:18;;:::i;14215:184::-;-1:-1:-1;;;14264:1:125;14257:88;14364:4;14361:1;14354:15;14388:4;14385:1;14378:15;14404:151;14494:4;14487:12;;;14473;;;14469:31;;14512:14;;14509:40;;;14529:18;;:::i;14560:422::-;14649:1;14692:5;14649:1;14706:270;14727:7;14717:8;14714:21;14706:270;;;14786:4;14782:1;14778:6;14774:17;14768:4;14765:27;14762:53;;;14795:18;;:::i;:::-;14845:7;14835:8;14831:22;14828:55;;;14865:16;;;;14828:55;14944:22;;;;14904:15;;;;14706:270;;;14710:3;14560:422;;;;;:::o;14987:806::-;15036:5;15066:8;15056:80;;-1:-1:-1;15107:1:125;15121:5;;15056:80;15155:4;15145:76;;-1:-1:-1;15192:1:125;15206:5;;15145:76;15237:4;15255:1;15250:59;;;;15323:1;15318:130;;;;15230:218;;15250:59;15280:1;15271:10;;15294:5;;;15318:130;15355:3;15345:8;15342:17;15339:43;;;15362:18;;:::i;:::-;-1:-1:-1;;15418:1:125;15404:16;;15433:5;;15230:218;;15532:2;15522:8;15519:16;15513:3;15507:4;15504:13;15500:36;15494:2;15484:8;15481:16;15476:2;15470:4;15467:12;15463:35;15460:77;15457:159;;;-1:-1:-1;15569:19:125;;;15601:5;;15457:159;15648:34;15673:8;15667:4;15648:34;:::i;:::-;15718:6;15714:1;15710:6;15706:19;15697:7;15694:32;15691:58;;;15729:18;;:::i;:::-;15767:20;;14987:806;-1:-1:-1;;;14987:806:125:o;15798:131::-;15858:5;15887:36;15914:8;15908:4;15887:36;:::i"
|
|
11734
11765
|
},
|
|
11735
11766
|
"gasEstimates": {
|
|
11736
11767
|
"creation": {
|
|
11737
|
-
"codeDepositCost": "
|
|
11738
|
-
"executionCost": "
|
|
11739
|
-
"totalCost": "
|
|
11768
|
+
"codeDepositCost": "1681000",
|
|
11769
|
+
"executionCost": "27605",
|
|
11770
|
+
"totalCost": "1708605"
|
|
11740
11771
|
},
|
|
11741
11772
|
"external": {
|
|
11742
|
-
"authorizationRequired()": "
|
|
11743
|
-
"authorize(address)": "
|
|
11773
|
+
"authorizationRequired()": "2394",
|
|
11774
|
+
"authorize(address)": "27911",
|
|
11744
11775
|
"currentEpoch()": "2398",
|
|
11745
11776
|
"deauthorize(address)": "27862",
|
|
11746
11777
|
"genesis(bytes,uint256,uint64)": "infinite",
|
|
11747
|
-
"genesisEpoch()": "
|
|
11778
|
+
"genesisEpoch()": "2358",
|
|
11748
11779
|
"getBlockDifficulty(uint256)": "infinite",
|
|
11749
11780
|
"getCurrentAndPrevEpochDifficulty()": "4509",
|
|
11750
|
-
"getCurrentEpochDifficulty()": "
|
|
11781
|
+
"getCurrentEpochDifficulty()": "2327",
|
|
11751
11782
|
"getEpochDifficulty(uint256)": "infinite",
|
|
11752
|
-
"getPrevEpochDifficulty()": "
|
|
11783
|
+
"getPrevEpochDifficulty()": "2349",
|
|
11753
11784
|
"getRelayRange()": "infinite",
|
|
11754
11785
|
"isAuthorized(address)": "2584",
|
|
11755
|
-
"owner()": "
|
|
11786
|
+
"owner()": "2346",
|
|
11756
11787
|
"proofLength()": "2396",
|
|
11757
11788
|
"ready()": "2416",
|
|
11758
11789
|
"renounceOwnership()": "infinite",
|
|
11759
11790
|
"retarget(bytes)": "infinite",
|
|
11760
11791
|
"setAuthorizationStatus(bool)": "27838",
|
|
11792
|
+
"setDifficultyFromHeaders(bytes)": "infinite",
|
|
11761
11793
|
"setProofLength(uint64)": "32219",
|
|
11762
11794
|
"transferOwnership(address)": "28327",
|
|
11763
11795
|
"validateChain(bytes)": "infinite"
|
|
@@ -11783,12 +11815,13 @@
|
|
|
11783
11815
|
"renounceOwnership()": "715018a6",
|
|
11784
11816
|
"retarget(bytes)": "7ca5b1dd",
|
|
11785
11817
|
"setAuthorizationStatus(bool)": "eb8695ef",
|
|
11818
|
+
"setDifficultyFromHeaders(bytes)": "d38c29a1",
|
|
11786
11819
|
"setProofLength(uint64)": "19c9aa32",
|
|
11787
11820
|
"transferOwnership(address)": "f2fde38b",
|
|
11788
11821
|
"validateChain(bytes)": "189179a3"
|
|
11789
11822
|
}
|
|
11790
11823
|
},
|
|
11791
|
-
"metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"newStatus\",\"type\":\"bool\"}],\"name\":\"AuthorizationRequirementChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"blockHeight\",\"type\":\"uint256\"}],\"name\":\"Genesis\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newLength\",\"type\":\"uint256\"}],\"name\":\"ProofLengthChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldDifficulty\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newDifficulty\",\"type\":\"uint256\"}],\"name\":\"Retarget\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"submitter\",\"type\":\"address\"}],\"name\":\"SubmitterAuthorized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"submitter\",\"type\":\"address\"}],\"name\":\"SubmitterDeauthorized\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"authorizationRequired\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"submitter\",\"type\":\"address\"}],\"name\":\"authorize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentEpoch\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"submitter\",\"type\":\"address\"}],\"name\":\"deauthorize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"genesisHeader\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"genesisHeight\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"genesisProofLength\",\"type\":\"uint64\"}],\"name\":\"genesis\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"genesisEpoch\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getBlockDifficulty\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentAndPrevEpochDifficulty\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"current\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"previous\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentEpochDifficulty\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"epochNumber\",\"type\":\"uint256\"}],\"name\":\"getEpochDifficulty\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPrevEpochDifficulty\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRelayRange\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"relayGenesis\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"currentEpochEnd\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isAuthorized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proofLength\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ready\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"headers\",\"type\":\"bytes\"}],\"name\":\"retarget\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"}],\"name\":\"setAuthorizationStatus\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newLength\",\"type\":\"uint64\"}],\"name\":\"setProofLength\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"headers\",\"type\":\"bytes\"}],\"name\":\"validateChain\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"startingHeaderTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"headerCount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Since the returned difficulties are fixed and impossible to be modified with any setters, it is safe to use GoerliLightRelay without risking somebody may change the difficulties and block the test network. Notice that GoerliLightRelay is derived from LightRelay so that the two contracts have the same API and correct bindings can be generated.\",\"kind\":\"dev\",\"methods\":{\"authorize(address)\":{\"params\":{\"submitter\":\"The address to be authorised.\"}},\"deauthorize(address)\":{\"params\":{\"submitter\":\"The address to be deauthorised.\"}},\"genesis(bytes,uint256,uint64)\":{\"details\":\"If the relay is used by querying the current and previous epoch difficulty, at least one retarget needs to be provided after genesis; otherwise the prevEpochDifficulty will be uninitialised and zero.\",\"params\":{\"genesisHeader\":\"The first block header of the genesis epoch.\",\"genesisHeight\":\"The block number of the first block of the epoch.\",\"genesisProofLength\":\"The number of blocks required to accept a proof.\"}},\"getBlockDifficulty(uint256)\":{\"params\":{\"blockNumber\":\"The number of the block. Must fall within the relay range (at or after the relay genesis, and at or before the end of the most recent epoch proven to the relay).\"},\"returns\":{\"_0\":\"The difficulty of the epoch.\"}},\"getEpochDifficulty(uint256)\":{\"params\":{\"epochNumber\":\"The number of the epoch (the height of the first block of the epoch, divided by 2016). Must fall within the relay range.\"},\"returns\":{\"_0\":\"The difficulty of the epoch.\"}},\"getRelayRange()\":{\"details\":\"Assumes that the genesis has been set correctly. Additionally, if the next epoch after the current one has the exact same difficulty, headers for it can be validated as well. This function should be used for informative purposes, e.g. to determine whether a retarget must be provided before submitting a header chain for validation.\",\"returns\":{\"currentEpochEnd\":\"The height of the last block that can be included in header chains for the relay to validate.\",\"relayGenesis\":\"The height of the earliest block that can be included in header chains for the relay to validate.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"retarget(bytes)\":{\"details\":\"Checks that the first X blocks are valid in the most recent epoch, that the difficulty of the new epoch is calculated correctly according to the block timestamps, and that the next X blocks would be valid in the new epoch. We have no information of block heights, so we cannot enforce that retargets only happen every 2016 blocks; instead, we assume that this is the case if a valid proof of work is provided. It is possible to cheat the relay by providing X blocks from earlier in the most recent epoch, and then mining X new blocks after them. However, each of these malicious blocks would have to be mined to a higher difficulty than the legitimate ones. Alternatively, if the retarget has not been performed yet, one could first mine X blocks in the old difficulty with timestamps set far in the future, and then another X blocks at a greatly reduced difficulty. In either case, cheating the realy requires more work than mining X legitimate blocks. Only the most recent epoch is vulnerable to these attacks; once a retarget has been proven to the relay, the epoch is immutable even if a contradictory proof were to be presented later.\",\"params\":{\"headers\":\"A chain of headers including the last X blocks before the retarget, followed by the first X blocks after the retarget, where X equals the current proof length.\"}},\"setAuthorizationStatus(bool)\":{\"params\":{\"status\":\"True if authorisation is to be required, false if not.\"}},\"setProofLength(uint64)\":{\"details\":\"For production, a high number (e.g. 20-50) is recommended. Small numbers are accepted but should only be used for testing.\",\"params\":{\"newLength\":\"The required number of blocks. Must be less than 2016.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"validateChain(bytes)\":{\"details\":\"A chain of headers is accepted as valid if: - Its length is between 2 and 2015 headers. - Headers in the chain are sequential and refer to previous digests. - Each header is mined with the correct amount of work. - The difficulty in each header matches an epoch of the relay, as determined by the headers' timestamps. The headers must be between the genesis epoch and the latest proven epoch (inclusive). If the chain contains a retarget, it is accepted if the retarget has already been proven to the relay. If the chain contains blocks of an epoch that has not been proven to the relay (after a retarget within the header chain, or when the entire chain falls within an epoch that has not been proven yet), it will be rejected. One exception to this is when two subsequent epochs have exactly the same difficulty; headers from the latter epoch will be accepted if the previous epoch has been proven to the relay. This is because it is not possible to distinguish such headers from headers of the previous epoch. If the difficulty increases significantly between relay genesis and the present, creating fraudulent proofs for earlier epochs becomes easier. Users of the relay should check the timestamps of valid headers and only accept appropriately recent ones.\",\"params\":{\"headers\":\"A chain of 2 to 2015 bitcoin headers.\"},\"returns\":{\"headerCount\":\"The number of headers.\",\"startingHeaderTimestamp\":\"The timestamp of the first header.\"}}},\"title\":\"Goerli Light Relay\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"authorize(address)\":{\"notice\":\"Authorise the given address to submit retarget proofs.\"},\"deauthorize(address)\":{\"notice\":\"Rescind the authorisation of the submitter to retarget.\"},\"genesis(bytes,uint256,uint64)\":{\"notice\":\"Establish a starting point for the relay by providing the target, timestamp and blockheight of the first block of the relay genesis epoch.\"},\"getBlockDifficulty(uint256)\":{\"notice\":\"Get the difficulty of the specified block.\"},\"getCurrentEpochDifficulty()\":{\"notice\":\"Returns `1` as the difficulty of the current epoch.\"},\"getEpochDifficulty(uint256)\":{\"notice\":\"Get the difficulty of the specified epoch.\"},\"getPrevEpochDifficulty()\":{\"notice\":\"Returns `1` as the difficulty of the previous epoch.\"},\"getRelayRange()\":{\"notice\":\"Get the range of blocks the relay can accept proofs for.\"},\"retarget(bytes)\":{\"notice\":\"Add a new epoch to the relay by providing a proof of the difficulty before and after the retarget.\"},\"setAuthorizationStatus(bool)\":{\"notice\":\"Set whether the relay requires retarget submitters to be pre-authorised by governance.\"},\"setProofLength(uint64)\":{\"notice\":\"Set the number of blocks required to accept a header chain.\"},\"validateChain(bytes)\":{\"notice\":\"Check whether a given chain of headers should be accepted as valid within the rules of the relay. If the validation fails, this function throws an exception.\"}},\"notice\":\"GoerliLightRelay is a stub version of LightRelay intended to be used on the Goerli test network. It always returns `1` as the current and previous difficulties making it possible to bypass validation of difficulties of Bitcoin testnet blocks. Since difficulty in Bitcoin testnet often falls to `1` it would not be possible to validate blocks with the real LightRelay.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/GoerliLightRelay.sol\":\"GoerliLightRelay\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[]},\"sources\":{\"@keep-network/bitcoin-spv-sol/contracts/BTCUtils.sol\":{\"content\":\"pragma solidity ^0.8.4;\\n\\n/** @title BitcoinSPV */\\n/** @author Summa (https://summa.one) */\\n\\nimport {BytesLib} from \\\"./BytesLib.sol\\\";\\nimport {SafeMath} from \\\"./SafeMath.sol\\\";\\n\\nlibrary BTCUtils {\\n using BytesLib for bytes;\\n using SafeMath for uint256;\\n\\n // The target at minimum Difficulty. Also the target of the genesis block\\n uint256 public constant DIFF1_TARGET = 0xffff0000000000000000000000000000000000000000000000000000;\\n\\n uint256 public constant RETARGET_PERIOD = 2 * 7 * 24 * 60 * 60; // 2 weeks in seconds\\n uint256 public constant RETARGET_PERIOD_BLOCKS = 2016; // 2 weeks in blocks\\n\\n uint256 public constant ERR_BAD_ARG = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff;\\n\\n /* ***** */\\n /* UTILS */\\n /* ***** */\\n\\n /// @notice Determines the length of a VarInt in bytes\\n /// @dev A VarInt of >1 byte is prefixed with a flag indicating its length\\n /// @param _flag The first byte of a VarInt\\n /// @return The number of non-flag bytes in the VarInt\\n function determineVarIntDataLength(bytes memory _flag) internal pure returns (uint8) {\\n return determineVarIntDataLengthAt(_flag, 0);\\n }\\n\\n /// @notice Determines the length of a VarInt in bytes\\n /// @dev A VarInt of >1 byte is prefixed with a flag indicating its length\\n /// @param _b The byte array containing a VarInt\\n /// @param _at The position of the VarInt in the array\\n /// @return The number of non-flag bytes in the VarInt\\n function determineVarIntDataLengthAt(bytes memory _b, uint256 _at) internal pure returns (uint8) {\\n if (uint8(_b[_at]) == 0xff) {\\n return 8; // one-byte flag, 8 bytes data\\n }\\n if (uint8(_b[_at]) == 0xfe) {\\n return 4; // one-byte flag, 4 bytes data\\n }\\n if (uint8(_b[_at]) == 0xfd) {\\n return 2; // one-byte flag, 2 bytes data\\n }\\n\\n return 0; // flag is data\\n }\\n\\n /// @notice Parse a VarInt into its data length and the number it represents\\n /// @dev Useful for Parsing Vins and Vouts. Returns ERR_BAD_ARG if insufficient bytes.\\n /// Caller SHOULD explicitly handle this case (or bubble it up)\\n /// @param _b A byte-string starting with a VarInt\\n /// @return number of bytes in the encoding (not counting the tag), the encoded int\\n function parseVarInt(bytes memory _b) internal pure returns (uint256, uint256) {\\n return parseVarIntAt(_b, 0);\\n }\\n\\n /// @notice Parse a VarInt into its data length and the number it represents\\n /// @dev Useful for Parsing Vins and Vouts. Returns ERR_BAD_ARG if insufficient bytes.\\n /// Caller SHOULD explicitly handle this case (or bubble it up)\\n /// @param _b A byte-string containing a VarInt\\n /// @param _at The position of the VarInt\\n /// @return number of bytes in the encoding (not counting the tag), the encoded int\\n function parseVarIntAt(bytes memory _b, uint256 _at) internal pure returns (uint256, uint256) {\\n uint8 _dataLen = determineVarIntDataLengthAt(_b, _at);\\n\\n if (_dataLen == 0) {\\n return (0, uint8(_b[_at]));\\n }\\n if (_b.length < 1 + _dataLen + _at) {\\n return (ERR_BAD_ARG, 0);\\n }\\n uint256 _number;\\n if (_dataLen == 2) {\\n _number = reverseUint16(uint16(_b.slice2(1 + _at)));\\n } else if (_dataLen == 4) {\\n _number = reverseUint32(uint32(_b.slice4(1 + _at)));\\n } else if (_dataLen == 8) {\\n _number = reverseUint64(uint64(_b.slice8(1 + _at)));\\n }\\n return (_dataLen, _number);\\n }\\n\\n /// @notice Changes the endianness of a byte array\\n /// @dev Returns a new, backwards, bytes\\n /// @param _b The bytes to reverse\\n /// @return The reversed bytes\\n function reverseEndianness(bytes memory _b) internal pure returns (bytes memory) {\\n bytes memory _newValue = new bytes(_b.length);\\n\\n for (uint i = 0; i < _b.length; i++) {\\n _newValue[_b.length - i - 1] = _b[i];\\n }\\n\\n return _newValue;\\n }\\n\\n /// @notice Changes the endianness of a uint256\\n /// @dev https://graphics.stanford.edu/~seander/bithacks.html#ReverseParallel\\n /// @param _b The unsigned integer to reverse\\n /// @return v The reversed value\\n function reverseUint256(uint256 _b) internal pure returns (uint256 v) {\\n v = _b;\\n\\n // swap bytes\\n v = ((v >> 8) & 0x00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF) |\\n ((v & 0x00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF) << 8);\\n // swap 2-byte long pairs\\n v = ((v >> 16) & 0x0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF) |\\n ((v & 0x0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF) << 16);\\n // swap 4-byte long pairs\\n v = ((v >> 32) & 0x00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF) |\\n ((v & 0x00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF) << 32);\\n // swap 8-byte long pairs\\n v = ((v >> 64) & 0x0000000000000000FFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF) |\\n ((v & 0x0000000000000000FFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF) << 64);\\n // swap 16-byte long pairs\\n v = (v >> 128) | (v << 128);\\n }\\n\\n /// @notice Changes the endianness of a uint64\\n /// @param _b The unsigned integer to reverse\\n /// @return v The reversed value\\n function reverseUint64(uint64 _b) internal pure returns (uint64 v) {\\n v = _b;\\n\\n // swap bytes\\n v = ((v >> 8) & 0x00FF00FF00FF00FF) |\\n ((v & 0x00FF00FF00FF00FF) << 8);\\n // swap 2-byte long pairs\\n v = ((v >> 16) & 0x0000FFFF0000FFFF) |\\n ((v & 0x0000FFFF0000FFFF) << 16);\\n // swap 4-byte long pairs\\n v = (v >> 32) | (v << 32);\\n }\\n\\n /// @notice Changes the endianness of a uint32\\n /// @param _b The unsigned integer to reverse\\n /// @return v The reversed value\\n function reverseUint32(uint32 _b) internal pure returns (uint32 v) {\\n v = _b;\\n\\n // swap bytes\\n v = ((v >> 8) & 0x00FF00FF) |\\n ((v & 0x00FF00FF) << 8);\\n // swap 2-byte long pairs\\n v = (v >> 16) | (v << 16);\\n }\\n\\n /// @notice Changes the endianness of a uint24\\n /// @param _b The unsigned integer to reverse\\n /// @return v The reversed value\\n function reverseUint24(uint24 _b) internal pure returns (uint24 v) {\\n v = (_b << 16) | (_b & 0x00FF00) | (_b >> 16);\\n }\\n\\n /// @notice Changes the endianness of a uint16\\n /// @param _b The unsigned integer to reverse\\n /// @return v The reversed value\\n function reverseUint16(uint16 _b) internal pure returns (uint16 v) {\\n v = (_b << 8) | (_b >> 8);\\n }\\n\\n\\n /// @notice Converts big-endian bytes to a uint\\n /// @dev Traverses the byte array and sums the bytes\\n /// @param _b The big-endian bytes-encoded integer\\n /// @return The integer representation\\n function bytesToUint(bytes memory _b) internal pure returns (uint256) {\\n uint256 _number;\\n\\n for (uint i = 0; i < _b.length; i++) {\\n _number = _number + uint8(_b[i]) * (2 ** (8 * (_b.length - (i + 1))));\\n }\\n\\n return _number;\\n }\\n\\n /// @notice Get the last _num bytes from a byte array\\n /// @param _b The byte array to slice\\n /// @param _num The number of bytes to extract from the end\\n /// @return The last _num bytes of _b\\n function lastBytes(bytes memory _b, uint256 _num) internal pure returns (bytes memory) {\\n uint256 _start = _b.length.sub(_num);\\n\\n return _b.slice(_start, _num);\\n }\\n\\n /// @notice Implements bitcoin's hash160 (rmd160(sha2()))\\n /// @dev abi.encodePacked changes the return to bytes instead of bytes32\\n /// @param _b The pre-image\\n /// @return The digest\\n function hash160(bytes memory _b) internal pure returns (bytes memory) {\\n return abi.encodePacked(ripemd160(abi.encodePacked(sha256(_b))));\\n }\\n\\n /// @notice Implements bitcoin's hash160 (sha2 + ripemd160)\\n /// @dev sha2 precompile at address(2), ripemd160 at address(3)\\n /// @param _b The pre-image\\n /// @return res The digest\\n function hash160View(bytes memory _b) internal view returns (bytes20 res) {\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n pop(staticcall(gas(), 2, add(_b, 32), mload(_b), 0x00, 32))\\n pop(staticcall(gas(), 3, 0x00, 32, 0x00, 32))\\n // read from position 12 = 0c\\n res := mload(0x0c)\\n }\\n }\\n\\n /// @notice Implements bitcoin's hash256 (double sha2)\\n /// @dev abi.encodePacked changes the return to bytes instead of bytes32\\n /// @param _b The pre-image\\n /// @return The digest\\n function hash256(bytes memory _b) internal pure returns (bytes32) {\\n return sha256(abi.encodePacked(sha256(_b)));\\n }\\n\\n /// @notice Implements bitcoin's hash256 (double sha2)\\n /// @dev sha2 is precompiled smart contract located at address(2)\\n /// @param _b The pre-image\\n /// @return res The digest\\n function hash256View(bytes memory _b) internal view returns (bytes32 res) {\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n pop(staticcall(gas(), 2, add(_b, 32), mload(_b), 0x00, 32))\\n pop(staticcall(gas(), 2, 0x00, 32, 0x00, 32))\\n res := mload(0x00)\\n }\\n }\\n\\n /// @notice Implements bitcoin's hash256 on a pair of bytes32\\n /// @dev sha2 is precompiled smart contract located at address(2)\\n /// @param _a The first bytes32 of the pre-image\\n /// @param _b The second bytes32 of the pre-image\\n /// @return res The digest\\n function hash256Pair(bytes32 _a, bytes32 _b) internal view returns (bytes32 res) {\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n mstore(0x00, _a)\\n mstore(0x20, _b)\\n pop(staticcall(gas(), 2, 0x00, 64, 0x00, 32))\\n pop(staticcall(gas(), 2, 0x00, 32, 0x00, 32))\\n res := mload(0x00)\\n }\\n }\\n\\n /// @notice Implements bitcoin's hash256 (double sha2)\\n /// @dev sha2 is precompiled smart contract located at address(2)\\n /// @param _b The array containing the pre-image\\n /// @param at The start of the pre-image\\n /// @param len The length of the pre-image\\n /// @return res The digest\\n function hash256Slice(\\n bytes memory _b,\\n uint256 at,\\n uint256 len\\n ) internal view returns (bytes32 res) {\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n pop(staticcall(gas(), 2, add(_b, add(32, at)), len, 0x00, 32))\\n pop(staticcall(gas(), 2, 0x00, 32, 0x00, 32))\\n res := mload(0x00)\\n }\\n }\\n\\n /* ************ */\\n /* Legacy Input */\\n /* ************ */\\n\\n /// @notice Extracts the nth input from the vin (0-indexed)\\n /// @dev Iterates over the vin. If you need to extract several, write a custom function\\n /// @param _vin The vin as a tightly-packed byte array\\n /// @param _index The 0-indexed location of the input to extract\\n /// @return The input as a byte array\\n function extractInputAtIndex(bytes memory _vin, uint256 _index) internal pure returns (bytes memory) {\\n uint256 _varIntDataLen;\\n uint256 _nIns;\\n\\n (_varIntDataLen, _nIns) = parseVarInt(_vin);\\n require(_varIntDataLen != ERR_BAD_ARG, \\\"Read overrun during VarInt parsing\\\");\\n require(_index < _nIns, \\\"Vin read overrun\\\");\\n\\n uint256 _len = 0;\\n uint256 _offset = 1 + _varIntDataLen;\\n\\n for (uint256 _i = 0; _i < _index; _i ++) {\\n _len = determineInputLengthAt(_vin, _offset);\\n require(_len != ERR_BAD_ARG, \\\"Bad VarInt in scriptSig\\\");\\n _offset = _offset + _len;\\n }\\n\\n _len = determineInputLengthAt(_vin, _offset);\\n require(_len != ERR_BAD_ARG, \\\"Bad VarInt in scriptSig\\\");\\n return _vin.slice(_offset, _len);\\n }\\n\\n /// @notice Determines whether an input is legacy\\n /// @dev False if no scriptSig, otherwise True\\n /// @param _input The input\\n /// @return True for legacy, False for witness\\n function isLegacyInput(bytes memory _input) internal pure returns (bool) {\\n return _input[36] != hex\\\"00\\\";\\n }\\n\\n /// @notice Determines the length of a scriptSig in an input\\n /// @dev Will return 0 if passed a witness input.\\n /// @param _input The LEGACY input\\n /// @return The length of the script sig\\n function extractScriptSigLen(bytes memory _input) internal pure returns (uint256, uint256) {\\n return extractScriptSigLenAt(_input, 0);\\n }\\n\\n /// @notice Determines the length of a scriptSig in an input\\n /// starting at the specified position\\n /// @dev Will return 0 if passed a witness input.\\n /// @param _input The byte array containing the LEGACY input\\n /// @param _at The position of the input in the array\\n /// @return The length of the script sig\\n function extractScriptSigLenAt(bytes memory _input, uint256 _at) internal pure returns (uint256, uint256) {\\n if (_input.length < 37 + _at) {\\n return (ERR_BAD_ARG, 0);\\n }\\n\\n uint256 _varIntDataLen;\\n uint256 _scriptSigLen;\\n (_varIntDataLen, _scriptSigLen) = parseVarIntAt(_input, _at + 36);\\n\\n return (_varIntDataLen, _scriptSigLen);\\n }\\n\\n /// @notice Determines the length of an input from its scriptSig\\n /// @dev 36 for outpoint, 1 for scriptSig length, 4 for sequence\\n /// @param _input The input\\n /// @return The length of the input in bytes\\n function determineInputLength(bytes memory _input) internal pure returns (uint256) {\\n return determineInputLengthAt(_input, 0);\\n }\\n\\n /// @notice Determines the length of an input from its scriptSig,\\n /// starting at the specified position\\n /// @dev 36 for outpoint, 1 for scriptSig length, 4 for sequence\\n /// @param _input The byte array containing the input\\n /// @param _at The position of the input in the array\\n /// @return The length of the input in bytes\\n function determineInputLengthAt(bytes memory _input, uint256 _at) internal pure returns (uint256) {\\n uint256 _varIntDataLen;\\n uint256 _scriptSigLen;\\n (_varIntDataLen, _scriptSigLen) = extractScriptSigLenAt(_input, _at);\\n if (_varIntDataLen == ERR_BAD_ARG) {\\n return ERR_BAD_ARG;\\n }\\n\\n return 36 + 1 + _varIntDataLen + _scriptSigLen + 4;\\n }\\n\\n /// @notice Extracts the LE sequence bytes from an input\\n /// @dev Sequence is used for relative time locks\\n /// @param _input The LEGACY input\\n /// @return The sequence bytes (LE uint)\\n function extractSequenceLELegacy(bytes memory _input) internal pure returns (bytes4) {\\n uint256 _varIntDataLen;\\n uint256 _scriptSigLen;\\n (_varIntDataLen, _scriptSigLen) = extractScriptSigLen(_input);\\n require(_varIntDataLen != ERR_BAD_ARG, \\\"Bad VarInt in scriptSig\\\");\\n return _input.slice4(36 + 1 + _varIntDataLen + _scriptSigLen);\\n }\\n\\n /// @notice Extracts the sequence from the input\\n /// @dev Sequence is a 4-byte little-endian number\\n /// @param _input The LEGACY input\\n /// @return The sequence number (big-endian uint)\\n function extractSequenceLegacy(bytes memory _input) internal pure returns (uint32) {\\n uint32 _leSeqence = uint32(extractSequenceLELegacy(_input));\\n uint32 _beSequence = reverseUint32(_leSeqence);\\n return _beSequence;\\n }\\n /// @notice Extracts the VarInt-prepended scriptSig from the input in a tx\\n /// @dev Will return hex\\\"00\\\" if passed a witness input\\n /// @param _input The LEGACY input\\n /// @return The length-prepended scriptSig\\n function extractScriptSig(bytes memory _input) internal pure returns (bytes memory) {\\n uint256 _varIntDataLen;\\n uint256 _scriptSigLen;\\n (_varIntDataLen, _scriptSigLen) = extractScriptSigLen(_input);\\n require(_varIntDataLen != ERR_BAD_ARG, \\\"Bad VarInt in scriptSig\\\");\\n return _input.slice(36, 1 + _varIntDataLen + _scriptSigLen);\\n }\\n\\n\\n /* ************* */\\n /* Witness Input */\\n /* ************* */\\n\\n /// @notice Extracts the LE sequence bytes from an input\\n /// @dev Sequence is used for relative time locks\\n /// @param _input The WITNESS input\\n /// @return The sequence bytes (LE uint)\\n function extractSequenceLEWitness(bytes memory _input) internal pure returns (bytes4) {\\n return _input.slice4(37);\\n }\\n\\n /// @notice Extracts the sequence from the input in a tx\\n /// @dev Sequence is a 4-byte little-endian number\\n /// @param _input The WITNESS input\\n /// @return The sequence number (big-endian uint)\\n function extractSequenceWitness(bytes memory _input) internal pure returns (uint32) {\\n uint32 _leSeqence = uint32(extractSequenceLEWitness(_input));\\n uint32 _inputeSequence = reverseUint32(_leSeqence);\\n return _inputeSequence;\\n }\\n\\n /// @notice Extracts the outpoint from the input in a tx\\n /// @dev 32-byte tx id with 4-byte index\\n /// @param _input The input\\n /// @return The outpoint (LE bytes of prev tx hash + LE bytes of prev tx index)\\n function extractOutpoint(bytes memory _input) internal pure returns (bytes memory) {\\n return _input.slice(0, 36);\\n }\\n\\n /// @notice Extracts the outpoint tx id from an input\\n /// @dev 32-byte tx id\\n /// @param _input The input\\n /// @return The tx id (little-endian bytes)\\n function extractInputTxIdLE(bytes memory _input) internal pure returns (bytes32) {\\n return _input.slice32(0);\\n }\\n\\n /// @notice Extracts the outpoint tx id from an input\\n /// starting at the specified position\\n /// @dev 32-byte tx id\\n /// @param _input The byte array containing the input\\n /// @param _at The position of the input\\n /// @return The tx id (little-endian bytes)\\n function extractInputTxIdLeAt(bytes memory _input, uint256 _at) internal pure returns (bytes32) {\\n return _input.slice32(_at);\\n }\\n\\n /// @notice Extracts the LE tx input index from the input in a tx\\n /// @dev 4-byte tx index\\n /// @param _input The input\\n /// @return The tx index (little-endian bytes)\\n function extractTxIndexLE(bytes memory _input) internal pure returns (bytes4) {\\n return _input.slice4(32);\\n }\\n\\n /// @notice Extracts the LE tx input index from the input in a tx\\n /// starting at the specified position\\n /// @dev 4-byte tx index\\n /// @param _input The byte array containing the input\\n /// @param _at The position of the input\\n /// @return The tx index (little-endian bytes)\\n function extractTxIndexLeAt(bytes memory _input, uint256 _at) internal pure returns (bytes4) {\\n return _input.slice4(32 + _at);\\n }\\n\\n /* ****** */\\n /* Output */\\n /* ****** */\\n\\n /// @notice Determines the length of an output\\n /// @dev Works with any properly formatted output\\n /// @param _output The output\\n /// @return The length indicated by the prefix, error if invalid length\\n function determineOutputLength(bytes memory _output) internal pure returns (uint256) {\\n return determineOutputLengthAt(_output, 0);\\n }\\n\\n /// @notice Determines the length of an output\\n /// starting at the specified position\\n /// @dev Works with any properly formatted output\\n /// @param _output The byte array containing the output\\n /// @param _at The position of the output\\n /// @return The length indicated by the prefix, error if invalid length\\n function determineOutputLengthAt(bytes memory _output, uint256 _at) internal pure returns (uint256) {\\n if (_output.length < 9 + _at) {\\n return ERR_BAD_ARG;\\n }\\n uint256 _varIntDataLen;\\n uint256 _scriptPubkeyLength;\\n (_varIntDataLen, _scriptPubkeyLength) = parseVarIntAt(_output, 8 + _at);\\n\\n if (_varIntDataLen == ERR_BAD_ARG) {\\n return ERR_BAD_ARG;\\n }\\n\\n // 8-byte value, 1-byte for tag itself\\n return 8 + 1 + _varIntDataLen + _scriptPubkeyLength;\\n }\\n\\n /// @notice Extracts the output at a given index in the TxOuts vector\\n /// @dev Iterates over the vout. If you need to extract multiple, write a custom function\\n /// @param _vout The _vout to extract from\\n /// @param _index The 0-indexed location of the output to extract\\n /// @return The specified output\\n function extractOutputAtIndex(bytes memory _vout, uint256 _index) internal pure returns (bytes memory) {\\n uint256 _varIntDataLen;\\n uint256 _nOuts;\\n\\n (_varIntDataLen, _nOuts) = parseVarInt(_vout);\\n require(_varIntDataLen != ERR_BAD_ARG, \\\"Read overrun during VarInt parsing\\\");\\n require(_index < _nOuts, \\\"Vout read overrun\\\");\\n\\n uint256 _len = 0;\\n uint256 _offset = 1 + _varIntDataLen;\\n\\n for (uint256 _i = 0; _i < _index; _i ++) {\\n _len = determineOutputLengthAt(_vout, _offset);\\n require(_len != ERR_BAD_ARG, \\\"Bad VarInt in scriptPubkey\\\");\\n _offset += _len;\\n }\\n\\n _len = determineOutputLengthAt(_vout, _offset);\\n require(_len != ERR_BAD_ARG, \\\"Bad VarInt in scriptPubkey\\\");\\n return _vout.slice(_offset, _len);\\n }\\n\\n /// @notice Extracts the value bytes from the output in a tx\\n /// @dev Value is an 8-byte little-endian number\\n /// @param _output The output\\n /// @return The output value as LE bytes\\n function extractValueLE(bytes memory _output) internal pure returns (bytes8) {\\n return _output.slice8(0);\\n }\\n\\n /// @notice Extracts the value from the output in a tx\\n /// @dev Value is an 8-byte little-endian number\\n /// @param _output The output\\n /// @return The output value\\n function extractValue(bytes memory _output) internal pure returns (uint64) {\\n uint64 _leValue = uint64(extractValueLE(_output));\\n uint64 _beValue = reverseUint64(_leValue);\\n return _beValue;\\n }\\n\\n /// @notice Extracts the value from the output in a tx\\n /// @dev Value is an 8-byte little-endian number\\n /// @param _output The byte array containing the output\\n /// @param _at The starting index of the output in the array\\n /// @return The output value\\n function extractValueAt(bytes memory _output, uint256 _at) internal pure returns (uint64) {\\n uint64 _leValue = uint64(_output.slice8(_at));\\n uint64 _beValue = reverseUint64(_leValue);\\n return _beValue;\\n }\\n\\n /// @notice Extracts the data from an op return output\\n /// @dev Returns hex\\\"\\\" if no data or not an op return\\n /// @param _output The output\\n /// @return Any data contained in the opreturn output, null if not an op return\\n function extractOpReturnData(bytes memory _output) internal pure returns (bytes memory) {\\n if (_output[9] != hex\\\"6a\\\") {\\n return hex\\\"\\\";\\n }\\n bytes1 _dataLen = _output[10];\\n return _output.slice(11, uint256(uint8(_dataLen)));\\n }\\n\\n /// @notice Extracts the hash from the output script\\n /// @dev Determines type by the length prefix and validates format\\n /// @param _output The output\\n /// @return The hash committed to by the pk_script, or null for errors\\n function extractHash(bytes memory _output) internal pure returns (bytes memory) {\\n return extractHashAt(_output, 8, _output.length - 8);\\n }\\n\\n /// @notice Extracts the hash from the output script\\n /// @dev Determines type by the length prefix and validates format\\n /// @param _output The byte array containing the output\\n /// @param _at The starting index of the output script in the array\\n /// (output start + 8)\\n /// @param _len The length of the output script\\n /// (output length - 8)\\n /// @return The hash committed to by the pk_script, or null for errors\\n function extractHashAt(\\n bytes memory _output,\\n uint256 _at,\\n uint256 _len\\n ) internal pure returns (bytes memory) {\\n uint8 _scriptLen = uint8(_output[_at]);\\n\\n // don't have to worry about overflow here.\\n // if _scriptLen + 1 overflows, then output length would have to be < 1\\n // for this check to pass. if it's < 1, then we errored when assigning\\n // _scriptLen\\n if (_scriptLen + 1 != _len) {\\n return hex\\\"\\\";\\n }\\n\\n if (uint8(_output[_at + 1]) == 0) {\\n if (_scriptLen < 2) {\\n return hex\\\"\\\";\\n }\\n uint256 _payloadLen = uint8(_output[_at + 2]);\\n // Check for maliciously formatted witness outputs.\\n // No need to worry about underflow as long b/c of the `< 2` check\\n if (_payloadLen != _scriptLen - 2 || (_payloadLen != 0x20 && _payloadLen != 0x14)) {\\n return hex\\\"\\\";\\n }\\n return _output.slice(_at + 3, _payloadLen);\\n } else {\\n bytes3 _tag = _output.slice3(_at);\\n // p2pkh\\n if (_tag == hex\\\"1976a9\\\") {\\n // Check for maliciously formatted p2pkh\\n // No need to worry about underflow, b/c of _scriptLen check\\n if (uint8(_output[_at + 3]) != 0x14 ||\\n _output.slice2(_at + _len - 2) != hex\\\"88ac\\\") {\\n return hex\\\"\\\";\\n }\\n return _output.slice(_at + 4, 20);\\n //p2sh\\n } else if (_tag == hex\\\"17a914\\\") {\\n // Check for maliciously formatted p2sh\\n // No need to worry about underflow, b/c of _scriptLen check\\n if (uint8(_output[_at + _len - 1]) != 0x87) {\\n return hex\\\"\\\";\\n }\\n return _output.slice(_at + 3, 20);\\n }\\n }\\n return hex\\\"\\\"; /* NB: will trigger on OPRETURN and any non-standard that doesn't overrun */\\n }\\n\\n /* ********** */\\n /* Witness TX */\\n /* ********** */\\n\\n\\n /// @notice Checks that the vin passed up is properly formatted\\n /// @dev Consider a vin with a valid vout in its scriptsig\\n /// @param _vin Raw bytes length-prefixed input vector\\n /// @return True if it represents a validly formatted vin\\n function validateVin(bytes memory _vin) internal pure returns (bool) {\\n uint256 _varIntDataLen;\\n uint256 _nIns;\\n\\n (_varIntDataLen, _nIns) = parseVarInt(_vin);\\n\\n // Not valid if it says there are too many or no inputs\\n if (_nIns == 0 || _varIntDataLen == ERR_BAD_ARG) {\\n return false;\\n }\\n\\n uint256 _offset = 1 + _varIntDataLen;\\n\\n for (uint256 i = 0; i < _nIns; i++) {\\n // If we're at the end, but still expect more\\n if (_offset >= _vin.length) {\\n return false;\\n }\\n\\n // Grab the next input and determine its length.\\n uint256 _nextLen = determineInputLengthAt(_vin, _offset);\\n if (_nextLen == ERR_BAD_ARG) {\\n return false;\\n }\\n\\n // Increase the offset by that much\\n _offset += _nextLen;\\n }\\n\\n // Returns false if we're not exactly at the end\\n return _offset == _vin.length;\\n }\\n\\n /// @notice Checks that the vout passed up is properly formatted\\n /// @dev Consider a vout with a valid scriptpubkey\\n /// @param _vout Raw bytes length-prefixed output vector\\n /// @return True if it represents a validly formatted vout\\n function validateVout(bytes memory _vout) internal pure returns (bool) {\\n uint256 _varIntDataLen;\\n uint256 _nOuts;\\n\\n (_varIntDataLen, _nOuts) = parseVarInt(_vout);\\n\\n // Not valid if it says there are too many or no outputs\\n if (_nOuts == 0 || _varIntDataLen == ERR_BAD_ARG) {\\n return false;\\n }\\n\\n uint256 _offset = 1 + _varIntDataLen;\\n\\n for (uint256 i = 0; i < _nOuts; i++) {\\n // If we're at the end, but still expect more\\n if (_offset >= _vout.length) {\\n return false;\\n }\\n\\n // Grab the next output and determine its length.\\n // Increase the offset by that much\\n uint256 _nextLen = determineOutputLengthAt(_vout, _offset);\\n if (_nextLen == ERR_BAD_ARG) {\\n return false;\\n }\\n\\n _offset += _nextLen;\\n }\\n\\n // Returns false if we're not exactly at the end\\n return _offset == _vout.length;\\n }\\n\\n\\n\\n /* ************ */\\n /* Block Header */\\n /* ************ */\\n\\n /// @notice Extracts the transaction merkle root from a block header\\n /// @dev Use verifyHash256Merkle to verify proofs with this root\\n /// @param _header The header\\n /// @return The merkle root (little-endian)\\n function extractMerkleRootLE(bytes memory _header) internal pure returns (bytes32) {\\n return _header.slice32(36);\\n }\\n\\n /// @notice Extracts the target from a block header\\n /// @dev Target is a 256-bit number encoded as a 3-byte mantissa and 1-byte exponent\\n /// @param _header The header\\n /// @return The target threshold\\n function extractTarget(bytes memory _header) internal pure returns (uint256) {\\n return extractTargetAt(_header, 0);\\n }\\n\\n /// @notice Extracts the target from a block header\\n /// @dev Target is a 256-bit number encoded as a 3-byte mantissa and 1-byte exponent\\n /// @param _header The array containing the header\\n /// @param at The start of the header\\n /// @return The target threshold\\n function extractTargetAt(bytes memory _header, uint256 at) internal pure returns (uint256) {\\n uint24 _m = uint24(_header.slice3(72 + at));\\n uint8 _e = uint8(_header[75 + at]);\\n uint256 _mantissa = uint256(reverseUint24(_m));\\n uint _exponent = _e - 3;\\n\\n return _mantissa * (256 ** _exponent);\\n }\\n\\n /// @notice Calculate difficulty from the difficulty 1 target and current target\\n /// @dev Difficulty 1 is 0x1d00ffff on mainnet and testnet\\n /// @dev Difficulty 1 is a 256-bit number encoded as a 3-byte mantissa and 1-byte exponent\\n /// @param _target The current target\\n /// @return The block difficulty (bdiff)\\n function calculateDifficulty(uint256 _target) internal pure returns (uint256) {\\n // Difficulty 1 calculated from 0x1d00ffff\\n return DIFF1_TARGET.div(_target);\\n }\\n\\n /// @notice Extracts the previous block's hash from a block header\\n /// @dev Block headers do NOT include block number :(\\n /// @param _header The header\\n /// @return The previous block's hash (little-endian)\\n function extractPrevBlockLE(bytes memory _header) internal pure returns (bytes32) {\\n return _header.slice32(4);\\n }\\n\\n /// @notice Extracts the previous block's hash from a block header\\n /// @dev Block headers do NOT include block number :(\\n /// @param _header The array containing the header\\n /// @param at The start of the header\\n /// @return The previous block's hash (little-endian)\\n function extractPrevBlockLEAt(\\n bytes memory _header,\\n uint256 at\\n ) internal pure returns (bytes32) {\\n return _header.slice32(4 + at);\\n }\\n\\n /// @notice Extracts the timestamp from a block header\\n /// @dev Time is not 100% reliable\\n /// @param _header The header\\n /// @return The timestamp (little-endian bytes)\\n function extractTimestampLE(bytes memory _header) internal pure returns (bytes4) {\\n return _header.slice4(68);\\n }\\n\\n /// @notice Extracts the timestamp from a block header\\n /// @dev Time is not 100% reliable\\n /// @param _header The header\\n /// @return The timestamp (uint)\\n function extractTimestamp(bytes memory _header) internal pure returns (uint32) {\\n return reverseUint32(uint32(extractTimestampLE(_header)));\\n }\\n\\n /// @notice Extracts the expected difficulty from a block header\\n /// @dev Does NOT verify the work\\n /// @param _header The header\\n /// @return The difficulty as an integer\\n function extractDifficulty(bytes memory _header) internal pure returns (uint256) {\\n return calculateDifficulty(extractTarget(_header));\\n }\\n\\n /// @notice Concatenates and hashes two inputs for merkle proving\\n /// @param _a The first hash\\n /// @param _b The second hash\\n /// @return The double-sha256 of the concatenated hashes\\n function _hash256MerkleStep(bytes memory _a, bytes memory _b) internal view returns (bytes32) {\\n return hash256View(abi.encodePacked(_a, _b));\\n }\\n\\n /// @notice Concatenates and hashes two inputs for merkle proving\\n /// @param _a The first hash\\n /// @param _b The second hash\\n /// @return The double-sha256 of the concatenated hashes\\n function _hash256MerkleStep(bytes32 _a, bytes32 _b) internal view returns (bytes32) {\\n return hash256Pair(_a, _b);\\n }\\n\\n\\n /// @notice Verifies a Bitcoin-style merkle tree\\n /// @dev Leaves are 0-indexed. Inefficient version.\\n /// @param _proof The proof. Tightly packed LE sha256 hashes. The last hash is the root\\n /// @param _index The index of the leaf\\n /// @return true if the proof is valid, else false\\n function verifyHash256Merkle(bytes memory _proof, uint _index) internal view returns (bool) {\\n // Not an even number of hashes\\n if (_proof.length % 32 != 0) {\\n return false;\\n }\\n\\n // Special case for coinbase-only blocks\\n if (_proof.length == 32) {\\n return true;\\n }\\n\\n // Should never occur\\n if (_proof.length == 64) {\\n return false;\\n }\\n\\n bytes32 _root = _proof.slice32(_proof.length - 32);\\n bytes32 _current = _proof.slice32(0);\\n bytes memory _tree = _proof.slice(32, _proof.length - 64);\\n\\n return verifyHash256Merkle(_current, _tree, _root, _index);\\n }\\n\\n /// @notice Verifies a Bitcoin-style merkle tree\\n /// @dev Leaves are 0-indexed. Efficient version.\\n /// @param _leaf The leaf of the proof. LE sha256 hash.\\n /// @param _tree The intermediate nodes in the proof.\\n /// Tightly packed LE sha256 hashes.\\n /// @param _root The root of the proof. LE sha256 hash.\\n /// @param _index The index of the leaf\\n /// @return true if the proof is valid, else false\\n function verifyHash256Merkle(\\n bytes32 _leaf,\\n bytes memory _tree,\\n bytes32 _root,\\n uint _index\\n ) internal view returns (bool) {\\n // Not an even number of hashes\\n if (_tree.length % 32 != 0) {\\n return false;\\n }\\n\\n // Should never occur\\n if (_tree.length == 0) {\\n return false;\\n }\\n\\n uint _idx = _index;\\n bytes32 _current = _leaf;\\n\\n // i moves in increments of 32\\n for (uint i = 0; i < _tree.length; i += 32) {\\n if (_idx % 2 == 1) {\\n _current = _hash256MerkleStep(_tree.slice32(i), _current);\\n } else {\\n _current = _hash256MerkleStep(_current, _tree.slice32(i));\\n }\\n _idx = _idx >> 1;\\n }\\n return _current == _root;\\n }\\n\\n /*\\n NB: https://github.com/bitcoin/bitcoin/blob/78dae8caccd82cfbfd76557f1fb7d7557c7b5edb/src/pow.cpp#L49-L72\\n NB: We get a full-bitlength target from this. For comparison with\\n header-encoded targets we need to mask it with the header target\\n e.g. (full & truncated) == truncated\\n */\\n /// @notice performs the bitcoin difficulty retarget\\n /// @dev implements the Bitcoin algorithm precisely\\n /// @param _previousTarget the target of the previous period\\n /// @param _firstTimestamp the timestamp of the first block in the difficulty period\\n /// @param _secondTimestamp the timestamp of the last block in the difficulty period\\n /// @return the new period's target threshold\\n function retargetAlgorithm(\\n uint256 _previousTarget,\\n uint256 _firstTimestamp,\\n uint256 _secondTimestamp\\n ) internal pure returns (uint256) {\\n uint256 _elapsedTime = _secondTimestamp.sub(_firstTimestamp);\\n\\n // Normalize ratio to factor of 4 if very long or very short\\n if (_elapsedTime < RETARGET_PERIOD.div(4)) {\\n _elapsedTime = RETARGET_PERIOD.div(4);\\n }\\n if (_elapsedTime > RETARGET_PERIOD.mul(4)) {\\n _elapsedTime = RETARGET_PERIOD.mul(4);\\n }\\n\\n /*\\n NB: high targets e.g. ffff0020 can cause overflows here\\n so we divide it by 256**2, then multiply by 256**2 later\\n we know the target is evenly divisible by 256**2, so this isn't an issue\\n */\\n\\n uint256 _adjusted = _previousTarget.div(65536).mul(_elapsedTime);\\n return _adjusted.div(RETARGET_PERIOD).mul(65536);\\n }\\n}\\n\",\"keccak256\":\"0x439eaa97e9239705f3d31e8d39dccbad32311f1f119e295d53c65e0ae3c5a5fc\"},\"@keep-network/bitcoin-spv-sol/contracts/BytesLib.sol\":{\"content\":\"pragma solidity ^0.8.4;\\n\\n/*\\n\\nhttps://github.com/GNSPS/solidity-bytes-utils/\\n\\nThis is free and unencumbered software released into the public domain.\\n\\nAnyone is free to copy, modify, publish, use, compile, sell, or\\ndistribute this software, either in source code form or as a compiled\\nbinary, for any purpose, commercial or non-commercial, and by any\\nmeans.\\n\\nIn jurisdictions that recognize copyright laws, the author or authors\\nof this software dedicate any and all copyright interest in the\\nsoftware to the public domain. We make this dedication for the benefit\\nof the public at large and to the detriment of our heirs and\\nsuccessors. We intend this dedication to be an overt act of\\nrelinquishment in perpetuity of all present and future rights to this\\nsoftware under copyright law.\\n\\nTHE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND,\\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\\nIN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\\nOTHER DEALINGS IN THE SOFTWARE.\\n\\nFor more information, please refer to <https://unlicense.org>\\n*/\\n\\n\\n/** @title BytesLib **/\\n/** @author https://github.com/GNSPS **/\\n\\nlibrary BytesLib {\\n function concat(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bytes memory) {\\n bytes memory tempBytes;\\n\\n assembly {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // Store the length of the first bytes array at the beginning of\\n // the memory for tempBytes.\\n let length := mload(_preBytes)\\n mstore(tempBytes, length)\\n\\n // Maintain a memory counter for the current write location in the\\n // temp bytes array by adding the 32 bytes for the array length to\\n // the starting location.\\n let mc := add(tempBytes, 0x20)\\n // Stop copying when the memory counter reaches the length of the\\n // first bytes array.\\n let end := add(mc, length)\\n\\n for {\\n // Initialize a copy counter to the start of the _preBytes data,\\n // 32 bytes into its memory.\\n let cc := add(_preBytes, 0x20)\\n } lt(mc, end) {\\n // Increase both counters by 32 bytes each iteration.\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // Write the _preBytes data into the tempBytes memory 32 bytes\\n // at a time.\\n mstore(mc, mload(cc))\\n }\\n\\n // Add the length of _postBytes to the current length of tempBytes\\n // and store it as the new length in the first 32 bytes of the\\n // tempBytes memory.\\n length := mload(_postBytes)\\n mstore(tempBytes, add(length, mload(tempBytes)))\\n\\n // Move the memory counter back from a multiple of 0x20 to the\\n // actual end of the _preBytes data.\\n mc := end\\n // Stop copying when the memory counter reaches the new combined\\n // length of the arrays.\\n end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n // Update the free-memory pointer by padding our last write location\\n // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\\n // next 32 byte block, then round down to the nearest multiple of\\n // 32. If the sum of the length of the two arrays is zero then add\\n // one before rounding down to leave a blank 32 bytes (the length block with 0).\\n mstore(0x40, and(\\n add(add(end, iszero(add(length, mload(_preBytes)))), 31),\\n not(31) // Round down to the nearest 32 bytes.\\n ))\\n }\\n\\n return tempBytes;\\n }\\n\\n function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal {\\n assembly {\\n // Read the first 32 bytes of _preBytes storage, which is the length\\n // of the array. (We don't need to use the offset into the slot\\n // because arrays use the entire slot.)\\n let fslot := sload(_preBytes.slot)\\n // Arrays of 31 bytes or less have an even value in their slot,\\n // while longer arrays have an odd value. The actual length is\\n // the slot divided by two for odd values, and the lowest order\\n // byte divided by two for even values.\\n // If the slot is even, bitwise and the slot with 255 and divide by\\n // two to get the length. If the slot is odd, bitwise and the slot\\n // with -1 and divide by two.\\n let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\\n let mlength := mload(_postBytes)\\n let newlength := add(slength, mlength)\\n // slength can contain both the length and contents of the array\\n // if length < 32 bytes so let's prepare for that\\n // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n switch add(lt(slength, 32), lt(newlength, 32))\\n case 2 {\\n // Since the new array still fits in the slot, we just need to\\n // update the contents of the slot.\\n // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length\\n sstore(\\n _preBytes.slot,\\n // all the modifications to the slot are inside this\\n // next block\\n add(\\n // we can just add to the slot contents because the\\n // bytes we want to change are the LSBs\\n fslot,\\n add(\\n mul(\\n div(\\n // load the bytes from memory\\n mload(add(_postBytes, 0x20)),\\n // zero all bytes to the right\\n exp(0x100, sub(32, mlength))\\n ),\\n // and now shift left the number of bytes to\\n // leave space for the length in the slot\\n exp(0x100, sub(32, newlength))\\n ),\\n // increase length by the double of the memory\\n // bytes length\\n mul(mlength, 2)\\n )\\n )\\n )\\n }\\n case 1 {\\n // The stored value fits in the slot, but the combined value\\n // will exceed it.\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n // save new length\\n sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n // The contents of the _postBytes array start 32 bytes into\\n // the structure. Our first read should obtain the `submod`\\n // bytes that can fit into the unused space in the last word\\n // of the stored array. To get this, we read 32 bytes starting\\n // from `submod`, so the data we read overlaps with the array\\n // contents by `submod` bytes. Masking the lowest-order\\n // `submod` bytes allows us to add that value directly to the\\n // stored value.\\n\\n let submod := sub(32, slength)\\n let mc := add(_postBytes, submod)\\n let end := add(_postBytes, mlength)\\n let mask := sub(exp(0x100, submod), 1)\\n\\n sstore(\\n sc,\\n add(\\n and(\\n fslot,\\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00\\n ),\\n and(mload(mc), mask)\\n )\\n )\\n\\n for {\\n mc := add(mc, 0x20)\\n sc := add(sc, 1)\\n } lt(mc, end) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n sstore(sc, mload(mc))\\n }\\n\\n mask := exp(0x100, sub(mc, end))\\n\\n sstore(sc, mul(div(mload(mc), mask), mask))\\n }\\n default {\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n // Start copying to the last used word of the stored array.\\n let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n // save new length\\n sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n // Copy over the first `submod` bytes of the new data as in\\n // case 1 above.\\n let slengthmod := mod(slength, 32)\\n let mlengthmod := mod(mlength, 32)\\n let submod := sub(32, slengthmod)\\n let mc := add(_postBytes, submod)\\n let end := add(_postBytes, mlength)\\n let mask := sub(exp(0x100, submod), 1)\\n\\n sstore(sc, add(sload(sc), and(mload(mc), mask)))\\n\\n for {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } lt(mc, end) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n sstore(sc, mload(mc))\\n }\\n\\n mask := exp(0x100, sub(mc, end))\\n\\n sstore(sc, mul(div(mload(mc), mask), mask))\\n }\\n }\\n }\\n\\n function slice(bytes memory _bytes, uint _start, uint _length) internal pure returns (bytes memory res) {\\n if (_length == 0) {\\n return hex\\\"\\\";\\n }\\n uint _end = _start + _length;\\n require(_end > _start && _bytes.length >= _end, \\\"Slice out of bounds\\\");\\n\\n assembly {\\n // Alloc bytes array with additional 32 bytes afterspace and assign it's size\\n res := mload(0x40)\\n mstore(0x40, add(add(res, 64), _length))\\n mstore(res, _length)\\n\\n // Compute distance between source and destination pointers\\n let diff := sub(res, add(_bytes, _start))\\n\\n for {\\n let src := add(add(_bytes, 32), _start)\\n let end := add(src, _length)\\n } lt(src, end) {\\n src := add(src, 32)\\n } {\\n mstore(add(src, diff), mload(src))\\n }\\n }\\n }\\n\\n /// @notice Take a slice of the byte array, overwriting the destination.\\n /// The length of the slice will equal the length of the destination array.\\n /// @dev Make sure the destination array has afterspace if required.\\n /// @param _bytes The source array\\n /// @param _dest The destination array.\\n /// @param _start The location to start in the source array.\\n function sliceInPlace(\\n bytes memory _bytes,\\n bytes memory _dest,\\n uint _start\\n ) internal pure {\\n uint _length = _dest.length;\\n uint _end = _start + _length;\\n require(_end > _start && _bytes.length >= _end, \\\"Slice out of bounds\\\");\\n\\n assembly {\\n for {\\n let src := add(add(_bytes, 32), _start)\\n let res := add(_dest, 32)\\n let end := add(src, _length)\\n } lt(src, end) {\\n src := add(src, 32)\\n res := add(res, 32)\\n } {\\n mstore(res, mload(src))\\n }\\n }\\n }\\n\\n // Static slice functions, no bounds checking\\n /// @notice take a 32-byte slice from the specified position\\n function slice32(bytes memory _bytes, uint _start) internal pure returns (bytes32 res) {\\n assembly {\\n res := mload(add(add(_bytes, 32), _start))\\n }\\n }\\n\\n /// @notice take a 20-byte slice from the specified position\\n function slice20(bytes memory _bytes, uint _start) internal pure returns (bytes20) {\\n return bytes20(slice32(_bytes, _start));\\n }\\n\\n /// @notice take a 8-byte slice from the specified position\\n function slice8(bytes memory _bytes, uint _start) internal pure returns (bytes8) {\\n return bytes8(slice32(_bytes, _start));\\n }\\n\\n /// @notice take a 4-byte slice from the specified position\\n function slice4(bytes memory _bytes, uint _start) internal pure returns (bytes4) {\\n return bytes4(slice32(_bytes, _start));\\n }\\n\\n /// @notice take a 3-byte slice from the specified position\\n function slice3(bytes memory _bytes, uint _start) internal pure returns (bytes3) {\\n return bytes3(slice32(_bytes, _start));\\n }\\n\\n /// @notice take a 2-byte slice from the specified position\\n function slice2(bytes memory _bytes, uint _start) internal pure returns (bytes2) {\\n return bytes2(slice32(_bytes, _start));\\n }\\n\\n function toAddress(bytes memory _bytes, uint _start) internal pure returns (address) {\\n uint _totalLen = _start + 20;\\n require(_totalLen > _start && _bytes.length >= _totalLen, \\\"Address conversion out of bounds.\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toUint(bytes memory _bytes, uint _start) internal pure returns (uint256) {\\n uint _totalLen = _start + 32;\\n require(_totalLen > _start && _bytes.length >= _totalLen, \\\"Uint conversion out of bounds.\\\");\\n uint256 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x20), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) {\\n bool success = true;\\n\\n assembly {\\n let length := mload(_preBytes)\\n\\n // if lengths don't match the arrays are not equal\\n switch eq(length, mload(_postBytes))\\n case 1 {\\n // cb is a circuit breaker in the for loop since there's\\n // no said feature for inline assembly loops\\n // cb = 1 - don't breaker\\n // cb = 0 - break\\n let cb := 1\\n\\n let mc := add(_preBytes, 0x20)\\n let end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n // the next line is the loop condition:\\n // while(uint(mc < end) + cb == 2)\\n } eq(add(lt(mc, end), cb), 2) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // if any of these checks fails then arrays are not equal\\n if iszero(eq(mload(mc), mload(cc))) {\\n // unsuccess:\\n success := 0\\n cb := 0\\n }\\n }\\n }\\n default {\\n // unsuccess:\\n success := 0\\n }\\n }\\n\\n return success;\\n }\\n\\n function equalStorage(bytes storage _preBytes, bytes memory _postBytes) internal view returns (bool) {\\n bool success = true;\\n\\n assembly {\\n // we know _preBytes_offset is 0\\n let fslot := sload(_preBytes.slot)\\n // Decode the length of the stored array like in concatStorage().\\n let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\\n let mlength := mload(_postBytes)\\n\\n // if lengths don't match the arrays are not equal\\n switch eq(slength, mlength)\\n case 1 {\\n // slength can contain both the length and contents of the array\\n // if length < 32 bytes so let's prepare for that\\n // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n if iszero(iszero(slength)) {\\n switch lt(slength, 32)\\n case 1 {\\n // blank the last byte which is the length\\n fslot := mul(div(fslot, 0x100), 0x100)\\n\\n if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {\\n // unsuccess:\\n success := 0\\n }\\n }\\n default {\\n // cb is a circuit breaker in the for loop since there's\\n // no said feature for inline assembly loops\\n // cb = 1 - don't breaker\\n // cb = 0 - break\\n let cb := 1\\n\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n let sc := keccak256(0x0, 0x20)\\n\\n let mc := add(_postBytes, 0x20)\\n let end := add(mc, mlength)\\n\\n // the next line is the loop condition:\\n // while(uint(mc < end) + cb == 2)\\n for {} eq(add(lt(mc, end), cb), 2) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n if iszero(eq(sload(sc), mload(mc))) {\\n // unsuccess:\\n success := 0\\n cb := 0\\n }\\n }\\n }\\n }\\n }\\n default {\\n // unsuccess:\\n success := 0\\n }\\n }\\n\\n return success;\\n }\\n\\n function toBytes32(bytes memory _source) pure internal returns (bytes32 result) {\\n if (_source.length == 0) {\\n return 0x0;\\n }\\n\\n assembly {\\n result := mload(add(_source, 32))\\n }\\n }\\n\\n function keccak256Slice(bytes memory _bytes, uint _start, uint _length) pure internal returns (bytes32 result) {\\n uint _end = _start + _length;\\n require(_end > _start && _bytes.length >= _end, \\\"Slice out of bounds\\\");\\n\\n assembly {\\n result := keccak256(add(add(_bytes, 32), _start), _length)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x43e0f3b3b23c861bd031588bf410dfdd02e2af17941a89aa38d70e534e0380d1\"},\"@keep-network/bitcoin-spv-sol/contracts/SafeMath.sol\":{\"content\":\"pragma solidity ^0.8.4;\\n\\n/*\\nThe MIT License (MIT)\\n\\nCopyright (c) 2016 Smart Contract Solutions, Inc.\\n\\nPermission is hereby granted, free of charge, to any person obtaining\\na copy of this software and associated documentation files (the\\n\\\"Software\\\"), to deal in the Software without restriction, including\\nwithout limitation the rights to use, copy, modify, merge, publish,\\ndistribute, sublicense, and/or sell copies of the Software, and to\\npermit persons to whom the Software is furnished to do so, subject to\\nthe following conditions:\\n\\nThe above copyright notice and this permission notice shall be included\\nin all copies or substantial portions of the Software.\\n\\nTHE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\\n*/\\n\\n\\n/**\\n * @title SafeMath\\n * @dev Math operations with safety checks that throw on error\\n */\\nlibrary SafeMath {\\n\\n /**\\n * @dev Multiplies two numbers, throws on overflow.\\n */\\n function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {\\n // Gas optimization: this is cheaper than asserting 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\\n if (_a == 0) {\\n return 0;\\n }\\n\\n c = _a * _b;\\n require(c / _a == _b, \\\"Overflow during multiplication.\\\");\\n return c;\\n }\\n\\n /**\\n * @dev Integer division of two numbers, truncating the quotient.\\n */\\n function div(uint256 _a, uint256 _b) internal pure returns (uint256) {\\n // assert(_b > 0); // Solidity automatically throws when dividing by 0\\n // uint256 c = _a / _b;\\n // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold\\n return _a / _b;\\n }\\n\\n /**\\n * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).\\n */\\n function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {\\n require(_b <= _a, \\\"Underflow during subtraction.\\\");\\n return _a - _b;\\n }\\n\\n /**\\n * @dev Adds two numbers, throws on overflow.\\n */\\n function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {\\n c = _a + _b;\\n require(c >= _a, \\\"Overflow during addition.\\\");\\n return c;\\n }\\n}\\n\",\"keccak256\":\"0x35930d982394c7ffde439b82e5e696c5b21a6f09699d44861dfe409ef64084a3\"},\"@keep-network/bitcoin-spv-sol/contracts/ValidateSPV.sol\":{\"content\":\"pragma solidity ^0.8.4;\\n\\n/** @title ValidateSPV*/\\n/** @author Summa (https://summa.one) */\\n\\nimport {BytesLib} from \\\"./BytesLib.sol\\\";\\nimport {SafeMath} from \\\"./SafeMath.sol\\\";\\nimport {BTCUtils} from \\\"./BTCUtils.sol\\\";\\n\\n\\nlibrary ValidateSPV {\\n\\n using BTCUtils for bytes;\\n using BTCUtils for uint256;\\n using BytesLib for bytes;\\n using SafeMath for uint256;\\n\\n enum InputTypes { NONE, LEGACY, COMPATIBILITY, WITNESS }\\n enum OutputTypes { NONE, WPKH, WSH, OP_RETURN, PKH, SH, NONSTANDARD }\\n\\n uint256 constant ERR_BAD_LENGTH = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff;\\n uint256 constant ERR_INVALID_CHAIN = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe;\\n uint256 constant ERR_LOW_WORK = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd;\\n\\n function getErrBadLength() internal pure returns (uint256) {\\n return ERR_BAD_LENGTH;\\n }\\n\\n function getErrInvalidChain() internal pure returns (uint256) {\\n return ERR_INVALID_CHAIN;\\n }\\n\\n function getErrLowWork() internal pure returns (uint256) {\\n return ERR_LOW_WORK;\\n }\\n\\n /// @notice Validates a tx inclusion in the block\\n /// @dev `index` is not a reliable indicator of location within a block\\n /// @param _txid The txid (LE)\\n /// @param _merkleRoot The merkle root (as in the block header)\\n /// @param _intermediateNodes The proof's intermediate nodes (digests between leaf and root)\\n /// @param _index The leaf's index in the tree (0-indexed)\\n /// @return true if fully valid, false otherwise\\n function prove(\\n bytes32 _txid,\\n bytes32 _merkleRoot,\\n bytes memory _intermediateNodes,\\n uint _index\\n ) internal view returns (bool) {\\n // Shortcut the empty-block case\\n if (_txid == _merkleRoot && _index == 0 && _intermediateNodes.length == 0) {\\n return true;\\n }\\n\\n // If the Merkle proof failed, bubble up error\\n return BTCUtils.verifyHash256Merkle(\\n _txid,\\n _intermediateNodes,\\n _merkleRoot,\\n _index\\n );\\n }\\n\\n /// @notice Hashes transaction to get txid\\n /// @dev Supports Legacy and Witness\\n /// @param _version 4-bytes version\\n /// @param _vin Raw bytes length-prefixed input vector\\n /// @param _vout Raw bytes length-prefixed output vector\\n /// @param _locktime 4-byte tx locktime\\n /// @return 32-byte transaction id, little endian\\n function calculateTxId(\\n bytes4 _version,\\n bytes memory _vin,\\n bytes memory _vout,\\n bytes4 _locktime\\n ) internal view returns (bytes32) {\\n // Get transaction hash double-Sha256(version + nIns + inputs + nOuts + outputs + locktime)\\n return abi.encodePacked(_version, _vin, _vout, _locktime).hash256View();\\n }\\n\\n /// @notice Checks validity of header chain\\n /// @notice Compares the hash of each header to the prevHash in the next header\\n /// @param headers Raw byte array of header chain\\n /// @return totalDifficulty The total accumulated difficulty of the header chain, or an error code\\n function validateHeaderChain(\\n bytes memory headers\\n ) internal view returns (uint256 totalDifficulty) {\\n\\n // Check header chain length\\n if (headers.length % 80 != 0) {return ERR_BAD_LENGTH;}\\n\\n // Initialize header start index\\n bytes32 digest;\\n\\n totalDifficulty = 0;\\n\\n for (uint256 start = 0; start < headers.length; start += 80) {\\n\\n // After the first header, check that headers are in a chain\\n if (start != 0) {\\n if (!validateHeaderPrevHash(headers, start, digest)) {return ERR_INVALID_CHAIN;}\\n }\\n\\n // ith header target\\n uint256 target = headers.extractTargetAt(start);\\n\\n // Require that the header has sufficient work\\n digest = headers.hash256Slice(start, 80);\\n if(uint256(digest).reverseUint256() > target) {\\n return ERR_LOW_WORK;\\n }\\n\\n // Add ith header difficulty to difficulty sum\\n totalDifficulty = totalDifficulty + target.calculateDifficulty();\\n }\\n }\\n\\n /// @notice Checks validity of header work\\n /// @param digest Header digest\\n /// @param target The target threshold\\n /// @return true if header work is valid, false otherwise\\n function validateHeaderWork(\\n bytes32 digest,\\n uint256 target\\n ) internal pure returns (bool) {\\n if (digest == bytes32(0)) {return false;}\\n return (uint256(digest).reverseUint256() < target);\\n }\\n\\n /// @notice Checks validity of header chain\\n /// @dev Compares current header prevHash to previous header's digest\\n /// @param headers The raw bytes array containing the header\\n /// @param at The position of the header\\n /// @param prevHeaderDigest The previous header's digest\\n /// @return true if the connect is valid, false otherwise\\n function validateHeaderPrevHash(\\n bytes memory headers,\\n uint256 at,\\n bytes32 prevHeaderDigest\\n ) internal pure returns (bool) {\\n\\n // Extract prevHash of current header\\n bytes32 prevHash = headers.extractPrevBlockLEAt(at);\\n\\n // Compare prevHash of current header to previous header's digest\\n if (prevHash != prevHeaderDigest) {return false;}\\n\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0xce3febbf3ad3a7ff8a8effd0c7ccaf7ccfa2719578b537d49ea196f0bae8062b\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/bridge/IRelay.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\n\\n// \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\n// \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\n// \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n\\npragma solidity 0.8.17;\\n\\n/// @title Interface for the Bitcoin relay\\n/// @notice Contains only the methods needed by tBTC v2. The Bitcoin relay\\n/// provides the difficulty of the previous and current epoch. One\\n/// difficulty epoch spans 2016 blocks.\\ninterface IRelay {\\n /// @notice Returns the difficulty of the current epoch.\\n function getCurrentEpochDifficulty() external view returns (uint256);\\n\\n /// @notice Returns the difficulty of the previous epoch.\\n function getPrevEpochDifficulty() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0xf70c723fc0a1824d92061b5dc76c65c38c22eff6b18ef6a2057f511183ce3c5b\",\"license\":\"GPL-3.0-only\"},\"contracts/relay/LightRelay.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\n\\n// \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\n// \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\n// \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n\\npragma solidity 0.8.17;\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport {BytesLib} from \\\"@keep-network/bitcoin-spv-sol/contracts/BytesLib.sol\\\";\\nimport {BTCUtils} from \\\"@keep-network/bitcoin-spv-sol/contracts/BTCUtils.sol\\\";\\nimport {ValidateSPV} from \\\"@keep-network/bitcoin-spv-sol/contracts/ValidateSPV.sol\\\";\\n\\nimport \\\"../bridge/IRelay.sol\\\";\\n\\nstruct Epoch {\\n uint32 timestamp;\\n // By definition, bitcoin targets have at least 32 leading zero bits.\\n // Thus we can only store the bits that aren't guaranteed to be 0.\\n uint224 target;\\n}\\n\\ninterface ILightRelay is IRelay {\\n event Genesis(uint256 blockHeight);\\n event Retarget(uint256 oldDifficulty, uint256 newDifficulty);\\n event ProofLengthChanged(uint256 newLength);\\n event AuthorizationRequirementChanged(bool newStatus);\\n event SubmitterAuthorized(address submitter);\\n event SubmitterDeauthorized(address submitter);\\n\\n function retarget(bytes memory headers) external;\\n\\n function validateChain(bytes memory headers)\\n external\\n view\\n returns (uint256 startingHeaderTimestamp, uint256 headerCount);\\n\\n function getBlockDifficulty(uint256 blockNumber)\\n external\\n view\\n returns (uint256);\\n\\n function getEpochDifficulty(uint256 epochNumber)\\n external\\n view\\n returns (uint256);\\n\\n function getRelayRange()\\n external\\n view\\n returns (uint256 relayGenesis, uint256 currentEpochEnd);\\n}\\n\\nlibrary RelayUtils {\\n using BytesLib for bytes;\\n\\n /// @notice Extract the timestamp of the header at the given position.\\n /// @param headers Byte array containing the header of interest.\\n /// @param at The start of the header in the array.\\n /// @return The timestamp of the header.\\n /// @dev Assumes that the specified position contains a valid header.\\n /// Performs no validation whatsoever.\\n function extractTimestampAt(bytes memory headers, uint256 at)\\n internal\\n pure\\n returns (uint32)\\n {\\n return BTCUtils.reverseUint32(uint32(headers.slice4(68 + at)));\\n }\\n}\\n\\n/// @dev THE RELAY MUST NOT BE USED BEFORE GENESIS AND AT LEAST ONE RETARGET.\\ncontract LightRelay is Ownable, ILightRelay {\\n using BytesLib for bytes;\\n using BTCUtils for bytes;\\n using ValidateSPV for bytes;\\n using RelayUtils for bytes;\\n\\n bool public ready;\\n // Whether the relay requires the address submitting a retarget to be\\n // authorised in advance by governance.\\n bool public authorizationRequired;\\n // Number of blocks required for each side of a retarget proof:\\n // a retarget must provide `proofLength` blocks before the retarget\\n // and `proofLength` blocks after it.\\n // Governable\\n // Should be set to a fairly high number (e.g. 20-50) in production.\\n uint64 public proofLength;\\n // The number of the first epoch recorded by the relay.\\n // This should equal the height of the block starting the genesis epoch,\\n // divided by 2016, but this is not enforced as the relay has no\\n // information about block numbers.\\n uint64 public genesisEpoch;\\n // The number of the latest epoch whose difficulty is proven to the relay.\\n // If the genesis epoch's number is set correctly, and retargets along the\\n // way have been legitimate, this equals the height of the block starting\\n // the most recent epoch, divided by 2016.\\n uint64 public currentEpoch;\\n\\n uint256 internal currentEpochDifficulty;\\n uint256 internal prevEpochDifficulty;\\n\\n // Each epoch from genesis to the current one, keyed by their numbers.\\n mapping(uint256 => Epoch) internal epochs;\\n\\n mapping(address => bool) public isAuthorized;\\n\\n modifier relayActive() {\\n require(ready, \\\"Relay is not ready for use\\\");\\n _;\\n }\\n\\n /// @notice Establish a starting point for the relay by providing the\\n /// target, timestamp and blockheight of the first block of the relay\\n /// genesis epoch.\\n /// @param genesisHeader The first block header of the genesis epoch.\\n /// @param genesisHeight The block number of the first block of the epoch.\\n /// @param genesisProofLength The number of blocks required to accept a\\n /// proof.\\n /// @dev If the relay is used by querying the current and previous epoch\\n /// difficulty, at least one retarget needs to be provided after genesis;\\n /// otherwise the prevEpochDifficulty will be uninitialised and zero.\\n function genesis(\\n bytes calldata genesisHeader,\\n uint256 genesisHeight,\\n uint64 genesisProofLength\\n ) external onlyOwner {\\n require(!ready, \\\"Genesis already performed\\\");\\n\\n require(genesisHeader.length == 80, \\\"Invalid genesis header length\\\");\\n\\n require(\\n genesisHeight % 2016 == 0,\\n \\\"Invalid height of relay genesis block\\\"\\n );\\n\\n require(genesisProofLength < 2016, \\\"Proof length excessive\\\");\\n require(genesisProofLength > 0, \\\"Proof length may not be zero\\\");\\n\\n genesisEpoch = uint64(genesisHeight / 2016);\\n currentEpoch = genesisEpoch;\\n uint256 genesisTarget = genesisHeader.extractTarget();\\n uint256 genesisTimestamp = genesisHeader.extractTimestamp();\\n epochs[genesisEpoch] = Epoch(\\n uint32(genesisTimestamp),\\n uint224(genesisTarget)\\n );\\n proofLength = genesisProofLength;\\n currentEpochDifficulty = BTCUtils.calculateDifficulty(genesisTarget);\\n ready = true;\\n\\n emit Genesis(genesisHeight);\\n }\\n\\n /// @notice Set the number of blocks required to accept a header chain.\\n /// @param newLength The required number of blocks. Must be less than 2016.\\n /// @dev For production, a high number (e.g. 20-50) is recommended.\\n /// Small numbers are accepted but should only be used for testing.\\n function setProofLength(uint64 newLength) external relayActive onlyOwner {\\n require(newLength < 2016, \\\"Proof length excessive\\\");\\n require(newLength > 0, \\\"Proof length may not be zero\\\");\\n require(newLength != proofLength, \\\"Proof length unchanged\\\");\\n proofLength = newLength;\\n emit ProofLengthChanged(newLength);\\n }\\n\\n /// @notice Set whether the relay requires retarget submitters to be\\n /// pre-authorised by governance.\\n /// @param status True if authorisation is to be required, false if not.\\n function setAuthorizationStatus(bool status) external onlyOwner {\\n authorizationRequired = status;\\n emit AuthorizationRequirementChanged(status);\\n }\\n\\n /// @notice Authorise the given address to submit retarget proofs.\\n /// @param submitter The address to be authorised.\\n function authorize(address submitter) external onlyOwner {\\n isAuthorized[submitter] = true;\\n emit SubmitterAuthorized(submitter);\\n }\\n\\n /// @notice Rescind the authorisation of the submitter to retarget.\\n /// @param submitter The address to be deauthorised.\\n function deauthorize(address submitter) external onlyOwner {\\n isAuthorized[submitter] = false;\\n emit SubmitterDeauthorized(submitter);\\n }\\n\\n /// @notice Add a new epoch to the relay by providing a proof\\n /// of the difficulty before and after the retarget.\\n /// @param headers A chain of headers including the last X blocks before\\n /// the retarget, followed by the first X blocks after the retarget,\\n /// where X equals the current proof length.\\n /// @dev Checks that the first X blocks are valid in the most recent epoch,\\n /// that the difficulty of the new epoch is calculated correctly according\\n /// to the block timestamps, and that the next X blocks would be valid in\\n /// the new epoch.\\n /// We have no information of block heights, so we cannot enforce that\\n /// retargets only happen every 2016 blocks; instead, we assume that this\\n /// is the case if a valid proof of work is provided.\\n /// It is possible to cheat the relay by providing X blocks from earlier in\\n /// the most recent epoch, and then mining X new blocks after them.\\n /// However, each of these malicious blocks would have to be mined to a\\n /// higher difficulty than the legitimate ones.\\n /// Alternatively, if the retarget has not been performed yet, one could\\n /// first mine X blocks in the old difficulty with timestamps set far in\\n /// the future, and then another X blocks at a greatly reduced difficulty.\\n /// In either case, cheating the realy requires more work than mining X\\n /// legitimate blocks.\\n /// Only the most recent epoch is vulnerable to these attacks; once a\\n /// retarget has been proven to the relay, the epoch is immutable even if a\\n /// contradictory proof were to be presented later.\\n function retarget(bytes memory headers) external relayActive {\\n if (authorizationRequired) {\\n require(isAuthorized[msg.sender], \\\"Submitter unauthorized\\\");\\n }\\n\\n require(\\n // Require proofLength headers on both sides of the retarget\\n headers.length == (proofLength * 2 * 80),\\n \\\"Invalid header length\\\"\\n );\\n\\n Epoch storage latest = epochs[currentEpoch];\\n\\n uint256 oldTarget = latest.target;\\n\\n bytes32 previousHeaderDigest = bytes32(0);\\n\\n // Validate old chain\\n for (uint256 i = 0; i < proofLength; i++) {\\n (\\n bytes32 currentDigest,\\n uint256 currentHeaderTarget\\n ) = validateHeader(headers, i * 80, previousHeaderDigest);\\n\\n require(\\n currentHeaderTarget == oldTarget,\\n \\\"Invalid target in pre-retarget headers\\\"\\n );\\n\\n previousHeaderDigest = currentDigest;\\n }\\n\\n // get timestamp of retarget block\\n uint256 epochEndTimestamp = headers.extractTimestampAt(\\n (proofLength - 1) * 80\\n );\\n\\n // An attacker could produce blocks with timestamps in the future,\\n // in an attempt to reduce the difficulty after the retarget\\n // to make mining the second part of the retarget proof easier.\\n // In particular, the attacker could reuse all but one block\\n // from the legitimate chain, and only mine the last block.\\n // To hinder this, require that the epoch end timestamp does not\\n // exceed the ethereum timestamp.\\n // NOTE: both are unix seconds, so this comparison should be valid.\\n require(\\n /* solhint-disable-next-line not-rely-on-time */\\n epochEndTimestamp < block.timestamp,\\n \\\"Epoch cannot end in the future\\\"\\n );\\n\\n // Expected target is the full-length target\\n uint256 expectedTarget = BTCUtils.retargetAlgorithm(\\n oldTarget,\\n latest.timestamp,\\n epochEndTimestamp\\n );\\n\\n // Mined target is the header-encoded target\\n uint256 minedTarget = 0;\\n\\n uint256 epochStartTimestamp = headers.extractTimestampAt(\\n proofLength * 80\\n );\\n\\n // validate new chain\\n for (uint256 j = proofLength; j < proofLength * 2; j++) {\\n (\\n bytes32 _currentDigest,\\n uint256 _currentHeaderTarget\\n ) = validateHeader(headers, j * 80, previousHeaderDigest);\\n\\n if (minedTarget == 0) {\\n // The new target has not been set, so check its correctness\\n minedTarget = _currentHeaderTarget;\\n require(\\n // Although the target is a 256-bit number, there are only 32 bits of\\n // space in the Bitcoin header. Because of that, the version stored in\\n // the header is a less-precise representation of the actual target\\n // using base-256 version of scientific notation.\\n //\\n // The 256-bit unsigned integer returned from BTCUtils.retargetAlgorithm\\n // is the precise target value.\\n // The 256-bit unsigned integer returned from validateHeader is the less\\n // precise target value because it was read from 32 bits of space of\\n // Bitcoin block header.\\n //\\n // We can't compare the precise and less precise representations together\\n // so we first mask them to obtain the less precise version:\\n // (full & truncated) == truncated\\n _currentHeaderTarget ==\\n (expectedTarget & _currentHeaderTarget),\\n \\\"Invalid target in new epoch\\\"\\n );\\n } else {\\n // The new target has been set, so remaining targets should match.\\n require(\\n _currentHeaderTarget == minedTarget,\\n \\\"Unexpected target change after retarget\\\"\\n );\\n }\\n\\n previousHeaderDigest = _currentDigest;\\n }\\n\\n currentEpoch = currentEpoch + 1;\\n\\n epochs[currentEpoch] = Epoch(\\n uint32(epochStartTimestamp),\\n uint224(minedTarget)\\n );\\n\\n uint256 oldDifficulty = currentEpochDifficulty;\\n uint256 newDifficulty = BTCUtils.calculateDifficulty(minedTarget);\\n\\n prevEpochDifficulty = oldDifficulty;\\n currentEpochDifficulty = newDifficulty;\\n\\n emit Retarget(oldDifficulty, newDifficulty);\\n }\\n\\n /// @notice Check whether a given chain of headers should be accepted as\\n /// valid within the rules of the relay.\\n /// If the validation fails, this function throws an exception.\\n /// @param headers A chain of 2 to 2015 bitcoin headers.\\n /// @return startingHeaderTimestamp The timestamp of the first header.\\n /// @return headerCount The number of headers.\\n /// @dev A chain of headers is accepted as valid if:\\n /// - Its length is between 2 and 2015 headers.\\n /// - Headers in the chain are sequential and refer to previous digests.\\n /// - Each header is mined with the correct amount of work.\\n /// - The difficulty in each header matches an epoch of the relay,\\n /// as determined by the headers' timestamps. The headers must be between\\n /// the genesis epoch and the latest proven epoch (inclusive).\\n /// If the chain contains a retarget, it is accepted if the retarget has\\n /// already been proven to the relay.\\n /// If the chain contains blocks of an epoch that has not been proven to\\n /// the relay (after a retarget within the header chain, or when the entire\\n /// chain falls within an epoch that has not been proven yet), it will be\\n /// rejected.\\n /// One exception to this is when two subsequent epochs have exactly the\\n /// same difficulty; headers from the latter epoch will be accepted if the\\n /// previous epoch has been proven to the relay.\\n /// This is because it is not possible to distinguish such headers from\\n /// headers of the previous epoch.\\n ///\\n /// If the difficulty increases significantly between relay genesis and the\\n /// present, creating fraudulent proofs for earlier epochs becomes easier.\\n /// Users of the relay should check the timestamps of valid headers and\\n /// only accept appropriately recent ones.\\n function validateChain(bytes memory headers)\\n external\\n view\\n returns (uint256 startingHeaderTimestamp, uint256 headerCount)\\n {\\n require(headers.length % 80 == 0, \\\"Invalid header length\\\");\\n\\n headerCount = headers.length / 80;\\n\\n require(\\n headerCount > 1 && headerCount < 2016,\\n \\\"Invalid number of headers\\\"\\n );\\n\\n startingHeaderTimestamp = headers.extractTimestamp();\\n\\n // Short-circuit the first header's validation.\\n // We validate the header here to get the target which is needed to\\n // precisely identify the epoch.\\n (\\n bytes32 previousHeaderDigest,\\n uint256 currentHeaderTarget\\n ) = validateHeader(headers, 0, bytes32(0));\\n\\n Epoch memory nullEpoch = Epoch(0, 0);\\n\\n uint256 startingEpochNumber = currentEpoch;\\n Epoch memory startingEpoch = epochs[startingEpochNumber];\\n Epoch memory nextEpoch = nullEpoch;\\n\\n // Find the correct epoch for the given chain\\n // Fastest with recent epochs, but able to handle anything after genesis\\n //\\n // The rules for bitcoin timestamps are:\\n // - must be greater than the median of the last 11 blocks' timestamps\\n // - must be less than the network-adjusted time +2 hours\\n //\\n // Because of this, the timestamp of a header may be smaller than the\\n // starting time, or greater than the ending time of its epoch.\\n // However, a valid timestamp is guaranteed to fall within the window\\n // formed by the epochs immediately before and after its timestamp.\\n // We can identify cases like these by comparing the targets.\\n while (startingHeaderTimestamp < startingEpoch.timestamp) {\\n startingEpochNumber -= 1;\\n nextEpoch = startingEpoch;\\n startingEpoch = epochs[startingEpochNumber];\\n }\\n\\n // We have identified the centre of the window,\\n // by reaching the most recent epoch whose starting timestamp\\n // or reached before the genesis where epoch slots are empty.\\n // Therefore check that the timestamp is nonzero.\\n require(\\n startingEpoch.timestamp > 0,\\n \\\"Cannot validate chains before relay genesis\\\"\\n );\\n\\n // The targets don't match. This could be because the block is invalid,\\n // or it could be because of timestamp inaccuracy.\\n // To cover the latter case, check adjacent epochs.\\n if (currentHeaderTarget != startingEpoch.target) {\\n // The target matches the next epoch.\\n // This means we are right at the beginning of the next epoch,\\n // and retargets during the chain should not be possible.\\n if (currentHeaderTarget == nextEpoch.target) {\\n startingEpoch = nextEpoch;\\n nextEpoch = nullEpoch;\\n }\\n // The target doesn't match the next epoch.\\n // Therefore the only valid epoch is the previous one.\\n // Because the timestamp can't be more than 2 hours into the future\\n // we must be right near the end of the epoch,\\n // so a retarget is possible.\\n else {\\n startingEpochNumber -= 1;\\n nextEpoch = startingEpoch;\\n startingEpoch = epochs[startingEpochNumber];\\n\\n // We have failed to find a match,\\n // therefore the target has to be invalid.\\n require(\\n currentHeaderTarget == startingEpoch.target,\\n \\\"Invalid target in header chain\\\"\\n );\\n }\\n }\\n\\n // We've found the correct epoch for the first header.\\n // Validate the rest.\\n for (uint256 i = 1; i < headerCount; i++) {\\n bytes32 currentDigest;\\n (currentDigest, currentHeaderTarget) = validateHeader(\\n headers,\\n i * 80,\\n previousHeaderDigest\\n );\\n\\n // If the header's target does not match the expected target,\\n // check if a retarget is possible.\\n //\\n // If next epoch timestamp exists, a valid retarget is possible\\n // (if next epoch timestamp doesn't exist, either a retarget has\\n // already happened in this chain, the relay needs a retarget\\n // before this chain can be validated, or a retarget is not allowed\\n // because we know the headers are within a timestamp irregularity\\n // of the previous retarget).\\n //\\n // In this case the target must match the next epoch's target,\\n // and the header's timestamp must match the epoch's start.\\n if (currentHeaderTarget != startingEpoch.target) {\\n uint256 currentHeaderTimestamp = headers.extractTimestampAt(\\n i * 80\\n );\\n\\n require(\\n nextEpoch.timestamp != 0 &&\\n currentHeaderTarget == nextEpoch.target &&\\n currentHeaderTimestamp == nextEpoch.timestamp,\\n \\\"Invalid target in header chain\\\"\\n );\\n\\n startingEpoch = nextEpoch;\\n nextEpoch = nullEpoch;\\n }\\n\\n previousHeaderDigest = currentDigest;\\n }\\n\\n return (startingHeaderTimestamp, headerCount);\\n }\\n\\n /// @notice Get the difficulty of the specified block.\\n /// @param blockNumber The number of the block. Must fall within the relay\\n /// range (at or after the relay genesis, and at or before the end of the\\n /// most recent epoch proven to the relay).\\n /// @return The difficulty of the epoch.\\n function getBlockDifficulty(uint256 blockNumber)\\n external\\n view\\n returns (uint256)\\n {\\n return getEpochDifficulty(blockNumber / 2016);\\n }\\n\\n /// @notice Get the range of blocks the relay can accept proofs for.\\n /// @dev Assumes that the genesis has been set correctly.\\n /// Additionally, if the next epoch after the current one has the exact\\n /// same difficulty, headers for it can be validated as well.\\n /// This function should be used for informative purposes,\\n /// e.g. to determine whether a retarget must be provided before submitting\\n /// a header chain for validation.\\n /// @return relayGenesis The height of the earliest block that can be\\n /// included in header chains for the relay to validate.\\n /// @return currentEpochEnd The height of the last block that can be\\n /// included in header chains for the relay to validate.\\n function getRelayRange()\\n external\\n view\\n returns (uint256 relayGenesis, uint256 currentEpochEnd)\\n {\\n relayGenesis = genesisEpoch * 2016;\\n currentEpochEnd = (currentEpoch * 2016) + 2015;\\n }\\n\\n /// @notice Returns the difficulty of the current epoch.\\n /// @dev returns 0 if the relay is not ready.\\n /// @return The difficulty of the current epoch.\\n function getCurrentEpochDifficulty()\\n external\\n view\\n virtual\\n returns (uint256)\\n {\\n return currentEpochDifficulty;\\n }\\n\\n /// @notice Returns the difficulty of the previous epoch.\\n /// @dev Returns 0 if the relay is not ready or has not had a retarget.\\n /// @return The difficulty of the previous epoch.\\n function getPrevEpochDifficulty() external view virtual returns (uint256) {\\n return prevEpochDifficulty;\\n }\\n\\n function getCurrentAndPrevEpochDifficulty()\\n external\\n view\\n returns (uint256 current, uint256 previous)\\n {\\n return (currentEpochDifficulty, prevEpochDifficulty);\\n }\\n\\n /// @notice Get the difficulty of the specified epoch.\\n /// @param epochNumber The number of the epoch (the height of the first\\n /// block of the epoch, divided by 2016). Must fall within the relay range.\\n /// @return The difficulty of the epoch.\\n function getEpochDifficulty(uint256 epochNumber)\\n public\\n view\\n returns (uint256)\\n {\\n require(epochNumber >= genesisEpoch, \\\"Epoch is before relay genesis\\\");\\n require(\\n epochNumber <= currentEpoch,\\n \\\"Epoch is not proven to the relay yet\\\"\\n );\\n return BTCUtils.calculateDifficulty(epochs[epochNumber].target);\\n }\\n\\n /// @notice Check that the specified header forms a correct chain with the\\n /// digest of the previous header (if provided), and has sufficient work.\\n /// @param headers The byte array containing the header of interest.\\n /// @param start The start of the header in the array.\\n /// @param prevDigest The digest of the previous header\\n /// (optional; providing zeros for the digest skips the check).\\n /// @return digest The digest of the current header.\\n /// @return target The PoW target of the header.\\n /// @dev Throws an exception if the header's chain or PoW are invalid.\\n /// Performs no other validation.\\n function validateHeader(\\n bytes memory headers,\\n uint256 start,\\n bytes32 prevDigest\\n ) internal view returns (bytes32 digest, uint256 target) {\\n // If previous block digest has been provided, require that it matches\\n if (prevDigest != bytes32(0)) {\\n require(\\n headers.validateHeaderPrevHash(start, prevDigest),\\n \\\"Invalid chain\\\"\\n );\\n }\\n\\n // Require that the header has sufficient work for its stated target\\n target = headers.extractTargetAt(start);\\n digest = headers.hash256Slice(start, 80);\\n require(ValidateSPV.validateHeaderWork(digest, target), \\\"Invalid work\\\");\\n\\n return (digest, target);\\n }\\n}\\n\",\"keccak256\":\"0x5329ba57ec3db13128ba0a90569682b16211f7fbc3fbab764fd0cd60386a7441\",\"license\":\"GPL-3.0-only\"},\"contracts/test/GoerliLightRelay.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\n\\n// \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\n// \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\n// \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n\\npragma solidity 0.8.17;\\n\\nimport \\\"../relay/LightRelay.sol\\\";\\n\\n/// @title Goerli Light Relay\\n/// @notice GoerliLightRelay is a stub version of LightRelay intended to be\\n/// used on the Goerli test network. It always returns `1` as the current\\n/// and previous difficulties making it possible to bypass validation of\\n/// difficulties of Bitcoin testnet blocks. Since difficulty in Bitcoin\\n/// testnet often falls to `1` it would not be possible to validate\\n/// blocks with the real LightRelay.\\n/// @dev Since the returned difficulties are fixed and impossible to be modified\\n/// with any setters, it is safe to use GoerliLightRelay without risking\\n/// somebody may change the difficulties and block the test network.\\n/// Notice that GoerliLightRelay is derived from LightRelay so that the two\\n/// contracts have the same API and correct bindings can be generated.\\ncontract GoerliLightRelay is LightRelay {\\n /// @notice Returns `1` as the difficulty of the previous epoch.\\n function getPrevEpochDifficulty() external view override returns (uint256) {\\n return 1;\\n }\\n\\n /// @notice Returns `1` as the difficulty of the current epoch.\\n function getCurrentEpochDifficulty()\\n external\\n view\\n override\\n returns (uint256)\\n {\\n return 1;\\n }\\n}\\n\",\"keccak256\":\"0xfc3602faa6659b1ff1c163416d3b553b528f159fa570702aab44a63fad98533e\",\"license\":\"GPL-3.0-only\"}},\"version\":1}",
|
|
11824
|
+
"metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"newStatus\",\"type\":\"bool\"}],\"name\":\"AuthorizationRequirementChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"blockHeight\",\"type\":\"uint256\"}],\"name\":\"Genesis\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newLength\",\"type\":\"uint256\"}],\"name\":\"ProofLengthChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldDifficulty\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newDifficulty\",\"type\":\"uint256\"}],\"name\":\"Retarget\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"submitter\",\"type\":\"address\"}],\"name\":\"SubmitterAuthorized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"submitter\",\"type\":\"address\"}],\"name\":\"SubmitterDeauthorized\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"authorizationRequired\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"submitter\",\"type\":\"address\"}],\"name\":\"authorize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentEpoch\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"submitter\",\"type\":\"address\"}],\"name\":\"deauthorize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"genesisHeader\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"genesisHeight\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"genesisProofLength\",\"type\":\"uint64\"}],\"name\":\"genesis\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"genesisEpoch\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getBlockDifficulty\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentAndPrevEpochDifficulty\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"current\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"previous\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentEpochDifficulty\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"epochNumber\",\"type\":\"uint256\"}],\"name\":\"getEpochDifficulty\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPrevEpochDifficulty\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRelayRange\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"relayGenesis\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"currentEpochEnd\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isAuthorized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proofLength\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ready\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"headers\",\"type\":\"bytes\"}],\"name\":\"retarget\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"}],\"name\":\"setAuthorizationStatus\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"bitcoinHeaders\",\"type\":\"bytes\"}],\"name\":\"setDifficultyFromHeaders\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"newLength\",\"type\":\"uint64\"}],\"name\":\"setProofLength\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"headers\",\"type\":\"bytes\"}],\"name\":\"validateChain\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"startingHeaderTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"headerCount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Notice that GoerliLightRelay is derived from LightRelay so that the two contracts have the same API and correct bindings can be generated.\",\"kind\":\"dev\",\"methods\":{\"authorize(address)\":{\"params\":{\"submitter\":\"The address to be authorised.\"}},\"deauthorize(address)\":{\"params\":{\"submitter\":\"The address to be deauthorised.\"}},\"genesis(bytes,uint256,uint64)\":{\"details\":\"If the relay is used by querying the current and previous epoch difficulty, at least one retarget needs to be provided after genesis; otherwise the prevEpochDifficulty will be uninitialised and zero.\",\"params\":{\"genesisHeader\":\"The first block header of the genesis epoch.\",\"genesisHeight\":\"The block number of the first block of the epoch.\",\"genesisProofLength\":\"The number of blocks required to accept a proof.\"}},\"getBlockDifficulty(uint256)\":{\"params\":{\"blockNumber\":\"The number of the block. Must fall within the relay range (at or after the relay genesis, and at or before the end of the most recent epoch proven to the relay).\"},\"returns\":{\"_0\":\"The difficulty of the epoch.\"}},\"getCurrentEpochDifficulty()\":{\"details\":\"returns 0 if the relay is not ready.\",\"returns\":{\"_0\":\"The difficulty of the current epoch.\"}},\"getEpochDifficulty(uint256)\":{\"params\":{\"epochNumber\":\"The number of the epoch (the height of the first block of the epoch, divided by 2016). Must fall within the relay range.\"},\"returns\":{\"_0\":\"The difficulty of the epoch.\"}},\"getPrevEpochDifficulty()\":{\"details\":\"Returns 0 if the relay is not ready or has not had a retarget.\",\"returns\":{\"_0\":\"The difficulty of the previous epoch.\"}},\"getRelayRange()\":{\"details\":\"Assumes that the genesis has been set correctly. Additionally, if the next epoch after the current one has the exact same difficulty, headers for it can be validated as well. This function should be used for informative purposes, e.g. to determine whether a retarget must be provided before submitting a header chain for validation.\",\"returns\":{\"currentEpochEnd\":\"The height of the last block that can be included in header chains for the relay to validate.\",\"relayGenesis\":\"The height of the earliest block that can be included in header chains for the relay to validate.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"retarget(bytes)\":{\"details\":\"Checks that the first X blocks are valid in the most recent epoch, that the difficulty of the new epoch is calculated correctly according to the block timestamps, and that the next X blocks would be valid in the new epoch. We have no information of block heights, so we cannot enforce that retargets only happen every 2016 blocks; instead, we assume that this is the case if a valid proof of work is provided. It is possible to cheat the relay by providing X blocks from earlier in the most recent epoch, and then mining X new blocks after them. However, each of these malicious blocks would have to be mined to a higher difficulty than the legitimate ones. Alternatively, if the retarget has not been performed yet, one could first mine X blocks in the old difficulty with timestamps set far in the future, and then another X blocks at a greatly reduced difficulty. In either case, cheating the realy requires more work than mining X legitimate blocks. Only the most recent epoch is vulnerable to these attacks; once a retarget has been proven to the relay, the epoch is immutable even if a contradictory proof were to be presented later.\",\"params\":{\"headers\":\"A chain of headers including the last X blocks before the retarget, followed by the first X blocks after the retarget, where X equals the current proof length.\"}},\"setAuthorizationStatus(bool)\":{\"params\":{\"status\":\"True if authorisation is to be required, false if not.\"}},\"setProofLength(uint64)\":{\"details\":\"For production, a high number (e.g. 20-50) is recommended. Small numbers are accepted but should only be used for testing.\",\"params\":{\"newLength\":\"The required number of blocks. Must be less than 2016.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"validateChain(bytes)\":{\"details\":\"A chain of headers is accepted as valid if: - Its length is between 2 and 2015 headers. - Headers in the chain are sequential and refer to previous digests. - Each header is mined with the correct amount of work. - The difficulty in each header matches an epoch of the relay, as determined by the headers' timestamps. The headers must be between the genesis epoch and the latest proven epoch (inclusive). If the chain contains a retarget, it is accepted if the retarget has already been proven to the relay. If the chain contains blocks of an epoch that has not been proven to the relay (after a retarget within the header chain, or when the entire chain falls within an epoch that has not been proven yet), it will be rejected. One exception to this is when two subsequent epochs have exactly the same difficulty; headers from the latter epoch will be accepted if the previous epoch has been proven to the relay. This is because it is not possible to distinguish such headers from headers of the previous epoch. If the difficulty increases significantly between relay genesis and the present, creating fraudulent proofs for earlier epochs becomes easier. Users of the relay should check the timestamps of valid headers and only accept appropriately recent ones.\",\"params\":{\"headers\":\"A chain of 2 to 2015 bitcoin headers.\"},\"returns\":{\"headerCount\":\"The number of headers.\",\"startingHeaderTimestamp\":\"The timestamp of the first header.\"}}},\"title\":\"Goerli Light Relay\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"authorize(address)\":{\"notice\":\"Authorise the given address to submit retarget proofs.\"},\"deauthorize(address)\":{\"notice\":\"Rescind the authorisation of the submitter to retarget.\"},\"genesis(bytes,uint256,uint64)\":{\"notice\":\"Establish a starting point for the relay by providing the target, timestamp and blockheight of the first block of the relay genesis epoch.\"},\"getBlockDifficulty(uint256)\":{\"notice\":\"Get the difficulty of the specified block.\"},\"getCurrentEpochDifficulty()\":{\"notice\":\"Returns the difficulty of the current epoch.\"},\"getEpochDifficulty(uint256)\":{\"notice\":\"Get the difficulty of the specified epoch.\"},\"getPrevEpochDifficulty()\":{\"notice\":\"Returns the difficulty of the previous epoch.\"},\"getRelayRange()\":{\"notice\":\"Get the range of blocks the relay can accept proofs for.\"},\"retarget(bytes)\":{\"notice\":\"Add a new epoch to the relay by providing a proof of the difficulty before and after the retarget.\"},\"setAuthorizationStatus(bool)\":{\"notice\":\"Set whether the relay requires retarget submitters to be pre-authorised by governance.\"},\"setDifficultyFromHeaders(bytes)\":{\"notice\":\"Sets the current and previous difficulty based on the difficulty inferred from the provided Bitcoin headers.\"},\"setProofLength(uint64)\":{\"notice\":\"Set the number of blocks required to accept a header chain.\"},\"validateChain(bytes)\":{\"notice\":\"Check whether a given chain of headers should be accepted as valid within the rules of the relay. If the validation fails, this function throws an exception.\"}},\"notice\":\"GoerliLightRelay is a stub version of LightRelay intended to be used on the Goerli test network. It allows to set the relay's difficulty based on arbitrary Bitcoin headers thus effectively bypass the validation of difficulties of Bitcoin testnet blocks. Since difficulty in Bitcoin testnet often falls to `1` it would not be possible to validate blocks with the real LightRelay.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/test/GoerliLightRelay.sol\":\"GoerliLightRelay\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1000},\"remappings\":[]},\"sources\":{\"@keep-network/bitcoin-spv-sol/contracts/BTCUtils.sol\":{\"content\":\"pragma solidity ^0.8.4;\\n\\n/** @title BitcoinSPV */\\n/** @author Summa (https://summa.one) */\\n\\nimport {BytesLib} from \\\"./BytesLib.sol\\\";\\nimport {SafeMath} from \\\"./SafeMath.sol\\\";\\n\\nlibrary BTCUtils {\\n using BytesLib for bytes;\\n using SafeMath for uint256;\\n\\n // The target at minimum Difficulty. Also the target of the genesis block\\n uint256 public constant DIFF1_TARGET = 0xffff0000000000000000000000000000000000000000000000000000;\\n\\n uint256 public constant RETARGET_PERIOD = 2 * 7 * 24 * 60 * 60; // 2 weeks in seconds\\n uint256 public constant RETARGET_PERIOD_BLOCKS = 2016; // 2 weeks in blocks\\n\\n uint256 public constant ERR_BAD_ARG = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff;\\n\\n /* ***** */\\n /* UTILS */\\n /* ***** */\\n\\n /// @notice Determines the length of a VarInt in bytes\\n /// @dev A VarInt of >1 byte is prefixed with a flag indicating its length\\n /// @param _flag The first byte of a VarInt\\n /// @return The number of non-flag bytes in the VarInt\\n function determineVarIntDataLength(bytes memory _flag) internal pure returns (uint8) {\\n return determineVarIntDataLengthAt(_flag, 0);\\n }\\n\\n /// @notice Determines the length of a VarInt in bytes\\n /// @dev A VarInt of >1 byte is prefixed with a flag indicating its length\\n /// @param _b The byte array containing a VarInt\\n /// @param _at The position of the VarInt in the array\\n /// @return The number of non-flag bytes in the VarInt\\n function determineVarIntDataLengthAt(bytes memory _b, uint256 _at) internal pure returns (uint8) {\\n if (uint8(_b[_at]) == 0xff) {\\n return 8; // one-byte flag, 8 bytes data\\n }\\n if (uint8(_b[_at]) == 0xfe) {\\n return 4; // one-byte flag, 4 bytes data\\n }\\n if (uint8(_b[_at]) == 0xfd) {\\n return 2; // one-byte flag, 2 bytes data\\n }\\n\\n return 0; // flag is data\\n }\\n\\n /// @notice Parse a VarInt into its data length and the number it represents\\n /// @dev Useful for Parsing Vins and Vouts. Returns ERR_BAD_ARG if insufficient bytes.\\n /// Caller SHOULD explicitly handle this case (or bubble it up)\\n /// @param _b A byte-string starting with a VarInt\\n /// @return number of bytes in the encoding (not counting the tag), the encoded int\\n function parseVarInt(bytes memory _b) internal pure returns (uint256, uint256) {\\n return parseVarIntAt(_b, 0);\\n }\\n\\n /// @notice Parse a VarInt into its data length and the number it represents\\n /// @dev Useful for Parsing Vins and Vouts. Returns ERR_BAD_ARG if insufficient bytes.\\n /// Caller SHOULD explicitly handle this case (or bubble it up)\\n /// @param _b A byte-string containing a VarInt\\n /// @param _at The position of the VarInt\\n /// @return number of bytes in the encoding (not counting the tag), the encoded int\\n function parseVarIntAt(bytes memory _b, uint256 _at) internal pure returns (uint256, uint256) {\\n uint8 _dataLen = determineVarIntDataLengthAt(_b, _at);\\n\\n if (_dataLen == 0) {\\n return (0, uint8(_b[_at]));\\n }\\n if (_b.length < 1 + _dataLen + _at) {\\n return (ERR_BAD_ARG, 0);\\n }\\n uint256 _number;\\n if (_dataLen == 2) {\\n _number = reverseUint16(uint16(_b.slice2(1 + _at)));\\n } else if (_dataLen == 4) {\\n _number = reverseUint32(uint32(_b.slice4(1 + _at)));\\n } else if (_dataLen == 8) {\\n _number = reverseUint64(uint64(_b.slice8(1 + _at)));\\n }\\n return (_dataLen, _number);\\n }\\n\\n /// @notice Changes the endianness of a byte array\\n /// @dev Returns a new, backwards, bytes\\n /// @param _b The bytes to reverse\\n /// @return The reversed bytes\\n function reverseEndianness(bytes memory _b) internal pure returns (bytes memory) {\\n bytes memory _newValue = new bytes(_b.length);\\n\\n for (uint i = 0; i < _b.length; i++) {\\n _newValue[_b.length - i - 1] = _b[i];\\n }\\n\\n return _newValue;\\n }\\n\\n /// @notice Changes the endianness of a uint256\\n /// @dev https://graphics.stanford.edu/~seander/bithacks.html#ReverseParallel\\n /// @param _b The unsigned integer to reverse\\n /// @return v The reversed value\\n function reverseUint256(uint256 _b) internal pure returns (uint256 v) {\\n v = _b;\\n\\n // swap bytes\\n v = ((v >> 8) & 0x00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF) |\\n ((v & 0x00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF00FF) << 8);\\n // swap 2-byte long pairs\\n v = ((v >> 16) & 0x0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF) |\\n ((v & 0x0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF) << 16);\\n // swap 4-byte long pairs\\n v = ((v >> 32) & 0x00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF) |\\n ((v & 0x00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF00000000FFFFFFFF) << 32);\\n // swap 8-byte long pairs\\n v = ((v >> 64) & 0x0000000000000000FFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF) |\\n ((v & 0x0000000000000000FFFFFFFFFFFFFFFF0000000000000000FFFFFFFFFFFFFFFF) << 64);\\n // swap 16-byte long pairs\\n v = (v >> 128) | (v << 128);\\n }\\n\\n /// @notice Changes the endianness of a uint64\\n /// @param _b The unsigned integer to reverse\\n /// @return v The reversed value\\n function reverseUint64(uint64 _b) internal pure returns (uint64 v) {\\n v = _b;\\n\\n // swap bytes\\n v = ((v >> 8) & 0x00FF00FF00FF00FF) |\\n ((v & 0x00FF00FF00FF00FF) << 8);\\n // swap 2-byte long pairs\\n v = ((v >> 16) & 0x0000FFFF0000FFFF) |\\n ((v & 0x0000FFFF0000FFFF) << 16);\\n // swap 4-byte long pairs\\n v = (v >> 32) | (v << 32);\\n }\\n\\n /// @notice Changes the endianness of a uint32\\n /// @param _b The unsigned integer to reverse\\n /// @return v The reversed value\\n function reverseUint32(uint32 _b) internal pure returns (uint32 v) {\\n v = _b;\\n\\n // swap bytes\\n v = ((v >> 8) & 0x00FF00FF) |\\n ((v & 0x00FF00FF) << 8);\\n // swap 2-byte long pairs\\n v = (v >> 16) | (v << 16);\\n }\\n\\n /// @notice Changes the endianness of a uint24\\n /// @param _b The unsigned integer to reverse\\n /// @return v The reversed value\\n function reverseUint24(uint24 _b) internal pure returns (uint24 v) {\\n v = (_b << 16) | (_b & 0x00FF00) | (_b >> 16);\\n }\\n\\n /// @notice Changes the endianness of a uint16\\n /// @param _b The unsigned integer to reverse\\n /// @return v The reversed value\\n function reverseUint16(uint16 _b) internal pure returns (uint16 v) {\\n v = (_b << 8) | (_b >> 8);\\n }\\n\\n\\n /// @notice Converts big-endian bytes to a uint\\n /// @dev Traverses the byte array and sums the bytes\\n /// @param _b The big-endian bytes-encoded integer\\n /// @return The integer representation\\n function bytesToUint(bytes memory _b) internal pure returns (uint256) {\\n uint256 _number;\\n\\n for (uint i = 0; i < _b.length; i++) {\\n _number = _number + uint8(_b[i]) * (2 ** (8 * (_b.length - (i + 1))));\\n }\\n\\n return _number;\\n }\\n\\n /// @notice Get the last _num bytes from a byte array\\n /// @param _b The byte array to slice\\n /// @param _num The number of bytes to extract from the end\\n /// @return The last _num bytes of _b\\n function lastBytes(bytes memory _b, uint256 _num) internal pure returns (bytes memory) {\\n uint256 _start = _b.length.sub(_num);\\n\\n return _b.slice(_start, _num);\\n }\\n\\n /// @notice Implements bitcoin's hash160 (rmd160(sha2()))\\n /// @dev abi.encodePacked changes the return to bytes instead of bytes32\\n /// @param _b The pre-image\\n /// @return The digest\\n function hash160(bytes memory _b) internal pure returns (bytes memory) {\\n return abi.encodePacked(ripemd160(abi.encodePacked(sha256(_b))));\\n }\\n\\n /// @notice Implements bitcoin's hash160 (sha2 + ripemd160)\\n /// @dev sha2 precompile at address(2), ripemd160 at address(3)\\n /// @param _b The pre-image\\n /// @return res The digest\\n function hash160View(bytes memory _b) internal view returns (bytes20 res) {\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n pop(staticcall(gas(), 2, add(_b, 32), mload(_b), 0x00, 32))\\n pop(staticcall(gas(), 3, 0x00, 32, 0x00, 32))\\n // read from position 12 = 0c\\n res := mload(0x0c)\\n }\\n }\\n\\n /// @notice Implements bitcoin's hash256 (double sha2)\\n /// @dev abi.encodePacked changes the return to bytes instead of bytes32\\n /// @param _b The pre-image\\n /// @return The digest\\n function hash256(bytes memory _b) internal pure returns (bytes32) {\\n return sha256(abi.encodePacked(sha256(_b)));\\n }\\n\\n /// @notice Implements bitcoin's hash256 (double sha2)\\n /// @dev sha2 is precompiled smart contract located at address(2)\\n /// @param _b The pre-image\\n /// @return res The digest\\n function hash256View(bytes memory _b) internal view returns (bytes32 res) {\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n pop(staticcall(gas(), 2, add(_b, 32), mload(_b), 0x00, 32))\\n pop(staticcall(gas(), 2, 0x00, 32, 0x00, 32))\\n res := mload(0x00)\\n }\\n }\\n\\n /// @notice Implements bitcoin's hash256 on a pair of bytes32\\n /// @dev sha2 is precompiled smart contract located at address(2)\\n /// @param _a The first bytes32 of the pre-image\\n /// @param _b The second bytes32 of the pre-image\\n /// @return res The digest\\n function hash256Pair(bytes32 _a, bytes32 _b) internal view returns (bytes32 res) {\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n mstore(0x00, _a)\\n mstore(0x20, _b)\\n pop(staticcall(gas(), 2, 0x00, 64, 0x00, 32))\\n pop(staticcall(gas(), 2, 0x00, 32, 0x00, 32))\\n res := mload(0x00)\\n }\\n }\\n\\n /// @notice Implements bitcoin's hash256 (double sha2)\\n /// @dev sha2 is precompiled smart contract located at address(2)\\n /// @param _b The array containing the pre-image\\n /// @param at The start of the pre-image\\n /// @param len The length of the pre-image\\n /// @return res The digest\\n function hash256Slice(\\n bytes memory _b,\\n uint256 at,\\n uint256 len\\n ) internal view returns (bytes32 res) {\\n // solium-disable-next-line security/no-inline-assembly\\n assembly {\\n pop(staticcall(gas(), 2, add(_b, add(32, at)), len, 0x00, 32))\\n pop(staticcall(gas(), 2, 0x00, 32, 0x00, 32))\\n res := mload(0x00)\\n }\\n }\\n\\n /* ************ */\\n /* Legacy Input */\\n /* ************ */\\n\\n /// @notice Extracts the nth input from the vin (0-indexed)\\n /// @dev Iterates over the vin. If you need to extract several, write a custom function\\n /// @param _vin The vin as a tightly-packed byte array\\n /// @param _index The 0-indexed location of the input to extract\\n /// @return The input as a byte array\\n function extractInputAtIndex(bytes memory _vin, uint256 _index) internal pure returns (bytes memory) {\\n uint256 _varIntDataLen;\\n uint256 _nIns;\\n\\n (_varIntDataLen, _nIns) = parseVarInt(_vin);\\n require(_varIntDataLen != ERR_BAD_ARG, \\\"Read overrun during VarInt parsing\\\");\\n require(_index < _nIns, \\\"Vin read overrun\\\");\\n\\n uint256 _len = 0;\\n uint256 _offset = 1 + _varIntDataLen;\\n\\n for (uint256 _i = 0; _i < _index; _i ++) {\\n _len = determineInputLengthAt(_vin, _offset);\\n require(_len != ERR_BAD_ARG, \\\"Bad VarInt in scriptSig\\\");\\n _offset = _offset + _len;\\n }\\n\\n _len = determineInputLengthAt(_vin, _offset);\\n require(_len != ERR_BAD_ARG, \\\"Bad VarInt in scriptSig\\\");\\n return _vin.slice(_offset, _len);\\n }\\n\\n /// @notice Determines whether an input is legacy\\n /// @dev False if no scriptSig, otherwise True\\n /// @param _input The input\\n /// @return True for legacy, False for witness\\n function isLegacyInput(bytes memory _input) internal pure returns (bool) {\\n return _input[36] != hex\\\"00\\\";\\n }\\n\\n /// @notice Determines the length of a scriptSig in an input\\n /// @dev Will return 0 if passed a witness input.\\n /// @param _input The LEGACY input\\n /// @return The length of the script sig\\n function extractScriptSigLen(bytes memory _input) internal pure returns (uint256, uint256) {\\n return extractScriptSigLenAt(_input, 0);\\n }\\n\\n /// @notice Determines the length of a scriptSig in an input\\n /// starting at the specified position\\n /// @dev Will return 0 if passed a witness input.\\n /// @param _input The byte array containing the LEGACY input\\n /// @param _at The position of the input in the array\\n /// @return The length of the script sig\\n function extractScriptSigLenAt(bytes memory _input, uint256 _at) internal pure returns (uint256, uint256) {\\n if (_input.length < 37 + _at) {\\n return (ERR_BAD_ARG, 0);\\n }\\n\\n uint256 _varIntDataLen;\\n uint256 _scriptSigLen;\\n (_varIntDataLen, _scriptSigLen) = parseVarIntAt(_input, _at + 36);\\n\\n return (_varIntDataLen, _scriptSigLen);\\n }\\n\\n /// @notice Determines the length of an input from its scriptSig\\n /// @dev 36 for outpoint, 1 for scriptSig length, 4 for sequence\\n /// @param _input The input\\n /// @return The length of the input in bytes\\n function determineInputLength(bytes memory _input) internal pure returns (uint256) {\\n return determineInputLengthAt(_input, 0);\\n }\\n\\n /// @notice Determines the length of an input from its scriptSig,\\n /// starting at the specified position\\n /// @dev 36 for outpoint, 1 for scriptSig length, 4 for sequence\\n /// @param _input The byte array containing the input\\n /// @param _at The position of the input in the array\\n /// @return The length of the input in bytes\\n function determineInputLengthAt(bytes memory _input, uint256 _at) internal pure returns (uint256) {\\n uint256 _varIntDataLen;\\n uint256 _scriptSigLen;\\n (_varIntDataLen, _scriptSigLen) = extractScriptSigLenAt(_input, _at);\\n if (_varIntDataLen == ERR_BAD_ARG) {\\n return ERR_BAD_ARG;\\n }\\n\\n return 36 + 1 + _varIntDataLen + _scriptSigLen + 4;\\n }\\n\\n /// @notice Extracts the LE sequence bytes from an input\\n /// @dev Sequence is used for relative time locks\\n /// @param _input The LEGACY input\\n /// @return The sequence bytes (LE uint)\\n function extractSequenceLELegacy(bytes memory _input) internal pure returns (bytes4) {\\n uint256 _varIntDataLen;\\n uint256 _scriptSigLen;\\n (_varIntDataLen, _scriptSigLen) = extractScriptSigLen(_input);\\n require(_varIntDataLen != ERR_BAD_ARG, \\\"Bad VarInt in scriptSig\\\");\\n return _input.slice4(36 + 1 + _varIntDataLen + _scriptSigLen);\\n }\\n\\n /// @notice Extracts the sequence from the input\\n /// @dev Sequence is a 4-byte little-endian number\\n /// @param _input The LEGACY input\\n /// @return The sequence number (big-endian uint)\\n function extractSequenceLegacy(bytes memory _input) internal pure returns (uint32) {\\n uint32 _leSeqence = uint32(extractSequenceLELegacy(_input));\\n uint32 _beSequence = reverseUint32(_leSeqence);\\n return _beSequence;\\n }\\n /// @notice Extracts the VarInt-prepended scriptSig from the input in a tx\\n /// @dev Will return hex\\\"00\\\" if passed a witness input\\n /// @param _input The LEGACY input\\n /// @return The length-prepended scriptSig\\n function extractScriptSig(bytes memory _input) internal pure returns (bytes memory) {\\n uint256 _varIntDataLen;\\n uint256 _scriptSigLen;\\n (_varIntDataLen, _scriptSigLen) = extractScriptSigLen(_input);\\n require(_varIntDataLen != ERR_BAD_ARG, \\\"Bad VarInt in scriptSig\\\");\\n return _input.slice(36, 1 + _varIntDataLen + _scriptSigLen);\\n }\\n\\n\\n /* ************* */\\n /* Witness Input */\\n /* ************* */\\n\\n /// @notice Extracts the LE sequence bytes from an input\\n /// @dev Sequence is used for relative time locks\\n /// @param _input The WITNESS input\\n /// @return The sequence bytes (LE uint)\\n function extractSequenceLEWitness(bytes memory _input) internal pure returns (bytes4) {\\n return _input.slice4(37);\\n }\\n\\n /// @notice Extracts the sequence from the input in a tx\\n /// @dev Sequence is a 4-byte little-endian number\\n /// @param _input The WITNESS input\\n /// @return The sequence number (big-endian uint)\\n function extractSequenceWitness(bytes memory _input) internal pure returns (uint32) {\\n uint32 _leSeqence = uint32(extractSequenceLEWitness(_input));\\n uint32 _inputeSequence = reverseUint32(_leSeqence);\\n return _inputeSequence;\\n }\\n\\n /// @notice Extracts the outpoint from the input in a tx\\n /// @dev 32-byte tx id with 4-byte index\\n /// @param _input The input\\n /// @return The outpoint (LE bytes of prev tx hash + LE bytes of prev tx index)\\n function extractOutpoint(bytes memory _input) internal pure returns (bytes memory) {\\n return _input.slice(0, 36);\\n }\\n\\n /// @notice Extracts the outpoint tx id from an input\\n /// @dev 32-byte tx id\\n /// @param _input The input\\n /// @return The tx id (little-endian bytes)\\n function extractInputTxIdLE(bytes memory _input) internal pure returns (bytes32) {\\n return _input.slice32(0);\\n }\\n\\n /// @notice Extracts the outpoint tx id from an input\\n /// starting at the specified position\\n /// @dev 32-byte tx id\\n /// @param _input The byte array containing the input\\n /// @param _at The position of the input\\n /// @return The tx id (little-endian bytes)\\n function extractInputTxIdLeAt(bytes memory _input, uint256 _at) internal pure returns (bytes32) {\\n return _input.slice32(_at);\\n }\\n\\n /// @notice Extracts the LE tx input index from the input in a tx\\n /// @dev 4-byte tx index\\n /// @param _input The input\\n /// @return The tx index (little-endian bytes)\\n function extractTxIndexLE(bytes memory _input) internal pure returns (bytes4) {\\n return _input.slice4(32);\\n }\\n\\n /// @notice Extracts the LE tx input index from the input in a tx\\n /// starting at the specified position\\n /// @dev 4-byte tx index\\n /// @param _input The byte array containing the input\\n /// @param _at The position of the input\\n /// @return The tx index (little-endian bytes)\\n function extractTxIndexLeAt(bytes memory _input, uint256 _at) internal pure returns (bytes4) {\\n return _input.slice4(32 + _at);\\n }\\n\\n /* ****** */\\n /* Output */\\n /* ****** */\\n\\n /// @notice Determines the length of an output\\n /// @dev Works with any properly formatted output\\n /// @param _output The output\\n /// @return The length indicated by the prefix, error if invalid length\\n function determineOutputLength(bytes memory _output) internal pure returns (uint256) {\\n return determineOutputLengthAt(_output, 0);\\n }\\n\\n /// @notice Determines the length of an output\\n /// starting at the specified position\\n /// @dev Works with any properly formatted output\\n /// @param _output The byte array containing the output\\n /// @param _at The position of the output\\n /// @return The length indicated by the prefix, error if invalid length\\n function determineOutputLengthAt(bytes memory _output, uint256 _at) internal pure returns (uint256) {\\n if (_output.length < 9 + _at) {\\n return ERR_BAD_ARG;\\n }\\n uint256 _varIntDataLen;\\n uint256 _scriptPubkeyLength;\\n (_varIntDataLen, _scriptPubkeyLength) = parseVarIntAt(_output, 8 + _at);\\n\\n if (_varIntDataLen == ERR_BAD_ARG) {\\n return ERR_BAD_ARG;\\n }\\n\\n // 8-byte value, 1-byte for tag itself\\n return 8 + 1 + _varIntDataLen + _scriptPubkeyLength;\\n }\\n\\n /// @notice Extracts the output at a given index in the TxOuts vector\\n /// @dev Iterates over the vout. If you need to extract multiple, write a custom function\\n /// @param _vout The _vout to extract from\\n /// @param _index The 0-indexed location of the output to extract\\n /// @return The specified output\\n function extractOutputAtIndex(bytes memory _vout, uint256 _index) internal pure returns (bytes memory) {\\n uint256 _varIntDataLen;\\n uint256 _nOuts;\\n\\n (_varIntDataLen, _nOuts) = parseVarInt(_vout);\\n require(_varIntDataLen != ERR_BAD_ARG, \\\"Read overrun during VarInt parsing\\\");\\n require(_index < _nOuts, \\\"Vout read overrun\\\");\\n\\n uint256 _len = 0;\\n uint256 _offset = 1 + _varIntDataLen;\\n\\n for (uint256 _i = 0; _i < _index; _i ++) {\\n _len = determineOutputLengthAt(_vout, _offset);\\n require(_len != ERR_BAD_ARG, \\\"Bad VarInt in scriptPubkey\\\");\\n _offset += _len;\\n }\\n\\n _len = determineOutputLengthAt(_vout, _offset);\\n require(_len != ERR_BAD_ARG, \\\"Bad VarInt in scriptPubkey\\\");\\n return _vout.slice(_offset, _len);\\n }\\n\\n /// @notice Extracts the value bytes from the output in a tx\\n /// @dev Value is an 8-byte little-endian number\\n /// @param _output The output\\n /// @return The output value as LE bytes\\n function extractValueLE(bytes memory _output) internal pure returns (bytes8) {\\n return _output.slice8(0);\\n }\\n\\n /// @notice Extracts the value from the output in a tx\\n /// @dev Value is an 8-byte little-endian number\\n /// @param _output The output\\n /// @return The output value\\n function extractValue(bytes memory _output) internal pure returns (uint64) {\\n uint64 _leValue = uint64(extractValueLE(_output));\\n uint64 _beValue = reverseUint64(_leValue);\\n return _beValue;\\n }\\n\\n /// @notice Extracts the value from the output in a tx\\n /// @dev Value is an 8-byte little-endian number\\n /// @param _output The byte array containing the output\\n /// @param _at The starting index of the output in the array\\n /// @return The output value\\n function extractValueAt(bytes memory _output, uint256 _at) internal pure returns (uint64) {\\n uint64 _leValue = uint64(_output.slice8(_at));\\n uint64 _beValue = reverseUint64(_leValue);\\n return _beValue;\\n }\\n\\n /// @notice Extracts the data from an op return output\\n /// @dev Returns hex\\\"\\\" if no data or not an op return\\n /// @param _output The output\\n /// @return Any data contained in the opreturn output, null if not an op return\\n function extractOpReturnData(bytes memory _output) internal pure returns (bytes memory) {\\n if (_output[9] != hex\\\"6a\\\") {\\n return hex\\\"\\\";\\n }\\n bytes1 _dataLen = _output[10];\\n return _output.slice(11, uint256(uint8(_dataLen)));\\n }\\n\\n /// @notice Extracts the hash from the output script\\n /// @dev Determines type by the length prefix and validates format\\n /// @param _output The output\\n /// @return The hash committed to by the pk_script, or null for errors\\n function extractHash(bytes memory _output) internal pure returns (bytes memory) {\\n return extractHashAt(_output, 8, _output.length - 8);\\n }\\n\\n /// @notice Extracts the hash from the output script\\n /// @dev Determines type by the length prefix and validates format\\n /// @param _output The byte array containing the output\\n /// @param _at The starting index of the output script in the array\\n /// (output start + 8)\\n /// @param _len The length of the output script\\n /// (output length - 8)\\n /// @return The hash committed to by the pk_script, or null for errors\\n function extractHashAt(\\n bytes memory _output,\\n uint256 _at,\\n uint256 _len\\n ) internal pure returns (bytes memory) {\\n uint8 _scriptLen = uint8(_output[_at]);\\n\\n // don't have to worry about overflow here.\\n // if _scriptLen + 1 overflows, then output length would have to be < 1\\n // for this check to pass. if it's < 1, then we errored when assigning\\n // _scriptLen\\n if (_scriptLen + 1 != _len) {\\n return hex\\\"\\\";\\n }\\n\\n if (uint8(_output[_at + 1]) == 0) {\\n if (_scriptLen < 2) {\\n return hex\\\"\\\";\\n }\\n uint256 _payloadLen = uint8(_output[_at + 2]);\\n // Check for maliciously formatted witness outputs.\\n // No need to worry about underflow as long b/c of the `< 2` check\\n if (_payloadLen != _scriptLen - 2 || (_payloadLen != 0x20 && _payloadLen != 0x14)) {\\n return hex\\\"\\\";\\n }\\n return _output.slice(_at + 3, _payloadLen);\\n } else {\\n bytes3 _tag = _output.slice3(_at);\\n // p2pkh\\n if (_tag == hex\\\"1976a9\\\") {\\n // Check for maliciously formatted p2pkh\\n // No need to worry about underflow, b/c of _scriptLen check\\n if (uint8(_output[_at + 3]) != 0x14 ||\\n _output.slice2(_at + _len - 2) != hex\\\"88ac\\\") {\\n return hex\\\"\\\";\\n }\\n return _output.slice(_at + 4, 20);\\n //p2sh\\n } else if (_tag == hex\\\"17a914\\\") {\\n // Check for maliciously formatted p2sh\\n // No need to worry about underflow, b/c of _scriptLen check\\n if (uint8(_output[_at + _len - 1]) != 0x87) {\\n return hex\\\"\\\";\\n }\\n return _output.slice(_at + 3, 20);\\n }\\n }\\n return hex\\\"\\\"; /* NB: will trigger on OPRETURN and any non-standard that doesn't overrun */\\n }\\n\\n /* ********** */\\n /* Witness TX */\\n /* ********** */\\n\\n\\n /// @notice Checks that the vin passed up is properly formatted\\n /// @dev Consider a vin with a valid vout in its scriptsig\\n /// @param _vin Raw bytes length-prefixed input vector\\n /// @return True if it represents a validly formatted vin\\n function validateVin(bytes memory _vin) internal pure returns (bool) {\\n uint256 _varIntDataLen;\\n uint256 _nIns;\\n\\n (_varIntDataLen, _nIns) = parseVarInt(_vin);\\n\\n // Not valid if it says there are too many or no inputs\\n if (_nIns == 0 || _varIntDataLen == ERR_BAD_ARG) {\\n return false;\\n }\\n\\n uint256 _offset = 1 + _varIntDataLen;\\n\\n for (uint256 i = 0; i < _nIns; i++) {\\n // If we're at the end, but still expect more\\n if (_offset >= _vin.length) {\\n return false;\\n }\\n\\n // Grab the next input and determine its length.\\n uint256 _nextLen = determineInputLengthAt(_vin, _offset);\\n if (_nextLen == ERR_BAD_ARG) {\\n return false;\\n }\\n\\n // Increase the offset by that much\\n _offset += _nextLen;\\n }\\n\\n // Returns false if we're not exactly at the end\\n return _offset == _vin.length;\\n }\\n\\n /// @notice Checks that the vout passed up is properly formatted\\n /// @dev Consider a vout with a valid scriptpubkey\\n /// @param _vout Raw bytes length-prefixed output vector\\n /// @return True if it represents a validly formatted vout\\n function validateVout(bytes memory _vout) internal pure returns (bool) {\\n uint256 _varIntDataLen;\\n uint256 _nOuts;\\n\\n (_varIntDataLen, _nOuts) = parseVarInt(_vout);\\n\\n // Not valid if it says there are too many or no outputs\\n if (_nOuts == 0 || _varIntDataLen == ERR_BAD_ARG) {\\n return false;\\n }\\n\\n uint256 _offset = 1 + _varIntDataLen;\\n\\n for (uint256 i = 0; i < _nOuts; i++) {\\n // If we're at the end, but still expect more\\n if (_offset >= _vout.length) {\\n return false;\\n }\\n\\n // Grab the next output and determine its length.\\n // Increase the offset by that much\\n uint256 _nextLen = determineOutputLengthAt(_vout, _offset);\\n if (_nextLen == ERR_BAD_ARG) {\\n return false;\\n }\\n\\n _offset += _nextLen;\\n }\\n\\n // Returns false if we're not exactly at the end\\n return _offset == _vout.length;\\n }\\n\\n\\n\\n /* ************ */\\n /* Block Header */\\n /* ************ */\\n\\n /// @notice Extracts the transaction merkle root from a block header\\n /// @dev Use verifyHash256Merkle to verify proofs with this root\\n /// @param _header The header\\n /// @return The merkle root (little-endian)\\n function extractMerkleRootLE(bytes memory _header) internal pure returns (bytes32) {\\n return _header.slice32(36);\\n }\\n\\n /// @notice Extracts the target from a block header\\n /// @dev Target is a 256-bit number encoded as a 3-byte mantissa and 1-byte exponent\\n /// @param _header The header\\n /// @return The target threshold\\n function extractTarget(bytes memory _header) internal pure returns (uint256) {\\n return extractTargetAt(_header, 0);\\n }\\n\\n /// @notice Extracts the target from a block header\\n /// @dev Target is a 256-bit number encoded as a 3-byte mantissa and 1-byte exponent\\n /// @param _header The array containing the header\\n /// @param at The start of the header\\n /// @return The target threshold\\n function extractTargetAt(bytes memory _header, uint256 at) internal pure returns (uint256) {\\n uint24 _m = uint24(_header.slice3(72 + at));\\n uint8 _e = uint8(_header[75 + at]);\\n uint256 _mantissa = uint256(reverseUint24(_m));\\n uint _exponent = _e - 3;\\n\\n return _mantissa * (256 ** _exponent);\\n }\\n\\n /// @notice Calculate difficulty from the difficulty 1 target and current target\\n /// @dev Difficulty 1 is 0x1d00ffff on mainnet and testnet\\n /// @dev Difficulty 1 is a 256-bit number encoded as a 3-byte mantissa and 1-byte exponent\\n /// @param _target The current target\\n /// @return The block difficulty (bdiff)\\n function calculateDifficulty(uint256 _target) internal pure returns (uint256) {\\n // Difficulty 1 calculated from 0x1d00ffff\\n return DIFF1_TARGET.div(_target);\\n }\\n\\n /// @notice Extracts the previous block's hash from a block header\\n /// @dev Block headers do NOT include block number :(\\n /// @param _header The header\\n /// @return The previous block's hash (little-endian)\\n function extractPrevBlockLE(bytes memory _header) internal pure returns (bytes32) {\\n return _header.slice32(4);\\n }\\n\\n /// @notice Extracts the previous block's hash from a block header\\n /// @dev Block headers do NOT include block number :(\\n /// @param _header The array containing the header\\n /// @param at The start of the header\\n /// @return The previous block's hash (little-endian)\\n function extractPrevBlockLEAt(\\n bytes memory _header,\\n uint256 at\\n ) internal pure returns (bytes32) {\\n return _header.slice32(4 + at);\\n }\\n\\n /// @notice Extracts the timestamp from a block header\\n /// @dev Time is not 100% reliable\\n /// @param _header The header\\n /// @return The timestamp (little-endian bytes)\\n function extractTimestampLE(bytes memory _header) internal pure returns (bytes4) {\\n return _header.slice4(68);\\n }\\n\\n /// @notice Extracts the timestamp from a block header\\n /// @dev Time is not 100% reliable\\n /// @param _header The header\\n /// @return The timestamp (uint)\\n function extractTimestamp(bytes memory _header) internal pure returns (uint32) {\\n return reverseUint32(uint32(extractTimestampLE(_header)));\\n }\\n\\n /// @notice Extracts the expected difficulty from a block header\\n /// @dev Does NOT verify the work\\n /// @param _header The header\\n /// @return The difficulty as an integer\\n function extractDifficulty(bytes memory _header) internal pure returns (uint256) {\\n return calculateDifficulty(extractTarget(_header));\\n }\\n\\n /// @notice Concatenates and hashes two inputs for merkle proving\\n /// @param _a The first hash\\n /// @param _b The second hash\\n /// @return The double-sha256 of the concatenated hashes\\n function _hash256MerkleStep(bytes memory _a, bytes memory _b) internal view returns (bytes32) {\\n return hash256View(abi.encodePacked(_a, _b));\\n }\\n\\n /// @notice Concatenates and hashes two inputs for merkle proving\\n /// @param _a The first hash\\n /// @param _b The second hash\\n /// @return The double-sha256 of the concatenated hashes\\n function _hash256MerkleStep(bytes32 _a, bytes32 _b) internal view returns (bytes32) {\\n return hash256Pair(_a, _b);\\n }\\n\\n\\n /// @notice Verifies a Bitcoin-style merkle tree\\n /// @dev Leaves are 0-indexed. Inefficient version.\\n /// @param _proof The proof. Tightly packed LE sha256 hashes. The last hash is the root\\n /// @param _index The index of the leaf\\n /// @return true if the proof is valid, else false\\n function verifyHash256Merkle(bytes memory _proof, uint _index) internal view returns (bool) {\\n // Not an even number of hashes\\n if (_proof.length % 32 != 0) {\\n return false;\\n }\\n\\n // Special case for coinbase-only blocks\\n if (_proof.length == 32) {\\n return true;\\n }\\n\\n // Should never occur\\n if (_proof.length == 64) {\\n return false;\\n }\\n\\n bytes32 _root = _proof.slice32(_proof.length - 32);\\n bytes32 _current = _proof.slice32(0);\\n bytes memory _tree = _proof.slice(32, _proof.length - 64);\\n\\n return verifyHash256Merkle(_current, _tree, _root, _index);\\n }\\n\\n /// @notice Verifies a Bitcoin-style merkle tree\\n /// @dev Leaves are 0-indexed. Efficient version.\\n /// @param _leaf The leaf of the proof. LE sha256 hash.\\n /// @param _tree The intermediate nodes in the proof.\\n /// Tightly packed LE sha256 hashes.\\n /// @param _root The root of the proof. LE sha256 hash.\\n /// @param _index The index of the leaf\\n /// @return true if the proof is valid, else false\\n function verifyHash256Merkle(\\n bytes32 _leaf,\\n bytes memory _tree,\\n bytes32 _root,\\n uint _index\\n ) internal view returns (bool) {\\n // Not an even number of hashes\\n if (_tree.length % 32 != 0) {\\n return false;\\n }\\n\\n // Should never occur\\n if (_tree.length == 0) {\\n return false;\\n }\\n\\n uint _idx = _index;\\n bytes32 _current = _leaf;\\n\\n // i moves in increments of 32\\n for (uint i = 0; i < _tree.length; i += 32) {\\n if (_idx % 2 == 1) {\\n _current = _hash256MerkleStep(_tree.slice32(i), _current);\\n } else {\\n _current = _hash256MerkleStep(_current, _tree.slice32(i));\\n }\\n _idx = _idx >> 1;\\n }\\n return _current == _root;\\n }\\n\\n /*\\n NB: https://github.com/bitcoin/bitcoin/blob/78dae8caccd82cfbfd76557f1fb7d7557c7b5edb/src/pow.cpp#L49-L72\\n NB: We get a full-bitlength target from this. For comparison with\\n header-encoded targets we need to mask it with the header target\\n e.g. (full & truncated) == truncated\\n */\\n /// @notice performs the bitcoin difficulty retarget\\n /// @dev implements the Bitcoin algorithm precisely\\n /// @param _previousTarget the target of the previous period\\n /// @param _firstTimestamp the timestamp of the first block in the difficulty period\\n /// @param _secondTimestamp the timestamp of the last block in the difficulty period\\n /// @return the new period's target threshold\\n function retargetAlgorithm(\\n uint256 _previousTarget,\\n uint256 _firstTimestamp,\\n uint256 _secondTimestamp\\n ) internal pure returns (uint256) {\\n uint256 _elapsedTime = _secondTimestamp.sub(_firstTimestamp);\\n\\n // Normalize ratio to factor of 4 if very long or very short\\n if (_elapsedTime < RETARGET_PERIOD.div(4)) {\\n _elapsedTime = RETARGET_PERIOD.div(4);\\n }\\n if (_elapsedTime > RETARGET_PERIOD.mul(4)) {\\n _elapsedTime = RETARGET_PERIOD.mul(4);\\n }\\n\\n /*\\n NB: high targets e.g. ffff0020 can cause overflows here\\n so we divide it by 256**2, then multiply by 256**2 later\\n we know the target is evenly divisible by 256**2, so this isn't an issue\\n */\\n\\n uint256 _adjusted = _previousTarget.div(65536).mul(_elapsedTime);\\n return _adjusted.div(RETARGET_PERIOD).mul(65536);\\n }\\n}\\n\",\"keccak256\":\"0x439eaa97e9239705f3d31e8d39dccbad32311f1f119e295d53c65e0ae3c5a5fc\"},\"@keep-network/bitcoin-spv-sol/contracts/BytesLib.sol\":{\"content\":\"pragma solidity ^0.8.4;\\n\\n/*\\n\\nhttps://github.com/GNSPS/solidity-bytes-utils/\\n\\nThis is free and unencumbered software released into the public domain.\\n\\nAnyone is free to copy, modify, publish, use, compile, sell, or\\ndistribute this software, either in source code form or as a compiled\\nbinary, for any purpose, commercial or non-commercial, and by any\\nmeans.\\n\\nIn jurisdictions that recognize copyright laws, the author or authors\\nof this software dedicate any and all copyright interest in the\\nsoftware to the public domain. We make this dedication for the benefit\\nof the public at large and to the detriment of our heirs and\\nsuccessors. We intend this dedication to be an overt act of\\nrelinquishment in perpetuity of all present and future rights to this\\nsoftware under copyright law.\\n\\nTHE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND,\\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\\nIN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\\nARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\\nOTHER DEALINGS IN THE SOFTWARE.\\n\\nFor more information, please refer to <https://unlicense.org>\\n*/\\n\\n\\n/** @title BytesLib **/\\n/** @author https://github.com/GNSPS **/\\n\\nlibrary BytesLib {\\n function concat(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bytes memory) {\\n bytes memory tempBytes;\\n\\n assembly {\\n // Get a location of some free memory and store it in tempBytes as\\n // Solidity does for memory variables.\\n tempBytes := mload(0x40)\\n\\n // Store the length of the first bytes array at the beginning of\\n // the memory for tempBytes.\\n let length := mload(_preBytes)\\n mstore(tempBytes, length)\\n\\n // Maintain a memory counter for the current write location in the\\n // temp bytes array by adding the 32 bytes for the array length to\\n // the starting location.\\n let mc := add(tempBytes, 0x20)\\n // Stop copying when the memory counter reaches the length of the\\n // first bytes array.\\n let end := add(mc, length)\\n\\n for {\\n // Initialize a copy counter to the start of the _preBytes data,\\n // 32 bytes into its memory.\\n let cc := add(_preBytes, 0x20)\\n } lt(mc, end) {\\n // Increase both counters by 32 bytes each iteration.\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // Write the _preBytes data into the tempBytes memory 32 bytes\\n // at a time.\\n mstore(mc, mload(cc))\\n }\\n\\n // Add the length of _postBytes to the current length of tempBytes\\n // and store it as the new length in the first 32 bytes of the\\n // tempBytes memory.\\n length := mload(_postBytes)\\n mstore(tempBytes, add(length, mload(tempBytes)))\\n\\n // Move the memory counter back from a multiple of 0x20 to the\\n // actual end of the _preBytes data.\\n mc := end\\n // Stop copying when the memory counter reaches the new combined\\n // length of the arrays.\\n end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n } lt(mc, end) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n mstore(mc, mload(cc))\\n }\\n\\n // Update the free-memory pointer by padding our last write location\\n // to 32 bytes: add 31 bytes to the end of tempBytes to move to the\\n // next 32 byte block, then round down to the nearest multiple of\\n // 32. If the sum of the length of the two arrays is zero then add\\n // one before rounding down to leave a blank 32 bytes (the length block with 0).\\n mstore(0x40, and(\\n add(add(end, iszero(add(length, mload(_preBytes)))), 31),\\n not(31) // Round down to the nearest 32 bytes.\\n ))\\n }\\n\\n return tempBytes;\\n }\\n\\n function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal {\\n assembly {\\n // Read the first 32 bytes of _preBytes storage, which is the length\\n // of the array. (We don't need to use the offset into the slot\\n // because arrays use the entire slot.)\\n let fslot := sload(_preBytes.slot)\\n // Arrays of 31 bytes or less have an even value in their slot,\\n // while longer arrays have an odd value. The actual length is\\n // the slot divided by two for odd values, and the lowest order\\n // byte divided by two for even values.\\n // If the slot is even, bitwise and the slot with 255 and divide by\\n // two to get the length. If the slot is odd, bitwise and the slot\\n // with -1 and divide by two.\\n let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\\n let mlength := mload(_postBytes)\\n let newlength := add(slength, mlength)\\n // slength can contain both the length and contents of the array\\n // if length < 32 bytes so let's prepare for that\\n // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n switch add(lt(slength, 32), lt(newlength, 32))\\n case 2 {\\n // Since the new array still fits in the slot, we just need to\\n // update the contents of the slot.\\n // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length\\n sstore(\\n _preBytes.slot,\\n // all the modifications to the slot are inside this\\n // next block\\n add(\\n // we can just add to the slot contents because the\\n // bytes we want to change are the LSBs\\n fslot,\\n add(\\n mul(\\n div(\\n // load the bytes from memory\\n mload(add(_postBytes, 0x20)),\\n // zero all bytes to the right\\n exp(0x100, sub(32, mlength))\\n ),\\n // and now shift left the number of bytes to\\n // leave space for the length in the slot\\n exp(0x100, sub(32, newlength))\\n ),\\n // increase length by the double of the memory\\n // bytes length\\n mul(mlength, 2)\\n )\\n )\\n )\\n }\\n case 1 {\\n // The stored value fits in the slot, but the combined value\\n // will exceed it.\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n // save new length\\n sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n // The contents of the _postBytes array start 32 bytes into\\n // the structure. Our first read should obtain the `submod`\\n // bytes that can fit into the unused space in the last word\\n // of the stored array. To get this, we read 32 bytes starting\\n // from `submod`, so the data we read overlaps with the array\\n // contents by `submod` bytes. Masking the lowest-order\\n // `submod` bytes allows us to add that value directly to the\\n // stored value.\\n\\n let submod := sub(32, slength)\\n let mc := add(_postBytes, submod)\\n let end := add(_postBytes, mlength)\\n let mask := sub(exp(0x100, submod), 1)\\n\\n sstore(\\n sc,\\n add(\\n and(\\n fslot,\\n 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00\\n ),\\n and(mload(mc), mask)\\n )\\n )\\n\\n for {\\n mc := add(mc, 0x20)\\n sc := add(sc, 1)\\n } lt(mc, end) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n sstore(sc, mload(mc))\\n }\\n\\n mask := exp(0x100, sub(mc, end))\\n\\n sstore(sc, mul(div(mload(mc), mask), mask))\\n }\\n default {\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n // Start copying to the last used word of the stored array.\\n let sc := add(keccak256(0x0, 0x20), div(slength, 32))\\n\\n // save new length\\n sstore(_preBytes.slot, add(mul(newlength, 2), 1))\\n\\n // Copy over the first `submod` bytes of the new data as in\\n // case 1 above.\\n let slengthmod := mod(slength, 32)\\n let mlengthmod := mod(mlength, 32)\\n let submod := sub(32, slengthmod)\\n let mc := add(_postBytes, submod)\\n let end := add(_postBytes, mlength)\\n let mask := sub(exp(0x100, submod), 1)\\n\\n sstore(sc, add(sload(sc), and(mload(mc), mask)))\\n\\n for {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } lt(mc, end) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n sstore(sc, mload(mc))\\n }\\n\\n mask := exp(0x100, sub(mc, end))\\n\\n sstore(sc, mul(div(mload(mc), mask), mask))\\n }\\n }\\n }\\n\\n function slice(bytes memory _bytes, uint _start, uint _length) internal pure returns (bytes memory res) {\\n if (_length == 0) {\\n return hex\\\"\\\";\\n }\\n uint _end = _start + _length;\\n require(_end > _start && _bytes.length >= _end, \\\"Slice out of bounds\\\");\\n\\n assembly {\\n // Alloc bytes array with additional 32 bytes afterspace and assign it's size\\n res := mload(0x40)\\n mstore(0x40, add(add(res, 64), _length))\\n mstore(res, _length)\\n\\n // Compute distance between source and destination pointers\\n let diff := sub(res, add(_bytes, _start))\\n\\n for {\\n let src := add(add(_bytes, 32), _start)\\n let end := add(src, _length)\\n } lt(src, end) {\\n src := add(src, 32)\\n } {\\n mstore(add(src, diff), mload(src))\\n }\\n }\\n }\\n\\n /// @notice Take a slice of the byte array, overwriting the destination.\\n /// The length of the slice will equal the length of the destination array.\\n /// @dev Make sure the destination array has afterspace if required.\\n /// @param _bytes The source array\\n /// @param _dest The destination array.\\n /// @param _start The location to start in the source array.\\n function sliceInPlace(\\n bytes memory _bytes,\\n bytes memory _dest,\\n uint _start\\n ) internal pure {\\n uint _length = _dest.length;\\n uint _end = _start + _length;\\n require(_end > _start && _bytes.length >= _end, \\\"Slice out of bounds\\\");\\n\\n assembly {\\n for {\\n let src := add(add(_bytes, 32), _start)\\n let res := add(_dest, 32)\\n let end := add(src, _length)\\n } lt(src, end) {\\n src := add(src, 32)\\n res := add(res, 32)\\n } {\\n mstore(res, mload(src))\\n }\\n }\\n }\\n\\n // Static slice functions, no bounds checking\\n /// @notice take a 32-byte slice from the specified position\\n function slice32(bytes memory _bytes, uint _start) internal pure returns (bytes32 res) {\\n assembly {\\n res := mload(add(add(_bytes, 32), _start))\\n }\\n }\\n\\n /// @notice take a 20-byte slice from the specified position\\n function slice20(bytes memory _bytes, uint _start) internal pure returns (bytes20) {\\n return bytes20(slice32(_bytes, _start));\\n }\\n\\n /// @notice take a 8-byte slice from the specified position\\n function slice8(bytes memory _bytes, uint _start) internal pure returns (bytes8) {\\n return bytes8(slice32(_bytes, _start));\\n }\\n\\n /// @notice take a 4-byte slice from the specified position\\n function slice4(bytes memory _bytes, uint _start) internal pure returns (bytes4) {\\n return bytes4(slice32(_bytes, _start));\\n }\\n\\n /// @notice take a 3-byte slice from the specified position\\n function slice3(bytes memory _bytes, uint _start) internal pure returns (bytes3) {\\n return bytes3(slice32(_bytes, _start));\\n }\\n\\n /// @notice take a 2-byte slice from the specified position\\n function slice2(bytes memory _bytes, uint _start) internal pure returns (bytes2) {\\n return bytes2(slice32(_bytes, _start));\\n }\\n\\n function toAddress(bytes memory _bytes, uint _start) internal pure returns (address) {\\n uint _totalLen = _start + 20;\\n require(_totalLen > _start && _bytes.length >= _totalLen, \\\"Address conversion out of bounds.\\\");\\n address tempAddress;\\n\\n assembly {\\n tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)\\n }\\n\\n return tempAddress;\\n }\\n\\n function toUint(bytes memory _bytes, uint _start) internal pure returns (uint256) {\\n uint _totalLen = _start + 32;\\n require(_totalLen > _start && _bytes.length >= _totalLen, \\\"Uint conversion out of bounds.\\\");\\n uint256 tempUint;\\n\\n assembly {\\n tempUint := mload(add(add(_bytes, 0x20), _start))\\n }\\n\\n return tempUint;\\n }\\n\\n function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) {\\n bool success = true;\\n\\n assembly {\\n let length := mload(_preBytes)\\n\\n // if lengths don't match the arrays are not equal\\n switch eq(length, mload(_postBytes))\\n case 1 {\\n // cb is a circuit breaker in the for loop since there's\\n // no said feature for inline assembly loops\\n // cb = 1 - don't breaker\\n // cb = 0 - break\\n let cb := 1\\n\\n let mc := add(_preBytes, 0x20)\\n let end := add(mc, length)\\n\\n for {\\n let cc := add(_postBytes, 0x20)\\n // the next line is the loop condition:\\n // while(uint(mc < end) + cb == 2)\\n } eq(add(lt(mc, end), cb), 2) {\\n mc := add(mc, 0x20)\\n cc := add(cc, 0x20)\\n } {\\n // if any of these checks fails then arrays are not equal\\n if iszero(eq(mload(mc), mload(cc))) {\\n // unsuccess:\\n success := 0\\n cb := 0\\n }\\n }\\n }\\n default {\\n // unsuccess:\\n success := 0\\n }\\n }\\n\\n return success;\\n }\\n\\n function equalStorage(bytes storage _preBytes, bytes memory _postBytes) internal view returns (bool) {\\n bool success = true;\\n\\n assembly {\\n // we know _preBytes_offset is 0\\n let fslot := sload(_preBytes.slot)\\n // Decode the length of the stored array like in concatStorage().\\n let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)\\n let mlength := mload(_postBytes)\\n\\n // if lengths don't match the arrays are not equal\\n switch eq(slength, mlength)\\n case 1 {\\n // slength can contain both the length and contents of the array\\n // if length < 32 bytes so let's prepare for that\\n // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage\\n if iszero(iszero(slength)) {\\n switch lt(slength, 32)\\n case 1 {\\n // blank the last byte which is the length\\n fslot := mul(div(fslot, 0x100), 0x100)\\n\\n if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {\\n // unsuccess:\\n success := 0\\n }\\n }\\n default {\\n // cb is a circuit breaker in the for loop since there's\\n // no said feature for inline assembly loops\\n // cb = 1 - don't breaker\\n // cb = 0 - break\\n let cb := 1\\n\\n // get the keccak hash to get the contents of the array\\n mstore(0x0, _preBytes.slot)\\n let sc := keccak256(0x0, 0x20)\\n\\n let mc := add(_postBytes, 0x20)\\n let end := add(mc, mlength)\\n\\n // the next line is the loop condition:\\n // while(uint(mc < end) + cb == 2)\\n for {} eq(add(lt(mc, end), cb), 2) {\\n sc := add(sc, 1)\\n mc := add(mc, 0x20)\\n } {\\n if iszero(eq(sload(sc), mload(mc))) {\\n // unsuccess:\\n success := 0\\n cb := 0\\n }\\n }\\n }\\n }\\n }\\n default {\\n // unsuccess:\\n success := 0\\n }\\n }\\n\\n return success;\\n }\\n\\n function toBytes32(bytes memory _source) pure internal returns (bytes32 result) {\\n if (_source.length == 0) {\\n return 0x0;\\n }\\n\\n assembly {\\n result := mload(add(_source, 32))\\n }\\n }\\n\\n function keccak256Slice(bytes memory _bytes, uint _start, uint _length) pure internal returns (bytes32 result) {\\n uint _end = _start + _length;\\n require(_end > _start && _bytes.length >= _end, \\\"Slice out of bounds\\\");\\n\\n assembly {\\n result := keccak256(add(add(_bytes, 32), _start), _length)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x43e0f3b3b23c861bd031588bf410dfdd02e2af17941a89aa38d70e534e0380d1\"},\"@keep-network/bitcoin-spv-sol/contracts/SafeMath.sol\":{\"content\":\"pragma solidity ^0.8.4;\\n\\n/*\\nThe MIT License (MIT)\\n\\nCopyright (c) 2016 Smart Contract Solutions, Inc.\\n\\nPermission is hereby granted, free of charge, to any person obtaining\\na copy of this software and associated documentation files (the\\n\\\"Software\\\"), to deal in the Software without restriction, including\\nwithout limitation the rights to use, copy, modify, merge, publish,\\ndistribute, sublicense, and/or sell copies of the Software, and to\\npermit persons to whom the Software is furnished to do so, subject to\\nthe following conditions:\\n\\nThe above copyright notice and this permission notice shall be included\\nin all copies or substantial portions of the Software.\\n\\nTHE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\\n*/\\n\\n\\n/**\\n * @title SafeMath\\n * @dev Math operations with safety checks that throw on error\\n */\\nlibrary SafeMath {\\n\\n /**\\n * @dev Multiplies two numbers, throws on overflow.\\n */\\n function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {\\n // Gas optimization: this is cheaper than asserting 'a' not being zero, but the\\n // benefit is lost if 'b' is also tested.\\n // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\\n if (_a == 0) {\\n return 0;\\n }\\n\\n c = _a * _b;\\n require(c / _a == _b, \\\"Overflow during multiplication.\\\");\\n return c;\\n }\\n\\n /**\\n * @dev Integer division of two numbers, truncating the quotient.\\n */\\n function div(uint256 _a, uint256 _b) internal pure returns (uint256) {\\n // assert(_b > 0); // Solidity automatically throws when dividing by 0\\n // uint256 c = _a / _b;\\n // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold\\n return _a / _b;\\n }\\n\\n /**\\n * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).\\n */\\n function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {\\n require(_b <= _a, \\\"Underflow during subtraction.\\\");\\n return _a - _b;\\n }\\n\\n /**\\n * @dev Adds two numbers, throws on overflow.\\n */\\n function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {\\n c = _a + _b;\\n require(c >= _a, \\\"Overflow during addition.\\\");\\n return c;\\n }\\n}\\n\",\"keccak256\":\"0x35930d982394c7ffde439b82e5e696c5b21a6f09699d44861dfe409ef64084a3\"},\"@keep-network/bitcoin-spv-sol/contracts/ValidateSPV.sol\":{\"content\":\"pragma solidity ^0.8.4;\\n\\n/** @title ValidateSPV*/\\n/** @author Summa (https://summa.one) */\\n\\nimport {BytesLib} from \\\"./BytesLib.sol\\\";\\nimport {SafeMath} from \\\"./SafeMath.sol\\\";\\nimport {BTCUtils} from \\\"./BTCUtils.sol\\\";\\n\\n\\nlibrary ValidateSPV {\\n\\n using BTCUtils for bytes;\\n using BTCUtils for uint256;\\n using BytesLib for bytes;\\n using SafeMath for uint256;\\n\\n enum InputTypes { NONE, LEGACY, COMPATIBILITY, WITNESS }\\n enum OutputTypes { NONE, WPKH, WSH, OP_RETURN, PKH, SH, NONSTANDARD }\\n\\n uint256 constant ERR_BAD_LENGTH = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff;\\n uint256 constant ERR_INVALID_CHAIN = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe;\\n uint256 constant ERR_LOW_WORK = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd;\\n\\n function getErrBadLength() internal pure returns (uint256) {\\n return ERR_BAD_LENGTH;\\n }\\n\\n function getErrInvalidChain() internal pure returns (uint256) {\\n return ERR_INVALID_CHAIN;\\n }\\n\\n function getErrLowWork() internal pure returns (uint256) {\\n return ERR_LOW_WORK;\\n }\\n\\n /// @notice Validates a tx inclusion in the block\\n /// @dev `index` is not a reliable indicator of location within a block\\n /// @param _txid The txid (LE)\\n /// @param _merkleRoot The merkle root (as in the block header)\\n /// @param _intermediateNodes The proof's intermediate nodes (digests between leaf and root)\\n /// @param _index The leaf's index in the tree (0-indexed)\\n /// @return true if fully valid, false otherwise\\n function prove(\\n bytes32 _txid,\\n bytes32 _merkleRoot,\\n bytes memory _intermediateNodes,\\n uint _index\\n ) internal view returns (bool) {\\n // Shortcut the empty-block case\\n if (_txid == _merkleRoot && _index == 0 && _intermediateNodes.length == 0) {\\n return true;\\n }\\n\\n // If the Merkle proof failed, bubble up error\\n return BTCUtils.verifyHash256Merkle(\\n _txid,\\n _intermediateNodes,\\n _merkleRoot,\\n _index\\n );\\n }\\n\\n /// @notice Hashes transaction to get txid\\n /// @dev Supports Legacy and Witness\\n /// @param _version 4-bytes version\\n /// @param _vin Raw bytes length-prefixed input vector\\n /// @param _vout Raw bytes length-prefixed output vector\\n /// @param _locktime 4-byte tx locktime\\n /// @return 32-byte transaction id, little endian\\n function calculateTxId(\\n bytes4 _version,\\n bytes memory _vin,\\n bytes memory _vout,\\n bytes4 _locktime\\n ) internal view returns (bytes32) {\\n // Get transaction hash double-Sha256(version + nIns + inputs + nOuts + outputs + locktime)\\n return abi.encodePacked(_version, _vin, _vout, _locktime).hash256View();\\n }\\n\\n /// @notice Checks validity of header chain\\n /// @notice Compares the hash of each header to the prevHash in the next header\\n /// @param headers Raw byte array of header chain\\n /// @return totalDifficulty The total accumulated difficulty of the header chain, or an error code\\n function validateHeaderChain(\\n bytes memory headers\\n ) internal view returns (uint256 totalDifficulty) {\\n\\n // Check header chain length\\n if (headers.length % 80 != 0) {return ERR_BAD_LENGTH;}\\n\\n // Initialize header start index\\n bytes32 digest;\\n\\n totalDifficulty = 0;\\n\\n for (uint256 start = 0; start < headers.length; start += 80) {\\n\\n // After the first header, check that headers are in a chain\\n if (start != 0) {\\n if (!validateHeaderPrevHash(headers, start, digest)) {return ERR_INVALID_CHAIN;}\\n }\\n\\n // ith header target\\n uint256 target = headers.extractTargetAt(start);\\n\\n // Require that the header has sufficient work\\n digest = headers.hash256Slice(start, 80);\\n if(uint256(digest).reverseUint256() > target) {\\n return ERR_LOW_WORK;\\n }\\n\\n // Add ith header difficulty to difficulty sum\\n totalDifficulty = totalDifficulty + target.calculateDifficulty();\\n }\\n }\\n\\n /// @notice Checks validity of header work\\n /// @param digest Header digest\\n /// @param target The target threshold\\n /// @return true if header work is valid, false otherwise\\n function validateHeaderWork(\\n bytes32 digest,\\n uint256 target\\n ) internal pure returns (bool) {\\n if (digest == bytes32(0)) {return false;}\\n return (uint256(digest).reverseUint256() < target);\\n }\\n\\n /// @notice Checks validity of header chain\\n /// @dev Compares current header prevHash to previous header's digest\\n /// @param headers The raw bytes array containing the header\\n /// @param at The position of the header\\n /// @param prevHeaderDigest The previous header's digest\\n /// @return true if the connect is valid, false otherwise\\n function validateHeaderPrevHash(\\n bytes memory headers,\\n uint256 at,\\n bytes32 prevHeaderDigest\\n ) internal pure returns (bool) {\\n\\n // Extract prevHash of current header\\n bytes32 prevHash = headers.extractPrevBlockLEAt(at);\\n\\n // Compare prevHash of current header to previous header's digest\\n if (prevHash != prevHeaderDigest) {return false;}\\n\\n return true;\\n }\\n}\\n\",\"keccak256\":\"0xce3febbf3ad3a7ff8a8effd0c7ccaf7ccfa2719578b537d49ea196f0bae8062b\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/bridge/IRelay.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\n\\n// \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\n// \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\n// \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n\\npragma solidity 0.8.17;\\n\\n/// @title Interface for the Bitcoin relay\\n/// @notice Contains only the methods needed by tBTC v2. The Bitcoin relay\\n/// provides the difficulty of the previous and current epoch. One\\n/// difficulty epoch spans 2016 blocks.\\ninterface IRelay {\\n /// @notice Returns the difficulty of the current epoch.\\n function getCurrentEpochDifficulty() external view returns (uint256);\\n\\n /// @notice Returns the difficulty of the previous epoch.\\n function getPrevEpochDifficulty() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0xf70c723fc0a1824d92061b5dc76c65c38c22eff6b18ef6a2057f511183ce3c5b\",\"license\":\"GPL-3.0-only\"},\"contracts/relay/LightRelay.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\n\\n// \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\n// \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\n// \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n\\npragma solidity 0.8.17;\\n\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport {BytesLib} from \\\"@keep-network/bitcoin-spv-sol/contracts/BytesLib.sol\\\";\\nimport {BTCUtils} from \\\"@keep-network/bitcoin-spv-sol/contracts/BTCUtils.sol\\\";\\nimport {ValidateSPV} from \\\"@keep-network/bitcoin-spv-sol/contracts/ValidateSPV.sol\\\";\\n\\nimport \\\"../bridge/IRelay.sol\\\";\\n\\nstruct Epoch {\\n uint32 timestamp;\\n // By definition, bitcoin targets have at least 32 leading zero bits.\\n // Thus we can only store the bits that aren't guaranteed to be 0.\\n uint224 target;\\n}\\n\\ninterface ILightRelay is IRelay {\\n event Genesis(uint256 blockHeight);\\n event Retarget(uint256 oldDifficulty, uint256 newDifficulty);\\n event ProofLengthChanged(uint256 newLength);\\n event AuthorizationRequirementChanged(bool newStatus);\\n event SubmitterAuthorized(address submitter);\\n event SubmitterDeauthorized(address submitter);\\n\\n function retarget(bytes memory headers) external;\\n\\n function validateChain(bytes memory headers)\\n external\\n view\\n returns (uint256 startingHeaderTimestamp, uint256 headerCount);\\n\\n function getBlockDifficulty(uint256 blockNumber)\\n external\\n view\\n returns (uint256);\\n\\n function getEpochDifficulty(uint256 epochNumber)\\n external\\n view\\n returns (uint256);\\n\\n function getRelayRange()\\n external\\n view\\n returns (uint256 relayGenesis, uint256 currentEpochEnd);\\n}\\n\\nlibrary RelayUtils {\\n using BytesLib for bytes;\\n\\n /// @notice Extract the timestamp of the header at the given position.\\n /// @param headers Byte array containing the header of interest.\\n /// @param at The start of the header in the array.\\n /// @return The timestamp of the header.\\n /// @dev Assumes that the specified position contains a valid header.\\n /// Performs no validation whatsoever.\\n function extractTimestampAt(bytes memory headers, uint256 at)\\n internal\\n pure\\n returns (uint32)\\n {\\n return BTCUtils.reverseUint32(uint32(headers.slice4(68 + at)));\\n }\\n}\\n\\n/// @dev THE RELAY MUST NOT BE USED BEFORE GENESIS AND AT LEAST ONE RETARGET.\\ncontract LightRelay is Ownable, ILightRelay {\\n using BytesLib for bytes;\\n using BTCUtils for bytes;\\n using ValidateSPV for bytes;\\n using RelayUtils for bytes;\\n\\n bool public ready;\\n // Whether the relay requires the address submitting a retarget to be\\n // authorised in advance by governance.\\n bool public authorizationRequired;\\n // Number of blocks required for each side of a retarget proof:\\n // a retarget must provide `proofLength` blocks before the retarget\\n // and `proofLength` blocks after it.\\n // Governable\\n // Should be set to a fairly high number (e.g. 20-50) in production.\\n uint64 public proofLength;\\n // The number of the first epoch recorded by the relay.\\n // This should equal the height of the block starting the genesis epoch,\\n // divided by 2016, but this is not enforced as the relay has no\\n // information about block numbers.\\n uint64 public genesisEpoch;\\n // The number of the latest epoch whose difficulty is proven to the relay.\\n // If the genesis epoch's number is set correctly, and retargets along the\\n // way have been legitimate, this equals the height of the block starting\\n // the most recent epoch, divided by 2016.\\n uint64 public currentEpoch;\\n\\n uint256 internal currentEpochDifficulty;\\n uint256 internal prevEpochDifficulty;\\n\\n // Each epoch from genesis to the current one, keyed by their numbers.\\n mapping(uint256 => Epoch) internal epochs;\\n\\n mapping(address => bool) public isAuthorized;\\n\\n modifier relayActive() {\\n require(ready, \\\"Relay is not ready for use\\\");\\n _;\\n }\\n\\n /// @notice Establish a starting point for the relay by providing the\\n /// target, timestamp and blockheight of the first block of the relay\\n /// genesis epoch.\\n /// @param genesisHeader The first block header of the genesis epoch.\\n /// @param genesisHeight The block number of the first block of the epoch.\\n /// @param genesisProofLength The number of blocks required to accept a\\n /// proof.\\n /// @dev If the relay is used by querying the current and previous epoch\\n /// difficulty, at least one retarget needs to be provided after genesis;\\n /// otherwise the prevEpochDifficulty will be uninitialised and zero.\\n function genesis(\\n bytes calldata genesisHeader,\\n uint256 genesisHeight,\\n uint64 genesisProofLength\\n ) external onlyOwner {\\n require(!ready, \\\"Genesis already performed\\\");\\n\\n require(genesisHeader.length == 80, \\\"Invalid genesis header length\\\");\\n\\n require(\\n genesisHeight % 2016 == 0,\\n \\\"Invalid height of relay genesis block\\\"\\n );\\n\\n require(genesisProofLength < 2016, \\\"Proof length excessive\\\");\\n require(genesisProofLength > 0, \\\"Proof length may not be zero\\\");\\n\\n genesisEpoch = uint64(genesisHeight / 2016);\\n currentEpoch = genesisEpoch;\\n uint256 genesisTarget = genesisHeader.extractTarget();\\n uint256 genesisTimestamp = genesisHeader.extractTimestamp();\\n epochs[genesisEpoch] = Epoch(\\n uint32(genesisTimestamp),\\n uint224(genesisTarget)\\n );\\n proofLength = genesisProofLength;\\n currentEpochDifficulty = BTCUtils.calculateDifficulty(genesisTarget);\\n ready = true;\\n\\n emit Genesis(genesisHeight);\\n }\\n\\n /// @notice Set the number of blocks required to accept a header chain.\\n /// @param newLength The required number of blocks. Must be less than 2016.\\n /// @dev For production, a high number (e.g. 20-50) is recommended.\\n /// Small numbers are accepted but should only be used for testing.\\n function setProofLength(uint64 newLength) external relayActive onlyOwner {\\n require(newLength < 2016, \\\"Proof length excessive\\\");\\n require(newLength > 0, \\\"Proof length may not be zero\\\");\\n require(newLength != proofLength, \\\"Proof length unchanged\\\");\\n proofLength = newLength;\\n emit ProofLengthChanged(newLength);\\n }\\n\\n /// @notice Set whether the relay requires retarget submitters to be\\n /// pre-authorised by governance.\\n /// @param status True if authorisation is to be required, false if not.\\n function setAuthorizationStatus(bool status) external onlyOwner {\\n authorizationRequired = status;\\n emit AuthorizationRequirementChanged(status);\\n }\\n\\n /// @notice Authorise the given address to submit retarget proofs.\\n /// @param submitter The address to be authorised.\\n function authorize(address submitter) external onlyOwner {\\n isAuthorized[submitter] = true;\\n emit SubmitterAuthorized(submitter);\\n }\\n\\n /// @notice Rescind the authorisation of the submitter to retarget.\\n /// @param submitter The address to be deauthorised.\\n function deauthorize(address submitter) external onlyOwner {\\n isAuthorized[submitter] = false;\\n emit SubmitterDeauthorized(submitter);\\n }\\n\\n /// @notice Add a new epoch to the relay by providing a proof\\n /// of the difficulty before and after the retarget.\\n /// @param headers A chain of headers including the last X blocks before\\n /// the retarget, followed by the first X blocks after the retarget,\\n /// where X equals the current proof length.\\n /// @dev Checks that the first X blocks are valid in the most recent epoch,\\n /// that the difficulty of the new epoch is calculated correctly according\\n /// to the block timestamps, and that the next X blocks would be valid in\\n /// the new epoch.\\n /// We have no information of block heights, so we cannot enforce that\\n /// retargets only happen every 2016 blocks; instead, we assume that this\\n /// is the case if a valid proof of work is provided.\\n /// It is possible to cheat the relay by providing X blocks from earlier in\\n /// the most recent epoch, and then mining X new blocks after them.\\n /// However, each of these malicious blocks would have to be mined to a\\n /// higher difficulty than the legitimate ones.\\n /// Alternatively, if the retarget has not been performed yet, one could\\n /// first mine X blocks in the old difficulty with timestamps set far in\\n /// the future, and then another X blocks at a greatly reduced difficulty.\\n /// In either case, cheating the realy requires more work than mining X\\n /// legitimate blocks.\\n /// Only the most recent epoch is vulnerable to these attacks; once a\\n /// retarget has been proven to the relay, the epoch is immutable even if a\\n /// contradictory proof were to be presented later.\\n function retarget(bytes memory headers) external relayActive {\\n if (authorizationRequired) {\\n require(isAuthorized[msg.sender], \\\"Submitter unauthorized\\\");\\n }\\n\\n require(\\n // Require proofLength headers on both sides of the retarget\\n headers.length == (proofLength * 2 * 80),\\n \\\"Invalid header length\\\"\\n );\\n\\n Epoch storage latest = epochs[currentEpoch];\\n\\n uint256 oldTarget = latest.target;\\n\\n bytes32 previousHeaderDigest = bytes32(0);\\n\\n // Validate old chain\\n for (uint256 i = 0; i < proofLength; i++) {\\n (\\n bytes32 currentDigest,\\n uint256 currentHeaderTarget\\n ) = validateHeader(headers, i * 80, previousHeaderDigest);\\n\\n require(\\n currentHeaderTarget == oldTarget,\\n \\\"Invalid target in pre-retarget headers\\\"\\n );\\n\\n previousHeaderDigest = currentDigest;\\n }\\n\\n // get timestamp of retarget block\\n uint256 epochEndTimestamp = headers.extractTimestampAt(\\n (proofLength - 1) * 80\\n );\\n\\n // An attacker could produce blocks with timestamps in the future,\\n // in an attempt to reduce the difficulty after the retarget\\n // to make mining the second part of the retarget proof easier.\\n // In particular, the attacker could reuse all but one block\\n // from the legitimate chain, and only mine the last block.\\n // To hinder this, require that the epoch end timestamp does not\\n // exceed the ethereum timestamp.\\n // NOTE: both are unix seconds, so this comparison should be valid.\\n require(\\n /* solhint-disable-next-line not-rely-on-time */\\n epochEndTimestamp < block.timestamp,\\n \\\"Epoch cannot end in the future\\\"\\n );\\n\\n // Expected target is the full-length target\\n uint256 expectedTarget = BTCUtils.retargetAlgorithm(\\n oldTarget,\\n latest.timestamp,\\n epochEndTimestamp\\n );\\n\\n // Mined target is the header-encoded target\\n uint256 minedTarget = 0;\\n\\n uint256 epochStartTimestamp = headers.extractTimestampAt(\\n proofLength * 80\\n );\\n\\n // validate new chain\\n for (uint256 j = proofLength; j < proofLength * 2; j++) {\\n (\\n bytes32 _currentDigest,\\n uint256 _currentHeaderTarget\\n ) = validateHeader(headers, j * 80, previousHeaderDigest);\\n\\n if (minedTarget == 0) {\\n // The new target has not been set, so check its correctness\\n minedTarget = _currentHeaderTarget;\\n require(\\n // Although the target is a 256-bit number, there are only 32 bits of\\n // space in the Bitcoin header. Because of that, the version stored in\\n // the header is a less-precise representation of the actual target\\n // using base-256 version of scientific notation.\\n //\\n // The 256-bit unsigned integer returned from BTCUtils.retargetAlgorithm\\n // is the precise target value.\\n // The 256-bit unsigned integer returned from validateHeader is the less\\n // precise target value because it was read from 32 bits of space of\\n // Bitcoin block header.\\n //\\n // We can't compare the precise and less precise representations together\\n // so we first mask them to obtain the less precise version:\\n // (full & truncated) == truncated\\n _currentHeaderTarget ==\\n (expectedTarget & _currentHeaderTarget),\\n \\\"Invalid target in new epoch\\\"\\n );\\n } else {\\n // The new target has been set, so remaining targets should match.\\n require(\\n _currentHeaderTarget == minedTarget,\\n \\\"Unexpected target change after retarget\\\"\\n );\\n }\\n\\n previousHeaderDigest = _currentDigest;\\n }\\n\\n currentEpoch = currentEpoch + 1;\\n\\n epochs[currentEpoch] = Epoch(\\n uint32(epochStartTimestamp),\\n uint224(minedTarget)\\n );\\n\\n uint256 oldDifficulty = currentEpochDifficulty;\\n uint256 newDifficulty = BTCUtils.calculateDifficulty(minedTarget);\\n\\n prevEpochDifficulty = oldDifficulty;\\n currentEpochDifficulty = newDifficulty;\\n\\n emit Retarget(oldDifficulty, newDifficulty);\\n }\\n\\n /// @notice Check whether a given chain of headers should be accepted as\\n /// valid within the rules of the relay.\\n /// If the validation fails, this function throws an exception.\\n /// @param headers A chain of 2 to 2015 bitcoin headers.\\n /// @return startingHeaderTimestamp The timestamp of the first header.\\n /// @return headerCount The number of headers.\\n /// @dev A chain of headers is accepted as valid if:\\n /// - Its length is between 2 and 2015 headers.\\n /// - Headers in the chain are sequential and refer to previous digests.\\n /// - Each header is mined with the correct amount of work.\\n /// - The difficulty in each header matches an epoch of the relay,\\n /// as determined by the headers' timestamps. The headers must be between\\n /// the genesis epoch and the latest proven epoch (inclusive).\\n /// If the chain contains a retarget, it is accepted if the retarget has\\n /// already been proven to the relay.\\n /// If the chain contains blocks of an epoch that has not been proven to\\n /// the relay (after a retarget within the header chain, or when the entire\\n /// chain falls within an epoch that has not been proven yet), it will be\\n /// rejected.\\n /// One exception to this is when two subsequent epochs have exactly the\\n /// same difficulty; headers from the latter epoch will be accepted if the\\n /// previous epoch has been proven to the relay.\\n /// This is because it is not possible to distinguish such headers from\\n /// headers of the previous epoch.\\n ///\\n /// If the difficulty increases significantly between relay genesis and the\\n /// present, creating fraudulent proofs for earlier epochs becomes easier.\\n /// Users of the relay should check the timestamps of valid headers and\\n /// only accept appropriately recent ones.\\n function validateChain(bytes memory headers)\\n external\\n view\\n returns (uint256 startingHeaderTimestamp, uint256 headerCount)\\n {\\n require(headers.length % 80 == 0, \\\"Invalid header length\\\");\\n\\n headerCount = headers.length / 80;\\n\\n require(\\n headerCount > 1 && headerCount < 2016,\\n \\\"Invalid number of headers\\\"\\n );\\n\\n startingHeaderTimestamp = headers.extractTimestamp();\\n\\n // Short-circuit the first header's validation.\\n // We validate the header here to get the target which is needed to\\n // precisely identify the epoch.\\n (\\n bytes32 previousHeaderDigest,\\n uint256 currentHeaderTarget\\n ) = validateHeader(headers, 0, bytes32(0));\\n\\n Epoch memory nullEpoch = Epoch(0, 0);\\n\\n uint256 startingEpochNumber = currentEpoch;\\n Epoch memory startingEpoch = epochs[startingEpochNumber];\\n Epoch memory nextEpoch = nullEpoch;\\n\\n // Find the correct epoch for the given chain\\n // Fastest with recent epochs, but able to handle anything after genesis\\n //\\n // The rules for bitcoin timestamps are:\\n // - must be greater than the median of the last 11 blocks' timestamps\\n // - must be less than the network-adjusted time +2 hours\\n //\\n // Because of this, the timestamp of a header may be smaller than the\\n // starting time, or greater than the ending time of its epoch.\\n // However, a valid timestamp is guaranteed to fall within the window\\n // formed by the epochs immediately before and after its timestamp.\\n // We can identify cases like these by comparing the targets.\\n while (startingHeaderTimestamp < startingEpoch.timestamp) {\\n startingEpochNumber -= 1;\\n nextEpoch = startingEpoch;\\n startingEpoch = epochs[startingEpochNumber];\\n }\\n\\n // We have identified the centre of the window,\\n // by reaching the most recent epoch whose starting timestamp\\n // or reached before the genesis where epoch slots are empty.\\n // Therefore check that the timestamp is nonzero.\\n require(\\n startingEpoch.timestamp > 0,\\n \\\"Cannot validate chains before relay genesis\\\"\\n );\\n\\n // The targets don't match. This could be because the block is invalid,\\n // or it could be because of timestamp inaccuracy.\\n // To cover the latter case, check adjacent epochs.\\n if (currentHeaderTarget != startingEpoch.target) {\\n // The target matches the next epoch.\\n // This means we are right at the beginning of the next epoch,\\n // and retargets during the chain should not be possible.\\n if (currentHeaderTarget == nextEpoch.target) {\\n startingEpoch = nextEpoch;\\n nextEpoch = nullEpoch;\\n }\\n // The target doesn't match the next epoch.\\n // Therefore the only valid epoch is the previous one.\\n // Because the timestamp can't be more than 2 hours into the future\\n // we must be right near the end of the epoch,\\n // so a retarget is possible.\\n else {\\n startingEpochNumber -= 1;\\n nextEpoch = startingEpoch;\\n startingEpoch = epochs[startingEpochNumber];\\n\\n // We have failed to find a match,\\n // therefore the target has to be invalid.\\n require(\\n currentHeaderTarget == startingEpoch.target,\\n \\\"Invalid target in header chain\\\"\\n );\\n }\\n }\\n\\n // We've found the correct epoch for the first header.\\n // Validate the rest.\\n for (uint256 i = 1; i < headerCount; i++) {\\n bytes32 currentDigest;\\n (currentDigest, currentHeaderTarget) = validateHeader(\\n headers,\\n i * 80,\\n previousHeaderDigest\\n );\\n\\n // If the header's target does not match the expected target,\\n // check if a retarget is possible.\\n //\\n // If next epoch timestamp exists, a valid retarget is possible\\n // (if next epoch timestamp doesn't exist, either a retarget has\\n // already happened in this chain, the relay needs a retarget\\n // before this chain can be validated, or a retarget is not allowed\\n // because we know the headers are within a timestamp irregularity\\n // of the previous retarget).\\n //\\n // In this case the target must match the next epoch's target,\\n // and the header's timestamp must match the epoch's start.\\n if (currentHeaderTarget != startingEpoch.target) {\\n uint256 currentHeaderTimestamp = headers.extractTimestampAt(\\n i * 80\\n );\\n\\n require(\\n nextEpoch.timestamp != 0 &&\\n currentHeaderTarget == nextEpoch.target &&\\n currentHeaderTimestamp == nextEpoch.timestamp,\\n \\\"Invalid target in header chain\\\"\\n );\\n\\n startingEpoch = nextEpoch;\\n nextEpoch = nullEpoch;\\n }\\n\\n previousHeaderDigest = currentDigest;\\n }\\n\\n return (startingHeaderTimestamp, headerCount);\\n }\\n\\n /// @notice Get the difficulty of the specified block.\\n /// @param blockNumber The number of the block. Must fall within the relay\\n /// range (at or after the relay genesis, and at or before the end of the\\n /// most recent epoch proven to the relay).\\n /// @return The difficulty of the epoch.\\n function getBlockDifficulty(uint256 blockNumber)\\n external\\n view\\n returns (uint256)\\n {\\n return getEpochDifficulty(blockNumber / 2016);\\n }\\n\\n /// @notice Get the range of blocks the relay can accept proofs for.\\n /// @dev Assumes that the genesis has been set correctly.\\n /// Additionally, if the next epoch after the current one has the exact\\n /// same difficulty, headers for it can be validated as well.\\n /// This function should be used for informative purposes,\\n /// e.g. to determine whether a retarget must be provided before submitting\\n /// a header chain for validation.\\n /// @return relayGenesis The height of the earliest block that can be\\n /// included in header chains for the relay to validate.\\n /// @return currentEpochEnd The height of the last block that can be\\n /// included in header chains for the relay to validate.\\n function getRelayRange()\\n external\\n view\\n returns (uint256 relayGenesis, uint256 currentEpochEnd)\\n {\\n relayGenesis = genesisEpoch * 2016;\\n currentEpochEnd = (currentEpoch * 2016) + 2015;\\n }\\n\\n /// @notice Returns the difficulty of the current epoch.\\n /// @dev returns 0 if the relay is not ready.\\n /// @return The difficulty of the current epoch.\\n function getCurrentEpochDifficulty()\\n external\\n view\\n virtual\\n returns (uint256)\\n {\\n return currentEpochDifficulty;\\n }\\n\\n /// @notice Returns the difficulty of the previous epoch.\\n /// @dev Returns 0 if the relay is not ready or has not had a retarget.\\n /// @return The difficulty of the previous epoch.\\n function getPrevEpochDifficulty() external view virtual returns (uint256) {\\n return prevEpochDifficulty;\\n }\\n\\n function getCurrentAndPrevEpochDifficulty()\\n external\\n view\\n returns (uint256 current, uint256 previous)\\n {\\n return (currentEpochDifficulty, prevEpochDifficulty);\\n }\\n\\n /// @notice Get the difficulty of the specified epoch.\\n /// @param epochNumber The number of the epoch (the height of the first\\n /// block of the epoch, divided by 2016). Must fall within the relay range.\\n /// @return The difficulty of the epoch.\\n function getEpochDifficulty(uint256 epochNumber)\\n public\\n view\\n returns (uint256)\\n {\\n require(epochNumber >= genesisEpoch, \\\"Epoch is before relay genesis\\\");\\n require(\\n epochNumber <= currentEpoch,\\n \\\"Epoch is not proven to the relay yet\\\"\\n );\\n return BTCUtils.calculateDifficulty(epochs[epochNumber].target);\\n }\\n\\n /// @notice Check that the specified header forms a correct chain with the\\n /// digest of the previous header (if provided), and has sufficient work.\\n /// @param headers The byte array containing the header of interest.\\n /// @param start The start of the header in the array.\\n /// @param prevDigest The digest of the previous header\\n /// (optional; providing zeros for the digest skips the check).\\n /// @return digest The digest of the current header.\\n /// @return target The PoW target of the header.\\n /// @dev Throws an exception if the header's chain or PoW are invalid.\\n /// Performs no other validation.\\n function validateHeader(\\n bytes memory headers,\\n uint256 start,\\n bytes32 prevDigest\\n ) internal view returns (bytes32 digest, uint256 target) {\\n // If previous block digest has been provided, require that it matches\\n if (prevDigest != bytes32(0)) {\\n require(\\n headers.validateHeaderPrevHash(start, prevDigest),\\n \\\"Invalid chain\\\"\\n );\\n }\\n\\n // Require that the header has sufficient work for its stated target\\n target = headers.extractTargetAt(start);\\n digest = headers.hash256Slice(start, 80);\\n require(ValidateSPV.validateHeaderWork(digest, target), \\\"Invalid work\\\");\\n\\n return (digest, target);\\n }\\n}\\n\",\"keccak256\":\"0x5329ba57ec3db13128ba0a90569682b16211f7fbc3fbab764fd0cd60386a7441\",\"license\":\"GPL-3.0-only\"},\"contracts/test/GoerliLightRelay.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0-only\\n\\n// \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\n// \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\n// \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588 \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n// \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c \\u2590\\u2588\\u2588\\u2588\\u2588\\u258c\\n\\npragma solidity 0.8.17;\\n\\nimport {BTCUtils} from \\\"@keep-network/bitcoin-spv-sol/contracts/BTCUtils.sol\\\";\\n\\nimport \\\"../relay/LightRelay.sol\\\";\\n\\n/// @title Goerli Light Relay\\n/// @notice GoerliLightRelay is a stub version of LightRelay intended to be\\n/// used on the Goerli test network. It allows to set the relay's\\n/// difficulty based on arbitrary Bitcoin headers thus effectively\\n/// bypass the validation of difficulties of Bitcoin testnet blocks.\\n/// Since difficulty in Bitcoin testnet often falls to `1` it would not\\n/// be possible to validate blocks with the real LightRelay.\\n/// @dev Notice that GoerliLightRelay is derived from LightRelay so that the two\\n/// contracts have the same API and correct bindings can be generated.\\ncontract GoerliLightRelay is LightRelay {\\n using BTCUtils for bytes;\\n using BTCUtils for uint256;\\n\\n /// @notice Sets the current and previous difficulty based on the difficulty\\n /// inferred from the provided Bitcoin headers.\\n function setDifficultyFromHeaders(bytes memory bitcoinHeaders)\\n external\\n onlyOwner\\n {\\n uint256 firstHeaderDiff = bitcoinHeaders\\n .extractTarget()\\n .calculateDifficulty();\\n\\n currentEpochDifficulty = firstHeaderDiff;\\n prevEpochDifficulty = firstHeaderDiff;\\n }\\n}\\n\",\"keccak256\":\"0xc43db499b9d3f3ad3708eab75096eb9ccb9f667379cbeb11999766d9786eb375\",\"license\":\"GPL-3.0-only\"}},\"version\":1}",
|
|
11792
11825
|
"storageLayout": {
|
|
11793
11826
|
"storage": [
|
|
11794
11827
|
{
|
|
@@ -11958,13 +11991,13 @@
|
|
|
11958
11991
|
"notice": "Get the difficulty of the specified block."
|
|
11959
11992
|
},
|
|
11960
11993
|
"getCurrentEpochDifficulty()": {
|
|
11961
|
-
"notice": "Returns
|
|
11994
|
+
"notice": "Returns the difficulty of the current epoch."
|
|
11962
11995
|
},
|
|
11963
11996
|
"getEpochDifficulty(uint256)": {
|
|
11964
11997
|
"notice": "Get the difficulty of the specified epoch."
|
|
11965
11998
|
},
|
|
11966
11999
|
"getPrevEpochDifficulty()": {
|
|
11967
|
-
"notice": "Returns
|
|
12000
|
+
"notice": "Returns the difficulty of the previous epoch."
|
|
11968
12001
|
},
|
|
11969
12002
|
"getRelayRange()": {
|
|
11970
12003
|
"notice": "Get the range of blocks the relay can accept proofs for."
|
|
@@ -11975,6 +12008,9 @@
|
|
|
11975
12008
|
"setAuthorizationStatus(bool)": {
|
|
11976
12009
|
"notice": "Set whether the relay requires retarget submitters to be pre-authorised by governance."
|
|
11977
12010
|
},
|
|
12011
|
+
"setDifficultyFromHeaders(bytes)": {
|
|
12012
|
+
"notice": "Sets the current and previous difficulty based on the difficulty inferred from the provided Bitcoin headers."
|
|
12013
|
+
},
|
|
11978
12014
|
"setProofLength(uint64)": {
|
|
11979
12015
|
"notice": "Set the number of blocks required to accept a header chain."
|
|
11980
12016
|
},
|
|
@@ -11982,7 +12018,7 @@
|
|
|
11982
12018
|
"notice": "Check whether a given chain of headers should be accepted as valid within the rules of the relay. If the validation fails, this function throws an exception."
|
|
11983
12019
|
}
|
|
11984
12020
|
},
|
|
11985
|
-
"notice": "GoerliLightRelay is a stub version of LightRelay intended to be used on the Goerli test network. It
|
|
12021
|
+
"notice": "GoerliLightRelay is a stub version of LightRelay intended to be used on the Goerli test network. It allows to set the relay's difficulty based on arbitrary Bitcoin headers thus effectively bypass the validation of difficulties of Bitcoin testnet blocks. Since difficulty in Bitcoin testnet often falls to `1` it would not be possible to validate blocks with the real LightRelay.",
|
|
11986
12022
|
"version": 1
|
|
11987
12023
|
}
|
|
11988
12024
|
}
|