diff --git a/op-bindings/bindings/optimismportal.go b/op-bindings/bindings/optimismportal.go index 0993d0ed2b54f..2614ea3551b55 100644 --- a/op-bindings/bindings/optimismportal.go +++ b/op-bindings/bindings/optimismportal.go @@ -49,7 +49,7 @@ type TypesWithdrawalTransaction struct { // OptimismPortalMetaData contains all meta data concerning the OptimismPortal contract. 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\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"withdrawalHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"WithdrawalProven\",\"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\":[],\"name\":\"donateETH\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"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\":\"structTypes.WithdrawalTransaction\",\"name\":\"_tx\",\"type\":\"tuple\"}],\"name\":\"finalizeWithdrawalTransaction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":[{\"components\":[{\"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\":\"structTypes.WithdrawalTransaction\",\"name\":\"_tx\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"_l2BlockNumber\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"version\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"messagePasserStorageRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"latestBlockhash\",\"type\":\"bytes32\"}],\"internalType\":\"structTypes.OutputRootProof\",\"name\":\"_outputRootProof\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"_withdrawalProof\",\"type\":\"bytes[]\"}],\"name\":\"proveWithdrawalTransaction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"provenWithdrawals\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"outputRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint128\",\"name\":\"timestamp\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"l2BlockNumber\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x6101206040523480156200001257600080fd5b50604051620051c4380380620051c4833981016040819052620000359162000261565b6000608081905260a052600160c0526001600160a01b0382166101005260e08190526200006162000069565b50506200029d565b600054610100900460ff16158080156200008a5750600054600160ff909116105b80620000ba5750620000a730620001af60201b620019f81760201c565b158015620000ba575060005460ff166001145b620001235760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000147576000805461ff0019166101001790555b603280546001600160a01b03191661dead17905562000165620001be565b8015620001ac576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6001600160a01b03163b151590565b600054610100900460ff166200022b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016200011a565b60408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b0217600155565b600080604083850312156200027557600080fd5b82516001600160a01b03811681146200028d57600080fd5b6020939093015192949293505050565b60805160a05160c05160e05161010051614ebf620003056000396000818161018501528181610aba0152818161126b015281816114dd015261196e0152600081816104da0152611e2501526000610ec201526000610e9901526000610e700152614ebf6000f3fe6080604052600436106101475760003560e01c80638c3152e9116100c0578063cd7c978911610074578063e965084c11610059578063e965084c14610429578063e9e05c42146104b5578063f4daa291146104c857600080fd5b8063cd7c978914610373578063cff0ab961461038857600080fd5b8063a14238e7116100a5578063a14238e7146102fe578063c4fc47981461033e578063ca3e99ba1461035e57600080fd5b80638c3152e9146102b15780639bf62d82146102d157600080fd5b806364b79208116101175780638129fc1c116100fc5780638129fc1c14610286578063867ead131461029b5780638b4c40b01461016c57600080fd5b806364b792081461024c5780636bb0291e1461027157600080fd5b80621c2ff61461017357806313620abd146101d15780634870496f1461020a57806354fd4d501461022a57600080fd5b3661016e5761016c3334620186a06000604051806020016040528060008152506104fc565b005b600080fd5b34801561017f57600080fd5b506101a77f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101dd57600080fd5b506101e9633b9aca0081565b6040516fffffffffffffffffffffffffffffffff90911681526020016101c8565b34801561021657600080fd5b5061016c6102253660046145ad565b6109c9565b34801561023657600080fd5b5061023f610e69565b6040516101c89190614703565b34801561025857600080fd5b50610263627a120081565b6040519081526020016101c8565b34801561027d57600080fd5b50610263600481565b34801561029257600080fd5b5061016c610f0c565b3480156102a757600080fd5b5061026361271081565b3480156102bd57600080fd5b5061016c6102cc366004614716565b6110ca565b3480156102dd57600080fd5b506032546101a79073ffffffffffffffffffffffffffffffffffffffff1681565b34801561030a57600080fd5b5061032e61031936600461474b565b60336020526000908152604090205460ff1681565b60405190151581526020016101c8565b34801561034a57600080fd5b5061032e61035936600461474b565b611923565b34801561036a57600080fd5b506102636119e7565b34801561037f57600080fd5b50610263600881565b34801561039457600080fd5b506001546103f0906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016101c8565b34801561043557600080fd5b5061048761044436600461474b565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff92831660208501529116908201526060016101c8565b61016c6104c3366004614764565b6104fc565b3480156104d457600080fd5b506102637f000000000000000000000000000000000000000000000000000000000000000081565b8260005a905083156105b35773ffffffffffffffffffffffffffffffffffffffff8716156105b357604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b333281146105d4575033731111000000000000000000000000000000001111015b600034888888886040516020016105ef9594939291906147f1565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161065f9190614703565b60405180910390a4505060015460009061069f907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643614885565b905080156108285760006106b76004627a12006148cb565b6001546106e29190700100000000000000000000000000000000900467ffffffffffffffff16614933565b9050600060086106f66004627a12006148cb565b6001546107169085906fffffffffffffffffffffffffffffffff166149a7565b61072091906148cb565b61072a91906148cb565b60015490915060009061077690610760906107589085906fffffffffffffffffffffffffffffffff16614a63565b612710611a14565b6fffffffffffffffffffffffffffffffff611a2d565b905060018411156107e9576107e6610760670de0b6b3a76400006107d261079e6008836148cb565b6107b090670de0b6b3a7640000614933565b6107bb60018a614885565b6107cd90670de0b6b3a7640000614ad7565b611a3c565b6107dc90856149a7565b61075891906148cb565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b6001805484919060109061085b908490700100000000000000000000000000000000900467ffffffffffffffff16614b14565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550627a1200600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315610937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d6974000060648201526084016105aa565b600154600090610963906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8616614b40565b6fffffffffffffffffffffffffffffffff169050600061098748633b9aca00611a6d565b6109919083614b78565b905060005a6109a09086614885565b9050808211156109bc576109bc6109b78284614885565b611a7d565b5050505050505050505050565b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603610a88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016105aa565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015610b15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b399190614b8c565b519050610b53610b4e36869003860186614bdb565b611aab565b8114610be1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016105aa565b6000610bec87611b07565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610c78575080604001516fffffffffffffffffffffffffffffffff1687148015610c78575080518314155b610d04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e00000000000000000060648201526084016105aa565b610d1c826040880135610d178789614c41565b611b37565b610da8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016105aa565b604080516060810182528481526fffffffffffffffffffffffffffffffff42811660208084019182528b831684860190815260008881526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558a830151908b0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169185917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a45050505050505050565b6060610e947f0000000000000000000000000000000000000000000000000000000000000000611bfe565b610ebd7f0000000000000000000000000000000000000000000000000000000000000000611bfe565b610ee67f0000000000000000000000000000000000000000000000000000000000000000611bfe565b604051602001610ef893929190614cc5565b604051602081830303815290604052905090565b600054610100900460ff1615808015610f2c5750600054600160ff909116105b80610f465750303b158015610f46575060005460ff166001145b610fd2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105aa565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561103057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055611064611d3b565b80156110c757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14611173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084016105aa565b600061117e82611b07565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff80821694830185905270010000000000000000000000000000000090910416918101919091529293509003611269576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e00000000000000000000000000000000000060648201526084016105aa565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f89190614d3b565b81602001516fffffffffffffffffffffffffffffffff1610156113c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a4016105aa565b6113e281602001516fffffffffffffffffffffffffffffffff16611e1e565b611494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a4016105aa565b60408181015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff90911660048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015611538573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155c9190614b8c565b8251815191925014611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a4016105aa565b6116238160200151611e1e565b6116d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a4016105aa565b60008381526033602052604090205460ff1615611774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016105aa565b600083815260336020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560808401516117bd90614e2090614d54565b5a101561184c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a20696e73756666696369656e742067617360448201527f20746f2066696e616c697a65207769746864726177616c00000000000000000060648201526084016105aa565b8360200151603260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006118af8560400151866080015187606001518860a00151611e52565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915084907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061191490841515815260200190565b60405180910390a25050505050565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018290526000906119e19073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae557906024016040805180830381865afa1580156119b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d89190614b8c565b60200151611e1e565b92915050565b6119f56004627a12006148cb565b81565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600081831215611a245781611a26565b825b9392505050565b6000818312611a245781611a26565b6000611a26670de0b6b3a764000083611a5486611e6c565b611a5e91906149a7565b611a6891906148cb565b6120b0565b600081831015611a245781611a26565b6000805a90505b825a611a909083614885565b1015611aa657611a9f82614d6c565b9150611a84565b505050565b60008160000151826020015183604001518460600151604051602001611aea949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097611aea979096959101614da4565b604080516020810185905260009181018290528190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250611bf59101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f010000000000000000000000000000000000000000000000000000000000000060208301529085876122ef565b95945050505050565b606081600003611c4157505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611c6b5780611c5581614d6c565b9150611c649050600a83614b78565b9150611c45565b60008167ffffffffffffffff811115611c8657611c866143d3565b6040519080825280601f01601f191660200182016040528015611cb0576020820181803683370190505b5090505b8415611d3357611cc5600183614885565b9150611cd2600a86614dfb565b611cdd906030614d54565b60f81b818381518110611cf257611cf2614e0f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611d2c600a86614b78565b9450611cb4565b949350505050565b600054610100900460ff16611dd2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105aa565b60408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6000611e4a7f000000000000000000000000000000000000000000000000000000000000000083614d54565b421192915050565b600080600080845160208601878a8af19695505050505050565b6000808213611ed7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016105aa565b60006060611ee484612313565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136120e157506000919050565b680755bf798b4a1bf1e58212612153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016105aa565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000806122fb866123e9565b90506123098186868661241b565b9695505050505050565b600080821161237e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016105aa565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b6060818051906020012060405160200161240591815260200190565b6040516020818303038152906040529050919050565b6000611bf58461242c878686612442565b8051602091820120825192909101919091201490565b6060600061244f84612e5f565b9050600061245c86612f4e565b905060008460405160200161247391815260200190565b60405160208183030381529060405290506000805b8451811015612dd65760008582815181106124a5576124a5614e0f565b602002602001015190508451831115612540576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e67746800000000000000000000000000000000000060648201526084016105aa565b826000036125f9578051805160209182012060405161258e9261256892910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b6125f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f74206861736800000060448201526064016105aa565b612750565b8051516020116126af57805180516020918201206040516126239261256892910190815260200190565b6125f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c20686173680000000000000000000000000000000000000000000000000060648201526084016105aa565b805184516020808701919091208251919092012014612750576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f652068617368000000000000000000000000000000000000000000000000000060648201526084016105aa565b61275c60106001614d54565b8160200151510361293d57845183036128d5576000612798826020015160108151811061278b5761278b614e0f565b60200260200101516130e9565b9050600081511161282b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e636829000000000060648201526084016105aa565b600187516128399190614885565b83146128c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e63682900000000000060648201526084016105aa565b9650611a2695505050505050565b60008584815181106128e9576128e9614e0f565b602001015160f81c60f81b60f81c9050600082602001518260ff168151811061291457612914614e0f565b6020026020010151905061292781613249565b9550612934600186614d54565b94505050612dc3565b600281602001515103612d3b5760006129558261326e565b905060008160008151811061296c5761296c614e0f565b016020015160f81c90506000612983600283614e3e565b61298e906002614e60565b9050600061299f848360ff16613292565b905060006129ad8a89613292565b905060006129bb83836132c8565b905080835114612a4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b657900000000000060648201526084016105aa565b60ff851660021480612a62575060ff85166003145b15612c565780825114612af7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e64657200000060648201526084016105aa565b6000612b13886020015160018151811061278b5761278b614e0f565b90506000815111612ba6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c656166290000000000000060648201526084016105aa565b60018d51612bb49190614885565b8914612c42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c65616629000000000000000060648201526084016105aa565b9c50611a269b505050505050505050505050565b60ff85161580612c69575060ff85166001145b15612ca857612c958760200151600181518110612c8857612c88614e0f565b6020026020010151613249565b9950612ca1818a614d54565b9850612d30565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e20707265666978000000000000000000000000000060648201526084016105aa565b505050505050612dc3565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f646500000000000000000000000000000000000000000000000060648201526084016105aa565b5080612dce81614d6c565b915050612488565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e747300000000000000000000000000000000000000000000000000000060648201526084016105aa565b805160609060008167ffffffffffffffff811115612e7f57612e7f6143d3565b604051908082528060200260200182016040528015612ec457816020015b6040805180820190915260608082526020820152815260200190600190039081612e9d5790505b50905060005b82811015612f46576040518060400160405280868381518110612eef57612eef614e0f565b60200260200101518152602001612f1e878481518110612f1157612f11614e0f565b6020026020010151613377565b815250828281518110612f3357612f33614e0f565b6020908102919091010152600101612eca565b509392505050565b80516060906000612f60826002614ad7565b67ffffffffffffffff811115612f7857612f786143d3565b6040519080825280601f01601f191660200182016040528015612fa2576020820181803683370190505b5090506000805b838110156130df57858181518110612fc357612fc3614e0f565b6020910101517fff000000000000000000000000000000000000000000000000000000000000008116925060041c7f0ff0000000000000000000000000000000000000000000000000000000000000168361301f836002614ad7565b8151811061302f5761302f614e0f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f0f0000000000000000000000000000000000000000000000000000000000000082168361308d836002614ad7565b613098906001614d54565b815181106130a8576130a8614e0f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101612fa9565b5090949350505050565b606060008060006130f98561338a565b91945092509050600081600181111561311457613114614e83565b146131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d0000000000000060648201526084016105aa565b6131ab8284614d54565b85511461323a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e64657200000000000000000000000060648201526084016105aa565b611bf585602001518484613df7565b6060602082600001511061326557613260826130e9565b6119e1565b6119e182613e98565b60606119e161328d836020015160008151811061278b5761278b614e0f565b612f4e565b6060825182106132b157506040805160208101909152600081526119e1565b611a2683838486516132c39190614885565b613eae565b600080600083518551106132dd5783516132e0565b84515b90505b808210801561336757508382815181106132ff576132ff614e0f565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191685838151811061333e5761333e614e0f565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15612f46578160010191506132e3565b60606119e161338583614086565b61416f565b600080600080846000015111613448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016105aa565b6020840151805160001a607f811161346d576000600160009450945094505050613df0565b60b7811161367b576000613482608083614885565b90508087600001511161353d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a4016105aa565b6001838101517fff000000000000000000000000000000000000000000000000000000000000001690821415806135b657507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b613668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a4016105aa565b5060019550935060009250613df0915050565b60bf81116139c957600061369060b783614885565b90508087600001511161374b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a4016105aa565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a4016105aa565b600184015160088302610100031c603781116138ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a4016105aa565b6138f78184614d54565b8951116139ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a4016105aa565b6139b7836001614d54565b9750955060009450613df09350505050565b60f78111613aaa5760006139de60c083614885565b905080876000015111613a99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a4016105aa565b600195509350849250613df0915050565b6000613ab760f783614885565b905080876000015111613b72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a4016105aa565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613c50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a4016105aa565b600184015160088302610100031c60378111613d14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a4016105aa565b613d1e8184614d54565b895111613dd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a4016105aa565b613dde836001614d54565b9750955060019450613df09350505050565b9193909250565b606060008267ffffffffffffffff811115613e1457613e146143d3565b6040519080825280601f01601f191660200182016040528015613e3e576020820181803683370190505b50905082600003613e50579050611a26565b6000613e5c8587614d54565b90506020820160005b85811015613e7d578281015182820152602001613e65565b85811115613e8c576000868301525b50919695505050505050565b60606119e1826020015160008460000151613df7565b60608182601f011015613f1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016105aa565b828284011015613f89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016105aa565b81830184511015613ff6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016105aa565b606082158015614015576040519150600082526020820160405261407d565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561404e578051835260209283019201614036565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201526000825111614151576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016105aa565b50604080518082019091528151815260209182019181019190915290565b6060600080600061417f8561338a565b91945092509050600181600181111561419a5761419a614e83565b14614227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d000000000000000060648201526084016105aa565b84516142338385614d54565b146142c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e646572000000000000000000000000000060648201526084016105aa565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816142d95790505090506000845b87518110156143c75760008061434c6040518060400160405280858d600001516143309190614885565b8152602001858d602001516143459190614d54565b905261338a565b5091509150604051806040016040528083836143689190614d54565b8152602001848c6020015161437d9190614d54565b81525085858151811061439257614392614e0f565b60209081029190910101526143a8600185614d54565b93506143b48183614d54565b6143be9084614d54565b92505050614306565b50815295945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614449576144496143d3565b604052919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461447557600080fd5b919050565b600082601f83011261448b57600080fd5b813567ffffffffffffffff8111156144a5576144a56143d3565b6144d660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614402565b8181528460208386010111156144eb57600080fd5b816020850160208301376000918101602001919091529392505050565b600060c0828403121561451a57600080fd5b60405160c0810167ffffffffffffffff828210818311171561453e5761453e6143d3565b816040528293508435835261455560208601614451565b602084015261456660408601614451565b6040840152606085013560608401526080850135608084015260a085013591508082111561459357600080fd5b506145a08582860161447a565b60a0830152505092915050565b600080600080600085870360e08112156145c657600080fd5b863567ffffffffffffffff808211156145de57600080fd5b6145ea8a838b01614508565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401121561462357600080fd5b60408901955060c089013592508083111561463d57600080fd5b828901925089601f84011261465157600080fd5b823591508082111561466257600080fd5b508860208260051b840101111561467857600080fd5b959894975092955050506020019190565b60005b838110156146a457818101518382015260200161468c565b838111156146b3576000848401525b50505050565b600081518084526146d1816020860160208601614689565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611a2660208301846146b9565b60006020828403121561472857600080fd5b813567ffffffffffffffff81111561473f57600080fd5b611d3384828501614508565b60006020828403121561475d57600080fd5b5035919050565b600080600080600060a0868803121561477c57600080fd5b61478586614451565b945060208601359350604086013567ffffffffffffffff80821682146147aa57600080fd5b90935060608701359081151582146147c157600080fd5b909250608087013590808211156147d757600080fd5b506147e48882890161447a565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251614845816049850160208701614689565b919091016049019695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561489757614897614856565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826148da576148da61489c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f80000000000000000000000000000000000000000000000000000000000000008314161561492e5761492e614856565b500590565b6000808312837f80000000000000000000000000000000000000000000000000000000000000000183128115161561496d5761496d614856565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156149a1576149a1614856565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000841360008413858304851182821616156149e8576149e8614856565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615614a2357614a23614856565b60008712925087820587128484161615614a3f57614a3f614856565b87850587128184161615614a5557614a55614856565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615614a9d57614a9d614856565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615614ad157614ad1614856565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b0f57614b0f614856565b500290565b600067ffffffffffffffff808316818516808303821115614b3757614b37614856565b01949350505050565b60006fffffffffffffffffffffffffffffffff80831681851681830481118215151615614b6f57614b6f614856565b02949350505050565b600082614b8757614b8761489c565b500490565b600060408284031215614b9e57600080fd5b6040516040810181811067ffffffffffffffff82111715614bc157614bc16143d3565b604052825181526020928301519281019290925250919050565b600060808284031215614bed57600080fd5b6040516080810181811067ffffffffffffffff82111715614c1057614c106143d3565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff80841115614c5c57614c5c6143d3565b8360051b6020614c6d818301614402565b868152918501918181019036841115614c8557600080fd5b865b84811015614cb957803586811115614c9f5760008081fd5b614cab36828b0161447a565b845250918301918301614c87565b50979650505050505050565b60008451614cd7818460208901614689565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551614d13816001850160208a01614689565b60019201918201528351614d2e816002840160208801614689565b0160020195945050505050565b600060208284031215614d4d57600080fd5b5051919050565b60008219821115614d6757614d67614856565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614d9d57614d9d614856565b5060010190565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152614def60c08301846146b9565b98975050505050505050565b600082614e0a57614e0a61489c565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff831680614e5157614e5161489c565b8060ff84160691505092915050565b600060ff821660ff841680821015614e7a57614e7a614856565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a", + Bin: "0x6101206040523480156200001257600080fd5b506040516200522f3803806200522f833981016040819052620000359162000261565b6000608081905260a052600160c0526001600160a01b0382166101005260e08190526200006162000069565b50506200029d565b600054610100900460ff16158080156200008a5750600054600160ff909116105b80620000ba5750620000a730620001af60201b620019f81760201c565b158015620000ba575060005460ff166001145b620001235760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000147576000805461ff0019166101001790555b603280546001600160a01b03191661dead17905562000165620001be565b8015620001ac576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6001600160a01b03163b151590565b600054610100900460ff166200022b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016200011a565b60408051606081018252633b9aca0080825260006020830152436001600160401b031691909201819052600160c01b0217600155565b600080604083850312156200027557600080fd5b82516001600160a01b03811681146200028d57600080fd5b6020939093015192949293505050565b60805160a05160c05160e05161010051614f2a620003056000396000818161018501528181610aba0152818161126b015281816114dd015261196e0152600081816104da0152611e2501526000610ec201526000610e9901526000610e700152614f2a6000f3fe6080604052600436106101475760003560e01c80638c3152e9116100c0578063cd7c978911610074578063e965084c11610059578063e965084c14610429578063e9e05c42146104b5578063f4daa291146104c857600080fd5b8063cd7c978914610373578063cff0ab961461038857600080fd5b8063a14238e7116100a5578063a14238e7146102fe578063c4fc47981461033e578063ca3e99ba1461035e57600080fd5b80638c3152e9146102b15780639bf62d82146102d157600080fd5b806364b79208116101175780638129fc1c116100fc5780638129fc1c14610286578063867ead131461029b5780638b4c40b01461016c57600080fd5b806364b792081461024c5780636bb0291e1461027157600080fd5b80621c2ff61461017357806313620abd146101d15780634870496f1461020a57806354fd4d501461022a57600080fd5b3661016e5761016c3334620186a06000604051806020016040528060008152506104fc565b005b600080fd5b34801561017f57600080fd5b506101a77f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101dd57600080fd5b506101e9633b9aca0081565b6040516fffffffffffffffffffffffffffffffff90911681526020016101c8565b34801561021657600080fd5b5061016c610225366004614618565b6109c9565b34801561023657600080fd5b5061023f610e69565b6040516101c8919061476e565b34801561025857600080fd5b50610263627a120081565b6040519081526020016101c8565b34801561027d57600080fd5b50610263600481565b34801561029257600080fd5b5061016c610f0c565b3480156102a757600080fd5b5061026361271081565b3480156102bd57600080fd5b5061016c6102cc366004614781565b6110ca565b3480156102dd57600080fd5b506032546101a79073ffffffffffffffffffffffffffffffffffffffff1681565b34801561030a57600080fd5b5061032e6103193660046147b6565b60336020526000908152604090205460ff1681565b60405190151581526020016101c8565b34801561034a57600080fd5b5061032e6103593660046147b6565b611923565b34801561036a57600080fd5b506102636119e7565b34801561037f57600080fd5b50610263600881565b34801561039457600080fd5b506001546103f0906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016101c8565b34801561043557600080fd5b506104876104443660046147b6565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff92831660208501529116908201526060016101c8565b61016c6104c33660046147cf565b6104fc565b3480156104d457600080fd5b506102637f000000000000000000000000000000000000000000000000000000000000000081565b8260005a905083156105b35773ffffffffffffffffffffffffffffffffffffffff8716156105b357604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b333281146105d4575033731111000000000000000000000000000000001111015b600034888888886040516020016105ef95949392919061485c565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161065f919061476e565b60405180910390a4505060015460009061069f907801000000000000000000000000000000000000000000000000900467ffffffffffffffff16436148f0565b905080156108285760006106b76004627a1200614936565b6001546106e29190700100000000000000000000000000000000900467ffffffffffffffff1661499e565b9050600060086106f66004627a1200614936565b6001546107169085906fffffffffffffffffffffffffffffffff16614a12565b6107209190614936565b61072a9190614936565b60015490915060009061077690610760906107589085906fffffffffffffffffffffffffffffffff16614ace565b612710611a14565b6fffffffffffffffffffffffffffffffff611a2d565b905060018411156107e9576107e6610760670de0b6b3a76400006107d261079e600883614936565b6107b090670de0b6b3a764000061499e565b6107bb60018a6148f0565b6107cd90670de0b6b3a7640000614b42565b611a3c565b6107dc9085614a12565b6107589190614936565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b6001805484919060109061085b908490700100000000000000000000000000000000900467ffffffffffffffff16614b7f565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550627a1200600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315610937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d6974000060648201526084016105aa565b600154600090610963906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8616614bab565b6fffffffffffffffffffffffffffffffff169050600061098748633b9aca00611a6d565b6109919083614be3565b905060005a6109a090866148f0565b9050808211156109bc576109bc6109b782846148f0565b611a7d565b5050505050505050505050565b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603610a88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016105aa565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015610b15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b399190614bf7565b519050610b53610b4e36869003860186614c46565b611aab565b8114610be1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016105aa565b6000610bec87611b07565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610c78575080604001516fffffffffffffffffffffffffffffffff1687148015610c78575080518314155b610d04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e00000000000000000060648201526084016105aa565b610d1c826040880135610d178789614cac565b611b37565b610da8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016105aa565b604080516060810182528481526fffffffffffffffffffffffffffffffff42811660208084019182528b831684860190815260008881526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558a830151908b0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169185917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a45050505050505050565b6060610e947f0000000000000000000000000000000000000000000000000000000000000000611bfe565b610ebd7f0000000000000000000000000000000000000000000000000000000000000000611bfe565b610ee67f0000000000000000000000000000000000000000000000000000000000000000611bfe565b604051602001610ef893929190614d30565b604051602081830303815290604052905090565b600054610100900460ff1615808015610f2c5750600054600160ff909116105b80610f465750303b158015610f46575060005460ff166001145b610fd2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105aa565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561103057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055611064611d3b565b80156110c757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14611173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084016105aa565b600061117e82611b07565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff80821694830185905270010000000000000000000000000000000090910416918101919091529293509003611269576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e00000000000000000000000000000000000060648201526084016105aa565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f89190614da6565b81602001516fffffffffffffffffffffffffffffffff1610156113c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a4016105aa565b6113e281602001516fffffffffffffffffffffffffffffffff16611e1e565b611494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a4016105aa565b60408181015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff90911660048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015611538573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155c9190614bf7565b8251815191925014611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a4016105aa565b6116238160200151611e1e565b6116d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a4016105aa565b60008381526033602052604090205460ff1615611774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016105aa565b600083815260336020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560808401516117bd90614e2090614dbf565b5a101561184c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a20696e73756666696369656e742067617360448201527f20746f2066696e616c697a65207769746864726177616c00000000000000000060648201526084016105aa565b8360200151603260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006118af8560400151866080015187606001518860a00151611e52565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915084907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061191490841515815260200190565b60405180910390a25050505050565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018290526000906119e19073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae557906024016040805180830381865afa1580156119b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d89190614bf7565b60200151611e1e565b92915050565b6119f56004627a1200614936565b81565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600081831215611a245781611a26565b825b9392505050565b6000818312611a245781611a26565b6000611a26670de0b6b3a764000083611a5486611e6c565b611a5e9190614a12565b611a689190614936565b6120b0565b600081831015611a245781611a26565b6000805a90505b825a611a9090836148f0565b1015611aa657611a9f82614dd7565b9150611a84565b505050565b60008160000151826020015183604001518460600151604051602001611aea949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097611aea979096959101614e0f565b604080516020810185905260009181018290528190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250611bf59101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f010000000000000000000000000000000000000000000000000000000000000060208301529085876122ef565b95945050505050565b606081600003611c4157505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611c6b5780611c5581614dd7565b9150611c649050600a83614be3565b9150611c45565b60008167ffffffffffffffff811115611c8657611c8661443e565b6040519080825280601f01601f191660200182016040528015611cb0576020820181803683370190505b5090505b8415611d3357611cc56001836148f0565b9150611cd2600a86614e66565b611cdd906030614dbf565b60f81b818381518110611cf257611cf2614e7a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611d2c600a86614be3565b9450611cb4565b949350505050565b600054610100900460ff16611dd2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105aa565b60408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6000611e4a7f000000000000000000000000000000000000000000000000000000000000000083614dbf565b421192915050565b600080600080845160208601878a8af19695505050505050565b6000808213611ed7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016105aa565b60006060611ee484612313565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136120e157506000919050565b680755bf798b4a1bf1e58212612153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016105aa565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000806122fb866123e9565b90506123098186868661241b565b9695505050505050565b600080821161237e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016105aa565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b6060818051906020012060405160200161240591815260200190565b6040516020818303038152906040529050919050565b6000611bf58461242c878686612442565b8051602091820120825192909101919091201490565b606060008451116124af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b6579000000000000000000000060448201526064016105aa565b60006124ba84612eca565b905060006124c786612fb9565b90506000846040516020016124de91815260200190565b60405160208183030381529060405290506000805b8451811015612e4157600085828151811061251057612510614e7a565b6020026020010151905084518311156125ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e67746800000000000000000000000000000000000060648201526084016105aa565b8260000361266457805180516020918201206040516125f9926125d392910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b61265f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f74206861736800000060448201526064016105aa565b6127bb565b80515160201161271a578051805160209182012060405161268e926125d392910190815260200190565b61265f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c20686173680000000000000000000000000000000000000000000000000060648201526084016105aa565b8051845160208087019190912082519190920120146127bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f652068617368000000000000000000000000000000000000000000000000000060648201526084016105aa565b6127c760106001614dbf565b816020015151036129a8578451830361294057600061280382602001516010815181106127f6576127f6614e7a565b6020026020010151613154565b90506000815111612896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e636829000000000060648201526084016105aa565b600187516128a491906148f0565b8314612932576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e63682900000000000060648201526084016105aa565b9650611a2695505050505050565b600085848151811061295457612954614e7a565b602001015160f81c60f81b60f81c9050600082602001518260ff168151811061297f5761297f614e7a565b60200260200101519050612992816132b4565b955061299f600186614dbf565b94505050612e2e565b600281602001515103612da65760006129c0826132d9565b90506000816000815181106129d7576129d7614e7a565b016020015160f81c905060006129ee600283614ea9565b6129f9906002614ecb565b90506000612a0a848360ff166132fd565b90506000612a188a896132fd565b90506000612a268383613333565b905080835114612ab8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b657900000000000060648201526084016105aa565b60ff851660021480612acd575060ff85166003145b15612cc15780825114612b62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e64657200000060648201526084016105aa565b6000612b7e88602001516001815181106127f6576127f6614e7a565b90506000815111612c11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c656166290000000000000060648201526084016105aa565b60018d51612c1f91906148f0565b8914612cad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c65616629000000000000000060648201526084016105aa565b9c50611a269b505050505050505050505050565b60ff85161580612cd4575060ff85166001145b15612d1357612d008760200151600181518110612cf357612cf3614e7a565b60200260200101516132b4565b9950612d0c818a614dbf565b9850612d9b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e20707265666978000000000000000000000000000060648201526084016105aa565b505050505050612e2e565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f646500000000000000000000000000000000000000000000000060648201526084016105aa565b5080612e3981614dd7565b9150506124f3565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e747300000000000000000000000000000000000000000000000000000060648201526084016105aa565b805160609060008167ffffffffffffffff811115612eea57612eea61443e565b604051908082528060200260200182016040528015612f2f57816020015b6040805180820190915260608082526020820152815260200190600190039081612f085790505b50905060005b82811015612fb1576040518060400160405280868381518110612f5a57612f5a614e7a565b60200260200101518152602001612f89878481518110612f7c57612f7c614e7a565b60200260200101516133e2565b815250828281518110612f9e57612f9e614e7a565b6020908102919091010152600101612f35565b509392505050565b80516060906000612fcb826002614b42565b67ffffffffffffffff811115612fe357612fe361443e565b6040519080825280601f01601f19166020018201604052801561300d576020820181803683370190505b5090506000805b8381101561314a5785818151811061302e5761302e614e7a565b6020910101517fff000000000000000000000000000000000000000000000000000000000000008116925060041c7f0ff0000000000000000000000000000000000000000000000000000000000000168361308a836002614b42565b8151811061309a5761309a614e7a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f0f000000000000000000000000000000000000000000000000000000000000008216836130f8836002614b42565b613103906001614dbf565b8151811061311357613113614e7a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101613014565b5090949350505050565b60606000806000613164856133f5565b91945092509050600081600181111561317f5761317f614eee565b1461320c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d0000000000000060648201526084016105aa565b6132168284614dbf565b8551146132a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e64657200000000000000000000000060648201526084016105aa565b611bf585602001518484613e62565b606060208260000151106132d0576132cb82613154565b6119e1565b6119e182613f03565b60606119e16132f883602001516000815181106127f6576127f6614e7a565b612fb9565b60608251821061331c57506040805160208101909152600081526119e1565b611a26838384865161332e91906148f0565b613f19565b6000806000835185511061334857835161334b565b84515b90505b80821080156133d2575083828151811061336a5761336a614e7a565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168583815181106133a9576133a9614e7a565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15612fb15781600101915061334e565b60606119e16133f0836140f1565b6141da565b6000806000808460000151116134b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016105aa565b6020840151805160001a607f81116134d8576000600160009450945094505050613e5b565b60b781116136e65760006134ed6080836148f0565b9050808760000151116135a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a4016105aa565b6001838101517fff0000000000000000000000000000000000000000000000000000000000000016908214158061362157507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b6136d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a4016105aa565b5060019550935060009250613e5b915050565b60bf8111613a345760006136fb60b7836148f0565b9050808760000151116137b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a4016105aa565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a4016105aa565b600184015160088302610100031c60378111613958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a4016105aa565b6139628184614dbf565b895111613a17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a4016105aa565b613a22836001614dbf565b9750955060009450613e5b9350505050565b60f78111613b15576000613a4960c0836148f0565b905080876000015111613b04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a4016105aa565b600195509350849250613e5b915050565b6000613b2260f7836148f0565b905080876000015111613bdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a4016105aa565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613cbb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a4016105aa565b600184015160088302610100031c60378111613d7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a4016105aa565b613d898184614dbf565b895111613e3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a4016105aa565b613e49836001614dbf565b9750955060019450613e5b9350505050565b9193909250565b606060008267ffffffffffffffff811115613e7f57613e7f61443e565b6040519080825280601f01601f191660200182016040528015613ea9576020820181803683370190505b50905082600003613ebb579050611a26565b6000613ec78587614dbf565b90506020820160005b85811015613ee8578281015182820152602001613ed0565b85811115613ef7576000868301525b50919695505050505050565b60606119e1826020015160008460000151613e62565b60608182601f011015613f88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016105aa565b828284011015613ff4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016105aa565b81830184511015614061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016105aa565b60608215801561408057604051915060008252602082016040526140e8565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156140b95780518352602092830192016140a1565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b604080518082019091526000808252602082015260008251116141bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016105aa565b50604080518082019091528151815260209182019181019190915290565b606060008060006141ea856133f5565b91945092509050600181600181111561420557614205614eee565b14614292576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d000000000000000060648201526084016105aa565b845161429e8385614dbf565b1461432b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e646572000000000000000000000000000060648201526084016105aa565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816143445790505090506000845b8751811015614432576000806143b76040518060400160405280858d6000015161439b91906148f0565b8152602001858d602001516143b09190614dbf565b90526133f5565b5091509150604051806040016040528083836143d39190614dbf565b8152602001848c602001516143e89190614dbf565b8152508585815181106143fd576143fd614e7a565b6020908102919091010152614413600185614dbf565b935061441f8183614dbf565b6144299084614dbf565b92505050614371565b50815295945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156144b4576144b461443e565b604052919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146144e057600080fd5b919050565b600082601f8301126144f657600080fd5b813567ffffffffffffffff8111156145105761451061443e565b61454160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161446d565b81815284602083860101111561455657600080fd5b816020850160208301376000918101602001919091529392505050565b600060c0828403121561458557600080fd5b60405160c0810167ffffffffffffffff82821081831117156145a9576145a961443e565b81604052829350843583526145c0602086016144bc565b60208401526145d1604086016144bc565b6040840152606085013560608401526080850135608084015260a08501359150808211156145fe57600080fd5b5061460b858286016144e5565b60a0830152505092915050565b600080600080600085870360e081121561463157600080fd5b863567ffffffffffffffff8082111561464957600080fd5b6146558a838b01614573565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401121561468e57600080fd5b60408901955060c08901359250808311156146a857600080fd5b828901925089601f8401126146bc57600080fd5b82359150808211156146cd57600080fd5b508860208260051b84010111156146e357600080fd5b959894975092955050506020019190565b60005b8381101561470f5781810151838201526020016146f7565b8381111561471e576000848401525b50505050565b6000815180845261473c8160208601602086016146f4565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611a266020830184614724565b60006020828403121561479357600080fd5b813567ffffffffffffffff8111156147aa57600080fd5b611d3384828501614573565b6000602082840312156147c857600080fd5b5035919050565b600080600080600060a086880312156147e757600080fd5b6147f0866144bc565b945060208601359350604086013567ffffffffffffffff808216821461481557600080fd5b909350606087013590811515821461482c57600080fd5b9092506080870135908082111561484257600080fd5b5061484f888289016144e5565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b6048820152600082516148b08160498501602087016146f4565b919091016049019695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015614902576149026148c1565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261494557614945614907565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614999576149996148c1565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156149d8576149d86148c1565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615614a0c57614a0c6148c1565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615614a5357614a536148c1565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615614a8e57614a8e6148c1565b60008712925087820587128484161615614aaa57614aaa6148c1565b87850587128184161615614ac057614ac06148c1565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615614b0857614b086148c1565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615614b3c57614b3c6148c1565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b7a57614b7a6148c1565b500290565b600067ffffffffffffffff808316818516808303821115614ba257614ba26148c1565b01949350505050565b60006fffffffffffffffffffffffffffffffff80831681851681830481118215151615614bda57614bda6148c1565b02949350505050565b600082614bf257614bf2614907565b500490565b600060408284031215614c0957600080fd5b6040516040810181811067ffffffffffffffff82111715614c2c57614c2c61443e565b604052825181526020928301519281019290925250919050565b600060808284031215614c5857600080fd5b6040516080810181811067ffffffffffffffff82111715614c7b57614c7b61443e565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff80841115614cc757614cc761443e565b8360051b6020614cd881830161446d565b868152918501918181019036841115614cf057600080fd5b865b84811015614d2457803586811115614d0a5760008081fd5b614d1636828b016144e5565b845250918301918301614cf2565b50979650505050505050565b60008451614d428184602089016146f4565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551614d7e816001850160208a016146f4565b60019201918201528351614d998160028401602088016146f4565b0160020195945050505050565b600060208284031215614db857600080fd5b5051919050565b60008219821115614dd257614dd26148c1565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e0857614e086148c1565b5060010190565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152614e5a60c0830184614724565b98975050505050505050565b600082614e7557614e75614907565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff831680614ebc57614ebc614907565b8060ff84160691505092915050565b600060ff821660ff841680821015614ee557614ee56148c1565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a", } // OptimismPortalABI is the input ABI used to generate the binding from. diff --git a/op-bindings/bindings/optimismportal_more.go b/op-bindings/bindings/optimismportal_more.go index 8102870b770c6..b5fd0ed17fbec 100644 --- a/op-bindings/bindings/optimismportal_more.go +++ b/op-bindings/bindings/optimismportal_more.go @@ -13,7 +13,7 @@ const OptimismPortalStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contrac var OptimismPortalStorageLayout = new(solc.StorageLayout) -var OptimismPortalDeployedBin = "0x6080604052600436106101475760003560e01c80638c3152e9116100c0578063cd7c978911610074578063e965084c11610059578063e965084c14610429578063e9e05c42146104b5578063f4daa291146104c857600080fd5b8063cd7c978914610373578063cff0ab961461038857600080fd5b8063a14238e7116100a5578063a14238e7146102fe578063c4fc47981461033e578063ca3e99ba1461035e57600080fd5b80638c3152e9146102b15780639bf62d82146102d157600080fd5b806364b79208116101175780638129fc1c116100fc5780638129fc1c14610286578063867ead131461029b5780638b4c40b01461016c57600080fd5b806364b792081461024c5780636bb0291e1461027157600080fd5b80621c2ff61461017357806313620abd146101d15780634870496f1461020a57806354fd4d501461022a57600080fd5b3661016e5761016c3334620186a06000604051806020016040528060008152506104fc565b005b600080fd5b34801561017f57600080fd5b506101a77f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101dd57600080fd5b506101e9633b9aca0081565b6040516fffffffffffffffffffffffffffffffff90911681526020016101c8565b34801561021657600080fd5b5061016c6102253660046145ad565b6109c9565b34801561023657600080fd5b5061023f610e69565b6040516101c89190614703565b34801561025857600080fd5b50610263627a120081565b6040519081526020016101c8565b34801561027d57600080fd5b50610263600481565b34801561029257600080fd5b5061016c610f0c565b3480156102a757600080fd5b5061026361271081565b3480156102bd57600080fd5b5061016c6102cc366004614716565b6110ca565b3480156102dd57600080fd5b506032546101a79073ffffffffffffffffffffffffffffffffffffffff1681565b34801561030a57600080fd5b5061032e61031936600461474b565b60336020526000908152604090205460ff1681565b60405190151581526020016101c8565b34801561034a57600080fd5b5061032e61035936600461474b565b611923565b34801561036a57600080fd5b506102636119e7565b34801561037f57600080fd5b50610263600881565b34801561039457600080fd5b506001546103f0906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016101c8565b34801561043557600080fd5b5061048761044436600461474b565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff92831660208501529116908201526060016101c8565b61016c6104c3366004614764565b6104fc565b3480156104d457600080fd5b506102637f000000000000000000000000000000000000000000000000000000000000000081565b8260005a905083156105b35773ffffffffffffffffffffffffffffffffffffffff8716156105b357604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b333281146105d4575033731111000000000000000000000000000000001111015b600034888888886040516020016105ef9594939291906147f1565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161065f9190614703565b60405180910390a4505060015460009061069f907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643614885565b905080156108285760006106b76004627a12006148cb565b6001546106e29190700100000000000000000000000000000000900467ffffffffffffffff16614933565b9050600060086106f66004627a12006148cb565b6001546107169085906fffffffffffffffffffffffffffffffff166149a7565b61072091906148cb565b61072a91906148cb565b60015490915060009061077690610760906107589085906fffffffffffffffffffffffffffffffff16614a63565b612710611a14565b6fffffffffffffffffffffffffffffffff611a2d565b905060018411156107e9576107e6610760670de0b6b3a76400006107d261079e6008836148cb565b6107b090670de0b6b3a7640000614933565b6107bb60018a614885565b6107cd90670de0b6b3a7640000614ad7565b611a3c565b6107dc90856149a7565b61075891906148cb565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b6001805484919060109061085b908490700100000000000000000000000000000000900467ffffffffffffffff16614b14565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550627a1200600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315610937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d6974000060648201526084016105aa565b600154600090610963906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8616614b40565b6fffffffffffffffffffffffffffffffff169050600061098748633b9aca00611a6d565b6109919083614b78565b905060005a6109a09086614885565b9050808211156109bc576109bc6109b78284614885565b611a7d565b5050505050505050505050565b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603610a88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016105aa565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015610b15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b399190614b8c565b519050610b53610b4e36869003860186614bdb565b611aab565b8114610be1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016105aa565b6000610bec87611b07565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610c78575080604001516fffffffffffffffffffffffffffffffff1687148015610c78575080518314155b610d04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e00000000000000000060648201526084016105aa565b610d1c826040880135610d178789614c41565b611b37565b610da8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016105aa565b604080516060810182528481526fffffffffffffffffffffffffffffffff42811660208084019182528b831684860190815260008881526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558a830151908b0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169185917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a45050505050505050565b6060610e947f0000000000000000000000000000000000000000000000000000000000000000611bfe565b610ebd7f0000000000000000000000000000000000000000000000000000000000000000611bfe565b610ee67f0000000000000000000000000000000000000000000000000000000000000000611bfe565b604051602001610ef893929190614cc5565b604051602081830303815290604052905090565b600054610100900460ff1615808015610f2c5750600054600160ff909116105b80610f465750303b158015610f46575060005460ff166001145b610fd2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105aa565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561103057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055611064611d3b565b80156110c757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14611173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084016105aa565b600061117e82611b07565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff80821694830185905270010000000000000000000000000000000090910416918101919091529293509003611269576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e00000000000000000000000000000000000060648201526084016105aa565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f89190614d3b565b81602001516fffffffffffffffffffffffffffffffff1610156113c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a4016105aa565b6113e281602001516fffffffffffffffffffffffffffffffff16611e1e565b611494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a4016105aa565b60408181015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff90911660048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015611538573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155c9190614b8c565b8251815191925014611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a4016105aa565b6116238160200151611e1e565b6116d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a4016105aa565b60008381526033602052604090205460ff1615611774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016105aa565b600083815260336020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560808401516117bd90614e2090614d54565b5a101561184c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a20696e73756666696369656e742067617360448201527f20746f2066696e616c697a65207769746864726177616c00000000000000000060648201526084016105aa565b8360200151603260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006118af8560400151866080015187606001518860a00151611e52565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915084907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061191490841515815260200190565b60405180910390a25050505050565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018290526000906119e19073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae557906024016040805180830381865afa1580156119b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d89190614b8c565b60200151611e1e565b92915050565b6119f56004627a12006148cb565b81565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600081831215611a245781611a26565b825b9392505050565b6000818312611a245781611a26565b6000611a26670de0b6b3a764000083611a5486611e6c565b611a5e91906149a7565b611a6891906148cb565b6120b0565b600081831015611a245781611a26565b6000805a90505b825a611a909083614885565b1015611aa657611a9f82614d6c565b9150611a84565b505050565b60008160000151826020015183604001518460600151604051602001611aea949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097611aea979096959101614da4565b604080516020810185905260009181018290528190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250611bf59101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f010000000000000000000000000000000000000000000000000000000000000060208301529085876122ef565b95945050505050565b606081600003611c4157505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611c6b5780611c5581614d6c565b9150611c649050600a83614b78565b9150611c45565b60008167ffffffffffffffff811115611c8657611c866143d3565b6040519080825280601f01601f191660200182016040528015611cb0576020820181803683370190505b5090505b8415611d3357611cc5600183614885565b9150611cd2600a86614dfb565b611cdd906030614d54565b60f81b818381518110611cf257611cf2614e0f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611d2c600a86614b78565b9450611cb4565b949350505050565b600054610100900460ff16611dd2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105aa565b60408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6000611e4a7f000000000000000000000000000000000000000000000000000000000000000083614d54565b421192915050565b600080600080845160208601878a8af19695505050505050565b6000808213611ed7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016105aa565b60006060611ee484612313565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136120e157506000919050565b680755bf798b4a1bf1e58212612153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016105aa565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000806122fb866123e9565b90506123098186868661241b565b9695505050505050565b600080821161237e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016105aa565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b6060818051906020012060405160200161240591815260200190565b6040516020818303038152906040529050919050565b6000611bf58461242c878686612442565b8051602091820120825192909101919091201490565b6060600061244f84612e5f565b9050600061245c86612f4e565b905060008460405160200161247391815260200190565b60405160208183030381529060405290506000805b8451811015612dd65760008582815181106124a5576124a5614e0f565b602002602001015190508451831115612540576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e67746800000000000000000000000000000000000060648201526084016105aa565b826000036125f9578051805160209182012060405161258e9261256892910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b6125f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f74206861736800000060448201526064016105aa565b612750565b8051516020116126af57805180516020918201206040516126239261256892910190815260200190565b6125f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c20686173680000000000000000000000000000000000000000000000000060648201526084016105aa565b805184516020808701919091208251919092012014612750576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f652068617368000000000000000000000000000000000000000000000000000060648201526084016105aa565b61275c60106001614d54565b8160200151510361293d57845183036128d5576000612798826020015160108151811061278b5761278b614e0f565b60200260200101516130e9565b9050600081511161282b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e636829000000000060648201526084016105aa565b600187516128399190614885565b83146128c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e63682900000000000060648201526084016105aa565b9650611a2695505050505050565b60008584815181106128e9576128e9614e0f565b602001015160f81c60f81b60f81c9050600082602001518260ff168151811061291457612914614e0f565b6020026020010151905061292781613249565b9550612934600186614d54565b94505050612dc3565b600281602001515103612d3b5760006129558261326e565b905060008160008151811061296c5761296c614e0f565b016020015160f81c90506000612983600283614e3e565b61298e906002614e60565b9050600061299f848360ff16613292565b905060006129ad8a89613292565b905060006129bb83836132c8565b905080835114612a4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b657900000000000060648201526084016105aa565b60ff851660021480612a62575060ff85166003145b15612c565780825114612af7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e64657200000060648201526084016105aa565b6000612b13886020015160018151811061278b5761278b614e0f565b90506000815111612ba6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c656166290000000000000060648201526084016105aa565b60018d51612bb49190614885565b8914612c42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c65616629000000000000000060648201526084016105aa565b9c50611a269b505050505050505050505050565b60ff85161580612c69575060ff85166001145b15612ca857612c958760200151600181518110612c8857612c88614e0f565b6020026020010151613249565b9950612ca1818a614d54565b9850612d30565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e20707265666978000000000000000000000000000060648201526084016105aa565b505050505050612dc3565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f646500000000000000000000000000000000000000000000000060648201526084016105aa565b5080612dce81614d6c565b915050612488565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e747300000000000000000000000000000000000000000000000000000060648201526084016105aa565b805160609060008167ffffffffffffffff811115612e7f57612e7f6143d3565b604051908082528060200260200182016040528015612ec457816020015b6040805180820190915260608082526020820152815260200190600190039081612e9d5790505b50905060005b82811015612f46576040518060400160405280868381518110612eef57612eef614e0f565b60200260200101518152602001612f1e878481518110612f1157612f11614e0f565b6020026020010151613377565b815250828281518110612f3357612f33614e0f565b6020908102919091010152600101612eca565b509392505050565b80516060906000612f60826002614ad7565b67ffffffffffffffff811115612f7857612f786143d3565b6040519080825280601f01601f191660200182016040528015612fa2576020820181803683370190505b5090506000805b838110156130df57858181518110612fc357612fc3614e0f565b6020910101517fff000000000000000000000000000000000000000000000000000000000000008116925060041c7f0ff0000000000000000000000000000000000000000000000000000000000000168361301f836002614ad7565b8151811061302f5761302f614e0f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f0f0000000000000000000000000000000000000000000000000000000000000082168361308d836002614ad7565b613098906001614d54565b815181106130a8576130a8614e0f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101612fa9565b5090949350505050565b606060008060006130f98561338a565b91945092509050600081600181111561311457613114614e83565b146131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d0000000000000060648201526084016105aa565b6131ab8284614d54565b85511461323a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e64657200000000000000000000000060648201526084016105aa565b611bf585602001518484613df7565b6060602082600001511061326557613260826130e9565b6119e1565b6119e182613e98565b60606119e161328d836020015160008151811061278b5761278b614e0f565b612f4e565b6060825182106132b157506040805160208101909152600081526119e1565b611a2683838486516132c39190614885565b613eae565b600080600083518551106132dd5783516132e0565b84515b90505b808210801561336757508382815181106132ff576132ff614e0f565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191685838151811061333e5761333e614e0f565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15612f46578160010191506132e3565b60606119e161338583614086565b61416f565b600080600080846000015111613448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016105aa565b6020840151805160001a607f811161346d576000600160009450945094505050613df0565b60b7811161367b576000613482608083614885565b90508087600001511161353d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a4016105aa565b6001838101517fff000000000000000000000000000000000000000000000000000000000000001690821415806135b657507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b613668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a4016105aa565b5060019550935060009250613df0915050565b60bf81116139c957600061369060b783614885565b90508087600001511161374b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a4016105aa565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a4016105aa565b600184015160088302610100031c603781116138ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a4016105aa565b6138f78184614d54565b8951116139ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a4016105aa565b6139b7836001614d54565b9750955060009450613df09350505050565b60f78111613aaa5760006139de60c083614885565b905080876000015111613a99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a4016105aa565b600195509350849250613df0915050565b6000613ab760f783614885565b905080876000015111613b72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a4016105aa565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613c50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a4016105aa565b600184015160088302610100031c60378111613d14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a4016105aa565b613d1e8184614d54565b895111613dd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a4016105aa565b613dde836001614d54565b9750955060019450613df09350505050565b9193909250565b606060008267ffffffffffffffff811115613e1457613e146143d3565b6040519080825280601f01601f191660200182016040528015613e3e576020820181803683370190505b50905082600003613e50579050611a26565b6000613e5c8587614d54565b90506020820160005b85811015613e7d578281015182820152602001613e65565b85811115613e8c576000868301525b50919695505050505050565b60606119e1826020015160008460000151613df7565b60608182601f011015613f1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016105aa565b828284011015613f89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016105aa565b81830184511015613ff6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016105aa565b606082158015614015576040519150600082526020820160405261407d565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561404e578051835260209283019201614036565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60408051808201909152600080825260208201526000825111614151576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016105aa565b50604080518082019091528151815260209182019181019190915290565b6060600080600061417f8561338a565b91945092509050600181600181111561419a5761419a614e83565b14614227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d000000000000000060648201526084016105aa565b84516142338385614d54565b146142c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e646572000000000000000000000000000060648201526084016105aa565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816142d95790505090506000845b87518110156143c75760008061434c6040518060400160405280858d600001516143309190614885565b8152602001858d602001516143459190614d54565b905261338a565b5091509150604051806040016040528083836143689190614d54565b8152602001848c6020015161437d9190614d54565b81525085858151811061439257614392614e0f565b60209081029190910101526143a8600185614d54565b93506143b48183614d54565b6143be9084614d54565b92505050614306565b50815295945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614449576144496143d3565b604052919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461447557600080fd5b919050565b600082601f83011261448b57600080fd5b813567ffffffffffffffff8111156144a5576144a56143d3565b6144d660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614402565b8181528460208386010111156144eb57600080fd5b816020850160208301376000918101602001919091529392505050565b600060c0828403121561451a57600080fd5b60405160c0810167ffffffffffffffff828210818311171561453e5761453e6143d3565b816040528293508435835261455560208601614451565b602084015261456660408601614451565b6040840152606085013560608401526080850135608084015260a085013591508082111561459357600080fd5b506145a08582860161447a565b60a0830152505092915050565b600080600080600085870360e08112156145c657600080fd5b863567ffffffffffffffff808211156145de57600080fd5b6145ea8a838b01614508565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401121561462357600080fd5b60408901955060c089013592508083111561463d57600080fd5b828901925089601f84011261465157600080fd5b823591508082111561466257600080fd5b508860208260051b840101111561467857600080fd5b959894975092955050506020019190565b60005b838110156146a457818101518382015260200161468c565b838111156146b3576000848401525b50505050565b600081518084526146d1816020860160208601614689565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611a2660208301846146b9565b60006020828403121561472857600080fd5b813567ffffffffffffffff81111561473f57600080fd5b611d3384828501614508565b60006020828403121561475d57600080fd5b5035919050565b600080600080600060a0868803121561477c57600080fd5b61478586614451565b945060208601359350604086013567ffffffffffffffff80821682146147aa57600080fd5b90935060608701359081151582146147c157600080fd5b909250608087013590808211156147d757600080fd5b506147e48882890161447a565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251614845816049850160208701614689565b919091016049019695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561489757614897614856565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826148da576148da61489c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f80000000000000000000000000000000000000000000000000000000000000008314161561492e5761492e614856565b500590565b6000808312837f80000000000000000000000000000000000000000000000000000000000000000183128115161561496d5761496d614856565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156149a1576149a1614856565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000841360008413858304851182821616156149e8576149e8614856565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615614a2357614a23614856565b60008712925087820587128484161615614a3f57614a3f614856565b87850587128184161615614a5557614a55614856565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615614a9d57614a9d614856565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615614ad157614ad1614856565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b0f57614b0f614856565b500290565b600067ffffffffffffffff808316818516808303821115614b3757614b37614856565b01949350505050565b60006fffffffffffffffffffffffffffffffff80831681851681830481118215151615614b6f57614b6f614856565b02949350505050565b600082614b8757614b8761489c565b500490565b600060408284031215614b9e57600080fd5b6040516040810181811067ffffffffffffffff82111715614bc157614bc16143d3565b604052825181526020928301519281019290925250919050565b600060808284031215614bed57600080fd5b6040516080810181811067ffffffffffffffff82111715614c1057614c106143d3565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff80841115614c5c57614c5c6143d3565b8360051b6020614c6d818301614402565b868152918501918181019036841115614c8557600080fd5b865b84811015614cb957803586811115614c9f5760008081fd5b614cab36828b0161447a565b845250918301918301614c87565b50979650505050505050565b60008451614cd7818460208901614689565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551614d13816001850160208a01614689565b60019201918201528351614d2e816002840160208801614689565b0160020195945050505050565b600060208284031215614d4d57600080fd5b5051919050565b60008219821115614d6757614d67614856565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614d9d57614d9d614856565b5060010190565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152614def60c08301846146b9565b98975050505050505050565b600082614e0a57614e0a61489c565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff831680614e5157614e5161489c565b8060ff84160691505092915050565b600060ff821660ff841680821015614e7a57614e7a614856565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a" +var OptimismPortalDeployedBin = "0x6080604052600436106101475760003560e01c80638c3152e9116100c0578063cd7c978911610074578063e965084c11610059578063e965084c14610429578063e9e05c42146104b5578063f4daa291146104c857600080fd5b8063cd7c978914610373578063cff0ab961461038857600080fd5b8063a14238e7116100a5578063a14238e7146102fe578063c4fc47981461033e578063ca3e99ba1461035e57600080fd5b80638c3152e9146102b15780639bf62d82146102d157600080fd5b806364b79208116101175780638129fc1c116100fc5780638129fc1c14610286578063867ead131461029b5780638b4c40b01461016c57600080fd5b806364b792081461024c5780636bb0291e1461027157600080fd5b80621c2ff61461017357806313620abd146101d15780634870496f1461020a57806354fd4d501461022a57600080fd5b3661016e5761016c3334620186a06000604051806020016040528060008152506104fc565b005b600080fd5b34801561017f57600080fd5b506101a77f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101dd57600080fd5b506101e9633b9aca0081565b6040516fffffffffffffffffffffffffffffffff90911681526020016101c8565b34801561021657600080fd5b5061016c610225366004614618565b6109c9565b34801561023657600080fd5b5061023f610e69565b6040516101c8919061476e565b34801561025857600080fd5b50610263627a120081565b6040519081526020016101c8565b34801561027d57600080fd5b50610263600481565b34801561029257600080fd5b5061016c610f0c565b3480156102a757600080fd5b5061026361271081565b3480156102bd57600080fd5b5061016c6102cc366004614781565b6110ca565b3480156102dd57600080fd5b506032546101a79073ffffffffffffffffffffffffffffffffffffffff1681565b34801561030a57600080fd5b5061032e6103193660046147b6565b60336020526000908152604090205460ff1681565b60405190151581526020016101c8565b34801561034a57600080fd5b5061032e6103593660046147b6565b611923565b34801561036a57600080fd5b506102636119e7565b34801561037f57600080fd5b50610263600881565b34801561039457600080fd5b506001546103f0906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016101c8565b34801561043557600080fd5b506104876104443660046147b6565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff92831660208501529116908201526060016101c8565b61016c6104c33660046147cf565b6104fc565b3480156104d457600080fd5b506102637f000000000000000000000000000000000000000000000000000000000000000081565b8260005a905083156105b35773ffffffffffffffffffffffffffffffffffffffff8716156105b357604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260248101919091527f4f7074696d69736d506f7274616c3a206d7573742073656e6420746f2061646460448201527f72657373283029207768656e206372656174696e67206120636f6e747261637460648201526084015b60405180910390fd5b333281146105d4575033731111000000000000000000000000000000001111015b600034888888886040516020016105ef95949392919061485c565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c328460405161065f919061476e565b60405180910390a4505060015460009061069f907801000000000000000000000000000000000000000000000000900467ffffffffffffffff16436148f0565b905080156108285760006106b76004627a1200614936565b6001546106e29190700100000000000000000000000000000000900467ffffffffffffffff1661499e565b9050600060086106f66004627a1200614936565b6001546107169085906fffffffffffffffffffffffffffffffff16614a12565b6107209190614936565b61072a9190614936565b60015490915060009061077690610760906107589085906fffffffffffffffffffffffffffffffff16614ace565b612710611a14565b6fffffffffffffffffffffffffffffffff611a2d565b905060018411156107e9576107e6610760670de0b6b3a76400006107d261079e600883614936565b6107b090670de0b6b3a764000061499e565b6107bb60018a6148f0565b6107cd90670de0b6b3a7640000614b42565b611a3c565b6107dc9085614a12565b6107589190614936565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b6001805484919060109061085b908490700100000000000000000000000000000000900467ffffffffffffffff16614b7f565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550627a1200600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315610937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d6974000060648201526084016105aa565b600154600090610963906fffffffffffffffffffffffffffffffff1667ffffffffffffffff8616614bab565b6fffffffffffffffffffffffffffffffff169050600061098748633b9aca00611a6d565b6109919083614be3565b905060005a6109a090866148f0565b9050808211156109bc576109bc6109b782846148f0565b611a7d565b5050505050505050505050565b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff1603610a88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a20796f752063616e6e6f742073656e642060448201527f6d6573736167657320746f2074686520706f7274616c20636f6e74726163740060648201526084016105aa565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015610b15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b399190614bf7565b519050610b53610b4e36869003860186614c46565b611aab565b8114610be1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f7074696d69736d506f7274616c3a20696e76616c6964206f7574707574207260448201527f6f6f742070726f6f66000000000000000000000000000000000000000000000060648201526084016105aa565b6000610bec87611b07565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610c78575080604001516fffffffffffffffffffffffffffffffff1687148015610c78575080518314155b610d04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173682060448201527f68617320616c7265616479206265656e2070726f76656e00000000000000000060648201526084016105aa565b610d1c826040880135610d178789614cac565b611b37565b610da8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f7074696d69736d506f7274616c3a20696e76616c696420776974686472617760448201527f616c20696e636c7573696f6e2070726f6f66000000000000000000000000000060648201526084016105aa565b604080516060810182528481526fffffffffffffffffffffffffffffffff42811660208084019182528b831684860190815260008881526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558a830151908b0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169185917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a45050505050505050565b6060610e947f0000000000000000000000000000000000000000000000000000000000000000611bfe565b610ebd7f0000000000000000000000000000000000000000000000000000000000000000611bfe565b610ee67f0000000000000000000000000000000000000000000000000000000000000000611bfe565b604051602001610ef893929190614d30565b604051602081830303815290604052905090565b600054610100900460ff1615808015610f2c5750600054600160ff909116105b80610f465750303b158015610f46575060005460ff166001145b610fd2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105aa565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561103057600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055611064611d3b565b80156110c757600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b60325473ffffffffffffffffffffffffffffffffffffffff1661dead14611173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4f7074696d69736d506f7274616c3a2063616e206f6e6c79207472696767657260448201527f206f6e65207769746864726177616c20706572207472616e73616374696f6e0060648201526084016105aa565b600061117e82611b07565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff80821694830185905270010000000000000000000000000000000090910416918101919091529293509003611269576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206e60448201527f6f74206265656e2070726f76656e00000000000000000000000000000000000060648201526084016105aa565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f89190614da6565b81602001516fffffffffffffffffffffffffffffffff1610156113c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604b60248201527f4f7074696d69736d506f7274616c3a207769746864726177616c2074696d657360448201527f74616d70206c657373207468616e204c32204f7261636c65207374617274696e60648201527f672074696d657374616d70000000000000000000000000000000000000000000608482015260a4016105aa565b6113e281602001516fffffffffffffffffffffffffffffffff16611e1e565b611494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f4f7074696d69736d506f7274616c3a2070726f76656e2077697468647261776160448201527f6c2066696e616c697a6174696f6e20706572696f6420686173206e6f7420656c60648201527f6170736564000000000000000000000000000000000000000000000000000000608482015260a4016105aa565b60408181015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff90911660048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a25ae557906024016040805180830381865afa158015611538573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155c9190614bf7565b8251815191925014611616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f4f7074696d69736d506f7274616c3a206f757470757420726f6f742070726f7660448201527f656e206973206e6f74207468652073616d652061732063757272656e74206f7560648201527f7470757420726f6f740000000000000000000000000000000000000000000000608482015260a4016105aa565b6116238160200151611e1e565b6116d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f4f7074696d69736d506f7274616c3a206f75747075742070726f706f73616c2060448201527f66696e616c697a6174696f6e20706572696f6420686173206e6f7420656c617060648201527f7365640000000000000000000000000000000000000000000000000000000000608482015260a4016105aa565b60008381526033602052604090205460ff1615611774576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f4f7074696d69736d506f7274616c3a207769746864726177616c20686173206160448201527f6c7265616479206265656e2066696e616c697a6564000000000000000000000060648201526084016105aa565b600083815260336020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560808401516117bd90614e2090614dbf565b5a101561184c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4f7074696d69736d506f7274616c3a20696e73756666696369656e742067617360448201527f20746f2066696e616c697a65207769746864726177616c00000000000000000060648201526084016105aa565b8360200151603260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006118af8560400151866080015187606001518860a00151611e52565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915084907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b9061191490841515815260200190565b60405180910390a25050505050565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018290526000906119e19073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a25ae557906024016040805180830381865afa1580156119b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d89190614bf7565b60200151611e1e565b92915050565b6119f56004627a1200614936565b81565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600081831215611a245781611a26565b825b9392505050565b6000818312611a245781611a26565b6000611a26670de0b6b3a764000083611a5486611e6c565b611a5e9190614a12565b611a689190614936565b6120b0565b600081831015611a245781611a26565b6000805a90505b825a611a9090836148f0565b1015611aa657611a9f82614dd7565b9150611a84565b505050565b60008160000151826020015183604001518460600151604051602001611aea949392919093845260208401929092526040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b80516020808301516040808501516060860151608087015160a08801519351600097611aea979096959101614e0f565b604080516020810185905260009181018290528190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083018190529250611bf59101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828201909152600182527f010000000000000000000000000000000000000000000000000000000000000060208301529085876122ef565b95945050505050565b606081600003611c4157505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611c6b5780611c5581614dd7565b9150611c649050600a83614be3565b9150611c45565b60008167ffffffffffffffff811115611c8657611c8661443e565b6040519080825280601f01601f191660200182016040528015611cb0576020820181803683370190505b5090505b8415611d3357611cc56001836148f0565b9150611cd2600a86614e66565b611cdd906030614dbf565b60f81b818381518110611cf257611cf2614e7a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611d2c600a86614be3565b9450611cb4565b949350505050565b600054610100900460ff16611dd2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105aa565b60408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6000611e4a7f000000000000000000000000000000000000000000000000000000000000000083614dbf565b421192915050565b600080600080845160208601878a8af19695505050505050565b6000808213611ed7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016105aa565b60006060611ee484612313565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136120e157506000919050565b680755bf798b4a1bf1e58212612153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4558505f4f564552464c4f57000000000000000000000000000000000000000060448201526064016105aa565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b6000806122fb866123e9565b90506123098186868661241b565b9695505050505050565b600080821161237e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f554e444546494e4544000000000000000000000000000000000000000000000060448201526064016105aa565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b6060818051906020012060405160200161240591815260200190565b6040516020818303038152906040529050919050565b6000611bf58461242c878686612442565b8051602091820120825192909101919091201490565b606060008451116124af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d65726b6c65547269653a20656d707479206b6579000000000000000000000060448201526064016105aa565b60006124ba84612eca565b905060006124c786612fb9565b90506000846040516020016124de91815260200190565b60405160208183030381529060405290506000805b8451811015612e4157600085828151811061251057612510614e7a565b6020026020010151905084518311156125ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4d65726b6c65547269653a206b657920696e646578206578636565647320746f60448201527f74616c206b6579206c656e67746800000000000000000000000000000000000060648201526084016105aa565b8260000361266457805180516020918201206040516125f9926125d392910190815260200190565b604051602081830303815290604052858051602091820120825192909101919091201490565b61265f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4d65726b6c65547269653a20696e76616c696420726f6f74206861736800000060448201526064016105aa565b6127bb565b80515160201161271a578051805160209182012060405161268e926125d392910190815260200190565b61265f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d65726b6c65547269653a20696e76616c6964206c6172676520696e7465726e60448201527f616c20686173680000000000000000000000000000000000000000000000000060648201526084016105aa565b8051845160208087019190912082519190920120146127bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4d65726b6c65547269653a20696e76616c696420696e7465726e616c206e6f6460448201527f652068617368000000000000000000000000000000000000000000000000000060648201526084016105aa565b6127c760106001614dbf565b816020015151036129a8578451830361294057600061280382602001516010815181106127f6576127f6614e7a565b6020026020010151613154565b90506000815111612896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603b60248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286272616e636829000000000060648201526084016105aa565b600187516128a491906148f0565b8314612932576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286272616e63682900000000000060648201526084016105aa565b9650611a2695505050505050565b600085848151811061295457612954614e7a565b602001015160f81c60f81b60f81c9050600082602001518260ff168151811061297f5761297f614e7a565b60200260200101519050612992816132b4565b955061299f600186614dbf565b94505050612e2e565b600281602001515103612da65760006129c0826132d9565b90506000816000815181106129d7576129d7614e7a565b016020015160f81c905060006129ee600283614ea9565b6129f9906002614ecb565b90506000612a0a848360ff166132fd565b90506000612a188a896132fd565b90506000612a268383613333565b905080835114612ab8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f4d65726b6c65547269653a20706174682072656d61696e646572206d7573742060448201527f736861726520616c6c206e6962626c65732077697468206b657900000000000060648201526084016105aa565b60ff851660021480612acd575060ff85166003145b15612cc15780825114612b62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f4d65726b6c65547269653a206b65792072656d61696e646572206d757374206260448201527f65206964656e746963616c20746f20706174682072656d61696e64657200000060648201526084016105aa565b6000612b7e88602001516001815181106127f6576127f6614e7a565b90506000815111612c11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4d65726b6c65547269653a2076616c7565206c656e677468206d75737420626560448201527f2067726561746572207468616e207a65726f20286c656166290000000000000060648201526084016105aa565b60018d51612c1f91906148f0565b8914612cad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4d65726b6c65547269653a2076616c7565206e6f6465206d757374206265206c60448201527f617374206e6f646520696e2070726f6f6620286c65616629000000000000000060648201526084016105aa565b9c50611a269b505050505050505050505050565b60ff85161580612cd4575060ff85166001145b15612d1357612d008760200151600181518110612cf357612cf3614e7a565b60200260200101516132b4565b9950612d0c818a614dbf565b9850612d9b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4d65726b6c65547269653a2072656365697665642061206e6f6465207769746860448201527f20616e20756e6b6e6f776e20707265666978000000000000000000000000000060648201526084016105aa565b505050505050612e2e565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f4d65726b6c65547269653a20726563656976656420616e20756e70617273656160448201527f626c65206e6f646500000000000000000000000000000000000000000000000060648201526084016105aa565b5080612e3981614dd7565b9150506124f3565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d65726b6c65547269653a2072616e206f7574206f662070726f6f6620656c6560448201527f6d656e747300000000000000000000000000000000000000000000000000000060648201526084016105aa565b805160609060008167ffffffffffffffff811115612eea57612eea61443e565b604051908082528060200260200182016040528015612f2f57816020015b6040805180820190915260608082526020820152815260200190600190039081612f085790505b50905060005b82811015612fb1576040518060400160405280868381518110612f5a57612f5a614e7a565b60200260200101518152602001612f89878481518110612f7c57612f7c614e7a565b60200260200101516133e2565b815250828281518110612f9e57612f9e614e7a565b6020908102919091010152600101612f35565b509392505050565b80516060906000612fcb826002614b42565b67ffffffffffffffff811115612fe357612fe361443e565b6040519080825280601f01601f19166020018201604052801561300d576020820181803683370190505b5090506000805b8381101561314a5785818151811061302e5761302e614e7a565b6020910101517fff000000000000000000000000000000000000000000000000000000000000008116925060041c7f0ff0000000000000000000000000000000000000000000000000000000000000168361308a836002614b42565b8151811061309a5761309a614e7a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f0f000000000000000000000000000000000000000000000000000000000000008216836130f8836002614b42565b613103906001614dbf565b8151811061311357613113614e7a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600101613014565b5090949350505050565b60606000806000613164856133f5565b91945092509050600081600181111561317f5761317f614eee565b1461320c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206279746573206973206e6f7420612064617461206974656d0000000000000060648201526084016105aa565b6132168284614dbf565b8551146132a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f524c505265616465723a2062797465732076616c756520636f6e7461696e732060448201527f616e20696e76616c69642072656d61696e64657200000000000000000000000060648201526084016105aa565b611bf585602001518484613e62565b606060208260000151106132d0576132cb82613154565b6119e1565b6119e182613f03565b60606119e16132f883602001516000815181106127f6576127f6614e7a565b612fb9565b60608251821061331c57506040805160208101909152600081526119e1565b611a26838384865161332e91906148f0565b613f19565b6000806000835185511061334857835161334b565b84515b90505b80821080156133d2575083828151811061336a5761336a614e7a565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168583815181106133a9576133a9614e7a565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016145b15612fb15781600101915061334e565b60606119e16133f0836140f1565b6141da565b6000806000808460000151116134b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016105aa565b6020840151805160001a607f81116134d8576000600160009450945094505050613e5b565b60b781116136e65760006134ed6080836148f0565b9050808760000151116135a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604e60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20737472696e67206c656e6774682060648201527f2873686f727420737472696e6729000000000000000000000000000000000000608482015260a4016105aa565b6001838101517fff0000000000000000000000000000000000000000000000000000000000000016908214158061362157507f80000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821610155b6136d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a20696e76616c6964207072656669782c2073696e676c60448201527f652062797465203c203078383020617265206e6f74207072656669786564202860648201527f73686f727420737472696e672900000000000000000000000000000000000000608482015260a4016105aa565b5060019550935060009250613e5b915050565b60bf8111613a345760006136fb60b7836148f0565b9050808760000151116137b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605160248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f6620737472696e67206c656e60648201527f67746820286c6f6e6720737472696e6729000000000000000000000000000000608482015260a4016105aa565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e6720737472696e672900000000000000000000000000000000000000000000608482015260a4016105aa565b600184015160088302610100031c60378111613958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f20737472696e6729000000000000000000000000000000000000000000000000608482015260a4016105aa565b6139628184614dbf565b895111613a17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e6720737472696e67290000000000000000000000000000000000000000608482015260a4016105aa565b613a22836001614dbf565b9750955060009450613e5b9350505050565b60f78111613b15576000613a4960c0836148f0565b905080876000015111613b04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e206c697374206c656e67746820287360648201527f686f7274206c6973742900000000000000000000000000000000000000000000608482015260a4016105aa565b600195509350849250613e5b915050565b6000613b2260f7836148f0565b905080876000015111613bdd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604d60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206265203e207468616e206c656e677468206f66206c697374206c656e677460648201527f6820286c6f6e67206c6973742900000000000000000000000000000000000000608482015260a4016105aa565b60018301517fff00000000000000000000000000000000000000000000000000000000000000166000819003613cbb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604860248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f74206e6f74206861766520616e79206c656164696e67207a65726f7320286c6f60648201527f6e67206c69737429000000000000000000000000000000000000000000000000608482015260a4016105aa565b600184015160088302610100031c60378111613d7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604660248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20353520627974657320286c6f6e6760648201527f206c697374290000000000000000000000000000000000000000000000000000608482015260a4016105aa565b613d898184614dbf565b895111613e3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620636f6e74656e74206d757360448201527f742062652067726561746572207468616e20746f74616c206c656e677468202860648201527f6c6f6e67206c6973742900000000000000000000000000000000000000000000608482015260a4016105aa565b613e49836001614dbf565b9750955060019450613e5b9350505050565b9193909250565b606060008267ffffffffffffffff811115613e7f57613e7f61443e565b6040519080825280601f01601f191660200182016040528015613ea9576020820181803683370190505b50905082600003613ebb579050611a26565b6000613ec78587614dbf565b90506020820160005b85811015613ee8578281015182820152602001613ed0565b85811115613ef7576000868301525b50919695505050505050565b60606119e1826020015160008460000151613e62565b60608182601f011015613f88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016105aa565b828284011015613ff4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f7700000000000000000000000000000000000060448201526064016105aa565b81830184511015614061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e647300000000000000000000000000000060448201526064016105aa565b60608215801561408057604051915060008252602082016040526140e8565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156140b95780518352602092830192016140a1565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b604080518082019091526000808252602082015260008251116141bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f524c505265616465723a206c656e677468206f6620616e20524c50206974656d60448201527f206d7573742062652067726561746572207468616e207a65726f20746f20626560648201527f206465636f6461626c6500000000000000000000000000000000000000000000608482015260a4016105aa565b50604080518082019091528151815260209182019181019190915290565b606060008060006141ea856133f5565b91945092509050600181600181111561420557614205614eee565b14614292576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f524c505265616465723a206465636f646564206974656d207479706520666f7260448201527f206c697374206973206e6f742061206c697374206974656d000000000000000060648201526084016105aa565b845161429e8385614dbf565b1461432b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f524c505265616465723a206c697374206974656d2068617320616e20696e766160448201527f6c696420646174612072656d61696e646572000000000000000000000000000060648201526084016105aa565b6040805160208082526104208201909252600091816020015b60408051808201909152600080825260208201528152602001906001900390816143445790505090506000845b8751811015614432576000806143b76040518060400160405280858d6000015161439b91906148f0565b8152602001858d602001516143b09190614dbf565b90526133f5565b5091509150604051806040016040528083836143d39190614dbf565b8152602001848c602001516143e89190614dbf565b8152508585815181106143fd576143fd614e7a565b6020908102919091010152614413600185614dbf565b935061441f8183614dbf565b6144299084614dbf565b92505050614371565b50815295945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156144b4576144b461443e565b604052919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146144e057600080fd5b919050565b600082601f8301126144f657600080fd5b813567ffffffffffffffff8111156145105761451061443e565b61454160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161446d565b81815284602083860101111561455657600080fd5b816020850160208301376000918101602001919091529392505050565b600060c0828403121561458557600080fd5b60405160c0810167ffffffffffffffff82821081831117156145a9576145a961443e565b81604052829350843583526145c0602086016144bc565b60208401526145d1604086016144bc565b6040840152606085013560608401526080850135608084015260a08501359150808211156145fe57600080fd5b5061460b858286016144e5565b60a0830152505092915050565b600080600080600085870360e081121561463157600080fd5b863567ffffffffffffffff8082111561464957600080fd5b6146558a838b01614573565b97506020890135965060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08401121561468e57600080fd5b60408901955060c08901359250808311156146a857600080fd5b828901925089601f8401126146bc57600080fd5b82359150808211156146cd57600080fd5b508860208260051b84010111156146e357600080fd5b959894975092955050506020019190565b60005b8381101561470f5781810151838201526020016146f7565b8381111561471e576000848401525b50505050565b6000815180845261473c8160208601602086016146f4565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611a266020830184614724565b60006020828403121561479357600080fd5b813567ffffffffffffffff8111156147aa57600080fd5b611d3384828501614573565b6000602082840312156147c857600080fd5b5035919050565b600080600080600060a086880312156147e757600080fd5b6147f0866144bc565b945060208601359350604086013567ffffffffffffffff808216821461481557600080fd5b909350606087013590811515821461482c57600080fd5b9092506080870135908082111561484257600080fd5b5061484f888289016144e5565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b6048820152600082516148b08160498501602087016146f4565b919091016049019695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015614902576149026148c1565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261494557614945614907565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f800000000000000000000000000000000000000000000000000000000000000083141615614999576149996148c1565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156149d8576149d86148c1565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615614a0c57614a0c6148c1565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600084136000841385830485118282161615614a5357614a536148c1565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615614a8e57614a8e6148c1565b60008712925087820587128484161615614aaa57614aaa6148c1565b87850587128184161615614ac057614ac06148c1565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615614b0857614b086148c1565b827f8000000000000000000000000000000000000000000000000000000000000000038412811615614b3c57614b3c6148c1565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b7a57614b7a6148c1565b500290565b600067ffffffffffffffff808316818516808303821115614ba257614ba26148c1565b01949350505050565b60006fffffffffffffffffffffffffffffffff80831681851681830481118215151615614bda57614bda6148c1565b02949350505050565b600082614bf257614bf2614907565b500490565b600060408284031215614c0957600080fd5b6040516040810181811067ffffffffffffffff82111715614c2c57614c2c61443e565b604052825181526020928301519281019290925250919050565b600060808284031215614c5857600080fd5b6040516080810181811067ffffffffffffffff82111715614c7b57614c7b61443e565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b600067ffffffffffffffff80841115614cc757614cc761443e565b8360051b6020614cd881830161446d565b868152918501918181019036841115614cf057600080fd5b865b84811015614d2457803586811115614d0a5760008081fd5b614d1636828b016144e5565b845250918301918301614cf2565b50979650505050505050565b60008451614d428184602089016146f4565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551614d7e816001850160208a016146f4565b60019201918201528351614d998160028401602088016146f4565b0160020195945050505050565b600060208284031215614db857600080fd5b5051919050565b60008219821115614dd257614dd26148c1565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e0857614e086148c1565b5060010190565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152614e5a60c0830184614724565b98975050505050505050565b600082614e7557614e75614907565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff831680614ebc57614ebc614907565b8060ff84160691505092915050565b600060ff821660ff841680821015614ee557614ee56148c1565b90039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a" func init() { if err := json.Unmarshal([]byte(OptimismPortalStorageLayoutJSON), OptimismPortalStorageLayout); err != nil { diff --git a/packages/contracts-bedrock/.gas-snapshot b/packages/contracts-bedrock/.gas-snapshot index 275a0dee67a98..7c4821418fa18 100644 --- a/packages/contracts-bedrock/.gas-snapshot +++ b/packages/contracts-bedrock/.gas-snapshot @@ -133,27 +133,37 @@ LegacyERC20ETH_Test:test_mint() (gas: 10649) LegacyERC20ETH_Test:test_transfer() (gas: 10711) LegacyERC20ETH_Test:test_transferFrom() (gas: 12887) LegacyMessagePasser_Test:test_LegacyMessagePasser_passMessageToL1_Succeeds() (gas: 34519) -MerkleTrie_Test:test_get_reverts_corruptedProof() (gas: 5686) -MerkleTrie_Test:test_get_reverts_extraProofElements() (gas: 60560) -MerkleTrie_Test:test_get_reverts_invalidDataRemainder() (gas: 35827) -MerkleTrie_Test:test_get_reverts_invalidInternalNodeHash() (gas: 50763) -MerkleTrie_Test:test_get_reverts_nonexistentKey1() (gas: 59624) -MerkleTrie_Test:test_get_reverts_nonexistentKey2() (gas: 23359) -MerkleTrie_Test:test_get_reverts_smallerPathThanKey1() (gas: 53476) -MerkleTrie_Test:test_get_reverts_smallerPathThanKey2() (gas: 54913) -MerkleTrie_Test:test_get_reverts_wrongKeyProof() (gas: 53844) -MerkleTrie_Test:test_get_reverts_zeroBranchValueLength() (gas: 43222) -MerkleTrie_Test:test_get_reverts_zeroLengthKey() (gas: 15886) -MerkleTrie_Test:test_get_validProofSucceeds1() (gas: 61619) -MerkleTrie_Test:test_get_validProofSucceeds10() (gas: 50546) -MerkleTrie_Test:test_get_validProofSucceeds2() (gas: 71531) -MerkleTrie_Test:test_get_validProofSucceeds3() (gas: 32779) -MerkleTrie_Test:test_get_validProofSucceeds4() (gas: 23553) -MerkleTrie_Test:test_get_validProofSucceeds5() (gas: 84215) -MerkleTrie_Test:test_get_validProofSucceeds6() (gas: 72991) -MerkleTrie_Test:test_get_validProofSucceeds7() (gas: 79670) -MerkleTrie_Test:test_get_validProofSucceeds8() (gas: 50546) -MerkleTrie_Test:test_get_validProofSucceeds9() (gas: 50501) +MerkleTrie_Test:testFuzz_get_corruptedProof_reverts(bytes4) (runs: 256, μ: 78186, ~: 73452) +MerkleTrie_Test:testFuzz_get_emptyKey_reverts(bytes4) (runs: 256, μ: 32996, ~: 33179) +MerkleTrie_Test:testFuzz_get_extraProofElements_reverts(bytes4) (runs: 256, μ: 192382, ~: 194728) +MerkleTrie_Test:testFuzz_get_invalidDataRemainder_reverts(bytes4) (runs: 256, μ: 83175, ~: 81707) +MerkleTrie_Test:testFuzz_get_invalidInternalNodeHash_reverts(bytes4) (runs: 256, μ: 139121, ~: 142253) +MerkleTrie_Test:testFuzz_get_invalidLargeInternalHash_reverts(bytes4) (runs: 256, μ: 145222, ~: 147055) +MerkleTrie_Test:testFuzz_get_invalidRoot_reverts(bytes4) (runs: 256, μ: 139569, ~: 141932) +MerkleTrie_Test:testFuzz_get_partialProof_reverts(bytes4) (runs: 256, μ: 96925, ~: 103365) +MerkleTrie_Test:testFuzz_get_prefixedValidKey_reverts(bytes4) (runs: 256, μ: 145465, ~: 148456) +MerkleTrie_Test:testFuzz_get_validProofs_success(bytes4) (runs: 256, μ: 309187, ~: 310504) +MerkleTrie_Test:test_get_reverts_corruptedProof() (gas: 5756) +MerkleTrie_Test:test_get_reverts_extraProofElements() (gas: 60608) +MerkleTrie_Test:test_get_reverts_invalidDataRemainder() (gas: 35808) +MerkleTrie_Test:test_get_reverts_invalidInternalNodeHash() (gas: 50833) +MerkleTrie_Test:test_get_reverts_nonexistentKey1() (gas: 59694) +MerkleTrie_Test:test_get_reverts_nonexistentKey2() (gas: 23407) +MerkleTrie_Test:test_get_reverts_smallerPathThanKey1() (gas: 53502) +MerkleTrie_Test:test_get_reverts_smallerPathThanKey2() (gas: 54962) +MerkleTrie_Test:test_get_reverts_wrongKeyProof() (gas: 53870) +MerkleTrie_Test:test_get_reverts_zeroBranchValueLength() (gas: 43270) +MerkleTrie_Test:test_get_reverts_zeroLengthKey() (gas: 3655) +MerkleTrie_Test:test_get_validProofSucceeds1() (gas: 61667) +MerkleTrie_Test:test_get_validProofSucceeds10() (gas: 50572) +MerkleTrie_Test:test_get_validProofSucceeds2() (gas: 71557) +MerkleTrie_Test:test_get_validProofSucceeds3() (gas: 32827) +MerkleTrie_Test:test_get_validProofSucceeds4() (gas: 23623) +MerkleTrie_Test:test_get_validProofSucceeds5() (gas: 84306) +MerkleTrie_Test:test_get_validProofSucceeds6() (gas: 73039) +MerkleTrie_Test:test_get_validProofSucceeds7() (gas: 79674) +MerkleTrie_Test:test_get_validProofSucceeds8() (gas: 50528) +MerkleTrie_Test:test_get_validProofSucceeds9() (gas: 50549) OptimismMintableERC20_Test:test_bridge() (gas: 7599) OptimismMintableERC20_Test:test_burn() (gas: 51031) OptimismMintableERC20_Test:test_burnRevertsFromNotBridge() (gas: 11164) @@ -172,23 +182,23 @@ OptimismPortalUpgradeable_Test:test_initialize_cannotInitImpl_reverts() (gas: 10 OptimismPortalUpgradeable_Test:test_initialize_cannotInitProxy_reverts() (gas: 15789) OptimismPortalUpgradeable_Test:test_params_initValuesOnProxy_success() (gas: 16033) OptimismPortalUpgradeable_Test:test_upgradeToAndCall_upgrading_success() (gas: 180435) -OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifOutputRootChanges_reverts() (gas: 198517) -OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifOutputTimestampIsNotFinalized_reverts() (gas: 200739) +OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifOutputRootChanges_reverts() (gas: 198543) +OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifOutputTimestampIsNotFinalized_reverts() (gas: 200765) OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifWithdrawalNotProven_reverts() (gas: 39634) -OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifWithdrawalProofNotOldEnough_reverts() (gas: 196193) -OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onInsufficientGas_reverts() (gas: 194402) -OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onRecentWithdrawal_reverts() (gas: 174437) -OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onReentrancy_reverts() (gas: 234659) -OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onReplay_reverts() (gas: 238957) -OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_provenWithdrawalHash_success() (gas: 230626) -OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_targetFails_fails() (gas: 333263) -OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_timestampLessThanL2OracleStart_reverts() (gas: 194807) +OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifWithdrawalProofNotOldEnough_reverts() (gas: 196219) +OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onInsufficientGas_reverts() (gas: 194532) +OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onRecentWithdrawal_reverts() (gas: 174463) +OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onReentrancy_reverts() (gas: 234789) +OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onReplay_reverts() (gas: 238983) +OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_provenWithdrawalHash_success() (gas: 230652) +OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_targetFails_fails() (gas: 333289) +OptimismPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_timestampLessThanL2OracleStart_reverts() (gas: 194833) OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_onInvalidOutputRootProof_reverts() (gas: 85539) -OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_onInvalidWithdrawalProof_reverts() (gas: 137224) +OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_onInvalidWithdrawalProof_reverts() (gas: 137250) OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_onSelfCall_reverts() (gas: 50754) -OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_replayProveChangedOutputRoot_success() (gas: 277238) -OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_replayProve_reverts() (gas: 190171) -OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_validWithdrawalProof_success() (gas: 180360) +OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_replayProveChangedOutputRoot_success() (gas: 277290) +OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_replayProve_reverts() (gas: 190197) +OptimismPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_validWithdrawalProof_success() (gas: 180386) OptimismPortal_Test:test_OptimismPortalConstructor() (gas: 17298) OptimismPortal_Test:test_OptimismPortalReceiveEth_success() (gas: 127483) OptimismPortal_Test:test_depositTransaction_NoValueContract_success() (gas: 76706) @@ -305,7 +315,7 @@ ResourceMetering_Test:test_updateTenEmptyBlocks() (gas: 20899) ResourceMetering_Test:test_updateTwoEmptyBlocks() (gas: 20945) ResourceMetering_Test:test_useMaxSucceeds() (gas: 8017170) ResourceMetering_Test:test_useMoreThanMaxReverts() (gas: 16045) -SafeCall_Test:test_safeCall(address,address,uint256,uint64,bytes) (runs: 256, μ: 43316, ~: 45640) +SafeCall_Test:test_safeCall(address,address,uint256,uint64,bytes) (runs: 256, μ: 43191, ~: 45640) Semver_Test:test_behindProxy() (gas: 506748) Semver_Test:test_version() (gas: 9373) SequencerFeeVault_Test:test_constructor() (gas: 5459) diff --git a/packages/contracts-bedrock/contracts/libraries/trie/MerkleTrie.sol b/packages/contracts-bedrock/contracts/libraries/trie/MerkleTrie.sol index 13799f6af5862..3921d4d83a7ee 100644 --- a/packages/contracts-bedrock/contracts/libraries/trie/MerkleTrie.sol +++ b/packages/contracts-bedrock/contracts/libraries/trie/MerkleTrie.sol @@ -90,6 +90,8 @@ library MerkleTrie { bytes[] memory _proof, bytes32 _root ) internal pure returns (bytes memory) { + require(_key.length > 0, "MerkleTrie: empty key"); + TrieNode[] memory proof = _parseProof(_proof); bytes memory key = Bytes.toNibbles(_key); bytes memory currentNodeID = abi.encodePacked(_root); diff --git a/packages/contracts-bedrock/contracts/test/CommonTest.t.sol b/packages/contracts-bedrock/contracts/test/CommonTest.t.sol index b558686bf38b2..cbbee84f1f969 100644 --- a/packages/contracts-bedrock/contracts/test/CommonTest.t.sol +++ b/packages/contracts-bedrock/contracts/test/CommonTest.t.sol @@ -628,6 +628,25 @@ contract FFIInterface is Test { bytes memory result = vm.ffi(cmds); return abi.decode(result, (uint256, uint256)); } + + function getMerkleTrieFuzzCase(string memory variant) + external + returns ( + bytes32, + bytes memory, + bytes memory, + bytes[] memory + ) + { + string[] memory cmds = new string[](5); + cmds[0] = "./go-fuzz/fuzz"; + cmds[1] = "-m"; + cmds[2] = "trie"; + cmds[3] = "-v"; + cmds[4] = variant; + + return abi.decode(vm.ffi(cmds), (bytes32, bytes, bytes, bytes[])); + } } // Used for testing a future upgrade beyond the current implementations. diff --git a/packages/contracts-bedrock/contracts/test/MerkleTrie.t.sol b/packages/contracts-bedrock/contracts/test/MerkleTrie.t.sol index 1e831839b7821..d9d1110d89399 100644 --- a/packages/contracts-bedrock/contracts/test/MerkleTrie.t.sol +++ b/packages/contracts-bedrock/contracts/test/MerkleTrie.t.sol @@ -5,59 +5,56 @@ import { CommonTest } from "./CommonTest.t.sol"; import { MerkleTrie } from "../libraries/trie/MerkleTrie.sol"; contract MerkleTrie_Test is CommonTest { + function setUp() public { + _setUp(); + } + function test_get_validProofSucceeds1() external { bytes32 root = 0xd582f99275e227a1cf4284899e5ff06ee56da8859be71b553397c69151bc942f; bytes memory key = hex"6b6579326262"; bytes memory val = hex"6176616c32"; bytes[] memory proof = new bytes[](3); - proof[0] = hex"e68416b65793a03101b4447781f1e6c51ce76c709274fc80bd064f3a58ff981b6015348a826386"; - proof[1] = hex"f84580a0582eed8dd051b823d13f8648cdcd08aa2d8dac239f458863c4620e8c4d605debca83206262856176616c32ca83206363856176616c3380808080808080808080808080"; + proof[ + 0 + ] = hex"e68416b65793a03101b4447781f1e6c51ce76c709274fc80bd064f3a58ff981b6015348a826386"; + proof[ + 1 + ] = hex"f84580a0582eed8dd051b823d13f8648cdcd08aa2d8dac239f458863c4620e8c4d605debca83206262856176616c32ca83206363856176616c3380808080808080808080808080"; proof[2] = hex"ca83206262856176616c32"; - assertEq( - val, - MerkleTrie.get( - key, - proof, - root - ) - ); + assertEq(val, MerkleTrie.get(key, proof, root)); } function test_get_validProofSucceeds2() external { bytes32 root = 0xd582f99275e227a1cf4284899e5ff06ee56da8859be71b553397c69151bc942f; bytes memory key = hex"6b6579316161"; - bytes memory val = hex"303132333435363738393031323334353637383930313233343536373839303132333435363738397878"; + bytes + memory val = hex"303132333435363738393031323334353637383930313233343536373839303132333435363738397878"; bytes[] memory proof = new bytes[](3); - proof[0] = hex"e68416b65793a03101b4447781f1e6c51ce76c709274fc80bd064f3a58ff981b6015348a826386"; - proof[1] = hex"f84580a0582eed8dd051b823d13f8648cdcd08aa2d8dac239f458863c4620e8c4d605debca83206262856176616c32ca83206363856176616c3380808080808080808080808080"; - proof[2] = hex"ef83206161aa303132333435363738393031323334353637383930313233343536373839303132333435363738397878"; - - assertEq( - val, - MerkleTrie.get( - key, - proof, - root - ) - ); + proof[ + 0 + ] = hex"e68416b65793a03101b4447781f1e6c51ce76c709274fc80bd064f3a58ff981b6015348a826386"; + proof[ + 1 + ] = hex"f84580a0582eed8dd051b823d13f8648cdcd08aa2d8dac239f458863c4620e8c4d605debca83206262856176616c32ca83206363856176616c3380808080808080808080808080"; + proof[ + 2 + ] = hex"ef83206161aa303132333435363738393031323334353637383930313233343536373839303132333435363738397878"; + + assertEq(val, MerkleTrie.get(key, proof, root)); } function test_get_validProofSucceeds3() external { bytes32 root = 0xf838216fa749aefa91e0b672a9c06d3e6e983f913d7107b5dab4af60b5f5abed; bytes memory key = hex"6b6579316161"; - bytes memory val = hex"303132333435363738393031323334353637383930313233343536373839303132333435363738397878"; + bytes + memory val = hex"303132333435363738393031323334353637383930313233343536373839303132333435363738397878"; bytes[] memory proof = new bytes[](1); - proof[0] = hex"f387206b6579316161aa303132333435363738393031323334353637383930313233343536373839303132333435363738397878"; - - assertEq( - val, - MerkleTrie.get( - key, - proof, - root - ) - ); + proof[ + 0 + ] = hex"f387206b6579316161aa303132333435363738393031323334353637383930313233343536373839303132333435363738397878"; + + assertEq(val, MerkleTrie.get(key, proof, root)); } function test_get_validProofSucceeds4() external { @@ -67,33 +64,26 @@ contract MerkleTrie_Test is CommonTest { bytes[] memory proof = new bytes[](1); proof[0] = hex"ce87206b6579316161853031323334"; - assertEq( - val, - MerkleTrie.get( - key, - proof, - root - ) - ); + assertEq(val, MerkleTrie.get(key, proof, root)); } function test_get_validProofSucceeds5() external { bytes32 root = 0xcb65032e2f76c48b82b5c24b3db8f670ce73982869d38cd39a624f23d62a9e89; bytes memory key = hex"6b657931"; - bytes memory val = hex"30313233343536373839303132333435363738393031323334353637383930313233343536373839566572795f4c6f6e67"; + bytes + memory val = hex"30313233343536373839303132333435363738393031323334353637383930313233343536373839566572795f4c6f6e67"; bytes[] memory proof = new bytes[](3); - proof[0] = hex"e68416b65793a0f3f387240403976788281c0a6ee5b3fc08360d276039d635bb824ea7e6fed779"; - proof[1] = hex"f87180a034d14ccc7685aa2beb64f78b11ee2a335eae82047ef97c79b7dda7f0732b9f4ca05fb052b64e23d177131d9f32e9c5b942209eb7229e9a07c99a5d93245f53af18a09a137197a43a880648d5887cce656a5e6bbbe5e44ecb4f264395ccaddbe1acca80808080808080808080808080"; - proof[2] = hex"f862808080808080a057895fdbd71e2c67c2f9274a56811ff5cf458720a7fa713a135e3890f8cafcf8808080808080808080b130313233343536373839303132333435363738393031323334353637383930313233343536373839566572795f4c6f6e67"; - - assertEq( - val, - MerkleTrie.get( - key, - proof, - root - ) - ); + proof[ + 0 + ] = hex"e68416b65793a0f3f387240403976788281c0a6ee5b3fc08360d276039d635bb824ea7e6fed779"; + proof[ + 1 + ] = hex"f87180a034d14ccc7685aa2beb64f78b11ee2a335eae82047ef97c79b7dda7f0732b9f4ca05fb052b64e23d177131d9f32e9c5b942209eb7229e9a07c99a5d93245f53af18a09a137197a43a880648d5887cce656a5e6bbbe5e44ecb4f264395ccaddbe1acca80808080808080808080808080"; + proof[ + 2 + ] = hex"f862808080808080a057895fdbd71e2c67c2f9274a56811ff5cf458720a7fa713a135e3890f8cafcf8808080808080808080b130313233343536373839303132333435363738393031323334353637383930313233343536373839566572795f4c6f6e67"; + + assertEq(val, MerkleTrie.get(key, proof, root)); } function test_get_validProofSucceeds6() external { @@ -101,18 +91,15 @@ contract MerkleTrie_Test is CommonTest { bytes memory key = hex"6b657932"; bytes memory val = hex"73686f7274"; bytes[] memory proof = new bytes[](3); - proof[0] = hex"e68416b65793a0f3f387240403976788281c0a6ee5b3fc08360d276039d635bb824ea7e6fed779"; - proof[1] = hex"f87180a034d14ccc7685aa2beb64f78b11ee2a335eae82047ef97c79b7dda7f0732b9f4ca05fb052b64e23d177131d9f32e9c5b942209eb7229e9a07c99a5d93245f53af18a09a137197a43a880648d5887cce656a5e6bbbe5e44ecb4f264395ccaddbe1acca80808080808080808080808080"; + proof[ + 0 + ] = hex"e68416b65793a0f3f387240403976788281c0a6ee5b3fc08360d276039d635bb824ea7e6fed779"; + proof[ + 1 + ] = hex"f87180a034d14ccc7685aa2beb64f78b11ee2a335eae82047ef97c79b7dda7f0732b9f4ca05fb052b64e23d177131d9f32e9c5b942209eb7229e9a07c99a5d93245f53af18a09a137197a43a880648d5887cce656a5e6bbbe5e44ecb4f264395ccaddbe1acca80808080808080808080808080"; proof[2] = hex"df808080808080c9823262856176616c338080808080808080808573686f7274"; - assertEq( - val, - MerkleTrie.get( - key, - proof, - root - ) - ); + assertEq(val, MerkleTrie.get(key, proof, root)); } function test_get_validProofSucceeds7() external { @@ -120,18 +107,17 @@ contract MerkleTrie_Test is CommonTest { bytes memory key = hex"6b657933"; bytes memory val = hex"31323334353637383930313233343536373839303132333435363738393031"; bytes[] memory proof = new bytes[](3); - proof[0] = hex"e68416b65793a0f3f387240403976788281c0a6ee5b3fc08360d276039d635bb824ea7e6fed779"; - proof[1] = hex"f87180a034d14ccc7685aa2beb64f78b11ee2a335eae82047ef97c79b7dda7f0732b9f4ca05fb052b64e23d177131d9f32e9c5b942209eb7229e9a07c99a5d93245f53af18a09a137197a43a880648d5887cce656a5e6bbbe5e44ecb4f264395ccaddbe1acca80808080808080808080808080"; - proof[2] = hex"f839808080808080c9823363856176616c338080808080808080809f31323334353637383930313233343536373839303132333435363738393031"; - - assertEq( - val, - MerkleTrie.get( - key, - proof, - root - ) - ); + proof[ + 0 + ] = hex"e68416b65793a0f3f387240403976788281c0a6ee5b3fc08360d276039d635bb824ea7e6fed779"; + proof[ + 1 + ] = hex"f87180a034d14ccc7685aa2beb64f78b11ee2a335eae82047ef97c79b7dda7f0732b9f4ca05fb052b64e23d177131d9f32e9c5b942209eb7229e9a07c99a5d93245f53af18a09a137197a43a880648d5887cce656a5e6bbbe5e44ecb4f264395ccaddbe1acca80808080808080808080808080"; + proof[ + 2 + ] = hex"f839808080808080c9823363856176616c338080808080808080809f31323334353637383930313233343536373839303132333435363738393031"; + + assertEq(val, MerkleTrie.get(key, proof, root)); } function test_get_validProofSucceeds8() external { @@ -143,14 +129,7 @@ contract MerkleTrie_Test is CommonTest { proof[1] = hex"d780c22061c22062c2206380808080808080808080808080"; proof[2] = hex"c22061"; - assertEq( - val, - MerkleTrie.get( - key, - proof, - root - ) - ); + assertEq(val, MerkleTrie.get(key, proof, root)); } function test_get_validProofSucceeds9() external { @@ -162,14 +141,7 @@ contract MerkleTrie_Test is CommonTest { proof[1] = hex"d780c22061c22062c2206380808080808080808080808080"; proof[2] = hex"c22062"; - assertEq( - val, - MerkleTrie.get( - key, - proof, - root - ) - ); + assertEq(val, MerkleTrie.get(key, proof, root)); } function test_get_validProofSucceeds10() external { @@ -181,44 +153,35 @@ contract MerkleTrie_Test is CommonTest { proof[1] = hex"d780c22061c22062c2206380808080808080808080808080"; proof[2] = hex"c22063"; - assertEq( - val, - MerkleTrie.get( - key, - proof, - root - ) - ); + assertEq(val, MerkleTrie.get(key, proof, root)); } function test_get_reverts_nonexistentKey1() external { bytes32 root = 0xd582f99275e227a1cf4284899e5ff06ee56da8859be71b553397c69151bc942f; bytes memory key = hex"6b657932"; bytes[] memory proof = new bytes[](3); - proof[0] = hex"e68416b65793a03101b4447781f1e6c51ce76c709274fc80bd064f3a58ff981b6015348a826386"; - proof[1] = hex"f84580a0582eed8dd051b823d13f8648cdcd08aa2d8dac239f458863c4620e8c4d605debca83206262856176616c32ca83206363856176616c3380808080808080808080808080"; + proof[ + 0 + ] = hex"e68416b65793a03101b4447781f1e6c51ce76c709274fc80bd064f3a58ff981b6015348a826386"; + proof[ + 1 + ] = hex"f84580a0582eed8dd051b823d13f8648cdcd08aa2d8dac239f458863c4620e8c4d605debca83206262856176616c32ca83206363856176616c3380808080808080808080808080"; proof[2] = hex"ca83206262856176616c32"; vm.expectRevert("MerkleTrie: path remainder must share all nibbles with key"); - MerkleTrie.get( - key, - proof, - root - ); + MerkleTrie.get(key, proof, root); } function test_get_reverts_nonexistentKey2() external { bytes32 root = 0xd582f99275e227a1cf4284899e5ff06ee56da8859be71b553397c69151bc942f; bytes memory key = hex"616e7972616e646f6d6b6579"; bytes[] memory proof = new bytes[](1); - proof[0] = hex"e68416b65793a03101b4447781f1e6c51ce76c709274fc80bd064f3a58ff981b6015348a826386"; + proof[ + 0 + ] = hex"e68416b65793a03101b4447781f1e6c51ce76c709274fc80bd064f3a58ff981b6015348a826386"; vm.expectRevert("MerkleTrie: path remainder must share all nibbles with key"); - MerkleTrie.get( - key, - proof, - root - ); + MerkleTrie.get(key, proof, root); } function test_get_reverts_wrongKeyProof() external { @@ -226,15 +189,13 @@ contract MerkleTrie_Test is CommonTest { bytes memory key = hex"6b6579316161"; bytes[] memory proof = new bytes[](3); proof[0] = hex"e216a04892c039d654f1be9af20e88ae53e9ab5fa5520190e0fb2f805823e45ebad22f"; - proof[1] = hex"f84780d687206e6f746865728d33343938683472697568677765808080808080808080a0854405b57aa6dc458bc41899a761cbbb1f66a4998af6dd0e8601c1b845395ae38080808080"; + proof[ + 1 + ] = hex"f84780d687206e6f746865728d33343938683472697568677765808080808080808080a0854405b57aa6dc458bc41899a761cbbb1f66a4998af6dd0e8601c1b845395ae38080808080"; proof[2] = hex"d687206e6f746865728d33343938683472697568677765"; vm.expectRevert("MerkleTrie: invalid internal node hash"); - MerkleTrie.get( - key, - proof, - root - ); + MerkleTrie.get(key, proof, root); } function test_get_reverts_corruptedProof() external { @@ -242,17 +203,19 @@ contract MerkleTrie_Test is CommonTest { bytes memory key = hex"6b6579326262"; bytes[] memory proof = new bytes[](5); proof[0] = hex"2fd2ba5ee42358802ffbe0900152a55fabe953ae880ef29abef154d639c09248a016e2"; - proof[1] = hex"f84780d687206e6f746865728d33343938683472697568677765808080808080808080a0854405b57aa6dc458bc41899a761cbbb1f66a4998af6dd0e8601c1b845395ae38080808080"; - proof[2] = hex"e583165793a03101b4447781f1e6c51ce76c709274fc80bd064f3a58ff981b6015348a826386"; - proof[3] = hex"f84580a0582eed8dd051b823d13f8648cdcd08aa2d8dac239f458863c4620e8c4d605debca83206262856176616c32ca83206363856176616c3380808080808080808080808080"; + proof[ + 1 + ] = hex"f84780d687206e6f746865728d33343938683472697568677765808080808080808080a0854405b57aa6dc458bc41899a761cbbb1f66a4998af6dd0e8601c1b845395ae38080808080"; + proof[ + 2 + ] = hex"e583165793a03101b4447781f1e6c51ce76c709274fc80bd064f3a58ff981b6015348a826386"; + proof[ + 3 + ] = hex"f84580a0582eed8dd051b823d13f8648cdcd08aa2d8dac239f458863c4620e8c4d605debca83206262856176616c32ca83206363856176616c3380808080808080808080808080"; proof[4] = hex"ca83206262856176616c32"; vm.expectRevert("RLPReader: decoded item type for list is not a list item"); - MerkleTrie.get( - key, - proof, - root - ); + MerkleTrie.get(key, proof, root); } function test_get_reverts_invalidDataRemainder() external { @@ -264,11 +227,7 @@ contract MerkleTrie_Test is CommonTest { proof[2] = hex"c32081aa000000000000000000000000000000"; vm.expectRevert("RLPReader: list item has an invalid data remainder"); - MerkleTrie.get( - key, - proof, - root - ); + MerkleTrie.get(key, proof, root); } function test_get_reverts_invalidInternalNodeHash() external { @@ -276,15 +235,13 @@ contract MerkleTrie_Test is CommonTest { bytes memory key = hex"aa"; bytes[] memory proof = new bytes[](3); proof[0] = hex"e21aa09862c6b113008c4204c13755693cbb868acc25ebaa98db11df8c89a0c0dd3157"; - proof[1] = hex"f380808080808080808080a0de2a9c6a46b6ea71ab9e881c8420570cf19e833c85df6026b04f085016e78f00c220118080808080"; + proof[ + 1 + ] = hex"f380808080808080808080a0de2a9c6a46b6ea71ab9e881c8420570cf19e833c85df6026b04f085016e78f00c220118080808080"; proof[2] = hex"de2a9c6a46b6ea71ab9e881c8420570cf19e833c85df6026b04f085016e78f"; vm.expectRevert("MerkleTrie: invalid internal node hash"); - MerkleTrie.get( - key, - proof, - root - ); + MerkleTrie.get(key, proof, root); } function test_get_reverts_zeroBranchValueLength() external { @@ -295,11 +252,7 @@ contract MerkleTrie_Test is CommonTest { proof[1] = hex"d98080808080808080808080c43b82aabbc43c82aacc80808080"; vm.expectRevert("MerkleTrie: value length must be greater than zero (branch)"); - MerkleTrie.get( - key, - proof, - root - ); + MerkleTrie.get(key, proof, root); } function test_get_reverts_zeroLengthKey() external { @@ -308,12 +261,8 @@ contract MerkleTrie_Test is CommonTest { bytes[] memory proof = new bytes[](1); proof[0] = hex"c78320f00082b443"; - vm.expectRevert("MerkleTrie: path remainder must share all nibbles with key"); - MerkleTrie.get( - key, - proof, - root - ); + vm.expectRevert("MerkleTrie: empty key"); + MerkleTrie.get(key, proof, root); } function test_get_reverts_smallerPathThanKey1() external { @@ -325,11 +274,7 @@ contract MerkleTrie_Test is CommonTest { proof[2] = hex"c582202381aa"; vm.expectRevert("MerkleTrie: path remainder must share all nibbles with key"); - MerkleTrie.get( - key, - proof, - root - ); + MerkleTrie.get(key, proof, root); } function test_get_reverts_smallerPathThanKey2() external { @@ -337,15 +282,13 @@ contract MerkleTrie_Test is CommonTest { bytes memory key = hex"aa"; bytes[] memory proof = new bytes[](3); proof[0] = hex"e21aa07ea462226a3dc0a46afb4ded39306d7a84d311ada3557dfc75a909fd25530905"; - proof[1] = hex"f380808080808080808080a027f11bd3af96d137b9287632f44dd00fea1ca1bd70386c30985ede8cc287476e808080c220338080"; + proof[ + 1 + ] = hex"f380808080808080808080a027f11bd3af96d137b9287632f44dd00fea1ca1bd70386c30985ede8cc287476e808080c220338080"; proof[2] = hex"e48200bba0a6911545ed01c2d3f4e15b8b27c7bfba97738bd5e6dd674dd07033428a4c53af"; vm.expectRevert("MerkleTrie: path remainder must share all nibbles with key"); - MerkleTrie.get( - key, - proof, - root - ); + MerkleTrie.get(key, proof, root); } function test_get_reverts_extraProofElements() external { @@ -358,10 +301,121 @@ contract MerkleTrie_Test is CommonTest { proof[3] = hex"c32081aa"; vm.expectRevert("MerkleTrie: value node must be last node in proof (leaf)"); - MerkleTrie.get( - key, - proof, - root + MerkleTrie.get(key, proof, root); + } + + /// @notice The `bytes4` parameter is to enable parallel fuzz runs; it is ignored. + function testFuzz_get_validProofs_success(bytes4) external { + // Generate a test case with a valid proof of inclusion for the k/v pair in the trie. + (bytes32 root, bytes memory key, bytes memory val, bytes[] memory proof) = ffi + .getMerkleTrieFuzzCase("valid"); + + // Assert that our expected value is equal to our actual value. + assertEq(val, MerkleTrie.get(key, proof, root)); + } + + /// @notice The `bytes4` parameter is to enable parallel fuzz runs; it is ignored. + function testFuzz_get_invalidRoot_reverts(bytes4) external { + // Get a random test case with a valid trie / proof + (bytes32 root, bytes memory key, , bytes[] memory proof) = ffi.getMerkleTrieFuzzCase( + "valid" + ); + + bytes32 rootHash = keccak256(abi.encodePacked(root)); + vm.expectRevert("MerkleTrie: invalid root hash"); + MerkleTrie.get(key, proof, rootHash); + } + + /// @notice The `bytes4` parameter is to enable parallel fuzz runs; it is ignored. + function testFuzz_get_extraProofElements_reverts(bytes4) external { + // Generate an invalid test case with an extra proof element attached to an otherwise + // valid proof of inclusion for the passed k/v. + (bytes32 root, bytes memory key, , bytes[] memory proof) = ffi.getMerkleTrieFuzzCase( + "extra_proof_elems" + ); + + vm.expectRevert("MerkleTrie: value node must be last node in proof (leaf)"); + MerkleTrie.get(key, proof, root); + } + + /// @notice The `bytes4` parameter is to enable parallel fuzz runs; it is ignored. + function testFuzz_get_invalidLargeInternalHash_reverts(bytes4) external { + // Generate an invalid test case where a long proof element is incorrect for the root. + (bytes32 root, bytes memory key, , bytes[] memory proof) = ffi.getMerkleTrieFuzzCase( + "invalid_large_internal_hash" + ); + + vm.expectRevert("MerkleTrie: invalid large internal hash"); + MerkleTrie.get(key, proof, root); + } + + /// @notice The `bytes4` parameter is to enable parallel fuzz runs; it is ignored. + function testFuzz_get_invalidInternalNodeHash_reverts(bytes4) external { + // Generate an invalid test case where a small proof element is incorrect for the root. + (bytes32 root, bytes memory key, , bytes[] memory proof) = ffi.getMerkleTrieFuzzCase( + "invalid_internal_node_hash" ); + + vm.expectRevert("MerkleTrie: invalid internal node hash"); + MerkleTrie.get(key, proof, root); + } + + /// @notice The `bytes4` parameter is to enable parallel fuzz runs; it is ignored. + function testFuzz_get_corruptedProof_reverts(bytes4) external { + // Generate an invalid test case where the proof is malformed. + (bytes32 root, bytes memory key, , bytes[] memory proof) = ffi.getMerkleTrieFuzzCase( + "corrupted_proof" + ); + + vm.expectRevert("RLPReader: decoded item type for list is not a list item"); + MerkleTrie.get(key, proof, root); + } + + /// @notice The `bytes4` parameter is to enable parallel fuzz runs; it is ignored. + function testFuzz_get_invalidDataRemainder_reverts(bytes4) external { + // Generate an invalid test case where a random element of the proof has more bytes than the + // length designates within the RLP list encoding. + (bytes32 root, bytes memory key, , bytes[] memory proof) = ffi.getMerkleTrieFuzzCase( + "invalid_data_remainder" + ); + + vm.expectRevert("RLPReader: list item has an invalid data remainder"); + MerkleTrie.get(key, proof, root); + } + + /// @notice The `bytes4` parameter is to enable parallel fuzz runs; it is ignored. + function testFuzz_get_prefixedValidKey_reverts(bytes4) external { + // Get a random test case with a valid trie / proof and a valid key that is prefixed + // with random bytes + (bytes32 root, bytes memory key, , bytes[] memory proof) = ffi.getMerkleTrieFuzzCase( + "prefixed_valid_key" + ); + + // Ambiguous revert check- all that we care is that it *does* fail. This case may + // fail within different branches. + vm.expectRevert(); + MerkleTrie.get(key, proof, root); + } + + /// @notice The `bytes4` parameter is to enable parallel fuzz runs; it is ignored. + function testFuzz_get_emptyKey_reverts(bytes4) external { + // Get a random test case with a valid trie / proof and an empty key + (bytes32 root, bytes memory key, , bytes[] memory proof) = ffi.getMerkleTrieFuzzCase( + "empty_key" + ); + + vm.expectRevert("MerkleTrie: empty key"); + MerkleTrie.get(key, proof, root); + } + + /// @notice The `bytes4` parameter is to enable parallel fuzz runs; it is ignored. + function testFuzz_get_partialProof_reverts(bytes4) external { + // Get a random test case with a valid trie / partially correct proof + (bytes32 root, bytes memory key, , bytes[] memory proof) = ffi.getMerkleTrieFuzzCase( + "partial_proof" + ); + + vm.expectRevert("MerkleTrie: ran out of proof elements"); + MerkleTrie.get(key, proof, root); } } diff --git a/packages/contracts-bedrock/package.json b/packages/contracts-bedrock/package.json index 2e1a52c28efc6..8b538234447d8 100644 --- a/packages/contracts-bedrock/package.json +++ b/packages/contracts-bedrock/package.json @@ -17,19 +17,20 @@ "build:forge": "forge build", "build:with-metadata": "hardhat clean && FOUNDRY_PROFILE=echidna hardhat compile", "build:differential": "tsc scripts/differential-testing.ts --outDir dist --moduleResolution node --esModuleInterop", + "build:fuzz": "go build -o go-fuzz go-fuzz/cmd/fuzz.go", "prebuild": "yarn ts-node scripts/verify-foundry-install.ts", "build": "hardhat compile && yarn autogen:artifacts && yarn build:ts && yarn typechain", "build:ts": "tsc -p tsconfig.json", "autogen:artifacts": "ts-node scripts/generate-artifacts.ts", "deploy": "hardhat deploy", - "test": "yarn build:differential && forge test", - "coverage": "yarn build:differential && forge coverage", - "coverage:lcov": "yarn build:differential && forge coverage --report lcov", - "gas-snapshot": "yarn build:differential && forge snapshot --no-match-test 'testDiff|testFuzz'", + "test": "yarn build:differential && yarn build:fuzz && forge test", + "coverage": "yarn build:differential && yarn build:fuzz && forge coverage", + "coverage:lcov": "yarn build:differential && yarn build:fuzz && forge coverage --report lcov", + "gas-snapshot": "yarn build:differential && yarn build:fuzz && forge snapshot --no-match-test 'differential|fuzz'", "storage-snapshot": "./scripts/storage-snapshot.sh", "validate-spacers": "hardhat validate-spacers", "slither": "./scripts/slither.sh", - "clean": "rm -rf ./dist ./artifacts ./forge-artifacts ./cache ./tsconfig.tsbuildinfo ./src/contract-artifacts.ts", + "clean": "rm -rf ./dist ./artifacts ./forge-artifacts ./cache ./tsconfig.tsbuildinfo ./src/contract-artifacts.ts ./go-fuzz/fuzz", "lint:ts:check": "eslint . --max-warnings=0", "lint:contracts:check": "yarn solhint -f table 'contracts/**/*.sol'", "lint:check": "yarn lint:contracts:check && yarn lint:ts:check",