Commit 7e6eb9b2 authored by Maurelian's avatar Maurelian Committed by GitHub

getL2Output reverts if not found (#2979)

* feat(bedrock): getL2Output reverts if not found

feat(bedrock): Handle error on empty output in Portal

feat(ctb): use isOutputFinalized in finalizeWithdrawalTx

* ctb: Remove extraneous abi encoding

Revert "feat(ctb): use isOutputFinalized in finalizeWithdrawalTx"

This reverts commit 4d4e89d4f624b8cbd95c1ad2800027bfe561c213.

ctb: getL2Output returns the next output for a block

ctb: Fix error message style
parent 8bd7abde
---
'@eth-optimism/contracts-bedrock': patch
---
The output oracle's getL2Output function now reverts when no output is returned
...@@ -37,7 +37,7 @@ type L2OutputOracleOutputProposal struct { ...@@ -37,7 +37,7 @@ type L2OutputOracleOutputProposal struct {
// L2OutputOracleMetaData contains all meta data concerning the L2OutputOracle contract. // L2OutputOracleMetaData contains all meta data concerning the L2OutputOracle contract.
var L2OutputOracleMetaData = &bind.MetaData{ var L2OutputOracleMetaData = &bind.MetaData{
ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_submissionInterval\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_genesisL2Output\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_historicalTotalBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_startingBlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_startingTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockTime\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_proposer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"l1Timestamp\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"OutputDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"l1Timestamp\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"OutputProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousProposer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newProposer\",\"type\":\"address\"}],\"name\":\"ProposerChanged\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"HISTORICAL_TOTAL_BLOCKS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_BLOCK_TIME\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STARTING_BLOCK_NUMBER\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STARTING_TIMESTAMP\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SUBMISSION_INTERVAL\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newProposer\",\"type\":\"address\"}],\"name\":\"changeProposer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"computeL2Timestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"internalType\":\"structL2OutputOracle.OutputProposal\",\"name\":\"_proposal\",\"type\":\"tuple\"}],\"name\":\"deleteL2Output\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"getL2Output\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"internalType\":\"structL2OutputOracle.OutputProposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_genesisL2Output\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_startingBlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_proposer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_l1Blockhash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_l1BlockNumber\",\"type\":\"uint256\"}],\"name\":\"proposeL2Output\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proposer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_submissionInterval\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_genesisL2Output\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_historicalTotalBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_startingBlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_startingTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockTime\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_proposer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"l1Timestamp\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"OutputDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"l1Timestamp\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"OutputProposed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousProposer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newProposer\",\"type\":\"address\"}],\"name\":\"ProposerChanged\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"HISTORICAL_TOTAL_BLOCKS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_BLOCK_TIME\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STARTING_BLOCK_NUMBER\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"STARTING_TIMESTAMP\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SUBMISSION_INTERVAL\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newProposer\",\"type\":\"address\"}],\"name\":\"changeProposer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"computeL2Timestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"internalType\":\"structL2OutputOracle.OutputProposal\",\"name\":\"_proposal\",\"type\":\"tuple\"}],\"name\":\"deleteL2Output\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"getL2Output\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"internalType\":\"structL2OutputOracle.OutputProposal\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_genesisL2Output\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_startingBlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_proposer\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_l1Blockhash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_l1BlockNumber\",\"type\":\"uint256\"}],\"name\":\"proposeL2Output\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proposer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
Bin: "0x6101806040523480156200001257600080fd5b5060405162002173380380620021738339810160408190526200003591620005e6565b6000608081905260a052600160c052428310620000cd5760405162461bcd60e51b8152602060048201526044602482018190527f4c324f75747075744f7261636c653a20696e697469616c204c3220626c6f636b908201527f2074696d65206d757374206265206c657373207468616e2063757272656e742060648201526374696d6560e01b608482015260a4015b60405180910390fd5b60e0889052610100869052610120859052610140849052610160839052620000f88786848462000106565b505050505050505062000658565b6000620001146001620001cf565b905080156200012d576000805461ff0019166101001790555b604080518082018252868152426020808301918252600088815260679091529290922090518155905160019091015560668490556200016b620002e2565b62000176836200034a565b620001818262000506565b8015620001c8576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60008054610100900460ff161562000264578160ff16600114801562000208575062000206306200055860201b620011df1760201c565b155b6200025c5760405162461bcd60e51b815260206004820152602e60248201526000805160206200213383398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620000c4565b506000919050565b60005460ff808416911610620002c35760405162461bcd60e51b815260206004820152602e60248201526000805160206200213383398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620000c4565b506000805460ff191660ff92909216919091179055600190565b919050565b600054610100900460ff166200033e5760405162461bcd60e51b815260206004820152602b60248201526000805160206200215383398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000c4565b6200034862000567565b565b6033546001600160a01b03163314620003a65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620000c4565b6001600160a01b038116620004245760405162461bcd60e51b815260206004820152603760248201527f4c324f75747075744f7261636c653a206e65772070726f706f7365722063616e60448201527f6e6f7420626520746865207a65726f20616464726573730000000000000000006064820152608401620000c4565b6033546001600160a01b0382811691161415620004aa5760405162461bcd60e51b815260206004820152603860248201527f4c324f75747075744f7261636c653a2070726f706f7365722063616e6e6f742060448201527f6265207468652073616d6520617320746865206f776e657200000000000000006064820152608401620000c4565b6065546040516001600160a01b038084169216907f3d7728dc2838bb794606bd89f5a37930830b32060f69ee929bbfc59b669024dd90600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03163b151590565b600054610100900460ff16620005c35760405162461bcd60e51b815260206004820152602b60248201526000805160206200215383398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000c4565b620003483362000506565b80516001600160a01b0381168114620002dd57600080fd5b600080600080600080600080610100898b0312156200060457600080fd5b885197506020890151965060408901519550606089015194506080890151935060a089015192506200063960c08a01620005ce565b91506200064960e08a01620005ce565b90509295985092959890939650565b60805160a05160c05160e05161010051610120516101405161016051611a4b620006e86000396000818161013f0152610efe0152600081816101a80152610f570152600081816101f201528181610e280152610f2201526000610384015260008181610226015281816106c2015261107e015260006107470152600061071e015260006106f50152611a4b6000f3fe6080604052600436106101285760003560e01c80638da5cb5b116100a5578063a8e4fb9011610074578063d20b1a5111610059578063d20b1a51146103f3578063dcec334814610413578063f2fde38b1461042857600080fd5b8063a8e4fb90146103a6578063d1de856c146103d357600080fd5b80638da5cb5b1461029f5780639aaab648146102eb578063a25ae557146102fe578063a4771aad1461037257600080fd5b80634ab65d73116100fc57806354fd4d50116100e157806354fd4d5014610248578063715018a61461026a57806372d5fe211461027f57600080fd5b80634ab65d73146101e0578063529933df1461021457600080fd5b80622134cc1461012d578063093b3d901461017457806320e9fcd4146101965780634599c788146101ca575b600080fd5b34801561013957600080fd5b506101617f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b34801561018057600080fd5b5061019461018f3660046116a0565b610448565b005b3480156101a257600080fd5b506101617f000000000000000000000000000000000000000000000000000000000000000081565b3480156101d657600080fd5b5061016160665481565b3480156101ec57600080fd5b506101617f000000000000000000000000000000000000000000000000000000000000000081565b34801561022057600080fd5b506101617f000000000000000000000000000000000000000000000000000000000000000081565b34801561025457600080fd5b5061025d6106ee565b60405161016b9190611746565b34801561027657600080fd5b50610194610791565b34801561028b57600080fd5b5061019461029a3660046117bb565b61081e565b3480156102ab57600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161016b565b6101946102f93660046117dd565b610a7b565b34801561030a57600080fd5b5061035761031936600461180f565b604080518082019091526000808252602082015250600090815260676020908152604091829020825180840190935280548352600101549082015290565b6040805182518152602092830151928101929092520161016b565b34801561037e57600080fd5b506101617f000000000000000000000000000000000000000000000000000000000000000081565b3480156103b257600080fd5b506065546102c69073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103df57600080fd5b506101616103ee36600461180f565b610e24565b3480156103ff57600080fd5b5061019461040e366004611828565b610f81565b34801561041f57600080fd5b5061016161107a565b34801561043457600080fd5b506101946104433660046117bb565b6110af565b60335473ffffffffffffffffffffffffffffffffffffffff1633146104ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b60665460009081526067602090815260409182902082518084019093528054808452600190910154918301919091528251146105b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604f60248201527f4c324f75747075744f7261636c653a206f757470757420726f6f7420746f206460448201527f656c65746520646f6573206e6f74206d6174636820746865206c61746573742060648201527f6f75747075742070726f706f73616c0000000000000000000000000000000000608482015260a4016104c5565b806020015182602001511461066f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f4c324f75747075744f7261636c653a2074696d657374616d7020746f2064656c60448201527f65746520646f6573206e6f74206d6174636820746865206c6174657374206f7560648201527f747075742070726f706f73616c00000000000000000000000000000000000000608482015260a4016104c5565b606654602082015182516040517f11e942315215fbc11bf574b22ca610d001e704d870a2307833c188d31600b5c690600090a460668054600090815260676020526040812081815560010155546106e7907f00000000000000000000000000000000000000000000000000000000000000009061189d565b6066555050565b60606107197f00000000000000000000000000000000000000000000000000000000000000006111fb565b6107427f00000000000000000000000000000000000000000000000000000000000000006111fb565b61076b7f00000000000000000000000000000000000000000000000000000000000000006111fb565b60405160200161077d939291906118b4565b604051602081830303815290604052905090565b60335473ffffffffffffffffffffffffffffffffffffffff163314610812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104c5565b61081c6000611335565b565b60335473ffffffffffffffffffffffffffffffffffffffff16331461089f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104c5565b73ffffffffffffffffffffffffffffffffffffffff8116610942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4c324f75747075744f7261636c653a206e65772070726f706f7365722063616e60448201527f6e6f7420626520746865207a65726f206164647265737300000000000000000060648201526084016104c5565b60335473ffffffffffffffffffffffffffffffffffffffff828116911614156109ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4c324f75747075744f7261636c653a2070726f706f7365722063616e6e6f742060448201527f6265207468652073616d6520617320746865206f776e6572000000000000000060648201526084016104c5565b60655460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f3d7728dc2838bb794606bd89f5a37930830b32060f69ee929bbfc59b669024dd90600090a3606580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60655473ffffffffffffffffffffffffffffffffffffffff163314610b22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4c324f75747075744f7261636c653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642062792070726f706f73657200000000000000000060648201526084016104c5565b610b2a61107a565b8314610bde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a20626c6f636b206e756d626572206d757360448201527f7420626520657175616c20746f206e65787420657870656374656420626c6f6360648201527f6b206e756d626572000000000000000000000000000000000000000000000000608482015260a4016104c5565b42610be884610e24565b10610c75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c324f75747075744f7261636c653a2063616e6e6f742070726f706f7365204c60448201527f32206f757470757420696e20746865206675747572650000000000000000000060648201526084016104c5565b83610d02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a204c32206f75747075742070726f706f7360448201527f616c2063616e6e6f7420626520746865207a65726f206861736800000000000060648201526084016104c5565b8115610dbe5781814014610dbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a20626c6f636b6861736820646f6573206e60448201527f6f74206d6174636820746865206861736820617420746865206578706563746560648201527f6420686569676874000000000000000000000000000000000000000000000000608482015260a4016104c5565b6040805180820182528581524260208083018281526000888152606790925284822093518455516001909301929092556066869055915185929187917fc120f5e881491e6e212befa39e36b8f57d5eca31915f2e5d60a420f418caa6df9190a450505050565b60007f0000000000000000000000000000000000000000000000000000000000000000821015610efc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605360248201527f4c324f75747075744f7261636c653a20626c6f636b206e756d626572206d757360448201527f742062652067726561746572207468616e206f7220657175616c20746f20737460648201527f617274696e6720626c6f636b206e756d62657200000000000000000000000000608482015260a4016104c5565b7f0000000000000000000000000000000000000000000000000000000000000000610f477f00000000000000000000000000000000000000000000000000000000000000008461189d565b610f51919061192a565b610f7b907f0000000000000000000000000000000000000000000000000000000000000000611967565b92915050565b6000610f8d60016113ac565b90508015610fc257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60408051808201825286815242602080830191825260008881526067909152929092209051815590516001909101556066849055610ffe611537565b6110078361081e565b61101082611335565b801561107357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006066546110aa9190611967565b905090565b60335473ffffffffffffffffffffffffffffffffffffffff163314611130576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104c5565b73ffffffffffffffffffffffffffffffffffffffff81166111d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104c5565b6111dc81611335565b50565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60608161123b57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611265578061124f8161197f565b915061125e9050600a836119e7565b915061123f565b60008167ffffffffffffffff81111561128057611280611671565b6040519080825280601f01601f1916602001820160405280156112aa576020820181803683370190505b5090505b841561132d576112bf60018361189d565b91506112cc600a866119fb565b6112d7906030611967565b60f81b8183815181106112ec576112ec611a0f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611326600a866119e7565b94506112ae565b949350505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008054610100900460ff1615611463578160ff1660011480156113cf5750303b155b61145b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104c5565b506000919050565b60005460ff8084169116106114fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104c5565b50600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055600190565b919050565b600054610100900460ff166115ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104c5565b61081c600054610100900460ff16611668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104c5565b61081c33611335565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000604082840312156116b257600080fd5b6040516040810181811067ffffffffffffffff821117156116fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604052823581526020928301359281019290925250919050565b60005b83811015611731578181015183820152602001611719565b83811115611740576000848401525b50505050565b6020815260008251806020840152611765816040850160208701611716565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461153257600080fd5b6000602082840312156117cd57600080fd5b6117d682611797565b9392505050565b600080600080608085870312156117f357600080fd5b5050823594602084013594506040840135936060013592509050565b60006020828403121561182157600080fd5b5035919050565b6000806000806080858703121561183e57600080fd5b843593506020850135925061185560408601611797565b915061186360608601611797565b905092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156118af576118af61186e565b500390565b600084516118c6818460208901611716565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551611902816001850160208a01611716565b6001920191820152835161191d816002840160208801611716565b0160020195945050505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156119625761196261186e565b500290565b6000821982111561197a5761197a61186e565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156119b1576119b161186e565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826119f6576119f66119b8565b500490565b600082611a0a57611a0a6119b8565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c634300080a000a496e697469616c697a61626c653a20636f6e747261637420697320616c726561496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069", Bin: "0x6101806040523480156200001257600080fd5b5060405162002398380380620023988339810160408190526200003591620005e6565b6000608081905260a052600160c052428310620000cd5760405162461bcd60e51b8152602060048201526044602482018190527f4c324f75747075744f7261636c653a20696e697469616c204c3220626c6f636b908201527f2074696d65206d757374206265206c657373207468616e2063757272656e742060648201526374696d6560e01b608482015260a4015b60405180910390fd5b60e0889052610100869052610120859052610140849052610160839052620000f88786848462000106565b505050505050505062000658565b6000620001146001620001cf565b905080156200012d576000805461ff0019166101001790555b604080518082018252868152426020808301918252600088815260679091529290922090518155905160019091015560668490556200016b620002e2565b62000176836200034a565b620001818262000506565b8015620001c8576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60008054610100900460ff161562000264578160ff16600114801562000208575062000206306200055860201b620013f01760201c565b155b6200025c5760405162461bcd60e51b815260206004820152602e60248201526000805160206200235883398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620000c4565b506000919050565b60005460ff808416911610620002c35760405162461bcd60e51b815260206004820152602e60248201526000805160206200235883398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620000c4565b506000805460ff191660ff92909216919091179055600190565b919050565b600054610100900460ff166200033e5760405162461bcd60e51b815260206004820152602b60248201526000805160206200237883398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000c4565b6200034862000567565b565b6033546001600160a01b03163314620003a65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620000c4565b6001600160a01b038116620004245760405162461bcd60e51b815260206004820152603760248201527f4c324f75747075744f7261636c653a206e65772070726f706f7365722063616e60448201527f6e6f7420626520746865207a65726f20616464726573730000000000000000006064820152608401620000c4565b6033546001600160a01b0382811691161415620004aa5760405162461bcd60e51b815260206004820152603860248201527f4c324f75747075744f7261636c653a2070726f706f7365722063616e6e6f742060448201527f6265207468652073616d6520617320746865206f776e657200000000000000006064820152608401620000c4565b6065546040516001600160a01b038084169216907f3d7728dc2838bb794606bd89f5a37930830b32060f69ee929bbfc59b669024dd90600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03163b151590565b600054610100900460ff16620005c35760405162461bcd60e51b815260206004820152602b60248201526000805160206200237883398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000c4565b620003483362000506565b80516001600160a01b0381168114620002dd57600080fd5b600080600080600080600080610100898b0312156200060457600080fd5b885197506020890151965060408901519550606089015194506080890151935060a089015192506200063960c08a01620005ce565b91506200064960e08a01620005ce565b90509295985092959890939650565b60805160a05160c05160e05161010051610120516101405161016051611c54620007046000396000818161013f015261110f0152600081816101a801526111680152600081816101f201528181610e0101528181610efd0152818161103901526111330152600061034b0152600081816102260152818161068901528181610ed901528181610f3c015261128f0152600061070e015260006106e5015260006106bc0152611c546000f3fe6080604052600436106101285760003560e01c80638da5cb5b116100a5578063a8e4fb9011610074578063d20b1a5111610059578063d20b1a51146103ba578063dcec3348146103da578063f2fde38b146103ef57600080fd5b8063a8e4fb901461036d578063d1de856c1461039a57600080fd5b80638da5cb5b1461029f5780639aaab648146102eb578063a25ae557146102fe578063a4771aad1461033957600080fd5b80634ab65d73116100fc57806354fd4d50116100e157806354fd4d5014610248578063715018a61461026a57806372d5fe211461027f57600080fd5b80634ab65d73146101e0578063529933df1461021457600080fd5b80622134cc1461012d578063093b3d901461017457806320e9fcd4146101965780634599c788146101ca575b600080fd5b34801561013957600080fd5b506101617f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b34801561018057600080fd5b5061019461018f3660046118a9565b61040f565b005b3480156101a257600080fd5b506101617f000000000000000000000000000000000000000000000000000000000000000081565b3480156101d657600080fd5b5061016160665481565b3480156101ec57600080fd5b506101617f000000000000000000000000000000000000000000000000000000000000000081565b34801561022057600080fd5b506101617f000000000000000000000000000000000000000000000000000000000000000081565b34801561025457600080fd5b5061025d6106b5565b60405161016b919061194f565b34801561027657600080fd5b50610194610758565b34801561028b57600080fd5b5061019461029a3660046119c4565b6107e5565b3480156102ab57600080fd5b5060335473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161016b565b6101946102f93660046119e6565b610a42565b34801561030a57600080fd5b5061031e610319366004611a18565b610deb565b6040805182518152602092830151928101929092520161016b565b34801561034557600080fd5b506101617f000000000000000000000000000000000000000000000000000000000000000081565b34801561037957600080fd5b506065546102c69073ffffffffffffffffffffffffffffffffffffffff1681565b3480156103a657600080fd5b506101616103b5366004611a18565b611035565b3480156103c657600080fd5b506101946103d5366004611a31565b611192565b3480156103e657600080fd5b5061016161128b565b3480156103fb57600080fd5b5061019461040a3660046119c4565b6112c0565b60335473ffffffffffffffffffffffffffffffffffffffff163314610495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6066546000908152606760209081526040918290208251808401909352805480845260019091015491830191909152825114610579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604f60248201527f4c324f75747075744f7261636c653a206f757470757420726f6f7420746f206460448201527f656c65746520646f6573206e6f74206d6174636820746865206c61746573742060648201527f6f75747075742070726f706f73616c0000000000000000000000000000000000608482015260a40161048c565b8060200151826020015114610636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f4c324f75747075744f7261636c653a2074696d657374616d7020746f2064656c60448201527f65746520646f6573206e6f74206d6174636820746865206c6174657374206f7560648201527f747075742070726f706f73616c00000000000000000000000000000000000000608482015260a40161048c565b606654602082015182516040517f11e942315215fbc11bf574b22ca610d001e704d870a2307833c188d31600b5c690600090a460668054600090815260676020526040812081815560010155546106ae907f000000000000000000000000000000000000000000000000000000000000000090611aa6565b6066555050565b60606106e07f000000000000000000000000000000000000000000000000000000000000000061140c565b6107097f000000000000000000000000000000000000000000000000000000000000000061140c565b6107327f000000000000000000000000000000000000000000000000000000000000000061140c565b60405160200161074493929190611abd565b604051602081830303815290604052905090565b60335473ffffffffffffffffffffffffffffffffffffffff1633146107d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161048c565b6107e3600061153e565b565b60335473ffffffffffffffffffffffffffffffffffffffff163314610866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161048c565b73ffffffffffffffffffffffffffffffffffffffff8116610909576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4c324f75747075744f7261636c653a206e65772070726f706f7365722063616e60448201527f6e6f7420626520746865207a65726f2061646472657373000000000000000000606482015260840161048c565b60335473ffffffffffffffffffffffffffffffffffffffff828116911614156109b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4c324f75747075744f7261636c653a2070726f706f7365722063616e6e6f742060448201527f6265207468652073616d6520617320746865206f776e65720000000000000000606482015260840161048c565b60655460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f3d7728dc2838bb794606bd89f5a37930830b32060f69ee929bbfc59b669024dd90600090a3606580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60655473ffffffffffffffffffffffffffffffffffffffff163314610ae9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4c324f75747075744f7261636c653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642062792070726f706f736572000000000000000000606482015260840161048c565b610af161128b565b8314610ba5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a20626c6f636b206e756d626572206d757360448201527f7420626520657175616c20746f206e65787420657870656374656420626c6f6360648201527f6b206e756d626572000000000000000000000000000000000000000000000000608482015260a40161048c565b42610baf84611035565b10610c3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c324f75747075744f7261636c653a2063616e6e6f742070726f706f7365204c60448201527f32206f757470757420696e207468652066757475726500000000000000000000606482015260840161048c565b83610cc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4c324f75747075744f7261636c653a204c32206f75747075742070726f706f7360448201527f616c2063616e6e6f7420626520746865207a65726f2068617368000000000000606482015260840161048c565b8115610d855781814014610d85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f4c324f75747075744f7261636c653a20626c6f636b6861736820646f6573206e60448201527f6f74206d6174636820746865206861736820617420746865206578706563746560648201527f6420686569676874000000000000000000000000000000000000000000000000608482015260a40161048c565b6040805180820182528581524260208083018281526000888152606790925284822093518455516001909301929092556066869055915185929187917fc120f5e881491e6e212befa39e36b8f57d5eca31915f2e5d60a420f418caa6df9190a450505050565b60408051808201909152600080825260208201527f0000000000000000000000000000000000000000000000000000000000000000821015610ed5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4c324f75747075744f7261636c653a20626c6f636b206e756d6265722063616e60448201527f6e6f74206265206c657373207468616e20746865207374617274696e6720626c60648201527f6f636b206e756d6265722e000000000000000000000000000000000000000000608482015260a40161048c565b60007f0000000000000000000000000000000000000000000000000000000000000000610f227f000000000000000000000000000000000000000000000000000000000000000085611aa6565b610f2c9190611b62565b905060008115610f6f57610f60827f0000000000000000000000000000000000000000000000000000000000000000611aa6565b610f6a9085611b76565b610f71565b835b60008181526067602090815260409182902082518084019093528054808452600190910154918301919091529192509061102d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f4c324f75747075744f7261636c653a204e6f206f757470757420666f756e642060448201527f666f72207468617420626c6f636b206e756d6265722e00000000000000000000606482015260840161048c565b949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000082101561110d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605360248201527f4c324f75747075744f7261636c653a20626c6f636b206e756d626572206d757360448201527f742062652067726561746572207468616e206f7220657175616c20746f20737460648201527f617274696e6720626c6f636b206e756d62657200000000000000000000000000608482015260a40161048c565b7f00000000000000000000000000000000000000000000000000000000000000006111587f000000000000000000000000000000000000000000000000000000000000000084611aa6565b6111629190611b8e565b61118c907f0000000000000000000000000000000000000000000000000000000000000000611b76565b92915050565b600061119e60016115b5565b905080156111d357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6040805180820182528681524260208083019182526000888152606790915292909220905181559051600190910155606684905561120f611740565b611218836107e5565b6112218261153e565b801561128457600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006066546112bb9190611b76565b905090565b60335473ffffffffffffffffffffffffffffffffffffffff163314611341576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161048c565b73ffffffffffffffffffffffffffffffffffffffff81166113e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161048c565b6113ed8161153e565b50565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60608161144c57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611476578061146081611bcb565b915061146f9050600a83611c04565b9150611450565b60008167ffffffffffffffff8111156114915761149161187a565b6040519080825280601f01601f1916602001820160405280156114bb576020820181803683370190505b5090505b841561102d576114d0600183611aa6565b91506114dd600a86611b62565b6114e8906030611b76565b60f81b8183815181106114fd576114fd611c18565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611537600a86611c04565b94506114bf565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008054610100900460ff161561166c578160ff1660011480156115d85750303b155b611664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161048c565b506000919050565b60005460ff808416911610611703576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161048c565b50600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055600190565b919050565b600054610100900460ff166117d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161048c565b6107e3600054610100900460ff16611871576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161048c565b6107e33361153e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000604082840312156118bb57600080fd5b6040516040810181811067ffffffffffffffff82111715611905577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604052823581526020928301359281019290925250919050565b60005b8381101561193a578181015183820152602001611922565b83811115611949576000848401525b50505050565b602081526000825180602084015261196e81604085016020870161191f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461173b57600080fd5b6000602082840312156119d657600080fd5b6119df826119a0565b9392505050565b600080600080608085870312156119fc57600080fd5b5050823594602084013594506040840135936060013592509050565b600060208284031215611a2a57600080fd5b5035919050565b60008060008060808587031215611a4757600080fd5b8435935060208501359250611a5e604086016119a0565b9150611a6c606086016119a0565b905092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611ab857611ab8611a77565b500390565b60008451611acf81846020890161191f565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551611b0b816001850160208a0161191f565b60019201918201528351611b2681600284016020880161191f565b0160020195945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082611b7157611b71611b33565b500690565b60008219821115611b8957611b89611a77565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611bc657611bc6611a77565b500290565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611bfd57611bfd611a77565b5060010190565b600082611c1357611c13611b33565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c634300080a000a496e697469616c697a61626c653a20636f6e747261637420697320616c726561496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069",
} }
// L2OutputOracleABI is the input ABI used to generate the binding from. // L2OutputOracleABI is the input ABI used to generate the binding from.
......
...@@ -38,8 +38,8 @@ type HashingOutputRootProof struct { ...@@ -38,8 +38,8 @@ type HashingOutputRootProof struct {
// OptimismPortalMetaData contains all meta data concerning the OptimismPortal contract. // OptimismPortalMetaData contains all meta data concerning the OptimismPortal contract.
var OptimismPortalMetaData = &bind.MetaData{ var OptimismPortalMetaData = &bind.MetaData{
ABI: "[{\"inputs\":[{\"internalType\":\"contractL2OutputOracle\",\"name\":\"_l2Oracle\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_finalizationPeriodSeconds\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"opaqueData\",\"type\":\"bytes\"}],\"name\":\"TransactionDeposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"withdrawalHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"WithdrawalFinalized\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BASE_FEE_MAX_CHANGE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ELASTICITY_MULTIPLIER\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"FINALIZATION_PERIOD_SECONDS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"INITIAL_BASE_FEE\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_ORACLE\",\"outputs\":[{\"internalType\":\"contractL2OutputOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_RESOURCE_LIMIT\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINIMUM_BASE_FEE\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TARGET_RESOURCE_LIMIT\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"_gasLimit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"_isCreation\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"depositTransaction\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"withdrawerStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"latestBlockhash\",\"type\":\"bytes32\"}],\"internalType\":\"structHashing.OutputRootProof\",\"name\":\"_outputRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"_withdrawalProof\",\"type\":\"bytes\"}],\"name\":\"finalizeWithdrawalTransaction\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"finalizedWithdrawals\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"isOutputFinalized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2Sender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"params\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"prevBaseFee\",\"type\":\"uint128\"},{\"internalType\":\"uint64\",\"name\":\"prevBoughtGas\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"prevBlockNum\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", ABI: "[{\"inputs\":[{\"internalType\":\"contractL2OutputOracle\",\"name\":\"_l2Oracle\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_finalizationPeriodSeconds\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"opaqueData\",\"type\":\"bytes\"}],\"name\":\"TransactionDeposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"withdrawalHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"WithdrawalFinalized\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BASE_FEE_MAX_CHANGE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ELASTICITY_MULTIPLIER\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"FINALIZATION_PERIOD_SECONDS\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"INITIAL_BASE_FEE\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L2_ORACLE\",\"outputs\":[{\"internalType\":\"contractL2OutputOracle\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_RESOURCE_LIMIT\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINIMUM_BASE_FEE\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TARGET_RESOURCE_LIMIT\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"_gasLimit\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"_isCreation\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"depositTransaction\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"withdrawerStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"latestBlockhash\",\"type\":\"bytes32\"}],\"internalType\":\"structHashing.OutputRootProof\",\"name\":\"_outputRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"_withdrawalProof\",\"type\":\"bytes\"}],\"name\":\"finalizeWithdrawalTransaction\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"finalizedWithdrawals\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"}],\"name\":\"isBlockFinalized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2Sender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"params\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"prevBaseFee\",\"type\":\"uint128\"},{\"internalType\":\"uint64\",\"name\":\"prevBoughtGas\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"prevBlockNum\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]",
Bin: "0x6101206040523480156200001257600080fd5b50604051620043e7380380620043e78339810160408190526200003591620002bc565b6000608081905260a052600160c0526001600160a01b0382166101005260e08190526200006162000069565b5050620002f8565b6000620000776001620000f8565b9050801562000090576000805461ff0019166101001790555b603380546001600160a01b03191661dead179055620000ae6200020a565b8015620000f5576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b60008054610100900460ff161562000191578160ff1660011480156200013157506200012f30620002ad60201b620014531760201c565b155b620001895760405162461bcd60e51b815260206004820152602e6024820152600080516020620043c783398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b506000919050565b60005460ff808416911610620001f05760405162461bcd60e51b815260206004820152602e6024820152600080516020620043c783398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840162000180565b506000805460ff191660ff92909216919091179055600190565b600054610100900460ff16620002775760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000180565b60408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b0217600155565b6001600160a01b03163b151590565b60008060408385031215620002d057600080fd5b82516001600160a01b0381168114620002e857600080fd5b6020939093015192949293505050565b60805160a05160c05160e051610100516140596200036e60003960008181610134015281816109ab01528181610a2201528181610ab501528181610b870152610edd0152600081816103d001528181610c390152610f6001526000610918015260006108ef015260006108c601526140596000f3fe6080604052600436106100f65760003560e01c80639bf62d821161008a578063cff0ab9611610059578063cff0ab96146102f7578063e9e05c4214610398578063eecf1c36146103ab578063f4daa291146103be57600080fd5b80639bf62d8214610270578063a14238e71461029d578063ca3e99ba146102cd578063cd7c9789146102e257600080fd5b80636bb0291e116100c65780636bb0291e146102005780636dbffb78146102155780638129fc1c14610245578063867ead131461025a57600080fd5b80621c2ff61461012257806313620abd1461018057806354fd4d50146101b957806364b79208146101db57600080fd5b3661011d5761011b3334620186a06000604051806020016040528060008152506103f2565b005b600080fd5b34801561012e57600080fd5b506101567f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561018c57600080fd5b50610198633b9aca0081565b6040516fffffffffffffffffffffffffffffffff9091168152602001610177565b3480156101c557600080fd5b506101ce6108bf565b60405161017791906136b1565b3480156101e757600080fd5b506101f2627a120081565b604051908152602001610177565b34801561020c57600080fd5b506101f2600481565b34801561022157600080fd5b506102356102303660046136c4565b610962565b6040519015158152602001610177565b34801561025157600080fd5b5061011b610c70565b34801561026657600080fd5b506101f261271081565b34801561027c57600080fd5b506033546101569073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102a957600080fd5b506102356102b83660046136c4565b60346020526000908152604090205460ff1681565b3480156102d957600080fd5b506101f2610d4b565b3480156102ee57600080fd5b506101f2600881565b34801561030357600080fd5b5060015461035f906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff9283166020850152911690820152606001610177565b61011b6103a636600461377f565b6103f2565b61011b6103b93660046138c9565b610d5c565b3480156103ca57600080fd5b506101f27f000000000000000000000000000000000000000000000000000000000000000081565b8260005a905083156104a95773ffffffffffffffffffffffffffffffffffffffff8716156104a957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b333281146104ca575033731111000000000000000000000000000000001111015b600034888888886040516020016104e59594939291906139c9565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161055591906136b1565b60405180910390a45050600154600090610595907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643613a5d565b9050801561071e5760006105ad6004627a1200613aa3565b6001546105d89190700100000000000000000000000000000000900467ffffffffffffffff16613b0b565b9050600060086105ec6004627a1200613aa3565b60015461060c9085906fffffffffffffffffffffffffffffffff16613b7f565b6106169190613aa3565b6106209190613aa3565b60015490915060009061066c906106569061064e9085906fffffffffffffffffffffffffffffffff16613c3b565b61271061146f565b6fffffffffffffffffffffffffffffffff61148a565b905060018411156106df576106dc610656670de0b6b3a76400006106c8610694600883613aa3565b6106a690670de0b6b3a7640000613b0b565b6106b160018a613a5d565b6106c390670de0b6b3a7640000613caf565b611499565b6106d29085613b7f565b61064e9190613aa3565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054849190601090610751908490700100000000000000000000000000000000900467ffffffffffffffff16613cec565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550627a1200600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff16131561082d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d6974000060648201526084016104a0565b600154600090610859906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8616613d18565b6fffffffffffffffffffffffffffffffff169050600061087d48633b9aca006114ca565b6108879083613d50565b905060005a6108969086613a5d565b9050808211156108b2576108b26108ad8284613a5d565b6114da565b5050505050505050505050565b60606108ea7f0000000000000000000000000000000000000000000000000000000000000000611508565b6109137f0000000000000000000000000000000000000000000000000000000000000000611508565b61093c7f0000000000000000000000000000000000000000000000000000000000000000611508565b60405160200161094e93929190613d64565b604051602081830303815290604052905090565b6040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101829052600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae557906024016040805180830381865afa1580156109f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a159190613dda565b8051909150610c375760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663529933df6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaf9190613e29565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634ab65d736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b429190613e29565b905084811115610b5757506000949350505050565b600082610b648388613a5d565b610b6e9190613e42565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663a25ae557610bb68386613a5d565b610bc09089613e56565b6040518263ffffffff1660e01b8152600401610bde91815260200190565b6040805180830381865afa158015610bfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1e9190613dda565b8051909450610c335750600095945050505050565b5050505b7f00000000000000000000000000000000000000000000000000000000000000008160200151610c679190613e56565b42119392505050565b6000610c7c6001611642565b90508015610cb157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055610ce56117cd565b8015610d4857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b610d596004627a1200613aa3565b81565b60335473ffffffffffffffffffffffffffffffffffffffff1661dead14610e05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084016104a0565b73ffffffffffffffffffffffffffffffffffffffff8916301415610eab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016104a0565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015610f38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5c9190613dda565b90507f00000000000000000000000000000000000000000000000000000000000000008160200151610f8e9190613e56565b421161101c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4f7074696d69736d506f7274616c3a2070726f706f73616c206973206e6f742060448201527f7965742066696e616c697a65640000000000000000000000000000000000000060648201526084016104a0565b61103361102e36869003860186613e6e565b6118b0565b8151146110c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016104a0565b60006111088d8d8d8d8d8d8d8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061190c92505050565b905061114f81866040013586868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061194b92505050565b6111db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016104a0565b60008181526034602052604090205460ff161561127a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016104a0565b600081815260346020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556112bd614e208a613e56565b5a101561134c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a20696e73756666696369656e742067617360448201527f20746f2066696e616c697a65207769746864726177616c00000000000000000060648201526084016104a0565b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8e16179055604080516020601f8a018190048102820181019092528881526000916113d5918e918d918f918691908f908f9081908401838280828437600092019190915250611a1492505050565b50603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061143b90841515815260200190565b60405180910390a25050505050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60008183121561147f5781611481565b825b90505b92915050565b600081831261147f5781611481565b6000611481670de0b6b3a7640000836114b186611a9f565b6114bb9190613b7f565b6114c59190613aa3565b611ce3565b60008183101561147f5781611481565b6000805a90505b825a6114ed9083613a5d565b1015611503576114fc82613ed4565b91506114e1565b505050565b60608161154857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611572578061155c81613ed4565b915061156b9050600a83613d50565b915061154c565b60008167ffffffffffffffff81111561158d5761158d613701565b6040519080825280601f01601f1916602001820160405280156115b7576020820181803683370190505b5090505b841561163a576115cc600183613a5d565b91506115d9600a86613e42565b6115e4906030613e56565b60f81b8183815181106115f9576115f9613f0d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611633600a86613d50565b94506115bb565b949350505050565b60008054610100900460ff16156116f9578160ff1660011480156116655750303b155b6116f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a0565b506000919050565b60005460ff808416911610611790576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a0565b50600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055600190565b919050565b600054610100900460ff16611864576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104a0565b60408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b600081600001518260200151836040015184606001516040516020016118ef949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600086868686868660405160200161192996959493929190613f3c565b6040516020818303038152906040528051906020012090509695505050505050565b604080516020810185905260009181018290528190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250611a099101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f01000000000000000000000000000000000000000000000000000000000000006020830152908587611f22565b9150505b9392505050565b6000606060008060008661ffff1667ffffffffffffffff811115611a3a57611a3a613701565b6040519080825280601f01601f191660200182016040528015611a64576020820181803683370190505b5090506000808751602089018b8e8ef191503d925086831115611a85578692505b828152826000602083013e90999098509650505050505050565b6000808213611b0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a0565b60006060611b1784611f46565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c18213611d1457506000919050565b680755bf798b4a1bf1e58212611d86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016104a0565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b600080611f2e8661201c565b9050611f3c8186868661204e565b9695505050505050565b6000808211611fb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a0565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b6060818051906020012060405160200161203891815260200190565b6040516020818303038152906040529050919050565b600080600061205e87868661208b565b9150915081801561208057508051602080830191909120875191880191909120145b979650505050505050565b60006060600061209a856121a6565b905060008060006120ac848a896122a1565b815192955090935091501580806120c05750815b61214c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2070726f76696465642070726f6f6620697320696e60448201527f76616c696400000000000000000000000000000000000000000000000000000060648201526084016104a0565b6000816121685760405180602001604052806000815250612194565b61219486612177600188613a5d565b8151811061218757612187613f0d565b602002602001015161282f565b919b919a509098505050505050505050565b606060006121b383612859565b90506000815167ffffffffffffffff8111156121d1576121d1613701565b60405190808252806020026020018201604052801561221657816020015b60408051808201909152606080825260208201528152602001906001900390816121ef5790505b50905060005b825181101561229957600061224984838151811061223c5761223c613f0d565b602002602001015161288c565b9050604051806040016040528082815260200161226583612859565b81525083838151811061227a5761227a613f0d565b602002602001018190525050808061229190613ed4565b91505061221c565b509392505050565b600060608180806122b18761295c565b905060008690506000806122d8604051806040016040528060608152602001606081525090565b60005b8c518110156127eb578c81815181106122f6576122f6613f0d565b60200260200101519150828461230c9190613e56565b9350612319600188613e56565b96508361239757815180516020909101208514612392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f74206861736800000060448201526064016104a0565b6124d3565b81515160201161243957815180516020909101208514612392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c20686173680000000000000000000000000000000000000000000000000060648201526084016104a0565b8151859061244690613f93565b146124d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f652068617368000000000000000000000000000000000000000000000000000060648201526084016104a0565b6124df60106001613e56565b82602001515114156125585785518414156124f9576127eb565b600086858151811061250d5761250d613f0d565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061253857612538613f0d565b6020026020010151905061254b81612adf565b96506001945050506127d9565b6002826020015151141561275157600061257183612b15565b905060008160008151811061258857612588613f0d565b016020015160f81c9050600061259f600283613fd8565b6125aa906002613ffa565b905060006125bb848360ff16612b39565b905060006125c98b8a612b39565b905060006125d78383612b6f565b905060ff8516600214806125ee575060ff85166003145b15612644578083511480156126035750808251145b1561261557612612818b613e56565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506127eb945050505050565b60ff85161580612657575060ff85166001145b156126c9578251811461269357507f800000000000000000000000000000000000000000000000000000000000000099506127eb945050505050565b6126ba88602001516001815181106126ad576126ad613f0d565b6020026020010151612adf565b9a5097506127d9945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e20707265666978000000000000000000000000000060648201526084016104a0565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f646500000000000000000000000000000000000000000000000060648201526084016104a0565b806127e381613ed4565b9150506122db565b507f800000000000000000000000000000000000000000000000000000000000000084148661281a8786612b39565b909e909d50909b509950505050505050505050565b602081015180516060916114849161284990600190613a5d565b8151811061223c5761223c613f0d565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061148490612c1b565b6060600080600061289c85612e74565b9194509250905060008160018111156128b7576128b761401d565b14612944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f524c505265616465723a20696e76616c696420524c502062797465732076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b6129538560200151848461335f565b95945050505050565b606060008251600261296e9190613caf565b67ffffffffffffffff81111561298657612986613701565b6040519080825280601f01601f1916602001820160405280156129b0576020820181803683370190505b50905060005b8351811015612ad85760048482815181106129d3576129d3613f0d565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612a08836002613caf565b81518110612a1857612a18613f0d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612a5b57612a5b613f0d565b0160200151612a6d919060f81c613fd8565b60f81b82612a7c836002613caf565b612a87906001613e56565b81518110612a9757612a97613f0d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612ad081613ed4565b9150506129b6565b5092915050565b60006060602083600001511015612b0057612af98361343e565b9050612b0c565b612b098361288c565b90505b611a0d81613f93565b6060611484612b34836020015160008151811061223c5761223c613f0d565b61295c565b606082518210612b585750604080516020810190915260008152611484565b6114818383848651612b6a9190613a5d565b613449565b6000805b808451118015612b835750808351115b8015612c045750828181518110612b9c57612b9c613f0d565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612bdb57612bdb613f0d565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156114815780612c1381613ed4565b915050612b73565b6060600080612c2984612e74565b91935090915060019050816001811115612c4557612c4561401d565b14612cd2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f524c505265616465723a20696e76616c696420524c50206c6973742076616c7560448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b6040805160208082526104208201909252600091816020015b6040805180820190915260008082526020820152815260200190600190039081612ceb5790505090506000835b8651811015612e695760208210612db1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2070726f766964656420524c50206c6973742065786360448201527f65656473206d6178206c697374206c656e67746800000000000000000000000060648201526084016104a0565b600080612dee6040518060400160405280858c60000151612dd29190613a5d565b8152602001858c60200151612de79190613e56565b9052612e74565b509150915060405180604001604052808383612e0a9190613e56565b8152602001848b60200151612e1f9190613e56565b815250858581518110612e3457612e34613f0d565b6020908102919091010152612e4a600185613e56565b9350612e568183613e56565b612e609084613e56565b92505050612d18565b508152949350505050565b600080600080846000015111612f0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f524c505265616465723a20524c50206974656d2063616e6e6f74206265206e7560448201527f6c6c00000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b6020840151805160001a607f8111612f31576000600160009450945094505050613358565b60b78111612fed576000612f46608083613a5d565b905080876000015111612fdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f524c505265616465723a20696e76616c696420524c502073686f72742073747260448201527f696e67000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b60019550935060009250613358915050565b60bf811161315c57600061300260b783613a5d565b905080876000015111613097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67207374726960448201527f6e67206c656e677468000000000000000000000000000000000000000000000060648201526084016104a0565b600183015160208290036101000a90046130b18183613e56565b885111613140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67207374726960448201527f6e6700000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b61314b826001613e56565b965094506000935061335892505050565b60f7811161321757600061317160c083613a5d565b905080876000015111613206576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f524c505265616465723a20696e76616c696420524c502073686f7274206c697360448201527f740000000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b600195509350849250613358915050565b600061322460f783613a5d565b9050808760000151116132b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67206c69737460448201527f206c656e6774680000000000000000000000000000000000000000000000000060648201526084016104a0565b600183015160208290036101000a90046132d38183613e56565b88511161333c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67206c69737460448201526064016104a0565b613347826001613e56565b965094506001935061335892505050565b9193909250565b606060008267ffffffffffffffff81111561337c5761337c613701565b6040519080825280601f01601f1916602001820160405280156133a6576020820181803683370190505b5090508051600014156133ba579050611a0d565b60006133c68587613e56565b90506020820160005b6133da602087613d50565b81101561341157825182526133f0602084613e56565b92506133fd602083613e56565b91508061340981613ed4565b9150506133cf565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061148482613621565b60608182601f0110156134b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a0565b828284011015613524576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a0565b81830184511015613591576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016104a0565b6060821580156135b05760405191506000825260208201604052613618565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156135e95780518352602092830192016135d1565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b606061148482602001516000846000015161335f565b60005b8381101561365257818101518382015260200161363a565b83811115613661576000848401525b50505050565b6000815180845261367f816020860160208601613637565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006114816020830184613667565b6000602082840312156136d657600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146117c857600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561377757613777613701565b604052919050565b600080600080600060a0868803121561379757600080fd5b6137a0866136dd565b94506020808701359450604087013567ffffffffffffffff80821682146137c657600080fd5b90945060608801359081151582146137dd57600080fd5b909350608088013590808211156137f357600080fd5b818901915089601f83011261380757600080fd5b81358181111561381957613819613701565b613849847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613730565b91508082528a8482850101111561385f57600080fd5b80848401858401376000848284010152508093505050509295509295909350565b60008083601f84011261389257600080fd5b50813567ffffffffffffffff8111156138aa57600080fd5b6020830191508360208285010111156138c257600080fd5b9250929050565b60008060008060008060008060008060006101808c8e0312156138eb57600080fd5b8b359a506138fb60208d016136dd565b995061390960408d016136dd565b985060608c0135975060808c0135965067ffffffffffffffff60a08d0135111561393257600080fd5b6139428d60a08e01358e01613880565b909650945060c08c0135935060808c8e037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2001121561398057600080fd5b60e08c01925067ffffffffffffffff6101608d013511156139a057600080fd5b6139b18d6101608e01358e01613880565b81935080925050509295989b509295989b9093969950565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251613a1d816049850160208701613637565b919091016049019695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613a6f57613a6f613a2e565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613ab257613ab2613a74565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615613b0657613b06613a2e565b500590565b6000808312837f800000000000000000000000000000000000000000000000000000000000000001831281151615613b4557613b45613a2e565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615613b7957613b79613a2e565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615613bc057613bc0613a2e565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615613bfb57613bfb613a2e565b60008712925087820587128484161615613c1757613c17613a2e565b87850587128184161615613c2d57613c2d613a2e565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615613c7557613c75613a2e565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615613ca957613ca9613a2e565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613ce757613ce7613a2e565b500290565b600067ffffffffffffffff808316818516808303821115613d0f57613d0f613a2e565b01949350505050565b60006fffffffffffffffffffffffffffffffff80831681851681830481118215151615613d4757613d47613a2e565b02949350505050565b600082613d5f57613d5f613a74565b500490565b60008451613d76818460208901613637565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551613db2816001850160208a01613637565b60019201918201528351613dcd816002840160208801613637565b0160020195945050505050565b600060408284031215613dec57600080fd5b6040516040810181811067ffffffffffffffff82111715613e0f57613e0f613701565b604052825181526020928301519281019290925250919050565b600060208284031215613e3b57600080fd5b5051919050565b600082613e5157613e51613a74565b500690565b60008219821115613e6957613e69613a2e565b500190565b600060808284031215613e8057600080fd5b6040516080810181811067ffffffffffffffff82111715613ea357613ea3613701565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f0657613f06613a2e565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152613f8760c0830184613667565b98975050505050505050565b80516020808301519190811015613fd2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8160200360031b1b821691505b50919050565b600060ff831680613feb57613feb613a74565b8060ff84160691505092915050565b600060ff821660ff84168082101561401457614014613a2e565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080a000a496e697469616c697a61626c653a20636f6e747261637420697320616c726561", Bin: "0x6101206040523480156200001257600080fd5b506040516200416f3803806200416f8339810160408190526200003591620002bc565b6000608081905260a052600160c0526001600160a01b0382166101005260e08190526200006162000069565b5050620002f8565b6000620000776001620000f8565b9050801562000090576000805461ff0019166101001790555b603380546001600160a01b03191661dead179055620000ae6200020a565b8015620000f5576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b60008054610100900460ff161562000191578160ff1660011480156200013157506200012f30620002ad60201b620011e11760201c565b155b620001895760405162461bcd60e51b815260206004820152602e60248201526000805160206200414f83398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b506000919050565b60005460ff808416911610620001f05760405162461bcd60e51b815260206004820152602e60248201526000805160206200414f83398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840162000180565b506000805460ff191660ff92909216919091179055600190565b600054610100900460ff16620002775760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000180565b60408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b0217600155565b6001600160a01b03163b151590565b60008060408385031215620002d057600080fd5b82516001600160a01b0381168114620002e857600080fd5b6020939093015192949293505050565b60805160a05160c05160e05161010051613dfd620003526000396000818161013401528181610a860152610c940152600081816103d0015261164201526000610918015260006108ef015260006108c60152613dfd6000f3fe6080604052600436106100f65760003560e01c8063a14238e71161008a578063cff0ab9611610059578063cff0ab96146102f7578063e9e05c4214610398578063eecf1c36146103ab578063f4daa291146103be57600080fd5b8063a14238e71461026d578063c4fc4798146102ad578063ca3e99ba146102cd578063cd7c9789146102e257600080fd5b80636bb0291e116100c65780636bb0291e146102005780638129fc1c14610215578063867ead131461022a5780639bf62d821461024057600080fd5b80621c2ff61461012257806313620abd1461018057806354fd4d50146101b957806364b79208146101db57600080fd5b3661011d5761011b3334620186a06000604051806020016040528060008152506103f2565b005b600080fd5b34801561012e57600080fd5b506101567f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561018c57600080fd5b50610198633b9aca0081565b6040516fffffffffffffffffffffffffffffffff9091168152602001610177565b3480156101c557600080fd5b506101ce6108bf565b604051610177919061346e565b3480156101e757600080fd5b506101f2627a120081565b604051908152602001610177565b34801561020c57600080fd5b506101f2600481565b34801561022157600080fd5b5061011b610962565b34801561023657600080fd5b506101f261271081565b34801561024c57600080fd5b506033546101569073ffffffffffffffffffffffffffffffffffffffff1681565b34801561027957600080fd5b5061029d610288366004613481565b60346020526000908152604090205460ff1681565b6040519015158152602001610177565b3480156102b957600080fd5b5061029d6102c8366004613481565b610a3d565b3480156102d957600080fd5b506101f2610b02565b3480156102ee57600080fd5b506101f2600881565b34801561030357600080fd5b5060015461035f906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff9283166020850152911690820152606001610177565b61011b6103a636600461353c565b6103f2565b61011b6103b9366004613686565b610b13565b3480156103ca57600080fd5b506101f27f000000000000000000000000000000000000000000000000000000000000000081565b8260005a905083156104a95773ffffffffffffffffffffffffffffffffffffffff8716156104a957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b333281146104ca575033731111000000000000000000000000000000001111015b600034888888886040516020016104e5959493929190613786565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c3284604051610555919061346e565b60405180910390a45050600154600090610595907801000000000000000000000000000000000000000000000000900467ffffffffffffffff164361381a565b9050801561071e5760006105ad6004627a1200613860565b6001546105d89190700100000000000000000000000000000000900467ffffffffffffffff166138c8565b9050600060086105ec6004627a1200613860565b60015461060c9085906fffffffffffffffffffffffffffffffff1661393c565b6106169190613860565b6106209190613860565b60015490915060009061066c906106569061064e9085906fffffffffffffffffffffffffffffffff166139f8565b6127106111fd565b6fffffffffffffffffffffffffffffffff611218565b905060018411156106df576106dc610656670de0b6b3a76400006106c8610694600883613860565b6106a690670de0b6b3a76400006138c8565b6106b160018a61381a565b6106c390670de0b6b3a7640000613a6c565b611227565b6106d2908561393c565b61064e9190613860565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054849190601090610751908490700100000000000000000000000000000000900467ffffffffffffffff16613aa9565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550627a1200600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff16131561082d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d6974000060648201526084016104a0565b600154600090610859906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8616613ad5565b6fffffffffffffffffffffffffffffffff169050600061087d48633b9aca00611258565b6108879083613b0d565b905060005a610896908661381a565b9050808211156108b2576108b26108ad828461381a565b611268565b5050505050505050505050565b60606108ea7f0000000000000000000000000000000000000000000000000000000000000000611296565b6109137f0000000000000000000000000000000000000000000000000000000000000000611296565b61093c7f0000000000000000000000000000000000000000000000000000000000000000611296565b60405160200161094e93929190613b21565b604051602081830303815290604052905090565b600061096e60016113d0565b905080156109a357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790556109d761155b565b8015610a3a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101829052600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae557906024016040805180830381865afa158015610acc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af09190613b97565b9050610afb8161163e565b9392505050565b610b106004627a1200613860565b81565b60335473ffffffffffffffffffffffffffffffffffffffff1661dead14610bbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084016104a0565b73ffffffffffffffffffffffffffffffffffffffff8916301415610c62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016104a0565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015610cef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d139190613b97565b9050610d1e8161163e565b610daa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4f7074696d69736d506f7274616c3a2070726f706f73616c206973206e6f742060448201527f7965742066696e616c697a65640000000000000000000000000000000000000060648201526084016104a0565b610dc1610dbc36869003860186613be6565b611678565b815114610e50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016104a0565b6000610e968d8d8d8d8d8d8d8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506116d492505050565b9050610edd81866040013586868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061171392505050565b610f69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016104a0565b60008181526034602052604090205460ff1615611008576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016104a0565b600081815260346020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561104b614e208a613c4c565b5a10156110da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a20696e73756666696369656e742067617360448201527f20746f2066696e616c697a65207769746864726177616c00000000000000000060648201526084016104a0565b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8e16179055604080516020601f8a01819004810282018101909252888152600091611163918e918d918f918691908f908f90819084018382808284376000920191909152506117da92505050565b50603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b906111c990841515815260200190565b60405180910390a25050505050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60008183121561120d578161120f565b825b90505b92915050565b600081831261120d578161120f565b600061120f670de0b6b3a76400008361123f86611865565b611249919061393c565b6112539190613860565b611aa9565b60008183101561120d578161120f565b6000805a90505b825a61127b908361381a565b10156112915761128a82613c64565b915061126f565b505050565b6060816112d657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561130057806112ea81613c64565b91506112f99050600a83613b0d565b91506112da565b60008167ffffffffffffffff81111561131b5761131b6134be565b6040519080825280601f01601f191660200182016040528015611345576020820181803683370190505b5090505b84156113c85761135a60018361381a565b9150611367600a86613c9d565b611372906030613c4c565b60f81b81838151811061138757611387613cb1565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506113c1600a86613b0d565b9450611349565b949350505050565b60008054610100900460ff1615611487578160ff1660011480156113f35750303b155b61147f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a0565b506000919050565b60005460ff80841691161061151e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a0565b50600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055600190565b919050565b600054610100900460ff166115f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104a0565b60408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b60007f000000000000000000000000000000000000000000000000000000000000000082602001516116709190613c4c565b421192915050565b600081600001518260200151836040015184606001516040516020016116b7949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60008686868686866040516020016116f196959493929190613ce0565b6040516020818303038152906040528051906020012090509695505050505050565b604080516020810185905260009181018290528190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090830181905292506117d19101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f01000000000000000000000000000000000000000000000000000000000000006020830152908587611ce8565b95945050505050565b6000606060008060008661ffff1667ffffffffffffffff811115611800576118006134be565b6040519080825280601f01601f19166020018201604052801561182a576020820181803683370190505b5090506000808751602089018b8e8ef191503d92508683111561184b578692505b828152826000602083013e90999098509650505050505050565b60008082136118d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a0565b600060606118dd84611d0c565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c18213611ada57506000919050565b680755bf798b4a1bf1e58212611b4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016104a0565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b600080611cf486611de2565b9050611d0281868686611e14565b9695505050505050565b6000808211611d77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a0565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b60608180519060200120604051602001611dfe91815260200190565b6040516020818303038152906040529050919050565b6000806000611e24878686611e51565b91509150818015611e4657508051602080830191909120875191880191909120145b979650505050505050565b600060606000611e6085611f6c565b90506000806000611e72848a89612067565b81519295509093509150158080611e865750815b611f12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2070726f76696465642070726f6f6620697320696e60448201527f76616c696400000000000000000000000000000000000000000000000000000060648201526084016104a0565b600081611f2e5760405180602001604052806000815250611f5a565b611f5a86611f3d60018861381a565b81518110611f4d57611f4d613cb1565b60200260200101516125f5565b919b919a509098505050505050505050565b60606000611f798361261f565b90506000815167ffffffffffffffff811115611f9757611f976134be565b604051908082528060200260200182016040528015611fdc57816020015b6040805180820190915260608082526020820152815260200190600190039081611fb55790505b50905060005b825181101561205f57600061200f84838151811061200257612002613cb1565b6020026020010151612652565b9050604051806040016040528082815260200161202b8361261f565b81525083838151811061204057612040613cb1565b602002602001018190525050808061205790613c64565b915050611fe2565b509392505050565b6000606081808061207787612719565b9050600086905060008061209e604051806040016040528060608152602001606081525090565b60005b8c518110156125b1578c81815181106120bc576120bc613cb1565b6020026020010151915082846120d29190613c4c565b93506120df600188613c4c565b96508361215d57815180516020909101208514612158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f74206861736800000060448201526064016104a0565b612299565b8151516020116121ff57815180516020909101208514612158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c20686173680000000000000000000000000000000000000000000000000060648201526084016104a0565b8151859061220c90613d37565b14612299576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f652068617368000000000000000000000000000000000000000000000000000060648201526084016104a0565b6122a560106001613c4c565b826020015151141561231e5785518414156122bf576125b1565b60008685815181106122d3576122d3613cb1565b602001015160f81c60f81b60f81c9050600083602001518260ff16815181106122fe576122fe613cb1565b602002602001015190506123118161289c565b965060019450505061259f565b60028260200151511415612517576000612337836128d2565b905060008160008151811061234e5761234e613cb1565b016020015160f81c90506000612365600283613d7c565b612370906002613d9e565b90506000612381848360ff166128f6565b9050600061238f8b8a6128f6565b9050600061239d838361292c565b905060ff8516600214806123b4575060ff85166003145b1561240a578083511480156123c95750808251145b156123db576123d8818b613c4c565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506125b1945050505050565b60ff8516158061241d575060ff85166001145b1561248f578251811461245957507f800000000000000000000000000000000000000000000000000000000000000099506125b1945050505050565b612480886020015160018151811061247357612473613cb1565b602002602001015161289c565b9a50975061259f945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e20707265666978000000000000000000000000000060648201526084016104a0565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f646500000000000000000000000000000000000000000000000060648201526084016104a0565b806125a981613c64565b9150506120a1565b507f80000000000000000000000000000000000000000000000000000000000000008414866125e087866128f6565b909e909d50909b509950505050505050505050565b602081015180516060916112129161260f9060019061381a565b8151811061200257612002613cb1565b604080518082018252600080825260209182015281518083019092528251825280830190820152606090611212906129d8565b6060600080600061266285612c31565b91945092509050600081600181111561267d5761267d613dc1565b1461270a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f524c505265616465723a20696e76616c696420524c502062797465732076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b6117d18560200151848461311c565b606060008251600261272b9190613a6c565b67ffffffffffffffff811115612743576127436134be565b6040519080825280601f01601f19166020018201604052801561276d576020820181803683370190505b50905060005b835181101561289557600484828151811061279057612790613cb1565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c826127c5836002613a6c565b815181106127d5576127d5613cb1565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350601084828151811061281857612818613cb1565b016020015161282a919060f81c613d7c565b60f81b82612839836002613a6c565b612844906001613c4c565b8151811061285457612854613cb1565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061288d81613c64565b915050612773565b5092915050565b600060606020836000015110156128bd576128b6836131fb565b90506128c9565b6128c683612652565b90505b610afb81613d37565b60606112126128f1836020015160008151811061200257612002613cb1565b612719565b6060825182106129155750604080516020810190915260008152611212565b61120f8383848651612927919061381a565b613206565b6000805b8084511180156129405750808351115b80156129c1575082818151811061295957612959613cb1565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684828151811061299857612998613cb1565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561120f57806129d081613c64565b915050612930565b60606000806129e684612c31565b91935090915060019050816001811115612a0257612a02613dc1565b14612a8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f524c505265616465723a20696e76616c696420524c50206c6973742076616c7560448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b6040805160208082526104208201909252600091816020015b6040805180820190915260008082526020820152815260200190600190039081612aa85790505090506000835b8651811015612c265760208210612b6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2070726f766964656420524c50206c6973742065786360448201527f65656473206d6178206c697374206c656e67746800000000000000000000000060648201526084016104a0565b600080612bab6040518060400160405280858c60000151612b8f919061381a565b8152602001858c60200151612ba49190613c4c565b9052612c31565b509150915060405180604001604052808383612bc79190613c4c565b8152602001848b60200151612bdc9190613c4c565b815250858581518110612bf157612bf1613cb1565b6020908102919091010152612c07600185613c4c565b9350612c138183613c4c565b612c1d9084613c4c565b92505050612ad5565b508152949350505050565b600080600080846000015111612cc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f524c505265616465723a20524c50206974656d2063616e6e6f74206265206e7560448201527f6c6c00000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b6020840151805160001a607f8111612cee576000600160009450945094505050613115565b60b78111612daa576000612d0360808361381a565b905080876000015111612d98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f524c505265616465723a20696e76616c696420524c502073686f72742073747260448201527f696e67000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b60019550935060009250613115915050565b60bf8111612f19576000612dbf60b78361381a565b905080876000015111612e54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67207374726960448201527f6e67206c656e677468000000000000000000000000000000000000000000000060648201526084016104a0565b600183015160208290036101000a9004612e6e8183613c4c565b885111612efd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67207374726960448201527f6e6700000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b612f08826001613c4c565b965094506000935061311592505050565b60f78111612fd4576000612f2e60c08361381a565b905080876000015111612fc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f524c505265616465723a20696e76616c696420524c502073686f7274206c697360448201527f740000000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b600195509350849250613115915050565b6000612fe160f78361381a565b905080876000015111613076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67206c69737460448201527f206c656e6774680000000000000000000000000000000000000000000000000060648201526084016104a0565b600183015160208290036101000a90046130908183613c4c565b8851116130f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67206c69737460448201526064016104a0565b613104826001613c4c565b965094506001935061311592505050565b9193909250565b606060008267ffffffffffffffff811115613139576131396134be565b6040519080825280601f01601f191660200182016040528015613163576020820181803683370190505b509050805160001415613177579050610afb565b60006131838587613c4c565b90506020820160005b613197602087613b0d565b8110156131ce57825182526131ad602084613c4c565b92506131ba602083613c4c565b9150806131c681613c64565b91505061318c565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b6060611212826133de565b60608182601f011015613275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a0565b8282840110156132e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a0565b8183018451101561334e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016104a0565b60608215801561336d57604051915060008252602082016040526133d5565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156133a657805183526020928301920161338e565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b606061121282602001516000846000015161311c565b60005b8381101561340f5781810151838201526020016133f7565b8381111561341e576000848401525b50505050565b6000815180845261343c8160208601602086016133f4565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061120f6020830184613424565b60006020828403121561349357600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461155657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613534576135346134be565b604052919050565b600080600080600060a0868803121561355457600080fd5b61355d8661349a565b94506020808701359450604087013567ffffffffffffffff808216821461358357600080fd5b909450606088013590811515821461359a57600080fd5b909350608088013590808211156135b057600080fd5b818901915089601f8301126135c457600080fd5b8135818111156135d6576135d66134be565b613606847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016134ed565b91508082528a8482850101111561361c57600080fd5b80848401858401376000848284010152508093505050509295509295909350565b60008083601f84011261364f57600080fd5b50813567ffffffffffffffff81111561366757600080fd5b60208301915083602082850101111561367f57600080fd5b9250929050565b60008060008060008060008060008060006101808c8e0312156136a857600080fd5b8b359a506136b860208d0161349a565b99506136c660408d0161349a565b985060608c0135975060808c0135965067ffffffffffffffff60a08d013511156136ef57600080fd5b6136ff8d60a08e01358e0161363d565b909650945060c08c0135935060808c8e037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2001121561373d57600080fd5b60e08c01925067ffffffffffffffff6101608d0135111561375d57600080fd5b61376e8d6101608e01358e0161363d565b81935080925050509295989b509295989b9093969950565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b6048820152600082516137da8160498501602087016133f4565b919091016049019695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561382c5761382c6137eb565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261386f5761386f613831565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f8000000000000000000000000000000000000000000000000000000000000000831416156138c3576138c36137eb565b500590565b6000808312837f800000000000000000000000000000000000000000000000000000000000000001831281151615613902576139026137eb565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615613936576139366137eb565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561397d5761397d6137eb565b7f800000000000000000000000000000000000000000000000000000000000000060008712868205881281841616156139b8576139b86137eb565b600087129250878205871284841616156139d4576139d46137eb565b878505871281841616156139ea576139ea6137eb565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615613a3257613a326137eb565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615613a6657613a666137eb565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613aa457613aa46137eb565b500290565b600067ffffffffffffffff808316818516808303821115613acc57613acc6137eb565b01949350505050565b60006fffffffffffffffffffffffffffffffff80831681851681830481118215151615613b0457613b046137eb565b02949350505050565b600082613b1c57613b1c613831565b500490565b60008451613b338184602089016133f4565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551613b6f816001850160208a016133f4565b60019201918201528351613b8a8160028401602088016133f4565b0160020195945050505050565b600060408284031215613ba957600080fd5b6040516040810181811067ffffffffffffffff82111715613bcc57613bcc6134be565b604052825181526020928301519281019290925250919050565b600060808284031215613bf857600080fd5b6040516080810181811067ffffffffffffffff82111715613c1b57613c1b6134be565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b60008219821115613c5f57613c5f6137eb565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c9657613c966137eb565b5060010190565b600082613cac57613cac613831565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152613d2b60c0830184613424565b98975050505050505050565b80516020808301519190811015613d76577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8160200360031b1b821691505b50919050565b600060ff831680613d8f57613d8f613831565b8060ff84160691505092915050565b600060ff821660ff841680821015613db857613db86137eb565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080a000a496e697469616c697a61626c653a20636f6e747261637420697320616c726561",
} }
// OptimismPortalABI is the input ABI used to generate the binding from. // OptimismPortalABI is the input ABI used to generate the binding from.
...@@ -488,12 +488,12 @@ func (_OptimismPortal *OptimismPortalCallerSession) FinalizedWithdrawals(arg0 [3 ...@@ -488,12 +488,12 @@ func (_OptimismPortal *OptimismPortalCallerSession) FinalizedWithdrawals(arg0 [3
return _OptimismPortal.Contract.FinalizedWithdrawals(&_OptimismPortal.CallOpts, arg0) return _OptimismPortal.Contract.FinalizedWithdrawals(&_OptimismPortal.CallOpts, arg0)
} }
// IsOutputFinalized is a free data retrieval call binding the contract method 0x6dbffb78. // IsBlockFinalized is a free data retrieval call binding the contract method 0xc4fc4798.
// //
// Solidity: function isOutputFinalized(uint256 _l2BlockNumber) view returns(bool) // Solidity: function isBlockFinalized(uint256 _l2BlockNumber) view returns(bool)
func (_OptimismPortal *OptimismPortalCaller) IsOutputFinalized(opts *bind.CallOpts, _l2BlockNumber *big.Int) (bool, error) { func (_OptimismPortal *OptimismPortalCaller) IsBlockFinalized(opts *bind.CallOpts, _l2BlockNumber *big.Int) (bool, error) {
var out []interface{} var out []interface{}
err := _OptimismPortal.contract.Call(opts, &out, "isOutputFinalized", _l2BlockNumber) err := _OptimismPortal.contract.Call(opts, &out, "isBlockFinalized", _l2BlockNumber)
if err != nil { if err != nil {
return *new(bool), err return *new(bool), err
...@@ -505,18 +505,18 @@ func (_OptimismPortal *OptimismPortalCaller) IsOutputFinalized(opts *bind.CallOp ...@@ -505,18 +505,18 @@ func (_OptimismPortal *OptimismPortalCaller) IsOutputFinalized(opts *bind.CallOp
} }
// IsOutputFinalized is a free data retrieval call binding the contract method 0x6dbffb78. // IsBlockFinalized is a free data retrieval call binding the contract method 0xc4fc4798.
// //
// Solidity: function isOutputFinalized(uint256 _l2BlockNumber) view returns(bool) // Solidity: function isBlockFinalized(uint256 _l2BlockNumber) view returns(bool)
func (_OptimismPortal *OptimismPortalSession) IsOutputFinalized(_l2BlockNumber *big.Int) (bool, error) { func (_OptimismPortal *OptimismPortalSession) IsBlockFinalized(_l2BlockNumber *big.Int) (bool, error) {
return _OptimismPortal.Contract.IsOutputFinalized(&_OptimismPortal.CallOpts, _l2BlockNumber) return _OptimismPortal.Contract.IsBlockFinalized(&_OptimismPortal.CallOpts, _l2BlockNumber)
} }
// IsOutputFinalized is a free data retrieval call binding the contract method 0x6dbffb78. // IsBlockFinalized is a free data retrieval call binding the contract method 0xc4fc4798.
// //
// Solidity: function isOutputFinalized(uint256 _l2BlockNumber) view returns(bool) // Solidity: function isBlockFinalized(uint256 _l2BlockNumber) view returns(bool)
func (_OptimismPortal *OptimismPortalCallerSession) IsOutputFinalized(_l2BlockNumber *big.Int) (bool, error) { func (_OptimismPortal *OptimismPortalCallerSession) IsBlockFinalized(_l2BlockNumber *big.Int) (bool, error) {
return _OptimismPortal.Contract.IsOutputFinalized(&_OptimismPortal.CallOpts, _l2BlockNumber) return _OptimismPortal.Contract.IsBlockFinalized(&_OptimismPortal.CallOpts, _l2BlockNumber)
} }
// L2Sender is a free data retrieval call binding the contract method 0x9bf62d82. // L2Sender is a free data retrieval call binding the contract method 0x9bf62d82.
......
...@@ -2,4 +2,4 @@ ...@@ -2,4 +2,4 @@
// This file is a generated binding and any manual changes will be lost. // This file is a generated binding and any manual changes will be lost.
package bindings package bindings
var OptimismPortalDeployedBin = "0x6080604052600436106100f65760003560e01c80639bf62d821161008a578063cff0ab9611610059578063cff0ab96146102f7578063e9e05c4214610398578063eecf1c36146103ab578063f4daa291146103be57600080fd5b80639bf62d8214610270578063a14238e71461029d578063ca3e99ba146102cd578063cd7c9789146102e257600080fd5b80636bb0291e116100c65780636bb0291e146102005780636dbffb78146102155780638129fc1c14610245578063867ead131461025a57600080fd5b80621c2ff61461012257806313620abd1461018057806354fd4d50146101b957806364b79208146101db57600080fd5b3661011d5761011b3334620186a06000604051806020016040528060008152506103f2565b005b600080fd5b34801561012e57600080fd5b506101567f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561018c57600080fd5b50610198633b9aca0081565b6040516fffffffffffffffffffffffffffffffff9091168152602001610177565b3480156101c557600080fd5b506101ce6108bf565b60405161017791906136b1565b3480156101e757600080fd5b506101f2627a120081565b604051908152602001610177565b34801561020c57600080fd5b506101f2600481565b34801561022157600080fd5b506102356102303660046136c4565b610962565b6040519015158152602001610177565b34801561025157600080fd5b5061011b610c70565b34801561026657600080fd5b506101f261271081565b34801561027c57600080fd5b506033546101569073ffffffffffffffffffffffffffffffffffffffff1681565b3480156102a957600080fd5b506102356102b83660046136c4565b60346020526000908152604090205460ff1681565b3480156102d957600080fd5b506101f2610d4b565b3480156102ee57600080fd5b506101f2600881565b34801561030357600080fd5b5060015461035f906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff9283166020850152911690820152606001610177565b61011b6103a636600461377f565b6103f2565b61011b6103b93660046138c9565b610d5c565b3480156103ca57600080fd5b506101f27f000000000000000000000000000000000000000000000000000000000000000081565b8260005a905083156104a95773ffffffffffffffffffffffffffffffffffffffff8716156104a957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b333281146104ca575033731111000000000000000000000000000000001111015b600034888888886040516020016104e59594939291906139c9565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161055591906136b1565b60405180910390a45050600154600090610595907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643613a5d565b9050801561071e5760006105ad6004627a1200613aa3565b6001546105d89190700100000000000000000000000000000000900467ffffffffffffffff16613b0b565b9050600060086105ec6004627a1200613aa3565b60015461060c9085906fffffffffffffffffffffffffffffffff16613b7f565b6106169190613aa3565b6106209190613aa3565b60015490915060009061066c906106569061064e9085906fffffffffffffffffffffffffffffffff16613c3b565b61271061146f565b6fffffffffffffffffffffffffffffffff61148a565b905060018411156106df576106dc610656670de0b6b3a76400006106c8610694600883613aa3565b6106a690670de0b6b3a7640000613b0b565b6106b160018a613a5d565b6106c390670de0b6b3a7640000613caf565b611499565b6106d29085613b7f565b61064e9190613aa3565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054849190601090610751908490700100000000000000000000000000000000900467ffffffffffffffff16613cec565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550627a1200600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff16131561082d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d6974000060648201526084016104a0565b600154600090610859906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8616613d18565b6fffffffffffffffffffffffffffffffff169050600061087d48633b9aca006114ca565b6108879083613d50565b905060005a6108969086613a5d565b9050808211156108b2576108b26108ad8284613a5d565b6114da565b5050505050505050505050565b60606108ea7f0000000000000000000000000000000000000000000000000000000000000000611508565b6109137f0000000000000000000000000000000000000000000000000000000000000000611508565b61093c7f0000000000000000000000000000000000000000000000000000000000000000611508565b60405160200161094e93929190613d64565b604051602081830303815290604052905090565b6040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101829052600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae557906024016040805180830381865afa1580156109f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a159190613dda565b8051909150610c375760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663529933df6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aaf9190613e29565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634ab65d736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b429190613e29565b905084811115610b5757506000949350505050565b600082610b648388613a5d565b610b6e9190613e42565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663a25ae557610bb68386613a5d565b610bc09089613e56565b6040518263ffffffff1660e01b8152600401610bde91815260200190565b6040805180830381865afa158015610bfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1e9190613dda565b8051909450610c335750600095945050505050565b5050505b7f00000000000000000000000000000000000000000000000000000000000000008160200151610c679190613e56565b42119392505050565b6000610c7c6001611642565b90508015610cb157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055610ce56117cd565b8015610d4857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b610d596004627a1200613aa3565b81565b60335473ffffffffffffffffffffffffffffffffffffffff1661dead14610e05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084016104a0565b73ffffffffffffffffffffffffffffffffffffffff8916301415610eab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016104a0565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015610f38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5c9190613dda565b90507f00000000000000000000000000000000000000000000000000000000000000008160200151610f8e9190613e56565b421161101c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4f7074696d69736d506f7274616c3a2070726f706f73616c206973206e6f742060448201527f7965742066696e616c697a65640000000000000000000000000000000000000060648201526084016104a0565b61103361102e36869003860186613e6e565b6118b0565b8151146110c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016104a0565b60006111088d8d8d8d8d8d8d8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061190c92505050565b905061114f81866040013586868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061194b92505050565b6111db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016104a0565b60008181526034602052604090205460ff161561127a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016104a0565b600081815260346020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556112bd614e208a613e56565b5a101561134c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a20696e73756666696369656e742067617360448201527f20746f2066696e616c697a65207769746864726177616c00000000000000000060648201526084016104a0565b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8e16179055604080516020601f8a018190048102820181019092528881526000916113d5918e918d918f918691908f908f9081908401838280828437600092019190915250611a1492505050565b50603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061143b90841515815260200190565b60405180910390a25050505050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60008183121561147f5781611481565b825b90505b92915050565b600081831261147f5781611481565b6000611481670de0b6b3a7640000836114b186611a9f565b6114bb9190613b7f565b6114c59190613aa3565b611ce3565b60008183101561147f5781611481565b6000805a90505b825a6114ed9083613a5d565b1015611503576114fc82613ed4565b91506114e1565b505050565b60608161154857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611572578061155c81613ed4565b915061156b9050600a83613d50565b915061154c565b60008167ffffffffffffffff81111561158d5761158d613701565b6040519080825280601f01601f1916602001820160405280156115b7576020820181803683370190505b5090505b841561163a576115cc600183613a5d565b91506115d9600a86613e42565b6115e4906030613e56565b60f81b8183815181106115f9576115f9613f0d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611633600a86613d50565b94506115bb565b949350505050565b60008054610100900460ff16156116f9578160ff1660011480156116655750303b155b6116f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a0565b506000919050565b60005460ff808416911610611790576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a0565b50600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055600190565b919050565b600054610100900460ff16611864576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104a0565b60408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b600081600001518260200151836040015184606001516040516020016118ef949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600086868686868660405160200161192996959493929190613f3c565b6040516020818303038152906040528051906020012090509695505050505050565b604080516020810185905260009181018290528190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250611a099101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f01000000000000000000000000000000000000000000000000000000000000006020830152908587611f22565b9150505b9392505050565b6000606060008060008661ffff1667ffffffffffffffff811115611a3a57611a3a613701565b6040519080825280601f01601f191660200182016040528015611a64576020820181803683370190505b5090506000808751602089018b8e8ef191503d925086831115611a85578692505b828152826000602083013e90999098509650505050505050565b6000808213611b0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a0565b60006060611b1784611f46565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c18213611d1457506000919050565b680755bf798b4a1bf1e58212611d86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016104a0565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b600080611f2e8661201c565b9050611f3c8186868661204e565b9695505050505050565b6000808211611fb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a0565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b6060818051906020012060405160200161203891815260200190565b6040516020818303038152906040529050919050565b600080600061205e87868661208b565b9150915081801561208057508051602080830191909120875191880191909120145b979650505050505050565b60006060600061209a856121a6565b905060008060006120ac848a896122a1565b815192955090935091501580806120c05750815b61214c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2070726f76696465642070726f6f6620697320696e60448201527f76616c696400000000000000000000000000000000000000000000000000000060648201526084016104a0565b6000816121685760405180602001604052806000815250612194565b61219486612177600188613a5d565b8151811061218757612187613f0d565b602002602001015161282f565b919b919a509098505050505050505050565b606060006121b383612859565b90506000815167ffffffffffffffff8111156121d1576121d1613701565b60405190808252806020026020018201604052801561221657816020015b60408051808201909152606080825260208201528152602001906001900390816121ef5790505b50905060005b825181101561229957600061224984838151811061223c5761223c613f0d565b602002602001015161288c565b9050604051806040016040528082815260200161226583612859565b81525083838151811061227a5761227a613f0d565b602002602001018190525050808061229190613ed4565b91505061221c565b509392505050565b600060608180806122b18761295c565b905060008690506000806122d8604051806040016040528060608152602001606081525090565b60005b8c518110156127eb578c81815181106122f6576122f6613f0d565b60200260200101519150828461230c9190613e56565b9350612319600188613e56565b96508361239757815180516020909101208514612392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f74206861736800000060448201526064016104a0565b6124d3565b81515160201161243957815180516020909101208514612392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c20686173680000000000000000000000000000000000000000000000000060648201526084016104a0565b8151859061244690613f93565b146124d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f652068617368000000000000000000000000000000000000000000000000000060648201526084016104a0565b6124df60106001613e56565b82602001515114156125585785518414156124f9576127eb565b600086858151811061250d5761250d613f0d565b602001015160f81c60f81b60f81c9050600083602001518260ff168151811061253857612538613f0d565b6020026020010151905061254b81612adf565b96506001945050506127d9565b6002826020015151141561275157600061257183612b15565b905060008160008151811061258857612588613f0d565b016020015160f81c9050600061259f600283613fd8565b6125aa906002613ffa565b905060006125bb848360ff16612b39565b905060006125c98b8a612b39565b905060006125d78383612b6f565b905060ff8516600214806125ee575060ff85166003145b15612644578083511480156126035750808251145b1561261557612612818b613e56565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506127eb945050505050565b60ff85161580612657575060ff85166001145b156126c9578251811461269357507f800000000000000000000000000000000000000000000000000000000000000099506127eb945050505050565b6126ba88602001516001815181106126ad576126ad613f0d565b6020026020010151612adf565b9a5097506127d9945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e20707265666978000000000000000000000000000060648201526084016104a0565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f646500000000000000000000000000000000000000000000000060648201526084016104a0565b806127e381613ed4565b9150506122db565b507f800000000000000000000000000000000000000000000000000000000000000084148661281a8786612b39565b909e909d50909b509950505050505050505050565b602081015180516060916114849161284990600190613a5d565b8151811061223c5761223c613f0d565b60408051808201825260008082526020918201528151808301909252825182528083019082015260609061148490612c1b565b6060600080600061289c85612e74565b9194509250905060008160018111156128b7576128b761401d565b14612944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f524c505265616465723a20696e76616c696420524c502062797465732076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b6129538560200151848461335f565b95945050505050565b606060008251600261296e9190613caf565b67ffffffffffffffff81111561298657612986613701565b6040519080825280601f01601f1916602001820160405280156129b0576020820181803683370190505b50905060005b8351811015612ad85760048482815181106129d3576129d3613f0d565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c82612a08836002613caf565b81518110612a1857612a18613f0d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506010848281518110612a5b57612a5b613f0d565b0160200151612a6d919060f81c613fd8565b60f81b82612a7c836002613caf565b612a87906001613e56565b81518110612a9757612a97613f0d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080612ad081613ed4565b9150506129b6565b5092915050565b60006060602083600001511015612b0057612af98361343e565b9050612b0c565b612b098361288c565b90505b611a0d81613f93565b6060611484612b34836020015160008151811061223c5761223c613f0d565b61295c565b606082518210612b585750604080516020810190915260008152611484565b6114818383848651612b6a9190613a5d565b613449565b6000805b808451118015612b835750808351115b8015612c045750828181518110612b9c57612b9c613f0d565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110612bdb57612bdb613f0d565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b156114815780612c1381613ed4565b915050612b73565b6060600080612c2984612e74565b91935090915060019050816001811115612c4557612c4561401d565b14612cd2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f524c505265616465723a20696e76616c696420524c50206c6973742076616c7560448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b6040805160208082526104208201909252600091816020015b6040805180820190915260008082526020820152815260200190600190039081612ceb5790505090506000835b8651811015612e695760208210612db1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2070726f766964656420524c50206c6973742065786360448201527f65656473206d6178206c697374206c656e67746800000000000000000000000060648201526084016104a0565b600080612dee6040518060400160405280858c60000151612dd29190613a5d565b8152602001858c60200151612de79190613e56565b9052612e74565b509150915060405180604001604052808383612e0a9190613e56565b8152602001848b60200151612e1f9190613e56565b815250858581518110612e3457612e34613f0d565b6020908102919091010152612e4a600185613e56565b9350612e568183613e56565b612e609084613e56565b92505050612d18565b508152949350505050565b600080600080846000015111612f0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f524c505265616465723a20524c50206974656d2063616e6e6f74206265206e7560448201527f6c6c00000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b6020840151805160001a607f8111612f31576000600160009450945094505050613358565b60b78111612fed576000612f46608083613a5d565b905080876000015111612fdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f524c505265616465723a20696e76616c696420524c502073686f72742073747260448201527f696e67000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b60019550935060009250613358915050565b60bf811161315c57600061300260b783613a5d565b905080876000015111613097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67207374726960448201527f6e67206c656e677468000000000000000000000000000000000000000000000060648201526084016104a0565b600183015160208290036101000a90046130b18183613e56565b885111613140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67207374726960448201527f6e6700000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b61314b826001613e56565b965094506000935061335892505050565b60f7811161321757600061317160c083613a5d565b905080876000015111613206576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f524c505265616465723a20696e76616c696420524c502073686f7274206c697360448201527f740000000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b600195509350849250613358915050565b600061322460f783613a5d565b9050808760000151116132b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67206c69737460448201527f206c656e6774680000000000000000000000000000000000000000000000000060648201526084016104a0565b600183015160208290036101000a90046132d38183613e56565b88511161333c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67206c69737460448201526064016104a0565b613347826001613e56565b965094506001935061335892505050565b9193909250565b606060008267ffffffffffffffff81111561337c5761337c613701565b6040519080825280601f01601f1916602001820160405280156133a6576020820181803683370190505b5090508051600014156133ba579050611a0d565b60006133c68587613e56565b90506020820160005b6133da602087613d50565b81101561341157825182526133f0602084613e56565b92506133fd602083613e56565b91508061340981613ed4565b9150506133cf565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b606061148482613621565b60608182601f0110156134b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a0565b828284011015613524576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a0565b81830184511015613591576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016104a0565b6060821580156135b05760405191506000825260208201604052613618565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156135e95780518352602092830192016135d1565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b606061148482602001516000846000015161335f565b60005b8381101561365257818101518382015260200161363a565b83811115613661576000848401525b50505050565b6000815180845261367f816020860160208601613637565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006114816020830184613667565b6000602082840312156136d657600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146117c857600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561377757613777613701565b604052919050565b600080600080600060a0868803121561379757600080fd5b6137a0866136dd565b94506020808701359450604087013567ffffffffffffffff80821682146137c657600080fd5b90945060608801359081151582146137dd57600080fd5b909350608088013590808211156137f357600080fd5b818901915089601f83011261380757600080fd5b81358181111561381957613819613701565b613849847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613730565b91508082528a8482850101111561385f57600080fd5b80848401858401376000848284010152508093505050509295509295909350565b60008083601f84011261389257600080fd5b50813567ffffffffffffffff8111156138aa57600080fd5b6020830191508360208285010111156138c257600080fd5b9250929050565b60008060008060008060008060008060006101808c8e0312156138eb57600080fd5b8b359a506138fb60208d016136dd565b995061390960408d016136dd565b985060608c0135975060808c0135965067ffffffffffffffff60a08d0135111561393257600080fd5b6139428d60a08e01358e01613880565b909650945060c08c0135935060808c8e037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2001121561398057600080fd5b60e08c01925067ffffffffffffffff6101608d013511156139a057600080fd5b6139b18d6101608e01358e01613880565b81935080925050509295989b509295989b9093969950565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251613a1d816049850160208701613637565b919091016049019695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613a6f57613a6f613a2e565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613ab257613ab2613a74565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615613b0657613b06613a2e565b500590565b6000808312837f800000000000000000000000000000000000000000000000000000000000000001831281151615613b4557613b45613a2e565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615613b7957613b79613a2e565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615613bc057613bc0613a2e565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615613bfb57613bfb613a2e565b60008712925087820587128484161615613c1757613c17613a2e565b87850587128184161615613c2d57613c2d613a2e565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615613c7557613c75613a2e565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615613ca957613ca9613a2e565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613ce757613ce7613a2e565b500290565b600067ffffffffffffffff808316818516808303821115613d0f57613d0f613a2e565b01949350505050565b60006fffffffffffffffffffffffffffffffff80831681851681830481118215151615613d4757613d47613a2e565b02949350505050565b600082613d5f57613d5f613a74565b500490565b60008451613d76818460208901613637565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551613db2816001850160208a01613637565b60019201918201528351613dcd816002840160208801613637565b0160020195945050505050565b600060408284031215613dec57600080fd5b6040516040810181811067ffffffffffffffff82111715613e0f57613e0f613701565b604052825181526020928301519281019290925250919050565b600060208284031215613e3b57600080fd5b5051919050565b600082613e5157613e51613a74565b500690565b60008219821115613e6957613e69613a2e565b500190565b600060808284031215613e8057600080fd5b6040516080810181811067ffffffffffffffff82111715613ea357613ea3613701565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f0657613f06613a2e565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152613f8760c0830184613667565b98975050505050505050565b80516020808301519190811015613fd2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8160200360031b1b821691505b50919050565b600060ff831680613feb57613feb613a74565b8060ff84160691505092915050565b600060ff821660ff84168082101561401457614014613a2e565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080a000a" var OptimismPortalDeployedBin = "0x6080604052600436106100f65760003560e01c8063a14238e71161008a578063cff0ab9611610059578063cff0ab96146102f7578063e9e05c4214610398578063eecf1c36146103ab578063f4daa291146103be57600080fd5b8063a14238e71461026d578063c4fc4798146102ad578063ca3e99ba146102cd578063cd7c9789146102e257600080fd5b80636bb0291e116100c65780636bb0291e146102005780638129fc1c14610215578063867ead131461022a5780639bf62d821461024057600080fd5b80621c2ff61461012257806313620abd1461018057806354fd4d50146101b957806364b79208146101db57600080fd5b3661011d5761011b3334620186a06000604051806020016040528060008152506103f2565b005b600080fd5b34801561012e57600080fd5b506101567f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561018c57600080fd5b50610198633b9aca0081565b6040516fffffffffffffffffffffffffffffffff9091168152602001610177565b3480156101c557600080fd5b506101ce6108bf565b604051610177919061346e565b3480156101e757600080fd5b506101f2627a120081565b604051908152602001610177565b34801561020c57600080fd5b506101f2600481565b34801561022157600080fd5b5061011b610962565b34801561023657600080fd5b506101f261271081565b34801561024c57600080fd5b506033546101569073ffffffffffffffffffffffffffffffffffffffff1681565b34801561027957600080fd5b5061029d610288366004613481565b60346020526000908152604090205460ff1681565b6040519015158152602001610177565b3480156102b957600080fd5b5061029d6102c8366004613481565b610a3d565b3480156102d957600080fd5b506101f2610b02565b3480156102ee57600080fd5b506101f2600881565b34801561030357600080fd5b5060015461035f906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff9283166020850152911690820152606001610177565b61011b6103a636600461353c565b6103f2565b61011b6103b9366004613686565b610b13565b3480156103ca57600080fd5b506101f27f000000000000000000000000000000000000000000000000000000000000000081565b8260005a905083156104a95773ffffffffffffffffffffffffffffffffffffffff8716156104a957604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b333281146104ca575033731111000000000000000000000000000000001111015b600034888888886040516020016104e5959493929190613786565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c3284604051610555919061346e565b60405180910390a45050600154600090610595907801000000000000000000000000000000000000000000000000900467ffffffffffffffff164361381a565b9050801561071e5760006105ad6004627a1200613860565b6001546105d89190700100000000000000000000000000000000900467ffffffffffffffff166138c8565b9050600060086105ec6004627a1200613860565b60015461060c9085906fffffffffffffffffffffffffffffffff1661393c565b6106169190613860565b6106209190613860565b60015490915060009061066c906106569061064e9085906fffffffffffffffffffffffffffffffff166139f8565b6127106111fd565b6fffffffffffffffffffffffffffffffff611218565b905060018411156106df576106dc610656670de0b6b3a76400006106c8610694600883613860565b6106a690670de0b6b3a76400006138c8565b6106b160018a61381a565b6106c390670de0b6b3a7640000613a6c565b611227565b6106d2908561393c565b61064e9190613860565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054849190601090610751908490700100000000000000000000000000000000900467ffffffffffffffff16613aa9565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550627a1200600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff16131561082d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d6974000060648201526084016104a0565b600154600090610859906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8616613ad5565b6fffffffffffffffffffffffffffffffff169050600061087d48633b9aca00611258565b6108879083613b0d565b905060005a610896908661381a565b9050808211156108b2576108b26108ad828461381a565b611268565b5050505050505050505050565b60606108ea7f0000000000000000000000000000000000000000000000000000000000000000611296565b6109137f0000000000000000000000000000000000000000000000000000000000000000611296565b61093c7f0000000000000000000000000000000000000000000000000000000000000000611296565b60405160200161094e93929190613b21565b604051602081830303815290604052905090565b600061096e60016113d0565b905080156109a357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790556109d761155b565b8015610a3a57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101829052600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae557906024016040805180830381865afa158015610acc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af09190613b97565b9050610afb8161163e565b9392505050565b610b106004627a1200613860565b81565b60335473ffffffffffffffffffffffffffffffffffffffff1661dead14610bbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084016104a0565b73ffffffffffffffffffffffffffffffffffffffff8916301415610c62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016104a0565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015610cef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d139190613b97565b9050610d1e8161163e565b610daa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4f7074696d69736d506f7274616c3a2070726f706f73616c206973206e6f742060448201527f7965742066696e616c697a65640000000000000000000000000000000000000060648201526084016104a0565b610dc1610dbc36869003860186613be6565b611678565b815114610e50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016104a0565b6000610e968d8d8d8d8d8d8d8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506116d492505050565b9050610edd81866040013586868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061171392505050565b610f69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016104a0565b60008181526034602052604090205460ff1615611008576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016104a0565b600081815260346020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561104b614e208a613c4c565b5a10156110da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a20696e73756666696369656e742067617360448201527f20746f2066696e616c697a65207769746864726177616c00000000000000000060648201526084016104a0565b603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8e16179055604080516020601f8a01819004810282018101909252888152600091611163918e918d918f918691908f908f90819084018382808284376000920191909152506117da92505050565b50603380547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915082907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b906111c990841515815260200190565b60405180910390a25050505050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60008183121561120d578161120f565b825b90505b92915050565b600081831261120d578161120f565b600061120f670de0b6b3a76400008361123f86611865565b611249919061393c565b6112539190613860565b611aa9565b60008183101561120d578161120f565b6000805a90505b825a61127b908361381a565b10156112915761128a82613c64565b915061126f565b505050565b6060816112d657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561130057806112ea81613c64565b91506112f99050600a83613b0d565b91506112da565b60008167ffffffffffffffff81111561131b5761131b6134be565b6040519080825280601f01601f191660200182016040528015611345576020820181803683370190505b5090505b84156113c85761135a60018361381a565b9150611367600a86613c9d565b611372906030613c4c565b60f81b81838151811061138757611387613cb1565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506113c1600a86613b0d565b9450611349565b949350505050565b60008054610100900460ff1615611487578160ff1660011480156113f35750303b155b61147f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a0565b506000919050565b60005460ff80841691161061151e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a0565b50600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff92909216919091179055600190565b919050565b600054610100900460ff166115f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104a0565b60408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b60007f000000000000000000000000000000000000000000000000000000000000000082602001516116709190613c4c565b421192915050565b600081600001518260200151836040015184606001516040516020016116b7949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60008686868686866040516020016116f196959493929190613ce0565b6040516020818303038152906040528051906020012090509695505050505050565b604080516020810185905260009181018290528190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012090830181905292506117d19101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f01000000000000000000000000000000000000000000000000000000000000006020830152908587611ce8565b95945050505050565b6000606060008060008661ffff1667ffffffffffffffff811115611800576118006134be565b6040519080825280601f01601f19166020018201604052801561182a576020820181803683370190505b5090506000808751602089018b8e8ef191503d92508683111561184b578692505b828152826000602083013e90999098509650505050505050565b60008082136118d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a0565b600060606118dd84611d0c565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c18213611ada57506000919050565b680755bf798b4a1bf1e58212611b4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016104a0565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b600080611cf486611de2565b9050611d0281868686611e14565b9695505050505050565b6000808211611d77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016104a0565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b60608180519060200120604051602001611dfe91815260200190565b6040516020818303038152906040529050919050565b6000806000611e24878686611e51565b91509150818015611e4657508051602080830191909120875191880191909120145b979650505050505050565b600060606000611e6085611f6c565b90506000806000611e72848a89612067565b81519295509093509150158080611e865750815b611f12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2070726f76696465642070726f6f6620697320696e60448201527f76616c696400000000000000000000000000000000000000000000000000000060648201526084016104a0565b600081611f2e5760405180602001604052806000815250611f5a565b611f5a86611f3d60018861381a565b81518110611f4d57611f4d613cb1565b60200260200101516125f5565b919b919a509098505050505050505050565b60606000611f798361261f565b90506000815167ffffffffffffffff811115611f9757611f976134be565b604051908082528060200260200182016040528015611fdc57816020015b6040805180820190915260608082526020820152815260200190600190039081611fb55790505b50905060005b825181101561205f57600061200f84838151811061200257612002613cb1565b6020026020010151612652565b9050604051806040016040528082815260200161202b8361261f565b81525083838151811061204057612040613cb1565b602002602001018190525050808061205790613c64565b915050611fe2565b509392505050565b6000606081808061207787612719565b9050600086905060008061209e604051806040016040528060608152602001606081525090565b60005b8c518110156125b1578c81815181106120bc576120bc613cb1565b6020026020010151915082846120d29190613c4c565b93506120df600188613c4c565b96508361215d57815180516020909101208514612158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f74206861736800000060448201526064016104a0565b612299565b8151516020116121ff57815180516020909101208514612158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c20686173680000000000000000000000000000000000000000000000000060648201526084016104a0565b8151859061220c90613d37565b14612299576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f652068617368000000000000000000000000000000000000000000000000000060648201526084016104a0565b6122a560106001613c4c565b826020015151141561231e5785518414156122bf576125b1565b60008685815181106122d3576122d3613cb1565b602001015160f81c60f81b60f81c9050600083602001518260ff16815181106122fe576122fe613cb1565b602002602001015190506123118161289c565b965060019450505061259f565b60028260200151511415612517576000612337836128d2565b905060008160008151811061234e5761234e613cb1565b016020015160f81c90506000612365600283613d7c565b612370906002613d9e565b90506000612381848360ff166128f6565b9050600061238f8b8a6128f6565b9050600061239d838361292c565b905060ff8516600214806123b4575060ff85166003145b1561240a578083511480156123c95750808251145b156123db576123d8818b613c4c565b99505b507f800000000000000000000000000000000000000000000000000000000000000099506125b1945050505050565b60ff8516158061241d575060ff85166001145b1561248f578251811461245957507f800000000000000000000000000000000000000000000000000000000000000099506125b1945050505050565b612480886020015160018151811061247357612473613cb1565b602002602001015161289c565b9a50975061259f945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e20707265666978000000000000000000000000000060648201526084016104a0565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f646500000000000000000000000000000000000000000000000060648201526084016104a0565b806125a981613c64565b9150506120a1565b507f80000000000000000000000000000000000000000000000000000000000000008414866125e087866128f6565b909e909d50909b509950505050505050505050565b602081015180516060916112129161260f9060019061381a565b8151811061200257612002613cb1565b604080518082018252600080825260209182015281518083019092528251825280830190820152606090611212906129d8565b6060600080600061266285612c31565b91945092509050600081600181111561267d5761267d613dc1565b1461270a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f524c505265616465723a20696e76616c696420524c502062797465732076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b6117d18560200151848461311c565b606060008251600261272b9190613a6c565b67ffffffffffffffff811115612743576127436134be565b6040519080825280601f01601f19166020018201604052801561276d576020820181803683370190505b50905060005b835181101561289557600484828151811061279057612790613cb1565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016901c826127c5836002613a6c565b815181106127d5576127d5613cb1565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350601084828151811061281857612818613cb1565b016020015161282a919060f81c613d7c565b60f81b82612839836002613a6c565b612844906001613c4c565b8151811061285457612854613cb1565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508061288d81613c64565b915050612773565b5092915050565b600060606020836000015110156128bd576128b6836131fb565b90506128c9565b6128c683612652565b90505b610afb81613d37565b60606112126128f1836020015160008151811061200257612002613cb1565b612719565b6060825182106129155750604080516020810190915260008152611212565b61120f8383848651612927919061381a565b613206565b6000805b8084511180156129405750808351115b80156129c1575082818151811061295957612959613cb1565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191684828151811061299857612998613cb1565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b1561120f57806129d081613c64565b915050612930565b60606000806129e684612c31565b91935090915060019050816001811115612a0257612a02613dc1565b14612a8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f524c505265616465723a20696e76616c696420524c50206c6973742076616c7560448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b6040805160208082526104208201909252600091816020015b6040805180820190915260008082526020820152815260200190600190039081612aa85790505090506000835b8651811015612c265760208210612b6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2070726f766964656420524c50206c6973742065786360448201527f65656473206d6178206c697374206c656e67746800000000000000000000000060648201526084016104a0565b600080612bab6040518060400160405280858c60000151612b8f919061381a565b8152602001858c60200151612ba49190613c4c565b9052612c31565b509150915060405180604001604052808383612bc79190613c4c565b8152602001848b60200151612bdc9190613c4c565b815250858581518110612bf157612bf1613cb1565b6020908102919091010152612c07600185613c4c565b9350612c138183613c4c565b612c1d9084613c4c565b92505050612ad5565b508152949350505050565b600080600080846000015111612cc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f524c505265616465723a20524c50206974656d2063616e6e6f74206265206e7560448201527f6c6c00000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b6020840151805160001a607f8111612cee576000600160009450945094505050613115565b60b78111612daa576000612d0360808361381a565b905080876000015111612d98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f524c505265616465723a20696e76616c696420524c502073686f72742073747260448201527f696e67000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b60019550935060009250613115915050565b60bf8111612f19576000612dbf60b78361381a565b905080876000015111612e54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67207374726960448201527f6e67206c656e677468000000000000000000000000000000000000000000000060648201526084016104a0565b600183015160208290036101000a9004612e6e8183613c4c565b885111612efd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67207374726960448201527f6e6700000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b612f08826001613c4c565b965094506000935061311592505050565b60f78111612fd4576000612f2e60c08361381a565b905080876000015111612fc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f524c505265616465723a20696e76616c696420524c502073686f7274206c697360448201527f740000000000000000000000000000000000000000000000000000000000000060648201526084016104a0565b600195509350849250613115915050565b6000612fe160f78361381a565b905080876000015111613076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67206c69737460448201527f206c656e6774680000000000000000000000000000000000000000000000000060648201526084016104a0565b600183015160208290036101000a90046130908183613c4c565b8851116130f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f524c505265616465723a20696e76616c696420524c50206c6f6e67206c69737460448201526064016104a0565b613104826001613c4c565b965094506001935061311592505050565b9193909250565b606060008267ffffffffffffffff811115613139576131396134be565b6040519080825280601f01601f191660200182016040528015613163576020820181803683370190505b509050805160001415613177579050610afb565b60006131838587613c4c565b90506020820160005b613197602087613b0d565b8110156131ce57825182526131ad602084613c4c565b92506131ba602083613c4c565b9150806131c681613c64565b91505061318c565b5060006001602087066020036101000a039050808251168119845116178252839450505050509392505050565b6060611212826133de565b60608182601f011015613275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a0565b8282840110156132e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016104a0565b8183018451101561334e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016104a0565b60608215801561336d57604051915060008252602082016040526133d5565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156133a657805183526020928301920161338e565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b606061121282602001516000846000015161311c565b60005b8381101561340f5781810151838201526020016133f7565b8381111561341e576000848401525b50505050565b6000815180845261343c8160208601602086016133f4565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061120f6020830184613424565b60006020828403121561349357600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461155657600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613534576135346134be565b604052919050565b600080600080600060a0868803121561355457600080fd5b61355d8661349a565b94506020808701359450604087013567ffffffffffffffff808216821461358357600080fd5b909450606088013590811515821461359a57600080fd5b909350608088013590808211156135b057600080fd5b818901915089601f8301126135c457600080fd5b8135818111156135d6576135d66134be565b613606847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016134ed565b91508082528a8482850101111561361c57600080fd5b80848401858401376000848284010152508093505050509295509295909350565b60008083601f84011261364f57600080fd5b50813567ffffffffffffffff81111561366757600080fd5b60208301915083602082850101111561367f57600080fd5b9250929050565b60008060008060008060008060008060006101808c8e0312156136a857600080fd5b8b359a506136b860208d0161349a565b99506136c660408d0161349a565b985060608c0135975060808c0135965067ffffffffffffffff60a08d013511156136ef57600080fd5b6136ff8d60a08e01358e0161363d565b909650945060c08c0135935060808c8e037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2001121561373d57600080fd5b60e08c01925067ffffffffffffffff6101608d0135111561375d57600080fd5b61376e8d6101608e01358e0161363d565b81935080925050509295989b509295989b9093969950565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b6048820152600082516137da8160498501602087016133f4565b919091016049019695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561382c5761382c6137eb565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261386f5761386f613831565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f8000000000000000000000000000000000000000000000000000000000000000831416156138c3576138c36137eb565b500590565b6000808312837f800000000000000000000000000000000000000000000000000000000000000001831281151615613902576139026137eb565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615613936576139366137eb565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561397d5761397d6137eb565b7f800000000000000000000000000000000000000000000000000000000000000060008712868205881281841616156139b8576139b86137eb565b600087129250878205871284841616156139d4576139d46137eb565b878505871281841616156139ea576139ea6137eb565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615613a3257613a326137eb565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615613a6657613a666137eb565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613aa457613aa46137eb565b500290565b600067ffffffffffffffff808316818516808303821115613acc57613acc6137eb565b01949350505050565b60006fffffffffffffffffffffffffffffffff80831681851681830481118215151615613b0457613b046137eb565b02949350505050565b600082613b1c57613b1c613831565b500490565b60008451613b338184602089016133f4565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551613b6f816001850160208a016133f4565b60019201918201528351613b8a8160028401602088016133f4565b0160020195945050505050565b600060408284031215613ba957600080fd5b6040516040810181811067ffffffffffffffff82111715613bcc57613bcc6134be565b604052825181526020928301519281019290925250919050565b600060808284031215613bf857600080fd5b6040516080810181811067ffffffffffffffff82111715613c1b57613c1b6134be565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b60008219821115613c5f57613c5f6137eb565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c9657613c966137eb565b5060010190565b600082613cac57613cac613831565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152613d2b60c0830184613424565b98975050505050505050565b80516020808301519190811015613d76577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8160200360031b1b821691505b50919050565b600060ff831680613d8f57613d8f613831565b8060ff84160691505092915050565b600060ff821660ff841680821015613db857613db86137eb565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080a000a"
...@@ -39,17 +39,17 @@ L1CrossDomainMessenger_Test:testCannot_L1MessengerPause() (gas: 24494) ...@@ -39,17 +39,17 @@ L1CrossDomainMessenger_Test:testCannot_L1MessengerPause() (gas: 24494)
L1CrossDomainMessenger_Test:testCannot_L1MessengerUnpause() (gas: 24530) L1CrossDomainMessenger_Test:testCannot_L1MessengerUnpause() (gas: 24530)
L1CrossDomainMessenger_Test:test_L1MessengerMessageVersion() (gas: 24704) L1CrossDomainMessenger_Test:test_L1MessengerMessageVersion() (gas: 24704)
L1CrossDomainMessenger_Test:test_L1MessengerPause() (gas: 47993) L1CrossDomainMessenger_Test:test_L1MessengerPause() (gas: 47993)
L1CrossDomainMessenger_Test:test_L1MessengerRelayMessageFirstStuckSecondSucceeds() (gas: 201871) L1CrossDomainMessenger_Test:test_L1MessengerRelayMessageFirstStuckSecondSucceeds() (gas: 201937)
L1CrossDomainMessenger_Test:test_L1MessengerRelayMessageRevertsOnReentrancy() (gas: 195009) L1CrossDomainMessenger_Test:test_L1MessengerRelayMessageRevertsOnReentrancy() (gas: 195075)
L1CrossDomainMessenger_Test:test_L1MessengerRelayMessageSucceeds() (gas: 77751) L1CrossDomainMessenger_Test:test_L1MessengerRelayMessageSucceeds() (gas: 77817)
L1CrossDomainMessenger_Test:test_L1MessengerRelayMessageToSystemContract() (gas: 67873) L1CrossDomainMessenger_Test:test_L1MessengerRelayMessageToSystemContract() (gas: 67939)
L1CrossDomainMessenger_Test:test_L1MessengerRelayShouldRevertIfPaused() (gas: 60448) L1CrossDomainMessenger_Test:test_L1MessengerRelayShouldRevertIfPaused() (gas: 60448)
L1CrossDomainMessenger_Test:test_L1MessengerReplayMessageWithValue() (gas: 38160) L1CrossDomainMessenger_Test:test_L1MessengerReplayMessageWithValue() (gas: 38160)
L1CrossDomainMessenger_Test:test_L1MessengerSendMessage() (gas: 298101) L1CrossDomainMessenger_Test:test_L1MessengerSendMessage() (gas: 298101)
L1CrossDomainMessenger_Test:test_L1MessengerTwiceSendMessage() (gas: 1489673) L1CrossDomainMessenger_Test:test_L1MessengerTwiceSendMessage() (gas: 1489673)
L1CrossDomainMessenger_Test:test_L1MessengerUnpause() (gas: 40852) L1CrossDomainMessenger_Test:test_L1MessengerUnpause() (gas: 40852)
L1CrossDomainMessenger_Test:test_L1MessengerXDomainSenderReverts() (gas: 24313) L1CrossDomainMessenger_Test:test_L1MessengerXDomainSenderReverts() (gas: 24313)
L1CrossDomainMessenger_Test:test_L1MessengerxDomainMessageSenderResets() (gas: 86298) L1CrossDomainMessenger_Test:test_L1MessengerxDomainMessageSenderResets() (gas: 86364)
L1StandardBridge_Test:test_depositERC20() (gas: 578548) L1StandardBridge_Test:test_depositERC20() (gas: 578548)
L1StandardBridge_Test:test_depositERC20To() (gas: 580752) L1StandardBridge_Test:test_depositERC20To() (gas: 580752)
L1StandardBridge_Test:test_depositETH() (gas: 372464) L1StandardBridge_Test:test_depositETH() (gas: 372464)
...@@ -76,9 +76,9 @@ L2CrossDomainMessenger_Test:test_L2MessengerTwiceSendMessage() (gas: 133074) ...@@ -76,9 +76,9 @@ L2CrossDomainMessenger_Test:test_L2MessengerTwiceSendMessage() (gas: 133074)
L2CrossDomainMessenger_Test:test_L2MessengerXDomainSenderReverts() (gas: 10612) L2CrossDomainMessenger_Test:test_L2MessengerXDomainSenderReverts() (gas: 10612)
L2CrossDomainMessenger_Test:test_L2MessengerxDomainMessageSenderResets() (gas: 54893) L2CrossDomainMessenger_Test:test_L2MessengerxDomainMessageSenderResets() (gas: 54893)
L2OutputOracleTest:testCannot_ProposeWithUnmatchedBlockhash() (gas: 26829) L2OutputOracleTest:testCannot_ProposeWithUnmatchedBlockhash() (gas: 26829)
L2OutputOracleTest:testCannot_deleteL2Output_ifNotOwner() (gas: 24842) L2OutputOracleTest:testCannot_deleteL2Output_ifNotOwner() (gas: 25097)
L2OutputOracleTest:testCannot_deleteL2Output_withWrongRoot() (gas: 91177) L2OutputOracleTest:testCannot_deleteL2Output_withWrongRoot() (gas: 91432)
L2OutputOracleTest:testCannot_deleteL2Output_withWrongTime() (gas: 87171) L2OutputOracleTest:testCannot_deleteL2Output_withWrongTime() (gas: 87426)
L2OutputOracleTest:testCannot_proposeEmptyOutput() (gas: 24128) L2OutputOracleTest:testCannot_proposeEmptyOutput() (gas: 24128)
L2OutputOracleTest:testCannot_proposeFutureTimetamp() (gas: 26097) L2OutputOracleTest:testCannot_proposeFutureTimetamp() (gas: 26097)
L2OutputOracleTest:testCannot_proposeL2OutputIfNotProposer() (gas: 23564) L2OutputOracleTest:testCannot_proposeL2OutputIfNotProposer() (gas: 23564)
...@@ -86,9 +86,9 @@ L2OutputOracleTest:testCannot_proposeOnWrongFork() (gas: 26424) ...@@ -86,9 +86,9 @@ L2OutputOracleTest:testCannot_proposeOnWrongFork() (gas: 26424)
L2OutputOracleTest:testCannot_proposeUnexpectedBlockNumber() (gas: 25983) L2OutputOracleTest:testCannot_proposeUnexpectedBlockNumber() (gas: 25983)
L2OutputOracleTest:test_changeProposer() (gas: 56052) L2OutputOracleTest:test_changeProposer() (gas: 56052)
L2OutputOracleTest:test_computeL2Timestamp() (gas: 30288) L2OutputOracleTest:test_computeL2Timestamp() (gas: 30288)
L2OutputOracleTest:test_constructor() (gas: 48791) L2OutputOracleTest:test_constructor() (gas: 49046)
L2OutputOracleTest:test_deleteOutput() (gas: 76611) L2OutputOracleTest:test_deleteOutput() (gas: 77223)
L2OutputOracleTest:test_getL2Output() (gas: 82934) L2OutputOracleTest:test_getL2Output() (gas: 88514)
L2OutputOracleTest:test_latestBlockNumber() (gas: 76284) L2OutputOracleTest:test_latestBlockNumber() (gas: 76284)
L2OutputOracleTest:test_nextBlockNumber() (gas: 15232) L2OutputOracleTest:test_nextBlockNumber() (gas: 15232)
L2OutputOracleTest:test_proposeWithBlockhashAndHeight() (gas: 75046) L2OutputOracleTest:test_proposeWithBlockhashAndHeight() (gas: 75046)
...@@ -96,7 +96,7 @@ L2OutputOracleTest:test_proposingAnotherOutput() (gas: 76881) ...@@ -96,7 +96,7 @@ L2OutputOracleTest:test_proposingAnotherOutput() (gas: 76881)
L2OutputOracleTest:test_updateOwner() (gas: 34580) L2OutputOracleTest:test_updateOwner() (gas: 34580)
L2OutputOracleUpgradeable_Test:test_cannotInitImpl() (gas: 19428) L2OutputOracleUpgradeable_Test:test_cannotInitImpl() (gas: 19428)
L2OutputOracleUpgradeable_Test:test_cannotInitProxy() (gas: 24427) L2OutputOracleUpgradeable_Test:test_cannotInitProxy() (gas: 24427)
L2OutputOracleUpgradeable_Test:test_initValuesOnProxy() (gas: 38831) L2OutputOracleUpgradeable_Test:test_initValuesOnProxy() (gas: 39086)
L2OutputOracleUpgradeable_Test:test_upgrading() (gas: 230843) L2OutputOracleUpgradeable_Test:test_upgrading() (gas: 230843)
L2StandardBridge_Test:test_ERC20BridgeFailed_whenLocalTokenIsBridge() (gas: 132769) L2StandardBridge_Test:test_ERC20BridgeFailed_whenLocalTokenIsBridge() (gas: 132769)
L2StandardBridge_Test:test_cannotWithdrawEthWithoutSendingIt() (gas: 21622) L2StandardBridge_Test:test_cannotWithdrawEthWithoutSendingIt() (gas: 21622)
...@@ -133,14 +133,14 @@ OptimismMintableTokenFactory_Test:test_bridge() (gas: 7663) ...@@ -133,14 +133,14 @@ OptimismMintableTokenFactory_Test:test_bridge() (gas: 7663)
OptimismMintableTokenFactory_Test:test_createStandardL2Token() (gas: 1113127) OptimismMintableTokenFactory_Test:test_createStandardL2Token() (gas: 1113127)
OptimismMintableTokenFactory_Test:test_createStandardL2TokenSameTwice() (gas: 2209165) OptimismMintableTokenFactory_Test:test_createStandardL2TokenSameTwice() (gas: 2209165)
OptimismMintableTokenFactory_Test:test_createStandardL2TokenShouldRevertIfRemoteIsZero() (gas: 9398) OptimismMintableTokenFactory_Test:test_createStandardL2TokenShouldRevertIfRemoteIsZero() (gas: 9398)
OptimismPortalUpgradeable_Test:test_cannotInitImpl() (gas: 10708) OptimismPortalUpgradeable_Test:test_cannotInitImpl() (gas: 10686)
OptimismPortalUpgradeable_Test:test_cannotInitProxy() (gas: 15684) OptimismPortalUpgradeable_Test:test_cannotInitProxy() (gas: 15662)
OptimismPortalUpgradeable_Test:test_initValuesOnProxy() (gas: 15967) OptimismPortalUpgradeable_Test:test_initValuesOnProxy() (gas: 15967)
OptimismPortalUpgradeable_Test:test_upgrading() (gas: 230843) OptimismPortalUpgradeable_Test:test_upgrading() (gas: 230843)
OptimismPortal_Test:test_OptimismPortalConstructor() (gas: 17275) OptimismPortal_Test:test_OptimismPortalConstructor() (gas: 17341)
OptimismPortal_Test:test_OptimismPortalContractCreationReverts() (gas: 14215) OptimismPortal_Test:test_OptimismPortalContractCreationReverts() (gas: 14215)
OptimismPortal_Test:test_OptimismPortalReceiveEth() (gas: 127503) OptimismPortal_Test:test_OptimismPortalReceiveEth() (gas: 127503)
OptimismPortal_Test:test_cannotVerifyRecentWithdrawal() (gas: 31946) OptimismPortal_Test:test_cannotFinalizeRecentWithdrawal() (gas: 24754)
OptimismPortal_Test:test_depositTransaction_NoValueContract() (gas: 76654) OptimismPortal_Test:test_depositTransaction_NoValueContract() (gas: 76654)
OptimismPortal_Test:test_depositTransaction_NoValueEOA() (gas: 77108) OptimismPortal_Test:test_depositTransaction_NoValueEOA() (gas: 77108)
OptimismPortal_Test:test_depositTransaction_createWithZeroValueForContract() (gas: 76659) OptimismPortal_Test:test_depositTransaction_createWithZeroValueForContract() (gas: 76659)
...@@ -148,10 +148,10 @@ OptimismPortal_Test:test_depositTransaction_createWithZeroValueForEOA() (gas: 76 ...@@ -148,10 +148,10 @@ OptimismPortal_Test:test_depositTransaction_createWithZeroValueForEOA() (gas: 76
OptimismPortal_Test:test_depositTransaction_withEthValueAndContractContractCreation() (gas: 83680) OptimismPortal_Test:test_depositTransaction_withEthValueAndContractContractCreation() (gas: 83680)
OptimismPortal_Test:test_depositTransaction_withEthValueAndEOAContractCreation() (gas: 75845) OptimismPortal_Test:test_depositTransaction_withEthValueAndEOAContractCreation() (gas: 75845)
OptimismPortal_Test:test_depositTransaction_withEthValueFromContract() (gas: 83384) OptimismPortal_Test:test_depositTransaction_withEthValueFromContract() (gas: 83384)
OptimismPortal_Test:test_depositTransaction_withEthValueFromEOA() (gas: 84154) OptimismPortal_Test:test_depositTransaction_withEthValueFromEOA() (gas: 84132)
OptimismPortal_Test:test_invalidWithdrawalProof() (gas: 45218) OptimismPortal_Test:test_invalidWithdrawalProof() (gas: 37266)
OptimismPortal_Test:test_isOutputFinalized() (gas: 132035) OptimismPortal_Test:test_isBlockFinalized() (gas: 113725)
OptimismPortal_Test:test_simple_isOutputFinalized() (gas: 24019) OptimismPortal_Test:test_simple_isBlockFinalized() (gas: 26652)
Proxy_Test:test_clashingFunctionSignatures() (gas: 101427) Proxy_Test:test_clashingFunctionSignatures() (gas: 101427)
Proxy_Test:test_implementationKey() (gas: 20942) Proxy_Test:test_implementationKey() (gas: 20942)
Proxy_Test:test_implementationProxyCallIfNotAdmin() (gas: 30021) Proxy_Test:test_implementationProxyCallIfNotAdmin() (gas: 30021)
......
...@@ -260,13 +260,35 @@ contract L2OutputOracle is OwnableUpgradeable, Semver { ...@@ -260,13 +260,35 @@ contract L2OutputOracle is OwnableUpgradeable, Semver {
} }
/** /**
* @notice Returns the L2 output proposal given a target L2 block number. * @notice Returns the L2 output proposal associated with a target L2 block number. If the
* Returns a null output proposal if none is found. * L2 block number provided is between checkpoints, this function will rerutn the next
* proposal for the next checkpoint.
* Reverts if the output proposal is either not found, or predates
* the STARTING_BLOCK_NUMBER.
* *
* @param _l2BlockNumber The L2 block number of the target block. * @param _l2BlockNumber The L2 block number of the target block.
*/ */
function getL2Output(uint256 _l2BlockNumber) external view returns (OutputProposal memory) { function getL2Output(uint256 _l2BlockNumber) external view returns (OutputProposal memory) {
return l2Outputs[_l2BlockNumber]; require(
_l2BlockNumber >= STARTING_BLOCK_NUMBER,
"L2OutputOracle: block number cannot be less than the starting block number."
);
// Find the distance between _l2BlockNumber, and the checkpoint block before it.
uint256 offset = (_l2BlockNumber - STARTING_BLOCK_NUMBER) % SUBMISSION_INTERVAL;
// If the offset is zero, then the _l2BlockNumber should be checkpointed.
// Otherwise, we'll look up the next block that will be checkpointed.
uint256 lookupBlockNumber = offset == 0
? _l2BlockNumber
: _l2BlockNumber + (SUBMISSION_INTERVAL - offset);
OutputProposal memory output = l2Outputs[lookupBlockNumber];
require(
output.outputRoot != bytes32(0),
"L2OutputOracle: No output found for that block number."
);
return output;
} }
/** /**
......
...@@ -169,33 +169,28 @@ contract OptimismPortal is Initializable, ResourceMetering, Semver { ...@@ -169,33 +169,28 @@ contract OptimismPortal is Initializable, ResourceMetering, Semver {
} }
/** /**
* @notice Determine if an L2 Output is finalized. * @notice Determine if a given block number is finalized. Reverts if the call to
* L2_ORACLE.getL2Output reverts. Returns a boolean otherwise.
* *
* @param _l2BlockNumber The number of the L2 block. * @param _l2BlockNumber The number of the L2 block.
*/ */
function isBlockFinalized(uint256 _l2BlockNumber) external view returns (bool) {
function isOutputFinalized(uint256 _l2BlockNumber) external view returns (bool) {
L2OutputOracle.OutputProposal memory proposal = L2_ORACLE.getL2Output(_l2BlockNumber); L2OutputOracle.OutputProposal memory proposal = L2_ORACLE.getL2Output(_l2BlockNumber);
if (proposal.outputRoot == bytes32(uint256(0))) { return _isOutputFinalized(proposal);
uint256 interval = L2_ORACLE.SUBMISSION_INTERVAL(); }
uint256 startingBlockNumber = L2_ORACLE.STARTING_BLOCK_NUMBER();
/**
// Prevent underflow * @notice Determine if an L2 Output is finalized.
if (startingBlockNumber > _l2BlockNumber) { *
return false; * @param _proposal The output proposal to check.
} */
function _isOutputFinalized(L2OutputOracle.OutputProposal memory _proposal)
// Find the distance between the _l2BlockNumber, and the checkpoint block before it. internal
uint256 offset = (_l2BlockNumber - startingBlockNumber) % interval; view
// Look up the checkpoint block after it. returns (bool)
proposal = L2_ORACLE.getL2Output(_l2BlockNumber + (interval - offset)); {
// False if that block is not yet proposed. return block.timestamp > _proposal.timestamp + FINALIZATION_PERIOD_SECONDS;
if (proposal.outputRoot == bytes32(uint256(0))) {
return false;
}
}
return block.timestamp > proposal.timestamp + FINALIZATION_PERIOD_SECONDS;
} }
/** /**
...@@ -235,17 +230,15 @@ contract OptimismPortal is Initializable, ResourceMetering, Semver { ...@@ -235,17 +230,15 @@ contract OptimismPortal is Initializable, ResourceMetering, Semver {
"OptimismPortal: you cannot send messages to the portal contract" "OptimismPortal: you cannot send messages to the portal contract"
); );
// Get the output root. // Get the output root. This will fail if there is no
// output root for the given block number.
L2OutputOracle.OutputProposal memory proposal = L2_ORACLE.getL2Output(_l2BlockNumber); L2OutputOracle.OutputProposal memory proposal = L2_ORACLE.getL2Output(_l2BlockNumber);
// Ensure that enough time has passed since the proposal was submitted before allowing a // Ensure that enough time has passed since the proposal was submitted before allowing a
// withdrawal. Under the assumption that the fault proof mechanism is operating correctly, // withdrawal. Under the assumption that the fault proof mechanism is operating correctly,
// we can infer that any withdrawal that has passed the finalization period must be valid // we can infer that any withdrawal that has passed the finalization period must be valid
// and can therefore be operated on. // and can therefore be operated on.
require( require(_isOutputFinalized(proposal), "OptimismPortal: proposal is not yet finalized");
block.timestamp > proposal.timestamp + FINALIZATION_PERIOD_SECONDS,
"OptimismPortal: proposal is not yet finalized"
);
// Verify that the output root can be generated with the elements in the proof. // Verify that the output root can be generated with the elements in the proof.
require( require(
......
...@@ -54,9 +54,18 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer { ...@@ -54,9 +54,18 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer {
assertEq(proposal.outputRoot, proposedOutput1); assertEq(proposal.outputRoot, proposedOutput1);
assertEq(proposal.timestamp, block.timestamp); assertEq(proposal.timestamp, block.timestamp);
L2OutputOracle.OutputProposal memory proposal2 = oracle.getL2Output(0); // Handles a block number that is between checkpoints:
assertEq(proposal2.outputRoot, bytes32(0)); proposal = oracle.getL2Output(nextBlockNumber - 1);
assertEq(proposal2.timestamp, 0); assertEq(proposal.outputRoot, proposedOutput1);
assertEq(proposal.timestamp, block.timestamp);
// The block number is too low:
vm.expectRevert("L2OutputOracle: block number cannot be less than the starting block number.");
proposal = oracle.getL2Output(0);
// The block number is larger than the latest proposed output:
vm.expectRevert("L2OutputOracle: No output found for that block number.");
proposal = oracle.getL2Output(nextBlockNumber + 1);
} }
// Test: nextBlockNumber() should return the correct value // Test: nextBlockNumber() should return the correct value
......
...@@ -220,7 +220,7 @@ contract OptimismPortal_Test is Portal_Initializer { ...@@ -220,7 +220,7 @@ contract OptimismPortal_Test is Portal_Initializer {
// TODO: test this deeply // TODO: test this deeply
// function test_verifyWithdrawal() external {} // function test_verifyWithdrawal() external {}
function test_cannotVerifyRecentWithdrawal() external { function test_cannotFinalizeRecentWithdrawal() external {
Hashing.OutputRootProof memory outputRootProof = Hashing Hashing.OutputRootProof memory outputRootProof = Hashing
.OutputRootProof({ .OutputRootProof({
version: bytes32(0), version: bytes32(0),
...@@ -228,12 +228,24 @@ contract OptimismPortal_Test is Portal_Initializer { ...@@ -228,12 +228,24 @@ contract OptimismPortal_Test is Portal_Initializer {
withdrawerStorageRoot: bytes32(0), withdrawerStorageRoot: bytes32(0),
latestBlockhash: bytes32(0) latestBlockhash: bytes32(0)
}); });
// Setup the Oracle to return an output with a recent timestamp
uint256 recentTimestamp = block.timestamp - 1000;
vm.mockCall(
address(op.L2_ORACLE()),
abi.encodeWithSelector(L2OutputOracle.getL2Output.selector),
abi.encode(L2OutputOracle.OutputProposal(bytes32(uint256(1)), recentTimestamp))
);
vm.expectRevert("OptimismPortal: proposal is not yet finalized"); vm.expectRevert("OptimismPortal: proposal is not yet finalized");
op.finalizeWithdrawalTransaction(0, alice, alice, 0, 0, hex"", 0, outputRootProof, hex""); op.finalizeWithdrawalTransaction(0, alice, alice, 0, 0, hex"", 0, outputRootProof, hex"");
} }
function test_invalidWithdrawalProof() external { function test_invalidWithdrawalProof() external {
vm.mockCall(
address(op.L2_ORACLE()),
abi.encodeWithSelector(L2OutputOracle.getL2Output.selector),
abi.encode(L2OutputOracle.OutputProposal(bytes32(uint256(1)), block.timestamp))
);
Hashing.OutputRootProof memory outputRootProof = Hashing Hashing.OutputRootProof memory outputRootProof = Hashing
.OutputRootProof({ .OutputRootProof({
version: bytes32(0), version: bytes32(0),
...@@ -243,17 +255,15 @@ contract OptimismPortal_Test is Portal_Initializer { ...@@ -243,17 +255,15 @@ contract OptimismPortal_Test is Portal_Initializer {
}); });
vm.warp( vm.warp(
oracle.getL2Output( oracle.getL2Output(oracle.latestBlockNumber()).timestamp +
oracle.latestBlockNumber() op.FINALIZATION_PERIOD_SECONDS() + 1
).timestamp
+ op.FINALIZATION_PERIOD_SECONDS()
); );
vm.expectRevert("OptimismPortal: invalid output root proof"); vm.expectRevert("OptimismPortal: invalid output root proof");
op.finalizeWithdrawalTransaction(0, alice, alice, 0, 0, hex"", 0, outputRootProof, hex""); op.finalizeWithdrawalTransaction(0, alice, alice, 0, 0, hex"", 0, outputRootProof, hex"");
} }
function test_simple_isOutputFinalized() external { function test_simple_isBlockFinalized() external {
vm.mockCall( vm.mockCall(
address(op.L2_ORACLE()), address(op.L2_ORACLE()),
abi.encodeWithSelector( abi.encodeWithSelector(
...@@ -262,20 +272,20 @@ contract OptimismPortal_Test is Portal_Initializer { ...@@ -262,20 +272,20 @@ contract OptimismPortal_Test is Portal_Initializer {
abi.encode( abi.encode(
L2OutputOracle.OutputProposal( L2OutputOracle.OutputProposal(
bytes32(uint256(1)), bytes32(uint256(1)),
0 startingBlockNumber
) )
) )
); );
// warp to the finalization period // warp to the finalization period
vm.warp(op.FINALIZATION_PERIOD_SECONDS()); vm.warp(startingBlockNumber + op.FINALIZATION_PERIOD_SECONDS());
assertEq(op.isOutputFinalized(0), false); assertEq(op.isBlockFinalized(startingBlockNumber), false);
// warp past the finalization period // warp past the finalization period
vm.warp(op.FINALIZATION_PERIOD_SECONDS() + 1); vm.warp(startingBlockNumber + op.FINALIZATION_PERIOD_SECONDS() + 1);
assertEq(op.isOutputFinalized(0), true); assertEq(op.isBlockFinalized(startingBlockNumber), true);
} }
function test_isOutputFinalized() external { function test_isBlockFinalized() external {
uint256 checkpoint = oracle.nextBlockNumber(); uint256 checkpoint = oracle.nextBlockNumber();
vm.roll(checkpoint); vm.roll(checkpoint);
vm.warp(oracle.computeL2Timestamp(checkpoint) + 1); vm.warp(oracle.computeL2Timestamp(checkpoint) + 1);
...@@ -286,21 +296,23 @@ contract OptimismPortal_Test is Portal_Initializer { ...@@ -286,21 +296,23 @@ contract OptimismPortal_Test is Portal_Initializer {
uint256 finalizationHorizon = block.timestamp + op.FINALIZATION_PERIOD_SECONDS(); uint256 finalizationHorizon = block.timestamp + op.FINALIZATION_PERIOD_SECONDS();
vm.warp(finalizationHorizon); vm.warp(finalizationHorizon);
// The checkpointed block should not be finalized until 1 second from now. // The checkpointed block should not be finalized until 1 second from now.
assertEq(op.isOutputFinalized(checkpoint), false); assertEq(op.isBlockFinalized(checkpoint), false);
// Nor should a block after it // Nor should a block after it
assertEq(op.isOutputFinalized(checkpoint + 1), false); vm.expectRevert("L2OutputOracle: No output found for that block number.");
assertEq(op.isBlockFinalized(checkpoint + 1), false);
// Nor a block before it, even though the finalization period has passed, there is // Nor a block before it, even though the finalization period has passed, there is
// not yet a checkpoint block on top of it for which that is true. // not yet a checkpoint block on top of it for which that is true.
assertEq(op.isOutputFinalized(checkpoint - 1), false); assertEq(op.isBlockFinalized(checkpoint - 1), false);
// warp past the finalization period // warp past the finalization period
vm.warp(finalizationHorizon + 1); vm.warp(finalizationHorizon + 1);
// It should now be finalized. // It should now be finalized.
assertEq(op.isOutputFinalized(checkpoint), true); assertEq(op.isBlockFinalized(checkpoint), true);
// So should the block before it. // So should the block before it.
assertEq(op.isOutputFinalized(checkpoint - 1), true); assertEq(op.isBlockFinalized(checkpoint - 1), true);
// But not the block after it. // But not the block after it.
assertEq(op.isOutputFinalized(checkpoint + 1), false); vm.expectRevert("L2OutputOracle: No output found for that block number.");
assertEq(op.isBlockFinalized(checkpoint + 1), false);
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment