package ethbridgecontracts

import (
	"math/big"
	"strings"

	ethereum "github.com/ethereum/go-ethereum"
	"github.com/ethereum/go-ethereum/accounts/abi"
	"github.com/ethereum/go-ethereum/accounts/abi/bind"
	"github.com/ethereum/go-ethereum/common"
	"github.com/ethereum/go-ethereum/core/types"
	"github.com/ethereum/go-ethereum/event"
)

var (
	_ = big.NewInt
	_ = strings.NewReader
	_ = ethereum.NotFound
	_ = bind.Bind
	_ = common.Big1
	_ = types.BloomLookup
	_ = event.NewSubscription
)

const OneStepProofABI = "[{\"constant\":true,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"inboxAcc\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"messagesAcc\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"logsAcc\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"}],\"name\":\"executeStep\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"gas\",\"type\":\"uint64\"},{\"internalType\":\"bytes32[5]\",\"name\":\"fields\",\"type\":\"bytes32[5]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"inboxAcc\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"messagesAcc\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"logsAcc\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"_kind\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_inboxSeqNum\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_msgData\",\"type\":\"bytes\"}],\"name\":\"executeStepWithMessage\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"gas\",\"type\":\"uint64\"},{\"internalType\":\"bytes32[5]\",\"name\":\"fields\",\"type\":\"bytes32[5]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]"

var OneStepProofFuncSigs = map[string]string{
	"385bc114": "executeStep(bytes32,bytes32,bytes32,bytes)",
	"96105dce": "executeStepWithMessage(bytes32,bytes32,bytes32,bytes,uint8,uint256,uint256,address,uint256,bytes)",
}

var OneStepProofBin = "0x608060405234801561001057600080fd5b506159ac80620000216000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063385bc1141461003b57806396105dce14610106575b600080fd5b6100be6004803603608081101561005157600080fd5b8135916020810135916040820135919081019060808101606082013564010000000081111561007f57600080fd5b82018360208201111561009157600080fd5b803590602001918460018302840111640100000000831117156100b357600080fd5b509092509050610206565b6040516001600160401b0383168152602081018260a080838360005b838110156100f25781810151838201526020016100da565b505050509050019250505060405180910390f35b6100be600480360361014081101561011d57600080fd5b8135916020810135916040820135919081019060808101606082013564010000000081111561014b57600080fd5b82018360208201111561015d57600080fd5b8035906020019184600183028401116401000000008311171561017f57600080fd5b9193909260ff833516926020810135926040820135926001600160a01b0360608401351692608081013592919060c081019060a001356401000000008111156101c757600080fd5b8201836020820111156101d957600080fd5b803590602001918460018302840111640100000000831117156101fb57600080fd5b50909250905061027d565b60006102106156b4565b6102186156d2565b61025a88888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061037792505050565b905061026581610807565b61026e81610b6f565b92509250509550959350505050565b60006102876156b4565b61028f6156d2565b6102d18f8f8f8f8f8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061037792505050565b90506102fd8a888b8b8a8a8a6040518083838082843760405192018290039091209350610bd292505050565b8160e001818152505061034a8a8a8a8a8a8a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610c4092505050565b60c082015261035881610807565b61036181610b6f565b92509250509c509c9a5050505050505050505050565b61037f6156d2565b60008260008151811061038e57fe5b602001015160f81c60f81b60f81c90506000836001815181106103ad57fe5b602001015160f81c60f81b60f81c905060006002905060608360040160ff1660405190808252806020026020018201604052801561040557816020015b6103f261575e565b8152602001906001900390816103ea5790505b50905060608360040160ff1660405190808252806020026020018201604052801561044a57816020015b61043761575e565b81526020019060019003908161042f5790505b50905060005b8560ff16811015610488576104658885610d68565b845185908490811061047357fe5b60209081029190910101529350600101610450565b5060005b8460ff168110156104c4576104a18885610d68565b83518490849081106104af57fe5b6020908102919091010152935060010161048c565b506104cd615792565b6104d78885610efa565b809250819550505060008885815181106104ed57fe5b602001015160f81c60f81b60f81c9050600089866001018151811061050e57fe5b01602001516002969096019560f81c90506105276156d2565b604051806101c0016040528085815260200161054286610fab565b81526020018f81526020018e81526020018d815260200160006001600160401b03168152602001610571611020565b81526020016000801b815260200160405180604001604052808c60ff16815260200189815250815260200160405180604001604052808b60ff1681526020018881525081526020018460ff16600114151581526020018360ff1681526020018c81526020018881525090508260ff16600014806105f157508260ff166001145b6040518060400160405280600b81526020016a04241445f494d4d5f5459560ac1b8152509061069e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561066357818101518382015260200161064b565b50505050905090810190601f1680156106905780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506106a761575e565b60ff84166106c4578151516106bd908490611067565b9050610764565b6000875111604051806040016040528060068152602001654e4f5f494d4d60d01b815250906107345760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561066357818101518382015260200161064b565b50610761838360000151600001518960018e0360ff168151811061075457fe5b60200260200101516110cb565b90505b61076d8161114f565b82515260005b848b0360ff168110156107b2576107aa88828151811061078f57fe5b6020026020010151846000015161126f90919063ffffffff16565b600101610773565b5060005b8960ff168110156107f3576107eb8782815181106107d057fe5b6020026020010151846000015161128990919063ffffffff16565b6001016107b6565b50909e9d5050505050505050505050505050565b600080600061277061082085610160015160ff166112a3565b935093509350935061083285836119f4565b156108405750505050610b6c565b610100850151518411156108f55761085e610859611020565b61114f565b61086f86602001516020015161114f565b146040518060400160405280600d81526020016c535441434b5f4d495353494e4760981b815250906108e25760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561066357818101518382015260200161064b565b506108ec85611a5e565b50505050610b6c565b610120850151518311156109905761090e610859611020565b61091f86602001516040015161114f565b146040518060400160405280600b81526020016a4155585f4d495353494e4760a81b815250906108e25760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561066357818101518382015260200161064b565b60008411806109a25750846101400151155b80156109b357506101008501515184145b806109db575084610140015180156109c9575083155b80156109db5750610100850151516001145b6040518060400160405280600a815260200169535441434b5f4d414e5960b01b81525090610a4a5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561066357818101518382015260200161064b565b50610120850151516040805180820190915260088152674155585f4d414e5960c01b6020820152908414610abf5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561066357818101518382015260200161064b565b50610acd858263ffffffff16565b60005b61010086015151811015610b1957610b11866101000151602001518281518110610af657fe5b6020026020010151876020015161126f90919063ffffffff16565b600101610ad0565b5060005b61012086015151811015610b6657610b5e866101200151602001518281518110610b4357fe5b6020026020010151876020015161128990919063ffffffff16565b600101610b1d565b50505050505b50565b6000610b796156b4565b8260a001516040518060a00160405280610b968660000151611ac7565b8152602001610ba88660200151611ac7565b81526020018560400151815260200185606001518152602001856080015181525091509150915091565b6040805160f89790971b6001600160f81b03191660208089019190915260609690961b6bffffffffffffffffffffffff191660218801526035870194909452605586019290925260758501526095808501919091528151808503909101815260b59093019052815191012090565b610c4861575e565b60408051600680825260e08201909252606091816020015b610c6861575e565b815260200190600190039081610c60579050509050610c898860ff16611ba1565b81600081518110610c9657fe5b6020026020010181905250610caa87611ba1565b81600181518110610cb757fe5b6020026020010181905250610ccb86611ba1565b81600281518110610cd857fe5b6020026020010181905250610cf5856001600160a01b0316611ba1565b81600381518110610d0257fe5b6020026020010181905250610d1684611ba1565b81600481518110610d2357fe5b6020026020010181905250610d3b8360008551611c53565b81600581518110610d4857fe5b6020026020010181905250610d5c81611dd7565b98975050505050505050565b6000610d7261575e565b83518310610db8576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a59081bd9999cd95d60921b604482015290519081900360640190fd5b600080610dc58686611ee9565b91509150610dd1611f10565b60ff168160ff161415610e05576000610dea8784611f15565b909350905082610df982611ba1565b94509450505050610ef3565b610e0d611f89565b60ff168160ff161415610e2f57610e248683611f8e565b935093505050610ef3565b610e37612030565b60ff168160ff161415610e4e57610e248683612035565b610e566120c9565b60ff168160ff1610158015610e775750610e6e6120ce565b60ff168160ff16105b15610eb3576000610e866120c9565b820390506060610e978289866120d3565b909450905083610ea682611dd7565b9550955050505050610ef3565b6040805162461bcd60e51b815260206004820152601060248201526f696e76616c69642074797065636f646560801b604482015290519081900360640190fd5b9250929050565b6000610f04615792565b610f0c615792565b6000610100820181905280610f218787611f15565b9096509150610f308787612035565b60208501529550610f418787612035565b60408501529550610f528787610d68565b60608501529550610f638787610d68565b60808501529550610f748787611f15565b60a08501529550610f858787611f15565b9096509050610f948787610d68565b60e085015291835260c08301529590945092505050565b610fb3615792565b60405180610120016040528083600001518152602001836020015181526020018360400151815260200183606001518152602001836080015181526020018360a0015181526020018360c0015181526020018360e00151815260200183610100015181525090505b919050565b61102861575e565b604080516000808252602082019092526110629161105c565b61104961575e565b8152602001906001900390816110415790505b50611dd7565b905090565b61106f61575e565b6040805160608101825260ff8516815260208082018590528251600080825291810184526110c2938301916110ba565b6110a761575e565b81526020019060019003908161109f5790505b50905261216c565b90505b92915050565b6110d361575e565b604080516001808252818301909252606091816020015b6110f261575e565b8152602001906001900390816110ea579050509050828160008151811061111557fe5b602002602001018190525061114660405180606001604052808760ff1681526020018681526020018381525061216c565b95945050505050565b6000611159611f10565b60ff16826060015160ff16141561117c578151611175906121d3565b905061101b565b611184611f89565b60ff16826060015160ff1614156111a25761117582602001516121f7565b6111aa612030565b60ff16826060015160ff1614156111cc578151608083015161117591906122f4565b6111d46120c9565b60ff16826060015160ff16141561120d576111ed61575e565b6111fa8360400151612345565b90506112058161114f565b91505061101b565b6112156124a7565b60ff16826060015160ff16141561122e5750805161101b565b6040805162461bcd60e51b8152602060048201526011602482015270496e76616c6964207479706520636f646560781b604482015290519081900360640190fd5b61127d8260200151826124ac565b82602001819052505050565b6112978260400151826124ac565b82604001819052505050565b6000808061277060018514806112b95750600285145b806112c45750600385145b156112de575060029250600091506003905061252a6119ed565b60048514806112ed5750600685145b1561130757506002925060009150600490506127896119ed565b60058514806113165750600785145b1561133057506002925060009150600790506127896119ed565b600885148061133f5750600985145b15611359575060039250600091506004905061285b6119ed565b600a851415611377575060029250600091506019905061252a6119ed565b600b851415611395575060029250600091506007905061252a6119ed565b60108514806113a45750601185145b806113af5750601285145b806113ba5750601385145b806113c55750601685145b806113d05750601785145b806113db5750601885145b156113f45750600292506000915082905061252a6119ed565b6014851415611411575060029250600091508290506129486119ed565b601585141561142e575060019250600091508290506129a16119ed565b601985141561144b575060019250600091508290506129fd6119ed565b601a85148061145a5750601b85145b806114655750601c85145b806114705750601d85145b1561148a575060029250600091506004905061252a6119ed565b60208514156114a85750600192506000915060079050612a496119ed565b60218514156114c65750600192506000915060039050612a766119ed565b60228514156114e4575060029250600091506008905061252a6119ed565b6023851415611503575060019250600091506102589050612aa06119ed565b60248514156115215750600392506000915060fa9050612c7e6119ed565b603085141561153e57506001925060009150829050612d3c6119ed565b603185141561155b57506000925082915060019050612d4a6119ed565b603285141561157857506000925082915060019050612d616119ed565b60338514156115965750600192506000915060029050612d786119ed565b60348514156115b45750600192506000915060049050612d926119ed565b60358514156115d25750600292506000915060049050612dd36119ed565b60368514156115ef57506000925082915060029050612e476119ed565b603785141561160c57506000925082915060019050612e8b6119ed565b603885141561162957506001925060009150829050612ea46119ed565b603985141561164657506000925060019150819050612ebb6119ed565b603a85141561166357506000925082915060029050612ed26119ed565b603b85141561168057506000925082915060019050610b6c6119ed565b603c85141561169d57506000925082915060019050612f006119ed565b603d8514156116ba57506001925060009150829050612f1c6119ed565b60408514156116d757506001925060009150829050612f606119ed565b60418514156116f55750600292506000915060019050612f966119ed565b60428514156117135750600392506000915060019050612ff36119ed565b604385141561173157506002925060009150600190506130776119ed565b604485141561174f57506003925060009150600190506130b66119ed565b605085141561176c5750600292506000915082905061311c6119ed565b605185141561178a57506003925060009150602890506131b96119ed565b60528514156117a857506001925060009150600290506132766119ed565b60538514156117c5575060019250829150600390506132c16119ed565b60548514156117e357506002925060019150602990506133436119ed565b606085141561180057506000925082915060649050610b6c6119ed565b606185141561181e57506001925060009150606490506134006119ed565b607085141561183c57506001925060009150606490506134476119ed565b607185141561185a57506001925060009150602890506134cf6119ed565b60728514156118775750600092508291506028905061354c6119ed565b6073851415611894575060009250829150600590506135ac6119ed565b60748514156118b1575060009250829150600a90506135b56119ed565b60758514156118ce575060019250600091508190506135c26119ed565b60768514156118eb575060009250829150600190506135fd6119ed565b6077851415611908575060009250829150601990506136176119ed565b607885141561192657506002925060009150601990506136686119ed565b607985141561194457506003925060009150601990506136e06119ed565b607b851415611961575060009250829150600a90506137716119ed565b608085141561198057506004925060009150614e2090506137b96119ed565b608185141561199f57506004925060009150610dac90506139326119ed565b60828514156119bf57506003925060009150620140509050613a6f6119ed565b60838514156119de575060019250600091506103e89050613b6a6119ed565b50600092508291508190506135ac5b9193509193565b60a080830180516001600160401b03908401811690915260208401519091015160009183161115611a3e57602083015160001960a090910152611a3683611a5e565b5060016110c5565b50602082015160a00180516001600160401b0383169003905260006110c5565b60408051600160f81b6020808301919091526000602183018190526022808401919091528351808403909101815260429092019092528051908201209082015160c001511415611aba57611ab58160200151613e6b565b610b6c565b6020015160c08101519052565b600060028261010001511415611adf5750600061101b565b60018261010001511415611af55750600161101b565b81516020830151611b059061114f565b611b12846040015161114f565b611b1f856060015161114f565b611b2c866080015161114f565b8660a001518760c00151611b438960e0015161114f565b604051602001808981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405160208183030381529060405280519060200120905061101b565b611ba961575e565b6040805160a0810182528381528151606081018352600080825260208281018290528451828152808201865293949085019390830191611bff565b611bec61575e565b815260200190600190039081611be45790505b50905281526040805160008082526020828101909352919092019190611c3b565b611c2861575e565b815260200190600190039081611c205790505b50815260006020820152600160409091015292915050565b611c5b61575e565b60208204611c6761575e565b611c6f611020565b60408051600280825260608281019093529293509091816020015b611c9261575e565b815260200190600190039081611c8a57905050905060005b83811015611d1357611ccf611cca89602084028a0163ffffffff613e7616565b611ba1565b82600081518110611cdc57fe5b60200260200101819052508282600181518110611cf557fe5b6020026020010181905250611d0982612345565b9250600101611caa565b506020850615611d89576000611d3588601f198989010163ffffffff613e7616565b9050602086066020036008021b611d4b81611ba1565b82600081518110611d5857fe5b60200260200101819052508282600181518110611d7157fe5b6020026020010181905250611d8582612345565b9250505b611d9285611ba1565b81600081518110611d9f57fe5b60200260200101819052508181600181518110611db857fe5b6020026020010181905250611dcc81612345565b979650505050505050565b611ddf61575e565b611de98251613ecf565b611e3a576040805162461bcd60e51b815260206004820152601a60248201527f5475706c65206d75737420686176652076616c69642073697a65000000000000604482015290519081900360640190fd5b600160005b8351811015611e7157838181518110611e5457fe5b602002602001015160800151820191508080600101915050611e3f565b506040805160a0810182526000808252825160608101845281815260208181018390528451838152808201865293949085019391929083019190611ecb565b611eb861575e565b815260200190600190039081611eb05790505b50905281526020810194909452600360408501526060909301525090565b60008082600101848481518110611efc57fe5b016020015190925060f81c90509250929050565b600090565b60008082845110158015611f2d575060208385510310155b611f6a576040805162461bcd60e51b81526020600482015260096024820152681d1bdbc81cda1bdc9d60ba1b604482015290519081900360640190fd5b60208301611f7e858563ffffffff613e7616565b915091509250929050565b600190565b6000611f9861575e565b82600080611fa461575e565b6000611fb08986611ee9565b9095509350611fbf8986611ee9565b9095509250600160ff85161415611fe057611fda8986610d68565b90955091505b611fea8986613ed6565b9095509050600160ff8516141561201557846120078483856110cb565b965096505050505050610ef3565b846120208483611067565b9650965050505050509250929050565b600290565b600061203f61575e565b82845110158015612054575060408385510310155b612090576040805162461bcd60e51b81526020600482015260086024820152671d1bc81cda1bdc9d60c21b604482015290519081900360640190fd5b60008061209d8686613ed6565b90945091506120ac8685611f15565b9094509050836120bc8383613eed565b9350935050509250929050565b600390565b600c90565b60006060600083905060608660ff1660405190808252806020026020018201604052801561211b57816020015b61210861575e565b8152602001906001900390816121005790505b50905060005b8760ff168160ff16101561215f576121398784610d68565b8351849060ff851690811061214a57fe5b60209081029190910101529250600101612121565b5090969095509350505050565b61217461575e565b6040805160a08101825260008082526020808301869052835182815290810184529192830191906121bb565b6121a861575e565b8152602001906001900390816121a05790505b50815260016020820181905260409091015292915050565b60408051602080820193909352815180820384018152908201909152805191012090565b600060028260400151511061220857fe5b60408201515161226d5761221a611f89565b8251602080850151604080516001600160f81b031960f896871b8116828601529490951b90931660218501526022808501919091528251808503909101815260429093019091528151910120905061101b565b612275611f89565b826000015161229b846040015160008151811061228e57fe5b602002602001015161114f565b8460200151604051602001808560ff1660ff1660f81b81526001018460ff1660ff1660f81b8152600101838152602001828152602001945050505050604051602081830303815290604052805190602001209050919050565b60006122fe6120c9565b8383604051602001808460ff1660ff1660f81b8152600101838152602001828152602001935050505060405160208183030381529060405280519060200120905092915050565b61234d61575e565b60088251111561239b576040805162461bcd60e51b8152602060048201526014602482015273092dcecc2d8d2c840e8eae0d8ca40d8cadccee8d60631b604482015290519081900360640190fd5b606082516040519080825280602002602001820160405280156123c8578160200160208202803883390190505b508051909150600160005b8281101561242b576123ea86828151811061228e57fe5b8482815181106123f657fe5b60200260200101818152505085818151811061240e57fe5b6020026020010151608001518201915080806001019150506123d3565b506000835184604051602001808360ff1660ff1660f81b8152600101828051906020019060200280838360005b83811015612470578181015183820152602001612458565b505050509050019250505060405160208183030381529060405280519060200120905061249d8183613eed565b9695505050505050565b606490565b6124b461575e565b6040805160028082526060828101909352816020015b6124d261575e565b8152602001906001900390816124ca57905050905082816000815181106124f557fe5b6020026020010181905250838160018151811061250e57fe5b602002602001018190525061252281612345565b949350505050565b61253261575e565b612540826101000151613f9e565b905061254a61575e565b612558836101000151613f9e565b905061256382613fe0565b1580612575575061257381613fe0565b155b1561258a5761258383613feb565b5050610b6c565b8151815161016085015160009060ff16600114156125ab5750818101612772565b61016086015160ff16600214156125c55750818102612772565b61016086015160ff16600314156125df5750808203612772565b61016086015160ff16600a14156125f9575080820a612772565b61016086015160ff16600b1415612613575080820b612772565b61016086015160ff166010141561262d5750808210612772565b61016086015160ff16601114156126475750808211612772565b61016086015160ff16601214156126615750808212612772565b61016086015160ff166013141561267b5750808213612772565b61016086015160ff16601614156126955750818116612772565b61016086015160ff16601714156126af5750818117612772565b61016086015160ff16601814156126c95750818118612772565b61016086015160ff16601a14156126e3575080821a612772565b61016086015160ff16601b14156126fd575080821b612772565b61016086015160ff16601c1415612717575080821c612772565b61016086015160ff16601d1415612731575080821d612772565b61016086015160ff1660221415612770575060408051602080820185905281830184905282518083038401815260609092019092528051910120612772565bfe5b610b6686610100015161278483611ba1565b61400a565b61279161575e565b61279f826101000151613f9e565b90506127a961575e565b6127b7836101000151613f9e565b90506127c282613fe0565b15806127d457506127d281613fe0565b155b806127de57508051155b156127ec5761258383613feb565b8151815161016085015160009060ff166004141561280d5750808204612772565b61016086015160ff16600514156128275750808205612772565b61016086015160ff16600614156128415750808206612772565b61016086015160ff16600714156127705750808207612772565b61286361575e565b612871826101000151613f9e565b905061287b61575e565b612889836101000151613f9e565b905061289361575e565b6128a1846101000151613f9e565b90506128ac83613fe0565b15806128be57506128bc82613fe0565b155b806128cf57506128cd81613fe0565b155b806128d957508051155b156128ef576128e784613feb565b505050610b6c565b82518251825161016087015160009060ff16600814156129145781838508905061292c565b61016088015160ff1660091415612770578183850990505b61293e88610100015161278483611ba1565b5050505050505050565b61295061575e565b61295e826101000151613f9e565b905061296861575e565b612976836101000151613f9e565b905061299c83610100015161278461298d8461114f565b6129968661114f565b14614034565b505050565b6129a961575e565b6129b7826101000151613f9e565b90506129c281613fe0565b6129de576129d98261010001516127846000611ba1565b6129f9565b80516101008301518115906129f69061278483611ba1565b50505b5050565b612a0561575e565b612a13826101000151613f9e565b9050612a1e81613fe0565b612a3157612a2b82613feb565b50610b6c565b80516101008301518119906129f69061278483611ba1565b612a5161575e565b612a5f826101000151613f9e565b90506129f9826101000151612784611cca8461114f565b612a7e61575e565b612a8c826101000151613f9e565b90506129f982610100015161278483614056565b612aa861575e565b612ab6826101000151613f9e565b9050612ac1816140bf565b1580612ad35750806040015151600714155b15612ae157612a2b82613feb565b604081015160005b6007811015612b2357612b0e828281518110612b0157fe5b6020026020010151613fe0565b612b1b576128e784613feb565b600101612ae9565b50612b2c6157fd565b60005b6019811015612b905760406003821602836004830481518110612b4e57fe5b602002602001015160000151901c6001600160401b03168260058381612b7057fe5b04600584066005020160198110612b8357fe5b6020020152600101612b2f565b50612b9a816140cc565b604080516007808252610100820190925291925060609190816020015b612bbf61575e565b815260200190600190039081612bb757905050905060005b6007811015612c0957612bea6000611ba1565b828281518110612bf657fe5b6020908102919091010152600101612bd7565b5060005b6019811015612c6457604060038216028360058304600584066005020160198110612c3457fe5b6020020151901b826004830481518110612c4a57fe5b602090810291909101015180519091179052600101612c0d565b50612c7785610100015161278483611dd7565b5050505050565b612c8661575e565b612c94826101000151613f9e565b9050612c9e61575e565b612cac836101000151613f9e565b9050612cb661575e565b612cc4846101000151613f9e565b9050612ccf83613fe0565b1580612ce15750612cdf82613fe0565b155b80612cf25750612cf081613fe0565b155b15612d00576128e784613feb565b8251825182516101008701516040805180820190915283815260208101839052612d33919061278490611cca9087614cbd565b50505050505050565b6129f9816101000151613f9e565b610b6c81610100015182602001516080015161400a565b610b6c81610100015182602001516060015161400a565b612d86816101000151613f9e565b60209091015160600152565b612d9a61575e565b612da8826101000151613f9e565b9050612db3816153da565b612dc057612a2b82613feb565b612dc98161114f565b6020830151525050565b612ddb61575e565b612de9826101000151613f9e565b9050612df361575e565b612e01836101000151613f9e565b9050612e0c826153da565b1580612e1e5750612e1c81613fe0565b155b15612e2c5761258383613feb565b80511561299c57612e3c8261114f565b602084015152505050565b61010081015151600090158015612e775750612e64610859611020565b612e7583602001516020015161114f565b145b90506129f982610100015161278483614034565b610100810151815151610b6c91906127849060016153e7565b610b6c816101200151612784836101000151613f9e565b610b6c816101000151612784836101200151613f9e565b61012081015151600090158015612e775750612eef610859611020565b612e7583602001516040015161114f565b610b6c816101000151612784836020015160c0015160016153e7565b612f2461575e565b612f32826101000151613f9e565b9050612f3d816153da565b612f4a57612a2b82613feb565b612f538161114f565b602083015160c001525050565b612f6861575e565b612f76826101000151613f9e565b9050612f878261010001518261400a565b6129f98261010001518261400a565b612f9e61575e565b612fac826101000151613f9e565b9050612fb661575e565b612fc4836101000151613f9e565b9050612fd58361010001518261400a565b612fe48361010001518361400a565b61299c8361010001518261400a565b612ffb61575e565b613009826101000151613f9e565b905061301361575e565b613021836101000151613f9e565b905061302b61575e565b613039846101000151613f9e565b905061304a8461010001518261400a565b6130598461010001518361400a565b6130688461010001518461400a565b6129f68461010001518261400a565b61307f61575e565b61308d826101000151613f9e565b905061309761575e565b6130a5836101000151613f9e565b9050612fe48361010001518361400a565b6130be61575e565b6130cc826101000151613f9e565b90506130d661575e565b6130e4836101000151613f9e565b90506130ee61575e565b6130fc846101000151613f9e565b905061310d8461010001518461400a565b6130688461010001518361400a565b61312461575e565b613132826101000151613f9e565b905061313c61575e565b61314a836101000151613f9e565b905061315582613fe0565b15806131675750613165816140bf565b155b80613181575061317681615498565b60ff16826000015110155b1561318f5761258383613feb565b61299c83610100015182604001518460000151815181106131ac57fe5b602002602001015161400a565b6131c161575e565b6131cf826101000151613f9e565b90506131d961575e565b6131e7836101000151613f9e565b90506131f161575e565b6131ff846101000151613f9e565b905061320a83613fe0565b158061321c575061321a826140bf565b155b80613236575061322b82615498565b60ff16836000015110155b15613244576128e784613feb565b60408201518351815183918391811061325957fe5b6020026020010181905250612c7785610100015161278483611dd7565b61327e61575e565b61328c826101000151613f9e565b9050613297816140bf565b6132a457612a2b82613feb565b6129f98261010001516127846132b984615498565b60ff16611ba1565b6132c961575e565b6132d7826101000151613f9e565b90506132e161575e565b6132ef836101200151613f9e565b90506132fa82613fe0565b158061330c575061330a816140bf565b155b80613326575061331b81615498565b60ff16826000015110155b156133345761258383613feb565b61318f8361012001518261400a565b61334b61575e565b613359826101000151613f9e565b905061336361575e565b613371836101000151613f9e565b905061337b61575e565b613389846101200151613f9e565b9050613394816140bf565b15806133a657506133a483613fe0565b155b806133c057506133b581615498565b60ff16836000015110155b156133ce576128e784613feb565b6040810151835181518491839181106133e357fe5b6020026020010181905250612c7785610120015161278483611dd7565b8060800151613416610859836101000151613f9e565b6040805160208082019490945280820192909252805180830382018152606090920190528051910120608090910152565b61344f61575e565b61345d826101000151613f9e565b9050612710816080015111806134795750613477816154bf565b155b1561348757612a2b82613feb565b81606001516134958261114f565b6040516020018083815260200182815260200192505050604051602081830303815290604052805190602001208260600181815250505050565b6134d761575e565b6134e5826101000151613f9e565b90506134f2610859611020565b613503836020015160e0015161114f565b1461351b57613511826155bd565b602083015160e001525b6129f98261010001516127846135308461114f565b612996866020015160e001516040015160018151811061228e57fe5b613557610859611020565b613568826020015160e0015161114f565b1461359a57613584816101000151826020015160e0015161400a565b61358c611020565b602082015160e00152610b6c565b610b6c816101000151612784836155bd565b610b6c81613feb565b610b6c8160200151615656565b6135ca61575e565b6135d8826101000151613f9e565b90506135e381613fe0565b6135f057612a2b82613feb565b51602082015160a0015250565b610b6c816101000151612784836020015160a00151611ba1565b61010081015160408051600160f81b6020808301919091526000602183018190526022808401919091528351808403909101815260429092019092528051910120610b6c91906127849060016153e7565b61367061575e565b61367e826101000151613f9e565b905061368861575e565b613696836101000151613f9e565b90506136a182613fe0565b15806136b357506136b1816153da565b155b156136c15761258383613feb565b61299c83610100015161278484600001516136db8561114f565b611067565b6136e861575e565b6136f6826101000151613f9e565b905061370061575e565b61370e836101000151613f9e565b905061371861575e565b613726846101000151613f9e565b905061373183613fe0565b15806137435750613741816153da565b155b15613751576128e784613feb565b6129f6846101000151612784856000015161376b8561114f565b866110cb565b604080516000808252602082019092526060916137a4565b61379161575e565b8152602001906001900390816137895790505b5090506129f982610100015161278483611dd7565b6137c161575e565b6137cf826101000151613f9e565b90506137d961575e565b6137e7836101000151613f9e565b90506137f161575e565b6137ff846101000151613f9e565b905061380961575e565b613817856101000151613f9e565b905061382284613fe0565b1580613834575061383283613fe0565b155b80613845575061384382613fe0565b155b80613856575061385481613fe0565b155b15613864576108ec85613feb565b8351835183511580159061387a57508351600114155b1561389d576138928761010001516127846000611ba1565b505050505050610b6c565b83518351604080516000808252602080830180855285905260ff601b9096019586168385015260608301889052608083018790529251909260019260a080820193601f1981019281900390910190855afa1580156138ff573d6000803e3d6000fd5b5050506020604051035190506139268a6101000151612784836001600160a01b0316611ba1565b50505050505050505050565b61393a61575e565b613948826101000151613f9e565b905061395261575e565b613960836101000151613f9e565b905061396a61575e565b613978846101000151613f9e565b905061398261575e565b613990856101000151613f9e565b905061399b84613fe0565b15806139ad57506139ab83613fe0565b155b806139be57506139bc82613fe0565b155b806139cf57506139cd81613fe0565b155b156139dd576108ec85613feb565b6139e561581c565b5060408051608081018252855181528451602082015283519181019190915281516060820152613a1361583a565b600060408260808560066107d05a03fa905080613a3f57613a3388613feb565b50505050505050610b6c565b610100880151613a5a906127848460015b6020020151611ba1565b61010088015161293e90612784846000613a50565b613a7761575e565b613a85826101000151613f9e565b9050613a8f61575e565b613a9d836101000151613f9e565b9050613aa761575e565b613ab5846101000151613f9e565b9050613ac083613fe0565b1580613ad25750613ad082613fe0565b155b80613ae35750613ae181613fe0565b155b15613af1576128e784613feb565b613af9615858565b50604080516060810182528451815283516020820152825191810191909152613b2061583a565b600060408260808560076107d05a03fa905080613b405761389287613feb565b610100870151613b5590612784846001613a50565b610100870151612d3390612784846000613a50565b613b7261575e565b613b80826101000151613f9e565b9050613b8a615876565b60005b601e811015613c1a57613b9f836140bf565b613bac576128e784613feb565b60408301518051613bbd5750613c1a565b8051600214613bcf576108ec85613feb565b80600081518110613bdc57fe5b60200260200101518383601e8110613bf057fe5b6020020152805181906001908110613c0457fe5b6020908102919091010151935050600101613b8d565b613c29846207a12083026119f4565b15613c3657505050610b6c565b613c3f836140bf565b1580613c4f575060408301515115155b15613c5d576128e784613feb565b613c656158a4565b60005b82811015613e2757613c7861575e565b8482601e8110613c8457fe5b60200201519050613c94816140bf565b613ca15761389287613feb565b60408101518051600614613cb857613a3388613feb565b60005b6006811015613cf557613cd3828281518110612b0157fe5b613ced57613ce089613feb565b5050505050505050610b6c565b600101613cbb565b5080600081518110613d0357fe5b602002602001015160000151848460060260b48110613d1e57fe5b6020020152805181906001908110613d3257fe5b602002602001015160000151848460060260010160b48110613d5057fe5b6020020152805181906003908110613d6457fe5b602002602001015160000151848460060260020160b48110613d8257fe5b6020020152805181906002908110613d9657fe5b602002602001015160000151848460060260030160b48110613db457fe5b6020020152805181906005908110613dc857fe5b602002602001015160000151848460060260040160b48110613de657fe5b6020020152805181906004908110613dfa57fe5b602002602001015160000151848460060260050160b48110613e1857fe5b60200201525050600101613c68565b5060c08202613e346158c3565b6000602082848660086107d05a03fa905080613e5357613a3388613feb565b610100880151825161293e9190612784901515614034565b600161010090910152565b60008160200183511015613ec6576040805162461bcd60e51b815260206004820152601260248201527152656164206f7574206f6620626f756e647360701b604482015290519081900360640190fd5b50016020015190565b6008101590565b60008060208301611f7e858563ffffffff613e7616565b613ef561575e565b6040805160a0810182528481528151606081018352600080825260208281018290528451828152808201865293949085019390830191613f4b565b613f3861575e565b815260200190600190039081613f305790505b50905281526040805160008082526020828101909352919092019190613f87565b613f7461575e565b815260200190600190039081613f6c5790505b508152600260208201526040019290925250919050565b613fa661575e565b613fae61575e565b8260200151600184600001510381518110613fc557fe5b60209081029190910101518351600019018452915050919050565b6060015160ff161590565b613ff481611a5e565b6101008101516000908190526101209091015152565b80826020015183600001518151811061401f57fe5b60209081029190910101525080516001019052565b61403c61575e565b811561404c576111756001611ba1565b6111756000611ba1565b61405e61575e565b816060015160ff16600214156140af576040805162461bcd60e51b8152602060048201526011602482015270696e76616c6964207479706520636f646560781b604482015290519081900360640190fd5b6110c5826060015160ff16611ba1565b6060015160ff1660031490565b6140d46157fd565b6140dc6156b4565b6140e46156b4565b6140ec6157fd565b6140f46158e1565b60405180610300016040528060018152602001618082815260200167800000000000808a8152602001678000000080008000815260200161808b81526020016380000001815260200167800000008000808181526020016780000000000080098152602001608a81526020016088815260200163800080098152602001638000000a8152602001638000808b815260200167800000000000008b8152602001678000000000008089815260200167800000000000800381526020016780000000000080028152602001678000000000000080815260200161800a815260200167800000008000000a81526020016780000000800080818152602001678000000000008080815260200163800000018152602001678000000080008008815250905060008090505b6018811015614cb2576080878101516060808a01516040808c01516020808e01518e511890911890921890931889526101208b01516101008c015160e08d015160c08e015160a08f0151181818189089018190526101c08b01516101a08c01516101808d01516101608e01516101408f0151181818189289019283526102608b01516102408c01516102208d01516102008e01516101e08f015118181818918901919091526103008a01516102e08b01516102c08c01516102a08d01516102808e0151181818189288018390526001600160401b0360028202166001603f1b91829004179092188652510485600260200201516002026001600160401b03161785600060200201511884600160200201526001603f1b85600360200201518161434057fe5b0485600360200201516002026001600160401b03161785600160200201511884600260200201526001603f1b85600460200201518161437b57fe5b0485600460200201516002026001600160401b0316178560026005811061439e57fe5b602002015118606085015284516001603f1b9086516060808901519390920460029091026001600160401b031617909118608086810191825286518a5118808b5287516020808d018051909218825289516040808f0180519092189091528a518e8801805190911890528a51948e0180519095189094528901805160a08e0180519091189052805160c08e0180519091189052805160e08e018051909118905280516101008e0180519091189052516101208d018051909118905291880180516101408d018051909118905280516101608d018051909118905280516101808d018051909118905280516101a08d0180519091189052516101c08c018051909118905292870180516101e08c018051909118905280516102008c018051909118905280516102208c018051909118905280516102408c0180519091189052516102608b018051909118905281516102808b018051909118905281516102a08b018051909118905281516102c08b018051909118905281516102e08b018051909118905290516103008a01805190911890529084525163100000009060208901516001600160401b03641000000000909102169190041761010084015260408701516001603d1b9060408901516001600160401b03600890910216919004176101608401526060870151628000009060608901516001600160401b036502000000000090910216919004176102608401526080870151654000000000009060808901516001600160401b036204000090910216919004176102c084015260a08701516001603f1b900487600560200201516002026001600160401b0316178360026019811061460857fe5b602002015260c0870151621000008104651000000000009091026001600160401b039081169190911760a085015260e0880151664000000000000081046104009091028216176101a08501526101008801516208000081046520000000000090910282161761020085015261012088015160048082029092166001603e1b909104176103008501526101408801516101408901516001600160401b036001603e1b90910216919004176080840152610160870151670400000000000000906101608901516001600160401b036040909102169190041760e084015261018087015162200000906101808901516001600160401b036508000000000090910216919004176101408401526101a08701516602000000000000906101a08901516001600160401b0361800090910216919004176102408401526101c08701516008906101c08901516001600160401b036001603d1b90910216919004176102a08401526101e0870151641000000000906101e08901516001600160401b03631000000090910216919004176020840152610200808801516102008901516001600160401b0366800000000000009091021691900417610120840152610220870151648000000000906102208901516001600160401b036302000000909102169190041761018084015261024087015165080000000000906102408901516001600160401b036220000090910216919004176101e0840152610260870151610100906102608901516001600160401b03600160381b90910216919004176102e0840152610280870151642000000000906102808901516001600160401b036308000000909102169190041760608401526102a087015165100000000000906102a08901516001600160401b0362100000909102169190041760c08401526102c08701516302000000906102c08901516001600160401b0364800000000090910216919004176101c08401526102e0870151600160381b906102e08901516001600160401b036101009091021691900417610220840152610300870151660400000000000090048760186020020151614000026001600160401b031617836014602002015282600a602002015183600560200201511916836000602002015118876000602002015282600b602002015183600660200201511916836001602002015118876001602002015282600c602002015183600760200201511916836002602002015118876002602002015282600d602002015183600860200201511916836003602002015118876003602002015282600e602002015183600960200201511916836004602002015118876004602002015282600f602002015183600a602002015119168360056020020151188760056020020152826010602002015183600b602002015119168360066020020151188760066020020152826011602002015183600c602002015119168360076020020151188760076020020152826012602002015183600d602002015119168360086020020151188760086020020152826013602002015183600e602002015119168360096020020151188760096020020152826014602002015183600f6020020151191683600a60200201511887600a602002015282601560200201518360106020020151191683600b60200201511887600b602002015282601660200201518360116020020151191683600c60200201511887600c602002015282601760200201518360126020020151191683600d60200201511887600d602002015282601860200201518360136020020151191683600e60200201511887600e602002015282600060200201518360146020020151191683600f60200201511887600f6020020152826001602002015183601560200201511916836010602002015118876010602002015282600260200201518360166020020151191683601160200201511887601160200201528260036020020151836017602002015119168360126020020151188760126020020152826004602002015183601860200201511916836013602002015118876013602002015282600560200201518360006020020151191683601460200201511887601460200201528260066020020151836001602002015119168360156020020151188760156020020152826007602002015183600260200201511916836016602002015118876016602002015282600860200201518360036020020151191683601760200201511887601760200201528260096020020151836004602002015119168360186020020151188760186020020152818160188110614ca057fe5b6020020151875118875260010161421b565b509495945050505050565b6000614cc7615900565b50604080516108008101825263428a2f9881526371374491602082015263b5c0fbcf9181019190915263e9b5dba56060820152633956c25b60808201526359f111f160a082015263923f82a460c082015263ab1c5ed560e082015263d807aa986101008201526312835b0161012082015263243185be61014082015263550c7dc36101608201526372be5d746101808201526380deb1fe6101a0820152639bdc06a76101c082015263c19bf1746101e082015263e49b69c161020082015263efbe4786610220820152630fc19dc661024082015263240ca1cc610260820152632de92c6f610280820152634a7484aa6102a0820152635cb0a9dc6102c08201526376f988da6102e082015263983e515261030082015263a831c66d61032082015263b00327c861034082015263bf597fc761036082015263c6e00bf361038082015263d5a791476103a08201526306ca63516103c082015263142929676103e08201526327b70a85610400820152632e1b2138610420820152634d2c6dfc6104408201526353380d1361046082015263650a735461048082015263766a0abb6104a08201526381c2c92e6104c08201526392722c856104e082015263a2bfe8a161050082015263a81a664b61052082015263c24b8b7061054082015263c76c51a361056082015263d192e81961058082015263d69906246105a082015263f40e35856105c082015263106aa0706105e08201526319a4c116610600820152631e376c08610620820152632748774c6106408201526334b0bcb561066082015263391c0cb3610680820152634ed8aa4a6106a0820152635b9cca4f6106c082015263682e6ff36106e082015263748f82ee6107008201526378a5636f6107208201526384c87814610740820152638cc702086107608201526390befffa61078082015263a4506ceb6107a082015263bef9a3f76107c082015263c67178f26107e0820152614f92615900565b60005b60088163ffffffff16101561501f5763ffffffff6020820260e003168660006020020151901c828263ffffffff1660408110614fcd57fe5b63ffffffff92831660209182029290920191909152820260e003168660016020020151901c828260080163ffffffff166040811061500757fe5b63ffffffff9092166020929092020152600101614f95565b5060106000805b60408363ffffffff16101561517b57600384600f850363ffffffff166040811061504c57fe5b602002015163ffffffff16901c61507d85600f860363ffffffff166040811061507157fe5b60200201516012615661565b6150a186600f870363ffffffff166040811061509557fe5b60200201516007615661565b18189150600a846002850363ffffffff16604081106150bc57fe5b602002015163ffffffff16901c6150ed856002860363ffffffff16604081106150e157fe5b60200201516013615661565b615111866002870363ffffffff166040811061510557fe5b60200201516011615661565b1818905080846007850363ffffffff166040811061512b57fe5b602002015183866010870363ffffffff166040811061514657fe5b6020020151010101848463ffffffff166040811061516057fe5b63ffffffff9092166020929092020152600190920191615026565b61518361591f565b600093505b60088463ffffffff1610156151d4578360200260e00363ffffffff1688901c818563ffffffff16600881106151b957fe5b63ffffffff9092166020929092020152600190930192615188565b60008060008096505b60408763ffffffff1610156153295760808401516151fc906019615661565b608085015161520c90600b615661565b608086015161521c906006615661565b18189450878763ffffffff166040811061523257fe5b6020020151898863ffffffff166040811061524957fe5b6020020151608086015160a087015160c088015161526892919061567f565b87876007602002015101010101925061528984600060200201516016615661565b845161529690600d615661565b85516152a3906002615661565b6040870180516020890180518a5160c08c01805163ffffffff90811660e08f015260a08e018051821690925260808e018051821690925260608e0180518e018216909252808616909152808316909552848116909252808318919091169116189290911892909218818101868101909316875260019990990198975090925090506151dd565b600096505b60088763ffffffff16101561537d578660200260e00363ffffffff168b901c848863ffffffff166008811061535f57fe5b60200201805163ffffffff920191909116905260019096019561532e565b60008097505b60088863ffffffff1610156153ca578760200260e00363ffffffff16858963ffffffff16600881106153b157fe5b602002015160019099019863ffffffff16901b17615383565b9c9b505050505050505050505050565b6060015160ff1660011490565b6153ef61575e565b6040805160a0810182528481528151606081018352600080825260208281018290528451828152808201865293949085019390830191615445565b61543261575e565b81526020019060019003908161542a5790505b50905281526040805160008082526020828101909352919092019190615481565b61546e61575e565b8152602001906001900390816154665790505b508152606460208201526040019290925250919050565b606081015160009060ff16600314156154b7575060408101515161101b565b50600161101b565b606081015160009060ff166154d65750600161101b565b606082015160ff16600114156154ee5750600061101b565b606082015160ff1660021415615542576040805162461bcd60e51b81526020600482015260146024820152736d75737420686176652066756c6c2076616c756560601b604482015290519081900360640190fd5b606082015160ff16600314156155a55760408201515160005b8181101561559a576155838460400151828151811061557657fe5b60200260200101516154bf565b6155925760009250505061101b565b60010161555b565b50600191505061101b565b606082015160ff166064141561122e5750600061101b565b6155c561575e565b60e082015160408051808201909152600981526812539093d617d5905360ba1b6020820152906156365760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561066357818101518382015260200161064b565b5061564982604001518360e00151615688565b60408301525060c0015190565b600261010090910152565b63ffffffff9182166020829003831681901b919092169190911c1790565b82191691161890565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b6040518060a001604052806005906020820280388339509192915050565b604051806101c001604052806156e6615792565b81526020016156f3615792565b81526000602082018190526040820181905260608201819052608082015260a00161571c61575e565b81526000602082015260400161573061593e565b815260200161573d61593e565b81526000602082018190526040820181905260608083015260809091015290565b6040518060a0016040528060008152602001615778615958565b815260606020820181905260006040830181905291015290565b60408051610120810190915260008152602081016157ae61575e565b81526020016157bb61575e565b81526020016157c861575e565b81526020016157d561575e565b815260006020820181905260408201526060016157f061575e565b8152602001600081525090565b6040518061032001604052806019906020820280388339509192915050565b60405180608001604052806004906020820280388339509192915050565b60405180604001604052806002906020820280388339509192915050565b60405180606001604052806003906020820280388339509192915050565b604051806103c00160405280601e905b61588e61575e565b8152602001906001900390816158865790505090565b60405180611680016040528060b4906020820280388339509192915050565b60405180602001604052806001906020820280388339509192915050565b6040518061030001604052806018906020820280388339509192915050565b6040518061080001604052806040906020820280388339509192915050565b6040518061010001604052806008906020820280388339509192915050565b604051806040016040528060008152602001606081525090565b604080516060808201835260008083526020830152918101919091529056fea265627a7a72315820ee11c4f69638dabf7dfc8e8f7fd6a47eb86bac9a00bb872531b1b0d7413ccd3064736f6c63430005110032"

func DeployOneStepProof(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *OneStepProof, error) {
	parsed, err := abi.JSON(strings.NewReader(OneStepProofABI))
	if err != nil {
		return common.Address{}, nil, nil, err
	}

	address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(OneStepProofBin), backend)
	if err != nil {
		return common.Address{}, nil, nil, err
	}
	return address, tx, &OneStepProof{OneStepProofCaller: OneStepProofCaller{contract: contract}, OneStepProofTransactor: OneStepProofTransactor{contract: contract}, OneStepProofFilterer: OneStepProofFilterer{contract: contract}}, nil
}

type OneStepProof struct {
	OneStepProofCaller     
	OneStepProofTransactor 
	OneStepProofFilterer   
}

type OneStepProofCaller struct {
	contract *bind.BoundContract 
}

type OneStepProofTransactor struct {
	contract *bind.BoundContract 
}

type OneStepProofFilterer struct {
	contract *bind.BoundContract 
}

type OneStepProofSession struct {
	Contract     *OneStepProof     
	CallOpts     bind.CallOpts     
	TransactOpts bind.TransactOpts 
}

type OneStepProofCallerSession struct {
	Contract *OneStepProofCaller 
	CallOpts bind.CallOpts       
}

type OneStepProofTransactorSession struct {
	Contract     *OneStepProofTransactor 
	TransactOpts bind.TransactOpts       
}

type OneStepProofRaw struct {
	Contract *OneStepProof 
}

type OneStepProofCallerRaw struct {
	Contract *OneStepProofCaller 
}

type OneStepProofTransactorRaw struct {
	Contract *OneStepProofTransactor 
}

func NewOneStepProof(address common.Address, backend bind.ContractBackend) (*OneStepProof, error) {
	contract, err := bindOneStepProof(address, backend, backend, backend)
	if err != nil {
		return nil, err
	}
	return &OneStepProof{OneStepProofCaller: OneStepProofCaller{contract: contract}, OneStepProofTransactor: OneStepProofTransactor{contract: contract}, OneStepProofFilterer: OneStepProofFilterer{contract: contract}}, nil
}

func NewOneStepProofCaller(address common.Address, caller bind.ContractCaller) (*OneStepProofCaller, error) {
	contract, err := bindOneStepProof(address, caller, nil, nil)
	if err != nil {
		return nil, err
	}
	return &OneStepProofCaller{contract: contract}, nil
}

func NewOneStepProofTransactor(address common.Address, transactor bind.ContractTransactor) (*OneStepProofTransactor, error) {
	contract, err := bindOneStepProof(address, nil, transactor, nil)
	if err != nil {
		return nil, err
	}
	return &OneStepProofTransactor{contract: contract}, nil
}

func NewOneStepProofFilterer(address common.Address, filterer bind.ContractFilterer) (*OneStepProofFilterer, error) {
	contract, err := bindOneStepProof(address, nil, nil, filterer)
	if err != nil {
		return nil, err
	}
	return &OneStepProofFilterer{contract: contract}, nil
}

func bindOneStepProof(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
	parsed, err := abi.JSON(strings.NewReader(OneStepProofABI))
	if err != nil {
		return nil, err
	}
	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
}

func (_OneStepProof *OneStepProofRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _OneStepProof.Contract.OneStepProofCaller.contract.Call(opts, result, method, params...)
}

func (_OneStepProof *OneStepProofRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _OneStepProof.Contract.OneStepProofTransactor.contract.Transfer(opts)
}

func (_OneStepProof *OneStepProofRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _OneStepProof.Contract.OneStepProofTransactor.contract.Transact(opts, method, params...)
}

func (_OneStepProof *OneStepProofCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _OneStepProof.Contract.contract.Call(opts, result, method, params...)
}

func (_OneStepProof *OneStepProofTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _OneStepProof.Contract.contract.Transfer(opts)
}

func (_OneStepProof *OneStepProofTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _OneStepProof.Contract.contract.Transact(opts, method, params...)
}

func (_OneStepProof *OneStepProofCaller) ExecuteStep(opts *bind.CallOpts, inboxAcc [32]byte, messagesAcc [32]byte, logsAcc [32]byte, proof []byte) (struct {
	Gas    uint64
	Fields [5][32]byte
}, error) {
	var out []interface{}
	err := _OneStepProof.contract.Call(opts, &out, "executeStep", inboxAcc, messagesAcc, logsAcc, proof)

	outstruct := new(struct {
		Gas    uint64
		Fields [5][32]byte
	})

	outstruct.Gas = out[0].(uint64)
	outstruct.Fields = out[1].([5][32]byte)

	return *outstruct, err

}

func (_OneStepProof *OneStepProofSession) ExecuteStep(inboxAcc [32]byte, messagesAcc [32]byte, logsAcc [32]byte, proof []byte) (struct {
	Gas    uint64
	Fields [5][32]byte
}, error) {
	return _OneStepProof.Contract.ExecuteStep(&_OneStepProof.CallOpts, inboxAcc, messagesAcc, logsAcc, proof)
}

func (_OneStepProof *OneStepProofCallerSession) ExecuteStep(inboxAcc [32]byte, messagesAcc [32]byte, logsAcc [32]byte, proof []byte) (struct {
	Gas    uint64
	Fields [5][32]byte
}, error) {
	return _OneStepProof.Contract.ExecuteStep(&_OneStepProof.CallOpts, inboxAcc, messagesAcc, logsAcc, proof)
}

func (_OneStepProof *OneStepProofCaller) ExecuteStepWithMessage(opts *bind.CallOpts, inboxAcc [32]byte, messagesAcc [32]byte, logsAcc [32]byte, proof []byte, _kind uint8, _blockNumber *big.Int, _timestamp *big.Int, _sender common.Address, _inboxSeqNum *big.Int, _msgData []byte) (struct {
	Gas    uint64
	Fields [5][32]byte
}, error) {
	var out []interface{}
	err := _OneStepProof.contract.Call(opts, &out, "executeStepWithMessage", inboxAcc, messagesAcc, logsAcc, proof, _kind, _blockNumber, _timestamp, _sender, _inboxSeqNum, _msgData)

	outstruct := new(struct {
		Gas    uint64
		Fields [5][32]byte
	})

	outstruct.Gas = out[0].(uint64)
	outstruct.Fields = out[1].([5][32]byte)

	return *outstruct, err

}

func (_OneStepProof *OneStepProofSession) ExecuteStepWithMessage(inboxAcc [32]byte, messagesAcc [32]byte, logsAcc [32]byte, proof []byte, _kind uint8, _blockNumber *big.Int, _timestamp *big.Int, _sender common.Address, _inboxSeqNum *big.Int, _msgData []byte) (struct {
	Gas    uint64
	Fields [5][32]byte
}, error) {
	return _OneStepProof.Contract.ExecuteStepWithMessage(&_OneStepProof.CallOpts, inboxAcc, messagesAcc, logsAcc, proof, _kind, _blockNumber, _timestamp, _sender, _inboxSeqNum, _msgData)
}

func (_OneStepProof *OneStepProofCallerSession) ExecuteStepWithMessage(inboxAcc [32]byte, messagesAcc [32]byte, logsAcc [32]byte, proof []byte, _kind uint8, _blockNumber *big.Int, _timestamp *big.Int, _sender common.Address, _inboxSeqNum *big.Int, _msgData []byte) (struct {
	Gas    uint64
	Fields [5][32]byte
}, error) {
	return _OneStepProof.Contract.ExecuteStepWithMessage(&_OneStepProof.CallOpts, inboxAcc, messagesAcc, logsAcc, proof, _kind, _blockNumber, _timestamp, _sender, _inboxSeqNum, _msgData)
}

const PrecompilesABI = "[]"

var PrecompilesBin = "0x60556023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea265627a7a7231582089a25ee4d0917faa75d52d337f832f58e8fef2b903c6259ee110daea7c41f21264736f6c63430005110032"

func DeployPrecompiles(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Precompiles, error) {
	parsed, err := abi.JSON(strings.NewReader(PrecompilesABI))
	if err != nil {
		return common.Address{}, nil, nil, err
	}

	address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(PrecompilesBin), backend)
	if err != nil {
		return common.Address{}, nil, nil, err
	}
	return address, tx, &Precompiles{PrecompilesCaller: PrecompilesCaller{contract: contract}, PrecompilesTransactor: PrecompilesTransactor{contract: contract}, PrecompilesFilterer: PrecompilesFilterer{contract: contract}}, nil
}

type Precompiles struct {
	PrecompilesCaller     
	PrecompilesTransactor 
	PrecompilesFilterer   
}

type PrecompilesCaller struct {
	contract *bind.BoundContract 
}

type PrecompilesTransactor struct {
	contract *bind.BoundContract 
}

type PrecompilesFilterer struct {
	contract *bind.BoundContract 
}

type PrecompilesSession struct {
	Contract     *Precompiles      
	CallOpts     bind.CallOpts     
	TransactOpts bind.TransactOpts 
}

type PrecompilesCallerSession struct {
	Contract *PrecompilesCaller 
	CallOpts bind.CallOpts      
}

type PrecompilesTransactorSession struct {
	Contract     *PrecompilesTransactor 
	TransactOpts bind.TransactOpts      
}

type PrecompilesRaw struct {
	Contract *Precompiles 
}

type PrecompilesCallerRaw struct {
	Contract *PrecompilesCaller 
}

type PrecompilesTransactorRaw struct {
	Contract *PrecompilesTransactor 
}

func NewPrecompiles(address common.Address, backend bind.ContractBackend) (*Precompiles, error) {
	contract, err := bindPrecompiles(address, backend, backend, backend)
	if err != nil {
		return nil, err
	}
	return &Precompiles{PrecompilesCaller: PrecompilesCaller{contract: contract}, PrecompilesTransactor: PrecompilesTransactor{contract: contract}, PrecompilesFilterer: PrecompilesFilterer{contract: contract}}, nil
}

func NewPrecompilesCaller(address common.Address, caller bind.ContractCaller) (*PrecompilesCaller, error) {
	contract, err := bindPrecompiles(address, caller, nil, nil)
	if err != nil {
		return nil, err
	}
	return &PrecompilesCaller{contract: contract}, nil
}

func NewPrecompilesTransactor(address common.Address, transactor bind.ContractTransactor) (*PrecompilesTransactor, error) {
	contract, err := bindPrecompiles(address, nil, transactor, nil)
	if err != nil {
		return nil, err
	}
	return &PrecompilesTransactor{contract: contract}, nil
}

func NewPrecompilesFilterer(address common.Address, filterer bind.ContractFilterer) (*PrecompilesFilterer, error) {
	contract, err := bindPrecompiles(address, nil, nil, filterer)
	if err != nil {
		return nil, err
	}
	return &PrecompilesFilterer{contract: contract}, nil
}

func bindPrecompiles(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
	parsed, err := abi.JSON(strings.NewReader(PrecompilesABI))
	if err != nil {
		return nil, err
	}
	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
}

func (_Precompiles *PrecompilesRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _Precompiles.Contract.PrecompilesCaller.contract.Call(opts, result, method, params...)
}

func (_Precompiles *PrecompilesRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _Precompiles.Contract.PrecompilesTransactor.contract.Transfer(opts)
}

func (_Precompiles *PrecompilesRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _Precompiles.Contract.PrecompilesTransactor.contract.Transact(opts, method, params...)
}

func (_Precompiles *PrecompilesCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _Precompiles.Contract.contract.Call(opts, result, method, params...)
}

func (_Precompiles *PrecompilesTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _Precompiles.Contract.contract.Transfer(opts)
}

func (_Precompiles *PrecompilesTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _Precompiles.Contract.contract.Transact(opts, method, params...)
}
// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.

package ethbridgecontracts

import (
	"math/big"
	"strings"

	ethereum "github.com/ethereum/go-ethereum"
	"github.com/ethereum/go-ethereum/accounts/abi"
	"github.com/ethereum/go-ethereum/accounts/abi/bind"
	"github.com/ethereum/go-ethereum/common"
	"github.com/ethereum/go-ethereum/core/types"
	"github.com/ethereum/go-ethereum/event"
)

// Reference imports to suppress errors if they are not otherwise used.
var (
	_ = big.NewInt
	_ = strings.NewReader
	_ = ethereum.NotFound
	_ = bind.Bind
	_ = common.Big1
	_ = types.BloomLookup
	_ = event.NewSubscription
)

// OneStepProofABI is the input ABI used to generate the binding from.
const OneStepProofABI = "[{\"constant\":true,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"inboxAcc\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"messagesAcc\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"logsAcc\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"}],\"name\":\"executeStep\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"gas\",\"type\":\"uint64\"},{\"internalType\":\"bytes32[5]\",\"name\":\"fields\",\"type\":\"bytes32[5]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"inboxAcc\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"messagesAcc\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"logsAcc\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"proof\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"_kind\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"_blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_timestamp\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_inboxSeqNum\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_msgData\",\"type\":\"bytes\"}],\"name\":\"executeStepWithMessage\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"gas\",\"type\":\"uint64\"},{\"internalType\":\"bytes32[5]\",\"name\":\"fields\",\"type\":\"bytes32[5]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]"

// OneStepProofFuncSigs maps the 4-byte function signature to its string representation.
var OneStepProofFuncSigs = map[string]string{
	"385bc114": "executeStep(bytes32,bytes32,bytes32,bytes)",
	"96105dce": "executeStepWithMessage(bytes32,bytes32,bytes32,bytes,uint8,uint256,uint256,address,uint256,bytes)",
}

// OneStepProofBin is the compiled bytecode used for deploying new contracts.
var OneStepProofBin = "0x608060405234801561001057600080fd5b506159ac80620000216000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063385bc1141461003b57806396105dce14610106575b600080fd5b6100be6004803603608081101561005157600080fd5b8135916020810135916040820135919081019060808101606082013564010000000081111561007f57600080fd5b82018360208201111561009157600080fd5b803590602001918460018302840111640100000000831117156100b357600080fd5b509092509050610206565b6040516001600160401b0383168152602081018260a080838360005b838110156100f25781810151838201526020016100da565b505050509050019250505060405180910390f35b6100be600480360361014081101561011d57600080fd5b8135916020810135916040820135919081019060808101606082013564010000000081111561014b57600080fd5b82018360208201111561015d57600080fd5b8035906020019184600183028401116401000000008311171561017f57600080fd5b9193909260ff833516926020810135926040820135926001600160a01b0360608401351692608081013592919060c081019060a001356401000000008111156101c757600080fd5b8201836020820111156101d957600080fd5b803590602001918460018302840111640100000000831117156101fb57600080fd5b50909250905061027d565b60006102106156b4565b6102186156d2565b61025a88888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061037792505050565b905061026581610807565b61026e81610b6f565b92509250509550959350505050565b60006102876156b4565b61028f6156d2565b6102d18f8f8f8f8f8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061037792505050565b90506102fd8a888b8b8a8a8a6040518083838082843760405192018290039091209350610bd292505050565b8160e001818152505061034a8a8a8a8a8a8a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610c4092505050565b60c082015261035881610807565b61036181610b6f565b92509250509c509c9a5050505050505050505050565b61037f6156d2565b60008260008151811061038e57fe5b602001015160f81c60f81b60f81c90506000836001815181106103ad57fe5b602001015160f81c60f81b60f81c905060006002905060608360040160ff1660405190808252806020026020018201604052801561040557816020015b6103f261575e565b8152602001906001900390816103ea5790505b50905060608360040160ff1660405190808252806020026020018201604052801561044a57816020015b61043761575e565b81526020019060019003908161042f5790505b50905060005b8560ff16811015610488576104658885610d68565b845185908490811061047357fe5b60209081029190910101529350600101610450565b5060005b8460ff168110156104c4576104a18885610d68565b83518490849081106104af57fe5b6020908102919091010152935060010161048c565b506104cd615792565b6104d78885610efa565b809250819550505060008885815181106104ed57fe5b602001015160f81c60f81b60f81c9050600089866001018151811061050e57fe5b01602001516002969096019560f81c90506105276156d2565b604051806101c0016040528085815260200161054286610fab565b81526020018f81526020018e81526020018d815260200160006001600160401b03168152602001610571611020565b81526020016000801b815260200160405180604001604052808c60ff16815260200189815250815260200160405180604001604052808b60ff1681526020018881525081526020018460ff16600114151581526020018360ff1681526020018c81526020018881525090508260ff16600014806105f157508260ff166001145b6040518060400160405280600b81526020016a04241445f494d4d5f5459560ac1b8152509061069e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561066357818101518382015260200161064b565b50505050905090810190601f1680156106905780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506106a761575e565b60ff84166106c4578151516106bd908490611067565b9050610764565b6000875111604051806040016040528060068152602001654e4f5f494d4d60d01b815250906107345760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561066357818101518382015260200161064b565b50610761838360000151600001518960018e0360ff168151811061075457fe5b60200260200101516110cb565b90505b61076d8161114f565b82515260005b848b0360ff168110156107b2576107aa88828151811061078f57fe5b6020026020010151846000015161126f90919063ffffffff16565b600101610773565b5060005b8960ff168110156107f3576107eb8782815181106107d057fe5b6020026020010151846000015161128990919063ffffffff16565b6001016107b6565b50909e9d5050505050505050505050505050565b600080600061277061082085610160015160ff166112a3565b935093509350935061083285836119f4565b156108405750505050610b6c565b610100850151518411156108f55761085e610859611020565b61114f565b61086f86602001516020015161114f565b146040518060400160405280600d81526020016c535441434b5f4d495353494e4760981b815250906108e25760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561066357818101518382015260200161064b565b506108ec85611a5e565b50505050610b6c565b610120850151518311156109905761090e610859611020565b61091f86602001516040015161114f565b146040518060400160405280600b81526020016a4155585f4d495353494e4760a81b815250906108e25760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561066357818101518382015260200161064b565b60008411806109a25750846101400151155b80156109b357506101008501515184145b806109db575084610140015180156109c9575083155b80156109db5750610100850151516001145b6040518060400160405280600a815260200169535441434b5f4d414e5960b01b81525090610a4a5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561066357818101518382015260200161064b565b50610120850151516040805180820190915260088152674155585f4d414e5960c01b6020820152908414610abf5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561066357818101518382015260200161064b565b50610acd858263ffffffff16565b60005b61010086015151811015610b1957610b11866101000151602001518281518110610af657fe5b6020026020010151876020015161126f90919063ffffffff16565b600101610ad0565b5060005b61012086015151811015610b6657610b5e866101200151602001518281518110610b4357fe5b6020026020010151876020015161128990919063ffffffff16565b600101610b1d565b50505050505b50565b6000610b796156b4565b8260a001516040518060a00160405280610b968660000151611ac7565b8152602001610ba88660200151611ac7565b81526020018560400151815260200185606001518152602001856080015181525091509150915091565b6040805160f89790971b6001600160f81b03191660208089019190915260609690961b6bffffffffffffffffffffffff191660218801526035870194909452605586019290925260758501526095808501919091528151808503909101815260b59093019052815191012090565b610c4861575e565b60408051600680825260e08201909252606091816020015b610c6861575e565b815260200190600190039081610c60579050509050610c898860ff16611ba1565b81600081518110610c9657fe5b6020026020010181905250610caa87611ba1565b81600181518110610cb757fe5b6020026020010181905250610ccb86611ba1565b81600281518110610cd857fe5b6020026020010181905250610cf5856001600160a01b0316611ba1565b81600381518110610d0257fe5b6020026020010181905250610d1684611ba1565b81600481518110610d2357fe5b6020026020010181905250610d3b8360008551611c53565b81600581518110610d4857fe5b6020026020010181905250610d5c81611dd7565b98975050505050505050565b6000610d7261575e565b83518310610db8576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a59081bd9999cd95d60921b604482015290519081900360640190fd5b600080610dc58686611ee9565b91509150610dd1611f10565b60ff168160ff161415610e05576000610dea8784611f15565b909350905082610df982611ba1565b94509450505050610ef3565b610e0d611f89565b60ff168160ff161415610e2f57610e248683611f8e565b935093505050610ef3565b610e37612030565b60ff168160ff161415610e4e57610e248683612035565b610e566120c9565b60ff168160ff1610158015610e775750610e6e6120ce565b60ff168160ff16105b15610eb3576000610e866120c9565b820390506060610e978289866120d3565b909450905083610ea682611dd7565b9550955050505050610ef3565b6040805162461bcd60e51b815260206004820152601060248201526f696e76616c69642074797065636f646560801b604482015290519081900360640190fd5b9250929050565b6000610f04615792565b610f0c615792565b6000610100820181905280610f218787611f15565b9096509150610f308787612035565b60208501529550610f418787612035565b60408501529550610f528787610d68565b60608501529550610f638787610d68565b60808501529550610f748787611f15565b60a08501529550610f858787611f15565b9096509050610f948787610d68565b60e085015291835260c08301529590945092505050565b610fb3615792565b60405180610120016040528083600001518152602001836020015181526020018360400151815260200183606001518152602001836080015181526020018360a0015181526020018360c0015181526020018360e00151815260200183610100015181525090505b919050565b61102861575e565b604080516000808252602082019092526110629161105c565b61104961575e565b8152602001906001900390816110415790505b50611dd7565b905090565b61106f61575e565b6040805160608101825260ff8516815260208082018590528251600080825291810184526110c2938301916110ba565b6110a761575e565b81526020019060019003908161109f5790505b50905261216c565b90505b92915050565b6110d361575e565b604080516001808252818301909252606091816020015b6110f261575e565b8152602001906001900390816110ea579050509050828160008151811061111557fe5b602002602001018190525061114660405180606001604052808760ff1681526020018681526020018381525061216c565b95945050505050565b6000611159611f10565b60ff16826060015160ff16141561117c578151611175906121d3565b905061101b565b611184611f89565b60ff16826060015160ff1614156111a25761117582602001516121f7565b6111aa612030565b60ff16826060015160ff1614156111cc578151608083015161117591906122f4565b6111d46120c9565b60ff16826060015160ff16141561120d576111ed61575e565b6111fa8360400151612345565b90506112058161114f565b91505061101b565b6112156124a7565b60ff16826060015160ff16141561122e5750805161101b565b6040805162461bcd60e51b8152602060048201526011602482015270496e76616c6964207479706520636f646560781b604482015290519081900360640190fd5b61127d8260200151826124ac565b82602001819052505050565b6112978260400151826124ac565b82604001819052505050565b6000808061277060018514806112b95750600285145b806112c45750600385145b156112de575060029250600091506003905061252a6119ed565b60048514806112ed5750600685145b1561130757506002925060009150600490506127896119ed565b60058514806113165750600785145b1561133057506002925060009150600790506127896119ed565b600885148061133f5750600985145b15611359575060039250600091506004905061285b6119ed565b600a851415611377575060029250600091506019905061252a6119ed565b600b851415611395575060029250600091506007905061252a6119ed565b60108514806113a45750601185145b806113af5750601285145b806113ba5750601385145b806113c55750601685145b806113d05750601785145b806113db5750601885145b156113f45750600292506000915082905061252a6119ed565b6014851415611411575060029250600091508290506129486119ed565b601585141561142e575060019250600091508290506129a16119ed565b601985141561144b575060019250600091508290506129fd6119ed565b601a85148061145a5750601b85145b806114655750601c85145b806114705750601d85145b1561148a575060029250600091506004905061252a6119ed565b60208514156114a85750600192506000915060079050612a496119ed565b60218514156114c65750600192506000915060039050612a766119ed565b60228514156114e4575060029250600091506008905061252a6119ed565b6023851415611503575060019250600091506102589050612aa06119ed565b60248514156115215750600392506000915060fa9050612c7e6119ed565b603085141561153e57506001925060009150829050612d3c6119ed565b603185141561155b57506000925082915060019050612d4a6119ed565b603285141561157857506000925082915060019050612d616119ed565b60338514156115965750600192506000915060029050612d786119ed565b60348514156115b45750600192506000915060049050612d926119ed565b60358514156115d25750600292506000915060049050612dd36119ed565b60368514156115ef57506000925082915060029050612e476119ed565b603785141561160c57506000925082915060019050612e8b6119ed565b603885141561162957506001925060009150829050612ea46119ed565b603985141561164657506000925060019150819050612ebb6119ed565b603a85141561166357506000925082915060029050612ed26119ed565b603b85141561168057506000925082915060019050610b6c6119ed565b603c85141561169d57506000925082915060019050612f006119ed565b603d8514156116ba57506001925060009150829050612f1c6119ed565b60408514156116d757506001925060009150829050612f606119ed565b60418514156116f55750600292506000915060019050612f966119ed565b60428514156117135750600392506000915060019050612ff36119ed565b604385141561173157506002925060009150600190506130776119ed565b604485141561174f57506003925060009150600190506130b66119ed565b605085141561176c5750600292506000915082905061311c6119ed565b605185141561178a57506003925060009150602890506131b96119ed565b60528514156117a857506001925060009150600290506132766119ed565b60538514156117c5575060019250829150600390506132c16119ed565b60548514156117e357506002925060019150602990506133436119ed565b606085141561180057506000925082915060649050610b6c6119ed565b606185141561181e57506001925060009150606490506134006119ed565b607085141561183c57506001925060009150606490506134476119ed565b607185141561185a57506001925060009150602890506134cf6119ed565b60728514156118775750600092508291506028905061354c6119ed565b6073851415611894575060009250829150600590506135ac6119ed565b60748514156118b1575060009250829150600a90506135b56119ed565b60758514156118ce575060019250600091508190506135c26119ed565b60768514156118eb575060009250829150600190506135fd6119ed565b6077851415611908575060009250829150601990506136176119ed565b607885141561192657506002925060009150601990506136686119ed565b607985141561194457506003925060009150601990506136e06119ed565b607b851415611961575060009250829150600a90506137716119ed565b608085141561198057506004925060009150614e2090506137b96119ed565b608185141561199f57506004925060009150610dac90506139326119ed565b60828514156119bf57506003925060009150620140509050613a6f6119ed565b60838514156119de575060019250600091506103e89050613b6a6119ed565b50600092508291508190506135ac5b9193509193565b60a080830180516001600160401b03908401811690915260208401519091015160009183161115611a3e57602083015160001960a090910152611a3683611a5e565b5060016110c5565b50602082015160a00180516001600160401b0383169003905260006110c5565b60408051600160f81b6020808301919091526000602183018190526022808401919091528351808403909101815260429092019092528051908201209082015160c001511415611aba57611ab58160200151613e6b565b610b6c565b6020015160c08101519052565b600060028261010001511415611adf5750600061101b565b60018261010001511415611af55750600161101b565b81516020830151611b059061114f565b611b12846040015161114f565b611b1f856060015161114f565b611b2c866080015161114f565b8660a001518760c00151611b438960e0015161114f565b604051602001808981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019850505050505050505060405160208183030381529060405280519060200120905061101b565b611ba961575e565b6040805160a0810182528381528151606081018352600080825260208281018290528451828152808201865293949085019390830191611bff565b611bec61575e565b815260200190600190039081611be45790505b50905281526040805160008082526020828101909352919092019190611c3b565b611c2861575e565b815260200190600190039081611c205790505b50815260006020820152600160409091015292915050565b611c5b61575e565b60208204611c6761575e565b611c6f611020565b60408051600280825260608281019093529293509091816020015b611c9261575e565b815260200190600190039081611c8a57905050905060005b83811015611d1357611ccf611cca89602084028a0163ffffffff613e7616565b611ba1565b82600081518110611cdc57fe5b60200260200101819052508282600181518110611cf557fe5b6020026020010181905250611d0982612345565b9250600101611caa565b506020850615611d89576000611d3588601f198989010163ffffffff613e7616565b9050602086066020036008021b611d4b81611ba1565b82600081518110611d5857fe5b60200260200101819052508282600181518110611d7157fe5b6020026020010181905250611d8582612345565b9250505b611d9285611ba1565b81600081518110611d9f57fe5b60200260200101819052508181600181518110611db857fe5b6020026020010181905250611dcc81612345565b979650505050505050565b611ddf61575e565b611de98251613ecf565b611e3a576040805162461bcd60e51b815260206004820152601a60248201527f5475706c65206d75737420686176652076616c69642073697a65000000000000604482015290519081900360640190fd5b600160005b8351811015611e7157838181518110611e5457fe5b602002602001015160800151820191508080600101915050611e3f565b506040805160a0810182526000808252825160608101845281815260208181018390528451838152808201865293949085019391929083019190611ecb565b611eb861575e565b815260200190600190039081611eb05790505b50905281526020810194909452600360408501526060909301525090565b60008082600101848481518110611efc57fe5b016020015190925060f81c90509250929050565b600090565b60008082845110158015611f2d575060208385510310155b611f6a576040805162461bcd60e51b81526020600482015260096024820152681d1bdbc81cda1bdc9d60ba1b604482015290519081900360640190fd5b60208301611f7e858563ffffffff613e7616565b915091509250929050565b600190565b6000611f9861575e565b82600080611fa461575e565b6000611fb08986611ee9565b9095509350611fbf8986611ee9565b9095509250600160ff85161415611fe057611fda8986610d68565b90955091505b611fea8986613ed6565b9095509050600160ff8516141561201557846120078483856110cb565b965096505050505050610ef3565b846120208483611067565b9650965050505050509250929050565b600290565b600061203f61575e565b82845110158015612054575060408385510310155b612090576040805162461bcd60e51b81526020600482015260086024820152671d1bc81cda1bdc9d60c21b604482015290519081900360640190fd5b60008061209d8686613ed6565b90945091506120ac8685611f15565b9094509050836120bc8383613eed565b9350935050509250929050565b600390565b600c90565b60006060600083905060608660ff1660405190808252806020026020018201604052801561211b57816020015b61210861575e565b8152602001906001900390816121005790505b50905060005b8760ff168160ff16101561215f576121398784610d68565b8351849060ff851690811061214a57fe5b60209081029190910101529250600101612121565b5090969095509350505050565b61217461575e565b6040805160a08101825260008082526020808301869052835182815290810184529192830191906121bb565b6121a861575e565b8152602001906001900390816121a05790505b50815260016020820181905260409091015292915050565b60408051602080820193909352815180820384018152908201909152805191012090565b600060028260400151511061220857fe5b60408201515161226d5761221a611f89565b8251602080850151604080516001600160f81b031960f896871b8116828601529490951b90931660218501526022808501919091528251808503909101815260429093019091528151910120905061101b565b612275611f89565b826000015161229b846040015160008151811061228e57fe5b602002602001015161114f565b8460200151604051602001808560ff1660ff1660f81b81526001018460ff1660ff1660f81b8152600101838152602001828152602001945050505050604051602081830303815290604052805190602001209050919050565b60006122fe6120c9565b8383604051602001808460ff1660ff1660f81b8152600101838152602001828152602001935050505060405160208183030381529060405280519060200120905092915050565b61234d61575e565b60088251111561239b576040805162461bcd60e51b8152602060048201526014602482015273092dcecc2d8d2c840e8eae0d8ca40d8cadccee8d60631b604482015290519081900360640190fd5b606082516040519080825280602002602001820160405280156123c8578160200160208202803883390190505b508051909150600160005b8281101561242b576123ea86828151811061228e57fe5b8482815181106123f657fe5b60200260200101818152505085818151811061240e57fe5b6020026020010151608001518201915080806001019150506123d3565b506000835184604051602001808360ff1660ff1660f81b8152600101828051906020019060200280838360005b83811015612470578181015183820152602001612458565b505050509050019250505060405160208183030381529060405280519060200120905061249d8183613eed565b9695505050505050565b606490565b6124b461575e565b6040805160028082526060828101909352816020015b6124d261575e565b8152602001906001900390816124ca57905050905082816000815181106124f557fe5b6020026020010181905250838160018151811061250e57fe5b602002602001018190525061252281612345565b949350505050565b61253261575e565b612540826101000151613f9e565b905061254a61575e565b612558836101000151613f9e565b905061256382613fe0565b1580612575575061257381613fe0565b155b1561258a5761258383613feb565b5050610b6c565b8151815161016085015160009060ff16600114156125ab5750818101612772565b61016086015160ff16600214156125c55750818102612772565b61016086015160ff16600314156125df5750808203612772565b61016086015160ff16600a14156125f9575080820a612772565b61016086015160ff16600b1415612613575080820b612772565b61016086015160ff166010141561262d5750808210612772565b61016086015160ff16601114156126475750808211612772565b61016086015160ff16601214156126615750808212612772565b61016086015160ff166013141561267b5750808213612772565b61016086015160ff16601614156126955750818116612772565b61016086015160ff16601714156126af5750818117612772565b61016086015160ff16601814156126c95750818118612772565b61016086015160ff16601a14156126e3575080821a612772565b61016086015160ff16601b14156126fd575080821b612772565b61016086015160ff16601c1415612717575080821c612772565b61016086015160ff16601d1415612731575080821d612772565b61016086015160ff1660221415612770575060408051602080820185905281830184905282518083038401815260609092019092528051910120612772565bfe5b610b6686610100015161278483611ba1565b61400a565b61279161575e565b61279f826101000151613f9e565b90506127a961575e565b6127b7836101000151613f9e565b90506127c282613fe0565b15806127d457506127d281613fe0565b155b806127de57508051155b156127ec5761258383613feb565b8151815161016085015160009060ff166004141561280d5750808204612772565b61016086015160ff16600514156128275750808205612772565b61016086015160ff16600614156128415750808206612772565b61016086015160ff16600714156127705750808207612772565b61286361575e565b612871826101000151613f9e565b905061287b61575e565b612889836101000151613f9e565b905061289361575e565b6128a1846101000151613f9e565b90506128ac83613fe0565b15806128be57506128bc82613fe0565b155b806128cf57506128cd81613fe0565b155b806128d957508051155b156128ef576128e784613feb565b505050610b6c565b82518251825161016087015160009060ff16600814156129145781838508905061292c565b61016088015160ff1660091415612770578183850990505b61293e88610100015161278483611ba1565b5050505050505050565b61295061575e565b61295e826101000151613f9e565b905061296861575e565b612976836101000151613f9e565b905061299c83610100015161278461298d8461114f565b6129968661114f565b14614034565b505050565b6129a961575e565b6129b7826101000151613f9e565b90506129c281613fe0565b6129de576129d98261010001516127846000611ba1565b6129f9565b80516101008301518115906129f69061278483611ba1565b50505b5050565b612a0561575e565b612a13826101000151613f9e565b9050612a1e81613fe0565b612a3157612a2b82613feb565b50610b6c565b80516101008301518119906129f69061278483611ba1565b612a5161575e565b612a5f826101000151613f9e565b90506129f9826101000151612784611cca8461114f565b612a7e61575e565b612a8c826101000151613f9e565b90506129f982610100015161278483614056565b612aa861575e565b612ab6826101000151613f9e565b9050612ac1816140bf565b1580612ad35750806040015151600714155b15612ae157612a2b82613feb565b604081015160005b6007811015612b2357612b0e828281518110612b0157fe5b6020026020010151613fe0565b612b1b576128e784613feb565b600101612ae9565b50612b2c6157fd565b60005b6019811015612b905760406003821602836004830481518110612b4e57fe5b602002602001015160000151901c6001600160401b03168260058381612b7057fe5b04600584066005020160198110612b8357fe5b6020020152600101612b2f565b50612b9a816140cc565b604080516007808252610100820190925291925060609190816020015b612bbf61575e565b815260200190600190039081612bb757905050905060005b6007811015612c0957612bea6000611ba1565b828281518110612bf657fe5b6020908102919091010152600101612bd7565b5060005b6019811015612c6457604060038216028360058304600584066005020160198110612c3457fe5b6020020151901b826004830481518110612c4a57fe5b602090810291909101015180519091179052600101612c0d565b50612c7785610100015161278483611dd7565b5050505050565b612c8661575e565b612c94826101000151613f9e565b9050612c9e61575e565b612cac836101000151613f9e565b9050612cb661575e565b612cc4846101000151613f9e565b9050612ccf83613fe0565b1580612ce15750612cdf82613fe0565b155b80612cf25750612cf081613fe0565b155b15612d00576128e784613feb565b8251825182516101008701516040805180820190915283815260208101839052612d33919061278490611cca9087614cbd565b50505050505050565b6129f9816101000151613f9e565b610b6c81610100015182602001516080015161400a565b610b6c81610100015182602001516060015161400a565b612d86816101000151613f9e565b60209091015160600152565b612d9a61575e565b612da8826101000151613f9e565b9050612db3816153da565b612dc057612a2b82613feb565b612dc98161114f565b6020830151525050565b612ddb61575e565b612de9826101000151613f9e565b9050612df361575e565b612e01836101000151613f9e565b9050612e0c826153da565b1580612e1e5750612e1c81613fe0565b155b15612e2c5761258383613feb565b80511561299c57612e3c8261114f565b602084015152505050565b61010081015151600090158015612e775750612e64610859611020565b612e7583602001516020015161114f565b145b90506129f982610100015161278483614034565b610100810151815151610b6c91906127849060016153e7565b610b6c816101200151612784836101000151613f9e565b610b6c816101000151612784836101200151613f9e565b61012081015151600090158015612e775750612eef610859611020565b612e7583602001516040015161114f565b610b6c816101000151612784836020015160c0015160016153e7565b612f2461575e565b612f32826101000151613f9e565b9050612f3d816153da565b612f4a57612a2b82613feb565b612f538161114f565b602083015160c001525050565b612f6861575e565b612f76826101000151613f9e565b9050612f878261010001518261400a565b6129f98261010001518261400a565b612f9e61575e565b612fac826101000151613f9e565b9050612fb661575e565b612fc4836101000151613f9e565b9050612fd58361010001518261400a565b612fe48361010001518361400a565b61299c8361010001518261400a565b612ffb61575e565b613009826101000151613f9e565b905061301361575e565b613021836101000151613f9e565b905061302b61575e565b613039846101000151613f9e565b905061304a8461010001518261400a565b6130598461010001518361400a565b6130688461010001518461400a565b6129f68461010001518261400a565b61307f61575e565b61308d826101000151613f9e565b905061309761575e565b6130a5836101000151613f9e565b9050612fe48361010001518361400a565b6130be61575e565b6130cc826101000151613f9e565b90506130d661575e565b6130e4836101000151613f9e565b90506130ee61575e565b6130fc846101000151613f9e565b905061310d8461010001518461400a565b6130688461010001518361400a565b61312461575e565b613132826101000151613f9e565b905061313c61575e565b61314a836101000151613f9e565b905061315582613fe0565b15806131675750613165816140bf565b155b80613181575061317681615498565b60ff16826000015110155b1561318f5761258383613feb565b61299c83610100015182604001518460000151815181106131ac57fe5b602002602001015161400a565b6131c161575e565b6131cf826101000151613f9e565b90506131d961575e565b6131e7836101000151613f9e565b90506131f161575e565b6131ff846101000151613f9e565b905061320a83613fe0565b158061321c575061321a826140bf565b155b80613236575061322b82615498565b60ff16836000015110155b15613244576128e784613feb565b60408201518351815183918391811061325957fe5b6020026020010181905250612c7785610100015161278483611dd7565b61327e61575e565b61328c826101000151613f9e565b9050613297816140bf565b6132a457612a2b82613feb565b6129f98261010001516127846132b984615498565b60ff16611ba1565b6132c961575e565b6132d7826101000151613f9e565b90506132e161575e565b6132ef836101200151613f9e565b90506132fa82613fe0565b158061330c575061330a816140bf565b155b80613326575061331b81615498565b60ff16826000015110155b156133345761258383613feb565b61318f8361012001518261400a565b61334b61575e565b613359826101000151613f9e565b905061336361575e565b613371836101000151613f9e565b905061337b61575e565b613389846101200151613f9e565b9050613394816140bf565b15806133a657506133a483613fe0565b155b806133c057506133b581615498565b60ff16836000015110155b156133ce576128e784613feb565b6040810151835181518491839181106133e357fe5b6020026020010181905250612c7785610120015161278483611dd7565b8060800151613416610859836101000151613f9e565b6040805160208082019490945280820192909252805180830382018152606090920190528051910120608090910152565b61344f61575e565b61345d826101000151613f9e565b9050612710816080015111806134795750613477816154bf565b155b1561348757612a2b82613feb565b81606001516134958261114f565b6040516020018083815260200182815260200192505050604051602081830303815290604052805190602001208260600181815250505050565b6134d761575e565b6134e5826101000151613f9e565b90506134f2610859611020565b613503836020015160e0015161114f565b1461351b57613511826155bd565b602083015160e001525b6129f98261010001516127846135308461114f565b612996866020015160e001516040015160018151811061228e57fe5b613557610859611020565b613568826020015160e0015161114f565b1461359a57613584816101000151826020015160e0015161400a565b61358c611020565b602082015160e00152610b6c565b610b6c816101000151612784836155bd565b610b6c81613feb565b610b6c8160200151615656565b6135ca61575e565b6135d8826101000151613f9e565b90506135e381613fe0565b6135f057612a2b82613feb565b51602082015160a0015250565b610b6c816101000151612784836020015160a00151611ba1565b61010081015160408051600160f81b6020808301919091526000602183018190526022808401919091528351808403909101815260429092019092528051910120610b6c91906127849060016153e7565b61367061575e565b61367e826101000151613f9e565b905061368861575e565b613696836101000151613f9e565b90506136a182613fe0565b15806136b357506136b1816153da565b155b156136c15761258383613feb565b61299c83610100015161278484600001516136db8561114f565b611067565b6136e861575e565b6136f6826101000151613f9e565b905061370061575e565b61370e836101000151613f9e565b905061371861575e565b613726846101000151613f9e565b905061373183613fe0565b15806137435750613741816153da565b155b15613751576128e784613feb565b6129f6846101000151612784856000015161376b8561114f565b866110cb565b604080516000808252602082019092526060916137a4565b61379161575e565b8152602001906001900390816137895790505b5090506129f982610100015161278483611dd7565b6137c161575e565b6137cf826101000151613f9e565b90506137d961575e565b6137e7836101000151613f9e565b90506137f161575e565b6137ff846101000151613f9e565b905061380961575e565b613817856101000151613f9e565b905061382284613fe0565b1580613834575061383283613fe0565b155b80613845575061384382613fe0565b155b80613856575061385481613fe0565b155b15613864576108ec85613feb565b8351835183511580159061387a57508351600114155b1561389d576138928761010001516127846000611ba1565b505050505050610b6c565b83518351604080516000808252602080830180855285905260ff601b9096019586168385015260608301889052608083018790529251909260019260a080820193601f1981019281900390910190855afa1580156138ff573d6000803e3d6000fd5b5050506020604051035190506139268a6101000151612784836001600160a01b0316611ba1565b50505050505050505050565b61393a61575e565b613948826101000151613f9e565b905061395261575e565b613960836101000151613f9e565b905061396a61575e565b613978846101000151613f9e565b905061398261575e565b613990856101000151613f9e565b905061399b84613fe0565b15806139ad57506139ab83613fe0565b155b806139be57506139bc82613fe0565b155b806139cf57506139cd81613fe0565b155b156139dd576108ec85613feb565b6139e561581c565b5060408051608081018252855181528451602082015283519181019190915281516060820152613a1361583a565b600060408260808560066107d05a03fa905080613a3f57613a3388613feb565b50505050505050610b6c565b610100880151613a5a906127848460015b6020020151611ba1565b61010088015161293e90612784846000613a50565b613a7761575e565b613a85826101000151613f9e565b9050613a8f61575e565b613a9d836101000151613f9e565b9050613aa761575e565b613ab5846101000151613f9e565b9050613ac083613fe0565b1580613ad25750613ad082613fe0565b155b80613ae35750613ae181613fe0565b155b15613af1576128e784613feb565b613af9615858565b50604080516060810182528451815283516020820152825191810191909152613b2061583a565b600060408260808560076107d05a03fa905080613b405761389287613feb565b610100870151613b5590612784846001613a50565b610100870151612d3390612784846000613a50565b613b7261575e565b613b80826101000151613f9e565b9050613b8a615876565b60005b601e811015613c1a57613b9f836140bf565b613bac576128e784613feb565b60408301518051613bbd5750613c1a565b8051600214613bcf576108ec85613feb565b80600081518110613bdc57fe5b60200260200101518383601e8110613bf057fe5b6020020152805181906001908110613c0457fe5b6020908102919091010151935050600101613b8d565b613c29846207a12083026119f4565b15613c3657505050610b6c565b613c3f836140bf565b1580613c4f575060408301515115155b15613c5d576128e784613feb565b613c656158a4565b60005b82811015613e2757613c7861575e565b8482601e8110613c8457fe5b60200201519050613c94816140bf565b613ca15761389287613feb565b60408101518051600614613cb857613a3388613feb565b60005b6006811015613cf557613cd3828281518110612b0157fe5b613ced57613ce089613feb565b5050505050505050610b6c565b600101613cbb565b5080600081518110613d0357fe5b602002602001015160000151848460060260b48110613d1e57fe5b6020020152805181906001908110613d3257fe5b602002602001015160000151848460060260010160b48110613d5057fe5b6020020152805181906003908110613d6457fe5b602002602001015160000151848460060260020160b48110613d8257fe5b6020020152805181906002908110613d9657fe5b602002602001015160000151848460060260030160b48110613db457fe5b6020020152805181906005908110613dc857fe5b602002602001015160000151848460060260040160b48110613de657fe5b6020020152805181906004908110613dfa57fe5b602002602001015160000151848460060260050160b48110613e1857fe5b60200201525050600101613c68565b5060c08202613e346158c3565b6000602082848660086107d05a03fa905080613e5357613a3388613feb565b610100880151825161293e9190612784901515614034565b600161010090910152565b60008160200183511015613ec6576040805162461bcd60e51b815260206004820152601260248201527152656164206f7574206f6620626f756e647360701b604482015290519081900360640190fd5b50016020015190565b6008101590565b60008060208301611f7e858563ffffffff613e7616565b613ef561575e565b6040805160a0810182528481528151606081018352600080825260208281018290528451828152808201865293949085019390830191613f4b565b613f3861575e565b815260200190600190039081613f305790505b50905281526040805160008082526020828101909352919092019190613f87565b613f7461575e565b815260200190600190039081613f6c5790505b508152600260208201526040019290925250919050565b613fa661575e565b613fae61575e565b8260200151600184600001510381518110613fc557fe5b60209081029190910101518351600019018452915050919050565b6060015160ff161590565b613ff481611a5e565b6101008101516000908190526101209091015152565b80826020015183600001518151811061401f57fe5b60209081029190910101525080516001019052565b61403c61575e565b811561404c576111756001611ba1565b6111756000611ba1565b61405e61575e565b816060015160ff16600214156140af576040805162461bcd60e51b8152602060048201526011602482015270696e76616c6964207479706520636f646560781b604482015290519081900360640190fd5b6110c5826060015160ff16611ba1565b6060015160ff1660031490565b6140d46157fd565b6140dc6156b4565b6140e46156b4565b6140ec6157fd565b6140f46158e1565b60405180610300016040528060018152602001618082815260200167800000000000808a8152602001678000000080008000815260200161808b81526020016380000001815260200167800000008000808181526020016780000000000080098152602001608a81526020016088815260200163800080098152602001638000000a8152602001638000808b815260200167800000000000008b8152602001678000000000008089815260200167800000000000800381526020016780000000000080028152602001678000000000000080815260200161800a815260200167800000008000000a81526020016780000000800080818152602001678000000000008080815260200163800000018152602001678000000080008008815250905060008090505b6018811015614cb2576080878101516060808a01516040808c01516020808e01518e511890911890921890931889526101208b01516101008c015160e08d015160c08e015160a08f0151181818189089018190526101c08b01516101a08c01516101808d01516101608e01516101408f0151181818189289019283526102608b01516102408c01516102208d01516102008e01516101e08f015118181818918901919091526103008a01516102e08b01516102c08c01516102a08d01516102808e0151181818189288018390526001600160401b0360028202166001603f1b91829004179092188652510485600260200201516002026001600160401b03161785600060200201511884600160200201526001603f1b85600360200201518161434057fe5b0485600360200201516002026001600160401b03161785600160200201511884600260200201526001603f1b85600460200201518161437b57fe5b0485600460200201516002026001600160401b0316178560026005811061439e57fe5b602002015118606085015284516001603f1b9086516060808901519390920460029091026001600160401b031617909118608086810191825286518a5118808b5287516020808d018051909218825289516040808f0180519092189091528a518e8801805190911890528a51948e0180519095189094528901805160a08e0180519091189052805160c08e0180519091189052805160e08e018051909118905280516101008e0180519091189052516101208d018051909118905291880180516101408d018051909118905280516101608d018051909118905280516101808d018051909118905280516101a08d0180519091189052516101c08c018051909118905292870180516101e08c018051909118905280516102008c018051909118905280516102208c018051909118905280516102408c0180519091189052516102608b018051909118905281516102808b018051909118905281516102a08b018051909118905281516102c08b018051909118905281516102e08b018051909118905290516103008a01805190911890529084525163100000009060208901516001600160401b03641000000000909102169190041761010084015260408701516001603d1b9060408901516001600160401b03600890910216919004176101608401526060870151628000009060608901516001600160401b036502000000000090910216919004176102608401526080870151654000000000009060808901516001600160401b036204000090910216919004176102c084015260a08701516001603f1b900487600560200201516002026001600160401b0316178360026019811061460857fe5b602002015260c0870151621000008104651000000000009091026001600160401b039081169190911760a085015260e0880151664000000000000081046104009091028216176101a08501526101008801516208000081046520000000000090910282161761020085015261012088015160048082029092166001603e1b909104176103008501526101408801516101408901516001600160401b036001603e1b90910216919004176080840152610160870151670400000000000000906101608901516001600160401b036040909102169190041760e084015261018087015162200000906101808901516001600160401b036508000000000090910216919004176101408401526101a08701516602000000000000906101a08901516001600160401b0361800090910216919004176102408401526101c08701516008906101c08901516001600160401b036001603d1b90910216919004176102a08401526101e0870151641000000000906101e08901516001600160401b03631000000090910216919004176020840152610200808801516102008901516001600160401b0366800000000000009091021691900417610120840152610220870151648000000000906102208901516001600160401b036302000000909102169190041761018084015261024087015165080000000000906102408901516001600160401b036220000090910216919004176101e0840152610260870151610100906102608901516001600160401b03600160381b90910216919004176102e0840152610280870151642000000000906102808901516001600160401b036308000000909102169190041760608401526102a087015165100000000000906102a08901516001600160401b0362100000909102169190041760c08401526102c08701516302000000906102c08901516001600160401b0364800000000090910216919004176101c08401526102e0870151600160381b906102e08901516001600160401b036101009091021691900417610220840152610300870151660400000000000090048760186020020151614000026001600160401b031617836014602002015282600a602002015183600560200201511916836000602002015118876000602002015282600b602002015183600660200201511916836001602002015118876001602002015282600c602002015183600760200201511916836002602002015118876002602002015282600d602002015183600860200201511916836003602002015118876003602002015282600e602002015183600960200201511916836004602002015118876004602002015282600f602002015183600a602002015119168360056020020151188760056020020152826010602002015183600b602002015119168360066020020151188760066020020152826011602002015183600c602002015119168360076020020151188760076020020152826012602002015183600d602002015119168360086020020151188760086020020152826013602002015183600e602002015119168360096020020151188760096020020152826014602002015183600f6020020151191683600a60200201511887600a602002015282601560200201518360106020020151191683600b60200201511887600b602002015282601660200201518360116020020151191683600c60200201511887600c602002015282601760200201518360126020020151191683600d60200201511887600d602002015282601860200201518360136020020151191683600e60200201511887600e602002015282600060200201518360146020020151191683600f60200201511887600f6020020152826001602002015183601560200201511916836010602002015118876010602002015282600260200201518360166020020151191683601160200201511887601160200201528260036020020151836017602002015119168360126020020151188760126020020152826004602002015183601860200201511916836013602002015118876013602002015282600560200201518360006020020151191683601460200201511887601460200201528260066020020151836001602002015119168360156020020151188760156020020152826007602002015183600260200201511916836016602002015118876016602002015282600860200201518360036020020151191683601760200201511887601760200201528260096020020151836004602002015119168360186020020151188760186020020152818160188110614ca057fe5b6020020151875118875260010161421b565b509495945050505050565b6000614cc7615900565b50604080516108008101825263428a2f9881526371374491602082015263b5c0fbcf9181019190915263e9b5dba56060820152633956c25b60808201526359f111f160a082015263923f82a460c082015263ab1c5ed560e082015263d807aa986101008201526312835b0161012082015263243185be61014082015263550c7dc36101608201526372be5d746101808201526380deb1fe6101a0820152639bdc06a76101c082015263c19bf1746101e082015263e49b69c161020082015263efbe4786610220820152630fc19dc661024082015263240ca1cc610260820152632de92c6f610280820152634a7484aa6102a0820152635cb0a9dc6102c08201526376f988da6102e082015263983e515261030082015263a831c66d61032082015263b00327c861034082015263bf597fc761036082015263c6e00bf361038082015263d5a791476103a08201526306ca63516103c082015263142929676103e08201526327b70a85610400820152632e1b2138610420820152634d2c6dfc6104408201526353380d1361046082015263650a735461048082015263766a0abb6104a08201526381c2c92e6104c08201526392722c856104e082015263a2bfe8a161050082015263a81a664b61052082015263c24b8b7061054082015263c76c51a361056082015263d192e81961058082015263d69906246105a082015263f40e35856105c082015263106aa0706105e08201526319a4c116610600820152631e376c08610620820152632748774c6106408201526334b0bcb561066082015263391c0cb3610680820152634ed8aa4a6106a0820152635b9cca4f6106c082015263682e6ff36106e082015263748f82ee6107008201526378a5636f6107208201526384c87814610740820152638cc702086107608201526390befffa61078082015263a4506ceb6107a082015263bef9a3f76107c082015263c67178f26107e0820152614f92615900565b60005b60088163ffffffff16101561501f5763ffffffff6020820260e003168660006020020151901c828263ffffffff1660408110614fcd57fe5b63ffffffff92831660209182029290920191909152820260e003168660016020020151901c828260080163ffffffff166040811061500757fe5b63ffffffff9092166020929092020152600101614f95565b5060106000805b60408363ffffffff16101561517b57600384600f850363ffffffff166040811061504c57fe5b602002015163ffffffff16901c61507d85600f860363ffffffff166040811061507157fe5b60200201516012615661565b6150a186600f870363ffffffff166040811061509557fe5b60200201516007615661565b18189150600a846002850363ffffffff16604081106150bc57fe5b602002015163ffffffff16901c6150ed856002860363ffffffff16604081106150e157fe5b60200201516013615661565b615111866002870363ffffffff166040811061510557fe5b60200201516011615661565b1818905080846007850363ffffffff166040811061512b57fe5b602002015183866010870363ffffffff166040811061514657fe5b6020020151010101848463ffffffff166040811061516057fe5b63ffffffff9092166020929092020152600190920191615026565b61518361591f565b600093505b60088463ffffffff1610156151d4578360200260e00363ffffffff1688901c818563ffffffff16600881106151b957fe5b63ffffffff9092166020929092020152600190930192615188565b60008060008096505b60408763ffffffff1610156153295760808401516151fc906019615661565b608085015161520c90600b615661565b608086015161521c906006615661565b18189450878763ffffffff166040811061523257fe5b6020020151898863ffffffff166040811061524957fe5b6020020151608086015160a087015160c088015161526892919061567f565b87876007602002015101010101925061528984600060200201516016615661565b845161529690600d615661565b85516152a3906002615661565b6040870180516020890180518a5160c08c01805163ffffffff90811660e08f015260a08e018051821690925260808e018051821690925260608e0180518e018216909252808616909152808316909552848116909252808318919091169116189290911892909218818101868101909316875260019990990198975090925090506151dd565b600096505b60088763ffffffff16101561537d578660200260e00363ffffffff168b901c848863ffffffff166008811061535f57fe5b60200201805163ffffffff920191909116905260019096019561532e565b60008097505b60088863ffffffff1610156153ca578760200260e00363ffffffff16858963ffffffff16600881106153b157fe5b602002015160019099019863ffffffff16901b17615383565b9c9b505050505050505050505050565b6060015160ff1660011490565b6153ef61575e565b6040805160a0810182528481528151606081018352600080825260208281018290528451828152808201865293949085019390830191615445565b61543261575e565b81526020019060019003908161542a5790505b50905281526040805160008082526020828101909352919092019190615481565b61546e61575e565b8152602001906001900390816154665790505b508152606460208201526040019290925250919050565b606081015160009060ff16600314156154b7575060408101515161101b565b50600161101b565b606081015160009060ff166154d65750600161101b565b606082015160ff16600114156154ee5750600061101b565b606082015160ff1660021415615542576040805162461bcd60e51b81526020600482015260146024820152736d75737420686176652066756c6c2076616c756560601b604482015290519081900360640190fd5b606082015160ff16600314156155a55760408201515160005b8181101561559a576155838460400151828151811061557657fe5b60200260200101516154bf565b6155925760009250505061101b565b60010161555b565b50600191505061101b565b606082015160ff166064141561122e5750600061101b565b6155c561575e565b60e082015160408051808201909152600981526812539093d617d5905360ba1b6020820152906156365760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561066357818101518382015260200161064b565b5061564982604001518360e00151615688565b60408301525060c0015190565b600261010090910152565b63ffffffff9182166020829003831681901b919092169190911c1790565b82191691161890565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b6040518060a001604052806005906020820280388339509192915050565b604051806101c001604052806156e6615792565b81526020016156f3615792565b81526000602082018190526040820181905260608201819052608082015260a00161571c61575e565b81526000602082015260400161573061593e565b815260200161573d61593e565b81526000602082018190526040820181905260608083015260809091015290565b6040518060a0016040528060008152602001615778615958565b815260606020820181905260006040830181905291015290565b60408051610120810190915260008152602081016157ae61575e565b81526020016157bb61575e565b81526020016157c861575e565b81526020016157d561575e565b815260006020820181905260408201526060016157f061575e565b8152602001600081525090565b6040518061032001604052806019906020820280388339509192915050565b60405180608001604052806004906020820280388339509192915050565b60405180604001604052806002906020820280388339509192915050565b60405180606001604052806003906020820280388339509192915050565b604051806103c00160405280601e905b61588e61575e565b8152602001906001900390816158865790505090565b60405180611680016040528060b4906020820280388339509192915050565b60405180602001604052806001906020820280388339509192915050565b6040518061030001604052806018906020820280388339509192915050565b6040518061080001604052806040906020820280388339509192915050565b6040518061010001604052806008906020820280388339509192915050565b604051806040016040528060008152602001606081525090565b604080516060808201835260008083526020830152918101919091529056fea265627a7a72315820ee11c4f69638dabf7dfc8e8f7fd6a47eb86bac9a00bb872531b1b0d7413ccd3064736f6c63430005110032"

// DeployOneStepProof deploys a new Ethereum contract, binding an instance of OneStepProof to it.
func DeployOneStepProof(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *OneStepProof, error) {
	parsed, err := abi.JSON(strings.NewReader(OneStepProofABI))
	if err != nil {
		return common.Address{}, nil, nil, err
	}

	address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(OneStepProofBin), backend)
	if err != nil {
		return common.Address{}, nil, nil, err
	}
	return address, tx, &OneStepProof{OneStepProofCaller: OneStepProofCaller{contract: contract}, OneStepProofTransactor: OneStepProofTransactor{contract: contract}, OneStepProofFilterer: OneStepProofFilterer{contract: contract}}, nil
}

// OneStepProof is an auto generated Go binding around an Ethereum contract.
type OneStepProof struct {
	OneStepProofCaller     // Read-only binding to the contract
	OneStepProofTransactor // Write-only binding to the contract
	OneStepProofFilterer   // Log filterer for contract events
}

// OneStepProofCaller is an auto generated read-only Go binding around an Ethereum contract.
type OneStepProofCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}

// OneStepProofTransactor is an auto generated write-only Go binding around an Ethereum contract.
type OneStepProofTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}

// OneStepProofFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type OneStepProofFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}

// OneStepProofSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type OneStepProofSession struct {
	Contract     *OneStepProof     // Generic contract binding to set the session for
	CallOpts     bind.CallOpts     // Call options to use throughout this session
	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
}

// OneStepProofCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type OneStepProofCallerSession struct {
	Contract *OneStepProofCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts       // Call options to use throughout this session
}

// OneStepProofTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type OneStepProofTransactorSession struct {
	Contract     *OneStepProofTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts       // Transaction auth options to use throughout this session
}

// OneStepProofRaw is an auto generated low-level Go binding around an Ethereum contract.
type OneStepProofRaw struct {
	Contract *OneStepProof // Generic contract binding to access the raw methods on
}

// OneStepProofCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type OneStepProofCallerRaw struct {
	Contract *OneStepProofCaller // Generic read-only contract binding to access the raw methods on
}

// OneStepProofTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type OneStepProofTransactorRaw struct {
	Contract *OneStepProofTransactor // Generic write-only contract binding to access the raw methods on
}

// NewOneStepProof creates a new instance of OneStepProof, bound to a specific deployed contract.
func NewOneStepProof(address common.Address, backend bind.ContractBackend) (*OneStepProof, error) {
	contract, err := bindOneStepProof(address, backend, backend, backend)
	if err != nil {
		return nil, err
	}
	return &OneStepProof{OneStepProofCaller: OneStepProofCaller{contract: contract}, OneStepProofTransactor: OneStepProofTransactor{contract: contract}, OneStepProofFilterer: OneStepProofFilterer{contract: contract}}, nil
}

// NewOneStepProofCaller creates a new read-only instance of OneStepProof, bound to a specific deployed contract.
func NewOneStepProofCaller(address common.Address, caller bind.ContractCaller) (*OneStepProofCaller, error) {
	contract, err := bindOneStepProof(address, caller, nil, nil)
	if err != nil {
		return nil, err
	}
	return &OneStepProofCaller{contract: contract}, nil
}

// NewOneStepProofTransactor creates a new write-only instance of OneStepProof, bound to a specific deployed contract.
func NewOneStepProofTransactor(address common.Address, transactor bind.ContractTransactor) (*OneStepProofTransactor, error) {
	contract, err := bindOneStepProof(address, nil, transactor, nil)
	if err != nil {
		return nil, err
	}
	return &OneStepProofTransactor{contract: contract}, nil
}

// NewOneStepProofFilterer creates a new log filterer instance of OneStepProof, bound to a specific deployed contract.
func NewOneStepProofFilterer(address common.Address, filterer bind.ContractFilterer) (*OneStepProofFilterer, error) {
	contract, err := bindOneStepProof(address, nil, nil, filterer)
	if err != nil {
		return nil, err
	}
	return &OneStepProofFilterer{contract: contract}, nil
}

// bindOneStepProof binds a generic wrapper to an already deployed contract.
func bindOneStepProof(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
	parsed, err := abi.JSON(strings.NewReader(OneStepProofABI))
	if err != nil {
		return nil, err
	}
	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
}

// Call invokes the (constant) contract method with params as input values and
// sets the output to result. The result type might be a single field for simple
// returns, a slice of interfaces for anonymous returns and a struct for named
// returns.
func (_OneStepProof *OneStepProofRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _OneStepProof.Contract.OneStepProofCaller.contract.Call(opts, result, method, params...)
}

// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_OneStepProof *OneStepProofRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _OneStepProof.Contract.OneStepProofTransactor.contract.Transfer(opts)
}

// Transact invokes the (paid) contract method with params as input values.
func (_OneStepProof *OneStepProofRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _OneStepProof.Contract.OneStepProofTransactor.contract.Transact(opts, method, params...)
}

// Call invokes the (constant) contract method with params as input values and
// sets the output to result. The result type might be a single field for simple
// returns, a slice of interfaces for anonymous returns and a struct for named
// returns.
func (_OneStepProof *OneStepProofCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _OneStepProof.Contract.contract.Call(opts, result, method, params...)
}

// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_OneStepProof *OneStepProofTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _OneStepProof.Contract.contract.Transfer(opts)
}

// Transact invokes the (paid) contract method with params as input values.
func (_OneStepProof *OneStepProofTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _OneStepProof.Contract.contract.Transact(opts, method, params...)
}

// ExecuteStep is a free data retrieval call binding the contract method 0x385bc114.
//
// Solidity: function executeStep(bytes32 inboxAcc, bytes32 messagesAcc, bytes32 logsAcc, bytes proof) view returns(uint64 gas, bytes32[5] fields)
func (_OneStepProof *OneStepProofCaller) ExecuteStep(opts *bind.CallOpts, inboxAcc [32]byte, messagesAcc [32]byte, logsAcc [32]byte, proof []byte) (struct {
	Gas    uint64
	Fields [5][32]byte
}, error) {
	var out []interface{}
	err := _OneStepProof.contract.Call(opts, &out, "executeStep", inboxAcc, messagesAcc, logsAcc, proof)

	outstruct := new(struct {
		Gas    uint64
		Fields [5][32]byte
	})

	outstruct.Gas = out[0].(uint64)
	outstruct.Fields = out[1].([5][32]byte)

	return *outstruct, err

}

// ExecuteStep is a free data retrieval call binding the contract method 0x385bc114.
//
// Solidity: function executeStep(bytes32 inboxAcc, bytes32 messagesAcc, bytes32 logsAcc, bytes proof) view returns(uint64 gas, bytes32[5] fields)
func (_OneStepProof *OneStepProofSession) ExecuteStep(inboxAcc [32]byte, messagesAcc [32]byte, logsAcc [32]byte, proof []byte) (struct {
	Gas    uint64
	Fields [5][32]byte
}, error) {
	return _OneStepProof.Contract.ExecuteStep(&_OneStepProof.CallOpts, inboxAcc, messagesAcc, logsAcc, proof)
}

// ExecuteStep is a free data retrieval call binding the contract method 0x385bc114.
//
// Solidity: function executeStep(bytes32 inboxAcc, bytes32 messagesAcc, bytes32 logsAcc, bytes proof) view returns(uint64 gas, bytes32[5] fields)
func (_OneStepProof *OneStepProofCallerSession) ExecuteStep(inboxAcc [32]byte, messagesAcc [32]byte, logsAcc [32]byte, proof []byte) (struct {
	Gas    uint64
	Fields [5][32]byte
}, error) {
	return _OneStepProof.Contract.ExecuteStep(&_OneStepProof.CallOpts, inboxAcc, messagesAcc, logsAcc, proof)
}

// ExecuteStepWithMessage is a free data retrieval call binding the contract method 0x96105dce.
//
// Solidity: function executeStepWithMessage(bytes32 inboxAcc, bytes32 messagesAcc, bytes32 logsAcc, bytes proof, uint8 _kind, uint256 _blockNumber, uint256 _timestamp, address _sender, uint256 _inboxSeqNum, bytes _msgData) view returns(uint64 gas, bytes32[5] fields)
func (_OneStepProof *OneStepProofCaller) ExecuteStepWithMessage(opts *bind.CallOpts, inboxAcc [32]byte, messagesAcc [32]byte, logsAcc [32]byte, proof []byte, _kind uint8, _blockNumber *big.Int, _timestamp *big.Int, _sender common.Address, _inboxSeqNum *big.Int, _msgData []byte) (struct {
	Gas    uint64
	Fields [5][32]byte
}, error) {
	var out []interface{}
	err := _OneStepProof.contract.Call(opts, &out, "executeStepWithMessage", inboxAcc, messagesAcc, logsAcc, proof, _kind, _blockNumber, _timestamp, _sender, _inboxSeqNum, _msgData)

	outstruct := new(struct {
		Gas    uint64
		Fields [5][32]byte
	})

	outstruct.Gas = out[0].(uint64)
	outstruct.Fields = out[1].([5][32]byte)

	return *outstruct, err

}

// ExecuteStepWithMessage is a free data retrieval call binding the contract method 0x96105dce.
//
// Solidity: function executeStepWithMessage(bytes32 inboxAcc, bytes32 messagesAcc, bytes32 logsAcc, bytes proof, uint8 _kind, uint256 _blockNumber, uint256 _timestamp, address _sender, uint256 _inboxSeqNum, bytes _msgData) view returns(uint64 gas, bytes32[5] fields)
func (_OneStepProof *OneStepProofSession) ExecuteStepWithMessage(inboxAcc [32]byte, messagesAcc [32]byte, logsAcc [32]byte, proof []byte, _kind uint8, _blockNumber *big.Int, _timestamp *big.Int, _sender common.Address, _inboxSeqNum *big.Int, _msgData []byte) (struct {
	Gas    uint64
	Fields [5][32]byte
}, error) {
	return _OneStepProof.Contract.ExecuteStepWithMessage(&_OneStepProof.CallOpts, inboxAcc, messagesAcc, logsAcc, proof, _kind, _blockNumber, _timestamp, _sender, _inboxSeqNum, _msgData)
}

// ExecuteStepWithMessage is a free data retrieval call binding the contract method 0x96105dce.
//
// Solidity: function executeStepWithMessage(bytes32 inboxAcc, bytes32 messagesAcc, bytes32 logsAcc, bytes proof, uint8 _kind, uint256 _blockNumber, uint256 _timestamp, address _sender, uint256 _inboxSeqNum, bytes _msgData) view returns(uint64 gas, bytes32[5] fields)
func (_OneStepProof *OneStepProofCallerSession) ExecuteStepWithMessage(inboxAcc [32]byte, messagesAcc [32]byte, logsAcc [32]byte, proof []byte, _kind uint8, _blockNumber *big.Int, _timestamp *big.Int, _sender common.Address, _inboxSeqNum *big.Int, _msgData []byte) (struct {
	Gas    uint64
	Fields [5][32]byte
}, error) {
	return _OneStepProof.Contract.ExecuteStepWithMessage(&_OneStepProof.CallOpts, inboxAcc, messagesAcc, logsAcc, proof, _kind, _blockNumber, _timestamp, _sender, _inboxSeqNum, _msgData)
}

// PrecompilesABI is the input ABI used to generate the binding from.
const PrecompilesABI = "[]"

// PrecompilesBin is the compiled bytecode used for deploying new contracts.
var PrecompilesBin = "0x60556023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea265627a7a7231582089a25ee4d0917faa75d52d337f832f58e8fef2b903c6259ee110daea7c41f21264736f6c63430005110032"

// DeployPrecompiles deploys a new Ethereum contract, binding an instance of Precompiles to it.
func DeployPrecompiles(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Precompiles, error) {
	parsed, err := abi.JSON(strings.NewReader(PrecompilesABI))
	if err != nil {
		return common.Address{}, nil, nil, err
	}

	address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(PrecompilesBin), backend)
	if err != nil {
		return common.Address{}, nil, nil, err
	}
	return address, tx, &Precompiles{PrecompilesCaller: PrecompilesCaller{contract: contract}, PrecompilesTransactor: PrecompilesTransactor{contract: contract}, PrecompilesFilterer: PrecompilesFilterer{contract: contract}}, nil
}

// Precompiles is an auto generated Go binding around an Ethereum contract.
type Precompiles struct {
	PrecompilesCaller     // Read-only binding to the contract
	PrecompilesTransactor // Write-only binding to the contract
	PrecompilesFilterer   // Log filterer for contract events
}

// PrecompilesCaller is an auto generated read-only Go binding around an Ethereum contract.
type PrecompilesCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}

// PrecompilesTransactor is an auto generated write-only Go binding around an Ethereum contract.
type PrecompilesTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}

// PrecompilesFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type PrecompilesFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}

// PrecompilesSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type PrecompilesSession struct {
	Contract     *Precompiles      // Generic contract binding to set the session for
	CallOpts     bind.CallOpts     // Call options to use throughout this session
	TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session
}

// PrecompilesCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type PrecompilesCallerSession struct {
	Contract *PrecompilesCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts      // Call options to use throughout this session
}

// PrecompilesTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type PrecompilesTransactorSession struct {
	Contract     *PrecompilesTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts      // Transaction auth options to use throughout this session
}

// PrecompilesRaw is an auto generated low-level Go binding around an Ethereum contract.
type PrecompilesRaw struct {
	Contract *Precompiles // Generic contract binding to access the raw methods on
}

// PrecompilesCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type PrecompilesCallerRaw struct {
	Contract *PrecompilesCaller // Generic read-only contract binding to access the raw methods on
}

// PrecompilesTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type PrecompilesTransactorRaw struct {
	Contract *PrecompilesTransactor // Generic write-only contract binding to access the raw methods on
}

// NewPrecompiles creates a new instance of Precompiles, bound to a specific deployed contract.
func NewPrecompiles(address common.Address, backend bind.ContractBackend) (*Precompiles, error) {
	contract, err := bindPrecompiles(address, backend, backend, backend)
	if err != nil {
		return nil, err
	}
	return &Precompiles{PrecompilesCaller: PrecompilesCaller{contract: contract}, PrecompilesTransactor: PrecompilesTransactor{contract: contract}, PrecompilesFilterer: PrecompilesFilterer{contract: contract}}, nil
}

// NewPrecompilesCaller creates a new read-only instance of Precompiles, bound to a specific deployed contract.
func NewPrecompilesCaller(address common.Address, caller bind.ContractCaller) (*PrecompilesCaller, error) {
	contract, err := bindPrecompiles(address, caller, nil, nil)
	if err != nil {
		return nil, err
	}
	return &PrecompilesCaller{contract: contract}, nil
}

// NewPrecompilesTransactor creates a new write-only instance of Precompiles, bound to a specific deployed contract.
func NewPrecompilesTransactor(address common.Address, transactor bind.ContractTransactor) (*PrecompilesTransactor, error) {
	contract, err := bindPrecompiles(address, nil, transactor, nil)
	if err != nil {
		return nil, err
	}
	return &PrecompilesTransactor{contract: contract}, nil
}

// NewPrecompilesFilterer creates a new log filterer instance of Precompiles, bound to a specific deployed contract.
func NewPrecompilesFilterer(address common.Address, filterer bind.ContractFilterer) (*PrecompilesFilterer, error) {
	contract, err := bindPrecompiles(address, nil, nil, filterer)
	if err != nil {
		return nil, err
	}
	return &PrecompilesFilterer{contract: contract}, nil
}

// bindPrecompiles binds a generic wrapper to an already deployed contract.
func bindPrecompiles(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
	parsed, err := abi.JSON(strings.NewReader(PrecompilesABI))
	if err != nil {
		return nil, err
	}
	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
}

// Call invokes the (constant) contract method with params as input values and
// sets the output to result. The result type might be a single field for simple
// returns, a slice of interfaces for anonymous returns and a struct for named
// returns.
func (_Precompiles *PrecompilesRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _Precompiles.Contract.PrecompilesCaller.contract.Call(opts, result, method, params...)
}

// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_Precompiles *PrecompilesRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _Precompiles.Contract.PrecompilesTransactor.contract.Transfer(opts)
}

// Transact invokes the (paid) contract method with params as input values.
func (_Precompiles *PrecompilesRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _Precompiles.Contract.PrecompilesTransactor.contract.Transact(opts, method, params...)
}

// Call invokes the (constant) contract method with params as input values and
// sets the output to result. The result type might be a single field for simple
// returns, a slice of interfaces for anonymous returns and a struct for named
// returns.
func (_Precompiles *PrecompilesCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _Precompiles.Contract.contract.Call(opts, result, method, params...)
}

// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_Precompiles *PrecompilesTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _Precompiles.Contract.contract.Transfer(opts)
}

// Transact invokes the (paid) contract method with params as input values.
func (_Precompiles *PrecompilesTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _Precompiles.Contract.contract.Transact(opts, method, params...)
}
