// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.

package accessors

import (
	"errors"
	"math/big"
	"strings"

	ethereum "github.com/thetatoken/thetasubchain/eth"
	"github.com/thetatoken/thetasubchain/eth/abi"
	"github.com/thetatoken/thetasubchain/eth/abi/bind"
	"github.com/thetatoken/theta/common"
	"github.com/thetatoken/thetasubchain/eth/core/types"
	"github.com/thetatoken/thetasubchain/eth/event"
)

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

// ChainRegistrarOnMainchainSubchainMetadata is an auto generated low-level Go binding around an user-defined struct.
type ChainRegistrarOnMainchainSubchainMetadata struct {
	Guarantor          common.Address
	CollateralAmount   *big.Int
	GovernanceToken    common.Address
	GenesisHash        string
	RegistrationHeight *big.Int
	Exists             bool
}

// ValidatorStakeManagerStake is an auto generated low-level Go binding around an user-defined struct.
type ValidatorStakeManagerStake struct {
	Validator   common.Address
	ShareAmount *big.Int
}

// ValidatorStakeManagerStakeSnapshot is an auto generated low-level Go binding around an user-defined struct.
type ValidatorStakeManagerStakeSnapshot struct {
	Height *big.Int
	Stakes []ValidatorStakeManagerStake
}

// WithdrawalQueueWithdrawalRequest is an auto generated low-level Go binding around an user-defined struct.
type WithdrawalQueueWithdrawalRequest struct {
	Receiver     common.Address
	Amount       *big.Int
	ReturnHeight *big.Int
}

// ChainRegistrarOnMainchainMetaData contains all meta data concerning the ChainRegistrarOnMainchain contract.
var ChainRegistrarOnMainchainMetaData = &bind.MetaData{
	ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wTheta_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"superAdmin_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"admin_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"governor_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"numBlocksPerDynasty_\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdrawalPendingPeriodInBlocks_\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"crossChainFee_\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"initialFeeRequired_\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"fallbackReceiver_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"slashAmount\",\"type\":\"uint256\"}],\"name\":\"SlashChainCollateral\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"guarantor\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualSlashedAmount\",\"type\":\"uint256\"}],\"name\":\"SlashValidatorCollateral\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"crossChainFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fallbackReceiver\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"governor\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialFeeRequired\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minChainCollateralAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minSubchainID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"numBlocksPerDynasty\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"subchainCollateralReturnPercentage\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"subchainIDs\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"subchainMetadataMap\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"guarantor\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"collateralAmount\",\"type\":\"uint256\"},{\"internalType\":\"contractSubchainGovernanceToken\",\"name\":\"governanceToken\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"genesisHash\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"registrationHeight\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"exists\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"superAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"vcm\",\"outputs\":[{\"internalType\":\"contractValidatorCollateralManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"vsm\",\"outputs\":[{\"internalType\":\"contractValidatorStakeManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"wTheta\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawalPendingPeriodInBlocks\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"governanceToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"collateralAmount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"genesisHash\",\"type\":\"string\"}],\"name\":\"registerSubchain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"additionalCollateral\",\"type\":\"uint256\"}],\"name\":\"addSubchainCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"}],\"name\":\"deregisterSubchain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"validatorCandidate\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"collateralAmount\",\"type\":\"uint256\"}],\"name\":\"depositCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"validatorCandidate\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"collateralAmount\",\"type\":\"uint256\"}],\"name\":\"withdrawCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"}],\"name\":\"claimCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"govTokenAmount\",\"type\":\"uint256\"}],\"name\":\"depositStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"shareAmount\",\"type\":\"uint256\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"}],\"name\":\"claimStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"slashAmount\",\"type\":\"uint256\"}],\"name\":\"slashChainCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"guarantor\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"slashAmount\",\"type\":\"uint256\"}],\"name\":\"slashValidatorCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newSuperAdmin\",\"type\":\"address\"}],\"name\":\"updateSuperAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"updateAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newGovernor\",\"type\":\"address\"}],\"name\":\"updateGovernor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"updateMinChainCollateralAmount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"updateMinValidatorCollateralAmount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"updateVCMOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"updateVSMOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newCrossChainFee\",\"type\":\"uint256\"}],\"name\":\"updateCrossChainFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newFallbackReceiver\",\"type\":\"address\"}],\"name\":\"updateFallbackReceiver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newPercentage\",\"type\":\"uint256\"}],\"name\":\"updateSubchainCollateralReturnPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynasty\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"dynasty\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCrossChainFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFallbackReceiver\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllSubchainIDs\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"}],\"name\":\"isARegisteredSubchain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"}],\"name\":\"getSubchainMetadata\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"guarantor\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"collateralAmount\",\"type\":\"uint256\"},{\"internalType\":\"contractSubchainGovernanceToken\",\"name\":\"governanceToken\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"genesisHash\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"registrationHeight\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"exists\",\"type\":\"bool\"}],\"internalType\":\"structChainRegistrarOnMainchain.SubchainMetadata\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"}],\"name\":\"getSubchainRegistrationHeight\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"}],\"name\":\"getStakeSnapshotHeights\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumBlocksPerDynasty\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockHeight\",\"type\":\"uint256\"}],\"name\":\"getStakeSnapshot\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"exists\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"targetSnapshotHeight\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"height\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"shareAmount\",\"type\":\"uint256\"}],\"internalType\":\"structValidatorStakeManager.Stake[]\",\"name\":\"stakes\",\"type\":\"tuple[]\"}],\"internalType\":\"structValidatorStakeManager.StakeSnapshot\",\"name\":\"targetStakeSnapshot\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"dynasty\",\"type\":\"uint256\"}],\"name\":\"getValidatorSet\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"validators\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"shareAmounts\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"dynasty\",\"type\":\"uint256\"}],\"name\":\"getTotalValidatorShares\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockHeight\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"getValidatorShares\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isAValidator\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"shareAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"}],\"name\":\"getValidatorGuarantorsWithPendingWithdrawals\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"guarantor\",\"type\":\"address\"}],\"name\":\"getPendingValidatorCollateralWithdrawals\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"returnHeight\",\"type\":\"uint256\"}],\"internalType\":\"structWithdrawalQueue.WithdrawalRequest[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"}],\"name\":\"getStakersWithPendingWithdrawals\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"getPendingStakeWithdrawals\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"returnHeight\",\"type\":\"uint256\"}],\"internalType\":\"structWithdrawalQueue.WithdrawalRequest[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
	Bin: "0x60806040526103e860015569021e19e0c9bab24000006002553480156200002557600080fd5b506040516200ac563803806200ac568339810160408190526200004891620001ee565b6001600055600580546001600160a01b03199081166001600160a01b038c8116919091179092556006805482168b84161790556007805482168a8416179055600880548216898416179055600387905560048690556009859055600a849055600b805490911691831691909117905560405130908a908690620000cb90620001b5565b6001600160a01b0393841681529290911660208301526040820152606001604051809103906000f08015801562000106573d6000803e3d6000fd5b50600f60006101000a8154816001600160a01b0302191690836001600160a01b03160217905550303086866040516200013f90620001c3565b6001600160a01b03948516815293909216602084015260408301526060820152608001604051809103906000f0801580156200017f573d6000803e3d6000fd5b50601080546001600160a01b0319166001600160a01b03929092169190911790555050605f600c55506200028595505050505050565b6128fc8062003c5b83390190565b6146ff806200655783390190565b80516001600160a01b0381168114620001e957600080fd5b919050565b60008060008060008060008060006101208a8c0312156200020e57600080fd5b620002198a620001d1565b98506200022960208b01620001d1565b97506200023960408b01620001d1565b96506200024960608b01620001d1565b955060808a0151945060a08a0151935060c08a0151925060e08a01519150620002766101008b01620001d1565b90509295985092959850929598565b6139c680620002956000396000f3fe6080604052600436106102d55760003560e01c80639bbb690a1161017b578063d77a6e66116100d7578063eae243f811610085578063eae243f814610909578063ebea51b41461091f578063ec0903021461093f578063ecda877914610971578063f226952114610991578063f851a440146109b1578063fc80ade3146109d157600080fd5b8063d77a6e6614610834578063da07838614610854578063dba9de6b14610874578063dc1e826314610889578063e2f273bd146108a9578063e6e5e0aa146108c9578063e6eaaa81146108e957600080fd5b8063b3f9997511610134578063b3f9997514610756578063c21d72bf14610776578063c2ae68f414610796578063c49785b4146107b4578063c74fba44146107d4578063cae43fd8146107f4578063cec9c6e11461081457600080fd5b80639bbb690a146106c35780639f9106cf146106d8578063a7464b12146106f8578063a74c83b71461070d578063aace29571461072d578063acca10881461074057600080fd5b80633cc41ef81161023557806362f384ad116101e357806362f384ad146105d357806367016090146105f35780637744f6d41461060957806378154cf7146106365780637e0c6253146106635780639886ddbc1461068357806399ea56b0146106a357600080fd5b80633cc41ef81461049c5780633f216374146104bc57806343b71f05146104f357806343f27e451461053657806344669c031461056457806344c7d6ef14610593578063464fa557146105b357600080fd5b80631be47778116102925780631be47778146103ae5780631ead7deb146103db57806329575f6a146103fb5780632e31ac1e1461041b5780632f2c13b514610431578063331515bc14610466578063336c73081461048657600080fd5b806307ddf6bc146102da5780630c340a24146103105780630cc94f591461033057806313b3849914610354578063164d29f6146103765780631911ee411461038c575b600080fd5b3480156102e657600080fd5b506010546102fa906001600160a01b031681565b60405161030791906133d0565b60405180910390f35b34801561031c57600080fd5b506008546102fa906001600160a01b031681565b34801561033c57600080fd5b50610346600c5481565b604051908152602001610307565b34801561036057600080fd5b506103696109f1565b60405161030791906134f8565b34801561038257600080fd5b5061034660095481565b34801561039857600080fd5b506103ac6103a73660046132b4565b610a49565b005b3480156103ba57600080fd5b506103ce6103c936600461314a565b610d23565b6040516103079190613496565b3480156103e757600080fd5b506103ac6103f6366004613118565b610e27565b34801561040757600080fd5b506006546102fa906001600160a01b031681565b34801561042757600080fd5b50610346600a5481565b34801561043d57600080fd5b5061045161044c366004613118565b610eb3565b60408051928352901515602083015201610307565b34801561047257600080fd5b50610369610481366004613118565b610fd5565b34801561049257600080fd5b5061034660045481565b3480156104a857600080fd5b506103ac6104b7366004613118565b61105c565b3480156104c857600080fd5b506104dc6104d73660046132d6565b6110d4565b604080519215158352602083019190915201610307565b3480156104ff57600080fd5b5061052661050e366004613118565b6000908152600d602052604090206005015460ff1690565b6040519015158152602001610307565b34801561054257600080fd5b506105566105513660046132b4565b611168565b604051610307929190613468565b34801561057057600080fd5b5061058461057f3660046132b4565b6111ff565b6040516103079392919061350b565b34801561059f57600080fd5b506103ac6105ae366004613118565b6112b3565b3480156105bf57600080fd5b506103ce6105ce36600461314a565b6113d3565b3480156105df57600080fd5b506103ac6105ee366004612ddd565b611405565b3480156105ff57600080fd5b5061034660035481565b34801561061557600080fd5b50610629610624366004613118565b611451565b6040516103079190613455565b34801561064257600080fd5b50610656610651366004613118565b611543565b60405161030791906136e9565b34801561066f57600080fd5b5061034661067e3660046132b4565b61166c565b34801561068f57600080fd5b506103ac61069e366004613118565b611748565b3480156106af57600080fd5b506103ac6106be3660046131c2565b611777565b3480156106cf57600080fd5b50600954610346565b3480156106e457600080fd5b506103ac6106f33660046131c2565b6119a5565b34801561070457600080fd5b50610346611acb565b34801561071957600080fd5b506103ac610728366004612ddd565b611b4d565b6103ac61073b3660046131c2565b611ba7565b34801561074c57600080fd5b5061034660015481565b34801561076257600080fd5b506103ac610771366004612ddd565b611eca565b34801561078257600080fd5b506103ac610791366004612ddd565b611f16565b3480156107a257600080fd5b50600b546001600160a01b03166102fa565b3480156107c057600080fd5b506103ac6107cf366004613118565b611f70565b3480156107e057600080fd5b506103ac6107ef3660046131fa565b612055565b34801561080057600080fd5b506103ac61080f366004612ddd565b612350565b34801561082057600080fd5b506103ac61082f366004613118565b61239c565b34801561084057600080fd5b5061034661084f366004613118565b6123cb565b34801561086057600080fd5b506103ac61086f36600461317a565b6123ec565b34801561088057600080fd5b50610451612570565b34801561089557600080fd5b50600f546102fa906001600160a01b031681565b3480156108b557600080fd5b506103ac6108c4366004612ddd565b61258e565b3480156108d557600080fd5b506103ac6108e4366004613118565b6125da565b3480156108f557600080fd5b50610629610904366004613118565b612978565b34801561091557600080fd5b5061034660025481565b34801561092b57600080fd5b506103ac61093a3660046131c2565b6129aa565b34801561094b57600080fd5b5061095f61095a366004613118565b612a93565b60405161030796959493929190613408565b34801561097d57600080fd5b506103ac61098c3660046132b4565b612b62565b34801561099d57600080fd5b50600b546102fa906001600160a01b031681565b3480156109bd57600080fd5b506007546102fa906001600160a01b031681565b3480156109dd57600080fd5b506005546102fa906001600160a01b031681565b6060600e805480602002602001604051908101604052809291908181526020018280548015610a3f57602002820191906000526020600020905b815481526020019060010190808311610a2b575b5050505050905090565b60026000541415610a755760405162461bcd60e51b8152600401610a6c906136b2565b60405180910390fd5b60026000818155838152600d60209081526040808320815160c08101835281546001600160a01b0390811682526001830154948201949094529481015490921690840152600381018054929392606084019190610ad1906138e0565b80601f0160208091040260200160405190810160405280929190818152602001828054610afd906138e0565b8015610b4a5780601f10610b1f57610100808354040283529160200191610b4a565b820191906000526020600020905b815481529060010190602001808311610b2d57829003601f168201915b50505091835250506004820154602082015260059091015460ff16151560409091015260a0810151909150610bd65760405162461bcd60e51b815260206004820152602c60248201527f7468697320737562636861696e20494420686173206e6f74206265656e20726560448201526b19da5cdd195c9959081e595d60a21b6064820152608401610a6c565b80516001600160a01b03163314610c475760405162461bcd60e51b815260206004820152602f60248201527f6f6e6c7920737562636861696e2067756172616e746f722063616e206164642060448201526e1b5bdc994818dbdb1b185d195c985b608a1b6064820152608401610a6c565b6005546040516323b872dd60e01b81526001600160a01b03909116906323b872dd90610c7b903390309087906004016133e4565b602060405180830381600087803b158015610c9557600080fd5b505af1158015610ca9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccd9190612f98565b610ce95760405162461bcd60e51b8152600401610a6c9061363c565b6000838152600d6020526040902060010154610d059083612c24565b6000938452600d602052604084206001908101919091559092555050565b601054604051631a9670f560e21b8152600481018490526060916001600160a01b031690636a59c3d4906024015b60206040518083038186803b158015610d6957600080fd5b505afa158015610d7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da191906130fb565b6001600160a01b0316637d031b65836040518263ffffffff1660e01b8152600401610dcc91906133d0565b60006040518083038186803b158015610de457600080fd5b505afa158015610df8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e209190810190612e99565b9392505050565b6007546001600160a01b03163314610e515760405162461bcd60e51b8152600401610a6c906135c1565b600f54604051631ead7deb60e01b8152600481018390526001600160a01b0390911690631ead7deb906024015b600060405180830381600087803b158015610e9857600080fd5b505af1158015610eac573d6000803e3d6000fd5b5050505050565b6000818152600d60209081526040808320815160c08101835281546001600160a01b0390811682526001830154948201949094526002820154909316918301919091526003810180548493849390929091606084019190610f13906138e0565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3f906138e0565b8015610f8c5780601f10610f6157610100808354040283529160200191610f8c565b820191906000526020600020905b815481529060010190602001808311610f6f57829003601f168201915b50505091835250506004820154602082015260059091015460ff16151560409091015260a0810151909150610fc75750600093849350915050565b608001519360019350915050565b601054604051630cc5456f60e21b8152600481018390526060916001600160a01b03169063331515bc9060240160006040518083038186803b15801561101a57600080fd5b505afa15801561102e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110569190810190612f64565b92915050565b6007546001600160a01b031633146110865760405162461bcd60e51b8152600401610a6c906135c1565b60648111156110cf5760405162461bcd60e51b8152602060048201526015602482015274696e76616c6964206e657750657263656e7461676560581b6044820152606401610a6c565b600c55565b601054604051630fc858dd60e21b815260009182916001600160a01b0390911690633f2163749061110d908890889088906004016137b4565b604080518083038186803b15801561112457600080fd5b505afa158015611138573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115c9190612fb3565b90969095509350505050565b6010546040516343f27e4560e01b8152600481018490526024810183905260609182916001600160a01b03909116906343f27e459060440160006040518083038186803b1580156111b857600080fd5b505afa1580156111cc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111f49190810190612e36565b915091509250929050565b60008061121f604051806040016040528060008152602001606081525090565b6010546040516344669c0360e01b815260048101879052602481018690526001600160a01b03909116906344669c039060440160006040518083038186803b15801561126a57600080fd5b505afa15801561127e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112a69190810190612fdf565b9250925092509250925092565b600260005414156112d65760405162461bcd60e51b8152600401610a6c906136b2565b60026000556040516343b71f0560e01b81526004810182905230906343b71f059060240160206040518083038186803b15801561131257600080fd5b505afa158015611326573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134a9190612f98565b6113665760405162461bcd60e51b8152600401610a6c906135f8565b60105460405163c0cc5e8960e01b815233916001600160a01b03169063c0cc5e89906113989085908590600401613751565b600060405180830381600087803b1580156113b257600080fd5b505af11580156113c6573d6000803e3d6000fd5b5050600160005550505050565b600f54604051631a9670f560e21b8152600481018490526060916001600160a01b031690636a59c3d490602401610d51565b6007546001600160a01b0316331461142f5760405162461bcd60e51b8152600401610a6c906135c1565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b601054604051631a9670f560e21b8152600481018390526060916001600160a01b031690636a59c3d4906024015b60206040518083038186803b15801561149757600080fd5b505afa1580156114ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114cf91906130fb565b6001600160a01b0316638a8097676040518163ffffffff1660e01b815260040160006040518083038186803b15801561150757600080fd5b505afa15801561151b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110569190810190612dfa565b6040805160c080820183526000808352602080840182905283850182905260608085018190526080850183905260a08501839052868352600d8252918590208551938401865280546001600160a01b03908116855260018201549285019290925260028101549091169483019490945260038401805493949293918401916115ca906138e0565b80601f01602080910402602001604051908101604052809291908181526020018280546115f6906138e0565b80156116435780601f1061161857610100808354040283529160200191611643565b820191906000526020600020905b81548152906001019060200180831161162657829003601f168201915b50505091835250506004820154602082015260059091015460ff16151560409091015292915050565b6040516343f27e4560e01b81526004810183905260248101829052600090819030906343f27e459060440160006040518083038186803b1580156116af57600080fd5b505afa1580156116c3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116eb9190810190612e36565b805190925090506000805b8281101561173e5761172a8482815181106117135761171361394c565b602002602001015183612c2490919063ffffffff16565b9150806117368161391b565b9150506116f6565b5095945050505050565b6007546001600160a01b031633146117725760405162461bcd60e51b8152600401610a6c906135c1565b600955565b6002600054141561179a5760405162461bcd60e51b8152600401610a6c906136b2565b60026000556040516343b71f0560e01b81526004810184905230906343b71f059060240160206040518083038186803b1580156117d657600080fd5b505afa1580156117ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180e9190612f98565b61182a5760405162461bcd60e51b8152600401610a6c906135f8565b601054604051630fc858dd60e21b81526000916001600160a01b031690633f2163749061185f908790439088906004016137b4565b604080518083038186803b15801561187657600080fd5b505afa15801561188a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ae9190612fb3565b50905080156119315760405162461bcd60e51b815260206004820152604360248201527f636f6c6c61746572616c207769746864726177616c206e6f7420616c6c6f776560448201527f6420666f7220612076616c696461746f72207769746820616374697665207374606482015262616b6560e81b608482015260a401610a6c565b600f54604051634f9b5c0b60e11b815233916001600160a01b031690639f36b8169061196790889088908890879060040161378d565b600060405180830381600087803b15801561198157600080fd5b505af1158015611995573d6000803e3d6000fd5b5050600160005550505050505050565b600260005414156119c85760405162461bcd60e51b8152600401610a6c906136b2565b60026000556040516343b71f0560e01b81526004810184905230906343b71f059060240160206040518083038186803b158015611a0457600080fd5b505afa158015611a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3c9190612f98565b611a585760405162461bcd60e51b8152600401610a6c906135f8565b601054604051632e74e4a160e21b815233916001600160a01b03169063b9d3928490611a8e90879087908790879060040161378d565b600060405180830381600087803b158015611aa857600080fd5b505af1158015611abc573d6000803e3d6000fd5b50506001600055505050505050565b60105460408051630670160960e41b815290516000926001600160a01b0316916367016090916004808301926020929190829003018186803b158015611b1057600080fd5b505afa158015611b24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b489190613131565b905090565b6007546001600160a01b03163314611b775760405162461bcd60e51b8152600401610a6c906135c1565b600f5460405163880cdc3160e01b81526001600160a01b039091169063880cdc3190610e7e9084906004016133d0565b60026000541415611bca5760405162461bcd60e51b8152600401610a6c906136b2565b60026000556040516343b71f0560e01b81526004810184905230906343b71f059060240160206040518083038186803b158015611c0657600080fd5b505afa158015611c1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c3e9190612f98565b611c5a5760405162461bcd60e51b8152600401610a6c906135f8565b600a54341015611cca5760405162461bcd60e51b815260206004820152603560248201527f6e6f7420656e6f75676820544675656c20746f20636f7665722074686520696e604482015274697469616c20696e7465722d636861696e2066656560581b6064820152608401610a6c565b6040516001600160a01b038316903480156108fc02916000818181858888f19350505050158015611cff573d6000803e3d6000fd5b50600f5460405163cd98536b60e01b81526000916001600160a01b03169063cd98536b90611d339087908790600401613751565b60206040518083038186803b158015611d4b57600080fd5b505afa158015611d5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d839190613131565b9050600f60009054906101000a90046001600160a01b03166001600160a01b03166335b444f06040518163ffffffff1660e01b815260040160206040518083038186803b158015611dd357600080fd5b505afa158015611de7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0b9190613131565b811015611e945760405162461bcd60e51b815260206004820152604b60248201527f6e65656420746f206465706f7369742073756666696369656e7420775448455460448201527f4120636f6c6c61746572616c20746f2061206e6f6465206265666f726520737460648201526a185ada5b99c81d1bc81a5d60aa1b608482015260a401610a6c565b601054604051630e74fc5760e11b815233916001600160a01b031690631ce9f8ae9061196790889088908890879060040161378d565b6007546001600160a01b03163314611ef45760405162461bcd60e51b8152600401610a6c906135c1565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b03163314611f405760405162461bcd60e51b8152600401610a6c906135c1565b60105460405163880cdc3160e01b81526001600160a01b039091169063880cdc3190610e7e9084906004016133d0565b60026000541415611f935760405162461bcd60e51b8152600401610a6c906136b2565b60026000556040516343b71f0560e01b81526004810182905230906343b71f059060240160206040518083038186803b158015611fcf57600080fd5b505afa158015611fe3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120079190612f98565b6120235760405162461bcd60e51b8152600401610a6c906135f8565b600f5460405163014b594760e71b815233916001600160a01b03169063a5aca380906113989085908590600401613751565b600260005414156120785760405162461bcd60e51b8152600401610a6c906136b2565b600260005560015484116120ce5760405162461bcd60e51b815260206004820152601e60248201527f5468697320737562636861696e4944206973206e6f7420616c6c6f77656400006044820152606401610a6c565b6000848152600d60205260409020600581015460ff16156121465760405162461bcd60e51b815260206004820152602c60248201527f7468697320737562636861696e2049442068617320616c72656164792062656560448201526b1b881c9959da5cdd195c995960a21b6064820152608401610a6c565b6002548310156121b05760405162461bcd60e51b815260206004820152602f60248201527f696e73756666696369656e742077544845544120636f6c6c61746572616c206660448201526e37b9103a34329039bab131b430b4b760891b6064820152608401610a6c565b6005546040516323b872dd60e01b815233916001600160a01b0316906323b872dd906121e4908490309089906004016133e4565b602060405180830381600087803b1580156121fe57600080fd5b505af1158015612212573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122369190612f98565b6122525760405162461bcd60e51b8152600401610a6c9061363c565b6040805160c0810182526001600160a01b038084168252602080830188815289831684860190815260608501898152436080870152600160a0870181905260008e8152600d865297909720865181549087166001600160a01b0319918216178255935197810197909755905160028701805491909516921691909117909255905180519293926122e89260038501920190612c54565b506080820151600482015560a0909101516005909101805460ff19169115159190911790555050600e80546001818101835560009283527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd9091019590955593909355505050565b6006546001600160a01b0316331461237a5760405162461bcd60e51b8152600401610a6c9061366f565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b031633146123c65760405162461bcd60e51b8152600401610a6c906135c1565b600255565b600e81815481106123db57600080fd5b600091825260209091200154905081565b6008546001600160a01b031633146124165760405162461bcd60e51b8152600401610a6c9061358c565b6040516343b71f0560e01b81526004810185905230906343b71f059060240160206040518083038186803b15801561244d57600080fd5b505afa158015612461573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124859190612f98565b6124a15760405162461bcd60e51b8152600401610a6c906135f8565b600f546040516314947a0760e21b81526000916001600160a01b031690635251e81c906124d8908890889088908890600401613768565b602060405180830381600087803b1580156124f257600080fd5b505af1158015612506573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252a9190613131565b90507f1099c09baaa6f6984b5ecea47e7a86fb0084d23b7e13a9a453629f6a3e93c62e858585846040516125619493929190613768565b60405180910390a15050505050565b600354600090819043906125849082613888565b9360019350915050565b6006546001600160a01b031633146125b85760405162461bcd60e51b8152600401610a6c9061366f565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b600260005414156125fd5760405162461bcd60e51b8152600401610a6c906136b2565b6002600055600f54604051634f1e404f60e01b8152600481018390526001600160a01b0390911690634f1e404f9060240160206040518083038186803b15801561264657600080fd5b505afa15801561265a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267e9190612f98565b156127175760405162461bcd60e51b815260206004820152605c60248201527f63616e6e6f7420756e7265676973746572206120737562636861696e2077686560448201527f6e20736f6d652076616c696461746f7273207374696c6c20686176652061637460648201527f697665206f7220756e636c61696d656420636f6c6c61746572616c7300000000608482015260a401610a6c565b6000818152600d60209081526040808320815160c08101835281546001600160a01b03908116825260018301549482019490945260028201549093169183019190915260038101805460608401919061276f906138e0565b80601f016020809104026020016040519081016040528092919081815260200182805461279b906138e0565b80156127e85780601f106127bd576101008083540402835291602001916127e8565b820191906000526020600020905b8154815290600101906020018083116127cb57829003601f168201915b50505091835250506004820154602082015260059091015460ff16151560409091015260a081015190915061282f5760405162461bcd60e51b8152600401610a6c906135f8565b8051336001600160a01b038216146128a55760405162461bcd60e51b815260206004820152603360248201527f6f6e6c7920737562636861696e2067756172616e746f722063616e206465726560448201527233b4b9ba32b9103a34329039bab131b430b4b760691b6064820152608401610a6c565b6020820151600c546000906128c8906064906128c2908590612c30565b90612c3c565b60055460405163a9059cbb60e01b81526001600160a01b0386811660048301526024820184905292935091169063a9059cbb90604401602060405180830381600087803b15801561291857600080fd5b505af115801561292c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129509190612f98565b61296c5760405162461bcd60e51b8152600401610a6c9061363c565b50506001600055505050565b600f54604051631a9670f560e21b8152600481018390526060916001600160a01b031690636a59c3d49060240161147f565b600260005414156129cd5760405162461bcd60e51b8152600401610a6c906136b2565b60026000556040516343b71f0560e01b81526004810184905230906343b71f059060240160206040518083038186803b158015612a0957600080fd5b505afa158015612a1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a419190612f98565b612a5d5760405162461bcd60e51b8152600401610a6c906135f8565b600f5460405163117a05d560e01b815233916001600160a01b03169063117a05d590611a8e90879087908790879060040161378d565b600d6020526000908152604090208054600182015460028301546003840180546001600160a01b039485169593949092169291612acf906138e0565b80601f0160208091040260200160405190810160405280929190818152602001828054612afb906138e0565b8015612b485780601f10612b1d57610100808354040283529160200191612b48565b820191906000526020600020905b815481529060010190602001808311612b2b57829003601f168201915b50505050600483015460059093015491929160ff16905086565b6008546001600160a01b03163314612b8c5760405162461bcd60e51b8152600401610a6c9061358c565b6000828152600d60205260409020600581015460ff16612bbe5760405162461bcd60e51b8152600401610a6c906135f8565b8181600101541015612bd257806001015491505b6001810154612be19083612c48565b600182015560408051848152602081018490527f75396b0e74e738b367e9c25e4168aa3b5e00d2ef5650b014c45a338ebedc5834910160405180910390a1505050565b6000610e208284613870565b6000610e2082846138aa565b6000610e208284613888565b6000610e2082846138c9565b828054612c60906138e0565b90600052602060002090601f016020900481019282612c825760008555612cc8565b82601f10612c9b57805160ff1916838001178555612cc8565b82800160010185558215612cc8579182015b82811115612cc8578251825591602001919060010190612cad565b50612cd4929150612cd8565b5090565b5b80821115612cd45760008155600101612cd9565b600082601f830112612cfe57600080fd5b81516020612d13612d0e8361384d565b61381d565b80838252828201915082860187848660051b8901011115612d3357600080fd5b60005b85811015612d5b578151612d4981613978565b84529284019290840190600101612d36565b5090979650505050505050565b600082601f830112612d7957600080fd5b81516020612d89612d0e8361384d565b80838252828201915082860187848660051b8901011115612da957600080fd5b60005b85811015612d5b57815184529284019290840190600101612dac565b80518015158114612dd857600080fd5b919050565b600060208284031215612def57600080fd5b8135610e2081613978565b600060208284031215612e0c57600080fd5b81516001600160401b03811115612e2257600080fd5b612e2e84828501612ced565b949350505050565b60008060408385031215612e4957600080fd5b82516001600160401b0380821115612e6057600080fd5b612e6c86838701612ced565b93506020850151915080821115612e8257600080fd5b50612e8f85828601612d68565b9150509250929050565b60006020808385031215612eac57600080fd5b82516001600160401b03811115612ec257600080fd5b8301601f81018513612ed357600080fd5b8051612ee1612d0e8261384d565b818152838101908385016060808502860187018a1015612f0057600080fd5b60009550855b85811015612f555781838c031215612f1c578687fd5b612f246137d3565b8351612f2f81613978565b815283890151898201526040808501519082015285529387019391810191600101612f06565b50919998505050505050505050565b600060208284031215612f7657600080fd5b81516001600160401b03811115612f8c57600080fd5b612e2e84828501612d68565b600060208284031215612faa57600080fd5b610e2082612dc8565b60008060408385031215612fc657600080fd5b612fcf83612dc8565b9150602083015190509250929050565b600080600060608486031215612ff457600080fd5b612ffd84612dc8565b925060208085015192506040808601516001600160401b038082111561302257600080fd5b818801915082828a03121561303657600080fd5b61303e6137fb565b82518152848301518281111561305357600080fd5b80840193505089601f84011261306857600080fd5b82519150613078612d0e8361384d565b8083825286820191508685018c888660061b880101111561309857600080fd5b60009550855b858110156130e35787828f0312156130b4578687fd5b6130bc6137fb565b82516130c781613978565b8152828a01518a8201528452928801929087019060010161309e565b50508087840152505080955050505050509250925092565b60006020828403121561310d57600080fd5b8151610e2081613978565b60006020828403121561312a57600080fd5b5035919050565b60006020828403121561314357600080fd5b5051919050565b6000806040838503121561315d57600080fd5b82359150602083013561316f81613978565b809150509250929050565b6000806000806080858703121561319057600080fd5b8435935060208501356131a281613978565b925060408501356131b281613978565b9396929550929360600135925050565b6000806000606084860312156131d757600080fd5b8335925060208401356131e981613978565b929592945050506040919091013590565b6000806000806080858703121561321057600080fd5b8435935060208086013561322381613978565b93506040860135925060608601356001600160401b038082111561324657600080fd5b818801915088601f83011261325a57600080fd5b81358181111561326c5761326c613962565b61327e601f8201601f1916850161381d565b9150808252898482850101111561329457600080fd5b808484018584013760008482840101525080935050505092959194509250565b600080604083850312156132c757600080fd5b50508035926020909101359150565b6000806000606084860312156132eb57600080fd5b8335925060208401359150604084013561330481613978565b809150509250925092565b600081518084526020808501945080840160005b838110156133485781516001600160a01b031687529582019590820190600101613323565b509495945050505050565b600081518084526020808501945080840160005b8381101561334857815187529582019590820190600101613367565b6000815180845260005b818110156133a95760208185018101518683018201520161338d565b818111156133bb576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b038781168252602082018790528516604082015260c06060820181905260009061343b90830186613383565b60808301949094525090151560a090910152949350505050565b602081526000610e20602083018461330f565b60408152600061347b604083018561330f565b828103602084015261348d8185613353565b95945050505050565b602080825282518282018190526000919060409081850190868401855b828110156134eb57815180516001600160a01b03168552868101518786015285015185850152606090930192908501906001016134b3565b5091979650505050505050565b602081526000610e206020830184613353565b8315158152600060208481840152604060608185015260a08401855160608601528286015182608087015281815180845260c0880191508583019350600092505b8083101561357e57835180516001600160a01b031683528601518683015292850192600192909201919084019061354c565b509998505050505050505050565b6020808252818101527f4f6e6c7920676f7665726e6f722063616e206d616b6520746869732063616c6c604082015260600190565b6020808252601d908201527f4f6e6c792061646d696e2063616e206d616b6520746869732063616c6c000000604082015260600190565b60208082526024908201527f74686520737562636861696e4944206973206e6f742072656769737465726564604082015263081e595d60e21b606082015260800190565b6020808252601990820152786661696c656420746f207472616e736665722077544845544160381b604082015260600190565b60208082526023908201527f4f6e6c792073757065722061646d696e2063616e206d616b6520746869732063604082015262185b1b60ea1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208152600060018060a01b038084511660208401526020840151604084015280604085015116606084015250606083015160c0608084015261372f60e0840182613383565b9050608084015160a084015260a0840151151560c08401528091505092915050565b9182526001600160a01b0316602082015260400190565b9384526001600160a01b03928316602085015291166040830152606082015260800190565b9384526001600160a01b039283166020850152604084019190915216606082015260800190565b92835260208301919091526001600160a01b0316604082015260600190565b604051606081016001600160401b03811182821017156137f5576137f5613962565b60405290565b604080519081016001600160401b03811182821017156137f5576137f5613962565b604051601f8201601f191681016001600160401b038111828210171561384557613845613962565b604052919050565b60006001600160401b0382111561386657613866613962565b5060051b60200190565b6000821982111561388357613883613936565b500190565b6000826138a557634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156138c4576138c4613936565b500290565b6000828210156138db576138db613936565b500390565b600181811c908216806138f457607f821691505b6020821081141561391557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561392f5761392f613936565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461398d57600080fd5b5056fea2646970667358221220dd2c7ee014a15796d1d305c3c38a6bf2fc640198ccaf659efa65ad77fc73b09064736f6c634300080700336080604052683635c9adc5dea0000060015534801561001d57600080fd5b50604051620028fc380380620028fc83398101604081905261003e91610092565b600080546001600160a01b039485166001600160a01b03199182161790915560038054939094169216919091179091556002556100ce565b80516001600160a01b038116811461008d57600080fd5b919050565b6000806000606084860312156100a757600080fd5b6100b084610076565b92506100be60208501610076565b9150604084015190509250925092565b61281e80620000de6000396000f3fe60806040523480156200001157600080fd5b5060043610620000ff5760003560e01c8063880cdc31116200009e578063880cdc3114620002015780638da5cb5b14620002185780639f36b816146200022c578063a5aca3801462000243578063c7bbe4dc146200025a578063cd98536b146200028e578063e01ee41214620002c7578063f95f152114620002f5578063fc80ade3146200030c57600080fd5b8063117a05d514620001045780631ead7deb146200011d578063336c7308146200013457806335b444f014620001515780634f1e404f146200015b5780635251e81c14620001835780636a59c3d4146200019a5780637743b6d314620001d5575b600080fd5b6200011b62000115366004620013c7565b62000320565b005b6200011b6200012e366004620012cc565b62000644565b6200013e60025481565b6040519081526020015b60405180910390f35b6200013e60015481565b620001726200016c366004620012cc565b62000676565b604051901515815260200162000148565b6200013e620001943660046200137a565b620007cb565b620001c6620001ab366004620012cc565b6000908152600760205260409020546001600160a01b031690565b60405162000148919062001439565b620001c6620001e6366004620012cc565b6007602052600090815260409020546001600160a01b031681565b6200011b6200021236600462001214565b620009f5565b600054620001c6906001600160a01b031681565b6200011b6200023d366004620013c7565b62000a8b565b6200011b6200025436600462001300565b62000e34565b6200013e6200026b36600462001333565b600660209081526000938452604080852082529284528284209052825290205481565b6200013e6200029f36600462001300565b60009182526005602090815260408084206001600160a01b0393909316845291905290205490565b6200013e620002d836600462001300565b600560209081526000928352604080842090915290825290205481565b620001c66200030636600462001416565b620011aa565b600354620001c6906001600160a01b031681565b6000546001600160a01b03163314620003565760405162461bcd60e51b81526004016200034d906200144d565b60405180910390fd5b6003546040516323b872dd60e01b81526001600160a01b03838116600483015230602483015260448201859052909116906323b872dd90606401602060405180830381600087803b158015620003ab57600080fd5b505af1158015620003c0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003e6919062001234565b620004055760405162461bcd60e51b81526004016200034d9062001484565b60008481526005602090815260408083206001600160a01b0387168452909152902054620004348184620011e3565b9050600154811015620004a45760405162461bcd60e51b815260206004820152603160248201527f73686f756c64206d65657420746865206d696e20636f6c6c61746572616c20616044820152701b5bdd5b9d081c995c5d5a5c995b595b9d607a1b60648201526084016200034d565b60008581526005602090815260408083206001600160a01b03808916808652918452828520869055898552600684528285209185529083528184209086168452909152902054620004f68185620011e3565b60008781526006602090815260408083206001600160a01b03808b16855290835281842090881684529091528120829055909150805b600088815260046020526040902054811015620005ad57600088815260046020526040902080546001600160a01b03891691908390811062000572576200057262001520565b6000918252602090912001546001600160a01b03161415620005985760019150620005ad565b80620005a481620014ec565b9150506200052c565b5080620005ec5760008781526004602090815260408220805460018101825590835291200180546001600160a01b0319166001600160a01b0388161790555b836001600160a01b0316866001600160a01b0316887fdbce15b4f4d15cbcc2418b64edca721f02bc1014480d42eef77fa18e06564c4d886040516200063391815260200190565b60405180910390a450505050505050565b6000546001600160a01b03163314620006715760405162461bcd60e51b81526004016200034d906200144d565b600155565b6000805b6000838152600460205260409020548110156200070c576000838152600460205260408120805483908110620006b457620006b462001520565b60009182526020808320909101548683526005825260408084206001600160a01b039092168085529190925291205490915015620006f6575060019392505050565b50806200070381620014ec565b9150506200067a565b506000828152600760205260409020546001600160a01b031615620007c357600082815260076020908152604091829020548251631a07f9c360e21b815292516001600160a01b039091169263681fe70c926004808301939192829003018186803b1580156200077b57600080fd5b505afa15801562000790573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007b6919062001234565b620007c357506001919050565b506000919050565b600080546001600160a01b03163314620007f95760405162461bcd60e51b81526004016200034d906200144d565b5060008481526006602090815260408083206001600160a01b03808816855290835281842090861684529091528120548280821015620008365750805b620008428282620011f8565b60008881526006602090815260408083206001600160a01b03808c16808652918452828520908b1685528352818420949094558a8352600582528083209383529290522054620008939082620011f8565b60008881526005602090815260408083206001600160a01b038b168452909152902055620008c28382620011e3565b9250846001600160a01b0316877f3f274b47575a0be275b10dad94a97d6b883fd9cb697f82c1911aef6ad9ad3a1b836040516200090191815260200190565b60405180910390a383821015620009eb576000620009208583620011f8565b6000898152600760205260409020549091506001600160a01b031615620009e9576000888152600760205260408082205490516302fb4d8560e01b81526001600160a01b03898116600483015260248201859052909116906302fb4d8590604401602060405180830381600087803b1580156200099c57600080fd5b505af1158015620009b1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620009d79190620012e6565b9050620009e58582620011e3565b9450505b505b5050949350505050565b6000546001600160a01b0316331462000a225760405162461bcd60e51b81526004016200034d906200144d565b600054604080516001600160a01b03928316815291831660208301527fe2c7d1c4da37855e682bde14f17826d185497973b73fba7554daa6da467058d9910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331462000ab85760405162461bcd60e51b81526004016200034d906200144d565b60008481526005602090815260408083206001600160a01b03871684529091529020548281101562000b465760405162461bcd60e51b815260206004820152603060248201527f6e6f7420656e6f75676820636f6c6c61746572616c2072656d61696e6564206660448201526f37b9103a3432903b30b634b230ba37b960811b60648201526084016200034d565b62000b528184620011f8565b905080158062000b6457506001548110155b62000bbe5760405162461bcd60e51b8152602060048201526024808201527f696e76616c696420636f6c6c61746572616c207769746864726177616c20616d6044820152631bdd5b9d60e21b60648201526084016200034d565b60008581526005602090815260408083206001600160a01b038089168086529184528285208690558985526006845282852091855290835281842090861684529091529020548381101562000c8a5760405162461bcd60e51b8152602060048201526044602482018190527f67756172616e746f7227732072656d61696e696e6720636f6c6c61746572616c908201527f206973206c6f776572207468616e20746865207769746864726177616c20616d6064820152631bdd5b9d60e21b608482015260a4016200034d565b62000c968185620011f8565b60008781526006602090815260408083206001600160a01b03808b168552908352818420888216855283528184208590558a84526007909252909120549192501662000d5d576003546040516001600160a01b0390911690309062000cfb9062001206565b6001600160a01b03928316815291166020820152604001604051809103906000f08015801562000d2f573d6000803e3d6000fd5b50600087815260076020526040902080546001600160a01b0319166001600160a01b03929092169190911790555b60006002544362000d6f9190620014b7565b60008881526007602052604090819020549051639b939b2160e01b81526001600160a01b0387811660048301526024820189905260448201849052929350911690639b939b2190606401600060405180830381600087803b15801562000dd457600080fd5b505af115801562000de9573d6000803e3d6000fd5b50505050836001600160a01b0316866001600160a01b0316887ff049ce4b58effbdd85cc8fbcf48a4e549f4a53a2a9b90bb49b95b97ddce36af1886040516200063391815260200190565b6000546001600160a01b0316331462000e615760405162461bcd60e51b81526004016200034d906200144d565b6000828152600760205260409020546001600160a01b031662000f135760405162461bcd60e51b815260206004820152605c60248201527f746865207769746864726177616c20717565756520646f6573206e6f7420657860448201527f69737420666f722074686520737562636861696e2c2068617320616e7920636f60648201527f6c6c61746572616c206265656e2077697468647261776e207965743f00000000608482015260a4016200034d565b6000828152600760205260409081902054905163619172b760e01b81526001600160a01b039091169063619172b79062000f5290849060040162001439565b60606040518083038186803b15801562000f6b57600080fd5b505afa15801562000f80573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000fa6919062001258565b604001514310156200101a5760405162461bcd60e51b815260206004820152603660248201527f6e6f20636f6c6c61746572616c20697320726561647920746f20626520636c6160448201527534b6b2b2103337b9103a34329033bab0b930b73a37b960511b60648201526084016200034d565b6000828152600760205260408082205490516302f1e63f60e31b81526001600160a01b039091169063178f31f8906200105890859060040162001439565b606060405180830381600087803b1580156200107357600080fd5b505af115801562001088573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620010ae919062001258565b602081015160035460405163a9059cbb60e01b81526001600160a01b038681166004830152602482018490529394509192169063a9059cbb90604401602060405180830381600087803b1580156200110557600080fd5b505af11580156200111a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001140919062001234565b6200115f5760405162461bcd60e51b81526004016200034d9062001484565b826001600160a01b0316847f063f3c865515831cbc40ae0338f1e8af83465a52dc7b18cb7847587f9ea1cf4e836040516200119c91815260200190565b60405180910390a350505050565b60046020528160005260406000208181548110620011c757600080fd5b6000918252602090912001546001600160a01b03169150829050565b6000620011f18284620014b7565b9392505050565b6000620011f18284620014d2565b611299806200155083390190565b6000602082840312156200122757600080fd5b8135620011f18162001536565b6000602082840312156200124757600080fd5b81518015158114620011f157600080fd5b6000606082840312156200126b57600080fd5b6040516060810181811067ffffffffffffffff821117156200129d57634e487b7160e01b600052604160045260246000fd5b6040528251620012ad8162001536565b8152602083810151908201526040928301519281019290925250919050565b600060208284031215620012df57600080fd5b5035919050565b600060208284031215620012f957600080fd5b5051919050565b600080604083850312156200131457600080fd5b823591506020830135620013288162001536565b809150509250929050565b6000806000606084860312156200134957600080fd5b8335925060208401356200135d8162001536565b915060408401356200136f8162001536565b809150509250925092565b600080600080608085870312156200139157600080fd5b843593506020850135620013a58162001536565b92506040850135620013b78162001536565b9396929550929360600135925050565b60008060008060808587031215620013de57600080fd5b843593506020850135620013f28162001536565b92506040850135915060608501356200140b8162001536565b939692955090935050565b600080604083850312156200142a57600080fd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b6020808252601c908201527f6f6e6c79206f776e65722063616e206d616b65207468652063616c6c00000000604082015260600190565b6020808252601990820152786661696c656420746f207472616e736665722077544845544160381b604082015260600190565b60008219821115620014cd57620014cd6200150a565b500190565b600082821015620014e757620014e76200150a565b500390565b60006000198214156200150357620015036200150a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03811681146200154c57600080fd5b5056fe608060405234801561001057600080fd5b5060405161129938038061129983398101604081905261002f91610158565b600080546001600160a01b0319166001600160a01b038381169190911790915582166100b15760405162461bcd60e51b815260206004820152602660248201527f696e76616c696420746f6b656e20666f7220746865207769746864726177616c60448201526520717565756560d01b60648201526084015b60405180910390fd5b6001600160a01b0381166101165760405162461bcd60e51b815260206004820152602660248201527f696e76616c6964206f776e657220666f7220746865207769746864726177616c60448201526520717565756560d01b60648201526084016100a8565b50600180546001600160a01b0319166001600160a01b039290921691909117905561018b565b80516001600160a01b038116811461015357600080fd5b919050565b6000806040838503121561016b57600080fd5b6101748361013c565b91506101826020840161013c565b90509250929050565b6110ff8061019a6000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80638a809767116100715780638a809767146101595780638da5cb5b1461016e5780639b939b2114610199578063bfd772fc146101ac578063efb166d0146101bf578063fc0c546a146101e157600080fd5b806302fb4d85146100b9578063178f31f8146100df578063619172b7146100ff578063681fe70c146101125780637d031b6514610124578063880cdc3114610144575b600080fd5b6100cc6100c7366004610eb0565b6101f4565b6040519081526020015b60405180910390f35b6100f26100ed366004610e95565b61053f565b6040516100d6919061102f565b6100f261010d366004610e95565b610985565b600354604051901581526020016100d6565b610137610132366004610e95565b610a8d565b6040516100d69190610fb6565b610157610152366004610e95565b610b23565b005b610161610bb6565b6040516100d69190610f69565b600054610181906001600160a01b031681565b6040516001600160a01b0390911681526020016100d6565b6101576101a7366004610eda565b610c18565b6101816101ba366004610f0d565b610d6a565b6101d26101cd366004610eb0565b610d94565b6040516100d693929190610f48565b600154610181906001600160a01b031681565b600080546001600160a01b031633146102285760405162461bcd60e51b815260040161021f90610ff8565b60405180910390fd5b506000805b6001600160a01b0384166000908152600260205260409020548110156105375760006102598484610de0565b6001600160a01b03861660009081526002602052604090208054919250829184908110610288576102886110b3565b906000526020600020906003020160010154116103f7576001600160a01b038516600090815260026020526040902080547f856403611d5b78b55440b0a08dbac9c93dd6ceb984ac669a8c6052460115b259918791859081106102ed576102ed6110b3565b90600052602060002090600302016001015460026000896001600160a01b03166001600160a01b031681526020019081526020016000208581548110610335576103356110b3565b90600052602060002090600302016002015460405161035693929190610f48565b60405180910390a16001600160a01b038516600090815260026020526040902080546103ae91908490811061038d5761038d6110b3565b90600052602060002090600302016001015484610df390919063ffffffff16565b6001600160a01b038616600090815260026020526040812080549295509091849081106103dd576103dd6110b3565b906000526020600020906003020160010181905550610524565b7f856403611d5b78b55440b0a08dbac9c93dd6ceb984ac669a8c6052460115b259858260026000896001600160a01b03166001600160a01b031681526020019081526020016000208581548110610450576104506110b3565b90600052602060002090600302016002015460405161047193929190610f48565b60405180910390a16104838382610df3565b92506104df8160026000886001600160a01b03166001600160a01b0316815260200190815260200160002084815481106104bf576104bf6110b3565b906000526020600020906003020160010154610de090919063ffffffff16565b6001600160a01b0386166000908152600260205260409020805484908110610509576105096110b3565b90600052602060002090600302016001018190555050610537565b508061052f8161106c565b91505061022d565b505b92915050565b610547610dff565b6000546001600160a01b031633146105715760405162461bcd60e51b815260040161021f90610ff8565b6001600160a01b0382166000908152600260205260409020546105f85760405162461bcd60e51b815260206004820152603960248201527f746865207769746864726177616c20717565756520666f72207468652072656360448201527865697665722073686f756c64206e6f7420626520656d70747960381b606482015260840161021f565b6003546000805b8282101561065957846001600160a01b031660038381548110610624576106246110b3565b6000918252602090912001546001600160a01b0316141561064757506001610659565b816106518161106c565b9250506105ff565b806106b85760405162461bcd60e51b815260206004820152602960248201527f6e6f206d61746368656420726563656976657220666f756e642c2063616e6e6f60448201526874206465717565756560b81b606482015260840161021f565b6001600160a01b0385166000908152600260205260408120805482906106e0576106e06110b3565b6000918252602080832060408051606081018252600390940290910180546001600160a01b031684526001810154928401929092526002909101549082015291505b6001600160a01b03871660009081526002602052604090205461074790600190611055565b811015610819576001600160a01b038716600090815260026020526040902061077182600161103d565b81548110610781576107816110b3565b906000526020600020906003020160026000896001600160a01b03166001600160a01b0316815260200190815260200160002082815481106107c5576107c56110b3565b60009182526020909120825460039092020180546001600160a01b0319166001600160a01b0390921691909117815560018083015490820155600291820154910155806108118161106c565b915050610722565b506001600160a01b03861660009081526002602052604090208054806108415761084161109d565b6000828152602080822060036000199094019384020180546001600160a01b0319168155600181018390556002908101839055929093556001600160a01b03891681529152604090205461097a576001600160a01b03861660009081526002602052604081206108b091610e29565b6108bb600185611055565b8310156109465760036108cf84600161103d565b815481106108df576108df6110b3565b600091825260209091200154600380546001600160a01b03909216918590811061090b5761090b6110b3565b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790558261093e8161106c565b9350506108b0565b60038054806109575761095761109d565b600082815260209020810160001990810180546001600160a01b03191690550190555b93505050505b919050565b61098d610dff565b6001600160a01b038216600090815260026020908152604080832080548251818502810185019093528083529192909190849084015b82821015610a18576000848152602090819020604080516060810182526003860290920180546001600160a01b03168352600180820154848601526002909101549183019190915290835290920191016109c3565b5050505090506000815111610a645760405162461bcd60e51b815260206004820152601260248201527174686520717565756520697320656d70747960701b604482015260640161021f565b600081600081518110610a7957610a796110b3565b602002602001015190508092505050919050565b6001600160a01b0381166000908152600260209081526040808320805482518185028101850190935280835260609493849084015b82821015610b17576000848152602090819020604080516060810182526003860290920180546001600160a01b0316835260018082015484860152600290910154918301919091529083529092019101610ac2565b50929695505050505050565b6000546001600160a01b03163314610b4d5760405162461bcd60e51b815260040161021f90610ff8565b600054604080516001600160a01b03928316815291831660208301527fe2c7d1c4da37855e682bde14f17826d185497973b73fba7554daa6da467058d9910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b60606003805480602002602001604051908101604052809291908181526020018280548015610c0e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610bf0575b5050505050905090565b6000546001600160a01b03163314610c425760405162461bcd60e51b815260040161021f90610ff8565b6001600160a01b03838116600081815260026020818152604080842081516060810183529586528583018981529186018881528154600180820184559287529386209651600390940290960180546001600160a01b03191693909716929092178655519085015591519290910191909155805b600354811015610d1257846001600160a01b031660038281548110610cdc57610cdc6110b3565b6000918252602090912001546001600160a01b03161415610d005760019150610d12565b80610d0a8161106c565b915050610cb5565b5080610d6457600380546001810182556000919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319166001600160a01b0386161790555b50505050565b60038181548110610d7a57600080fd5b6000918252602090912001546001600160a01b0316905081565b60026020528160005260406000208181548110610db057600080fd5b60009182526020909120600390910201805460018201546002909201546001600160a01b03909116935090915083565b6000610dec8284611055565b9392505050565b6000610dec828461103d565b604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b5080546000825560030290600052602060002090810190610e4a9190610e4d565b50565b5b80821115610e7a5780546001600160a01b03191681556000600182018190556002820155600301610e4e565b5090565b80356001600160a01b038116811461098057600080fd5b600060208284031215610ea757600080fd5b610dec82610e7e565b60008060408385031215610ec357600080fd5b610ecc83610e7e565b946020939093013593505050565b600080600060608486031215610eef57600080fd5b610ef884610e7e565b95602085013595506040909401359392505050565b600060208284031215610f1f57600080fd5b5035919050565b80516001600160a01b0316825260208082015190830152604090810151910152565b6001600160a01b039390931683526020830191909152604082015260600190565b6020808252825182820181905260009190848201906040850190845b81811015610faa5783516001600160a01b031683529284019291840191600101610f85565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610faa57610fe5838551610f26565b9284019260609290920191600101610fd2565b6020808252601c908201527f6f6e6c79206f776e65722063616e206d616b65207468652063616c6c00000000604082015260600190565b606081016105398284610f26565b6000821982111561105057611050611087565b500190565b60008282101561106757611067611087565b500390565b600060001982141561108057611080611087565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fdfea2646970667358221220b85c496ff091dcfab35092018bfbbe07aecc0c071991e708ab14f8311277b13564736f6c63430008070033a2646970667358221220cf1607d8f640b64d4f15c03d1814f87c6a35234a3a711bb287f75ac93804ce8364736f6c6343000807003360806040523480156200001157600080fd5b50604051620046ff380380620046ff83398101604081905262000034916200008c565b600080546001600160a01b039586166001600160a01b03199182161790915560019290925560025560038054929093169116179055620000d4565b80516001600160a01b03811681146200008757600080fd5b919050565b60008060008060808587031215620000a357600080fd5b620000ae856200006f565b9350620000be602086016200006f565b6040860151606090960151949790965092505050565b61461b80620000e46000396000f3fe60806040523480156200001157600080fd5b5060043610620001695760003560e01c80636a59c3d411620000d357806390e7e395116200008657806390e7e39514620003e5578063b49d964614620003fc578063b9d392841462000413578063c0cc5e89146200042a578063c4ff90851462000441578063e9ed30e0146200045857600080fd5b80636a59c3d4146200030b5780636b529ac41462000337578063746348ac146200036b5780637743b6d3146200038e578063880cdc3114620003ba5780638da5cb5b14620003d157600080fd5b80633f216374116200012c5780633f216374146200023357806343f27e45146200026257806344669c03146200028957806352a8042114620002b15780635484274714620002c857806367016090146200030157600080fd5b8063192e1574146200016e5780631af10d7d146200019a5780631ce9f8ae14620001ea578063331515bc1462000203578063336c73081462000229575b600080fd5b60035462000182906001600160a01b031681565b60405162000191919062002f6f565b60405180910390f35b620001db620001ab36600462002e48565b60009283526006602090815260408085206001600160a01b03948516865282528085209290931684525290205490565b60405190815260200162000191565b62000201620001fb36600462002e8f565b62000480565b005b6200021a6200021436600462002de1565b62000b61565b60405162000191919062003021565b620001db60025481565b6200024a6200024436600462002f01565b62000bc5565b60408051921515835260208301919091520162000191565b620002796200027336600462002ede565b62000cec565b6040516200019192919062002fbd565b620002a06200029a36600462002ede565b62000ef1565b604051620001919392919062003036565b620001db620002c236600462002e15565b6200121a565b620001db620002d936600462002e15565b60009182526008602090815260408084206001600160a01b0393909316845291905290205490565b620001db60015481565b620001826200031c36600462002de1565b6000908152600a60205260409020546001600160a01b031690565b620001db6200034836600462002e48565b600660209081526000938452604080852082529284528284209052825290205481565b620001db6200037c36600462002de1565b60009081526007602052604090205490565b620001826200039f36600462002de1565b600a602052600090815260409020546001600160a01b031681565b62000201620003cb36600462002964565b620014f1565b60005462000182906001600160a01b031681565b620001db620003f636600462002de1565b62001587565b620001db6200040d36600462002de1565b62001774565b620002016200042436600462002e8f565b620017b1565b620002016200043b36600462002e15565b6200213d565b620001db6200045236600462002ede565b62002556565b6200046f6200046936600462002964565b62002588565b604051901515815260200162000191565b6000546001600160a01b03163314620004b65760405162461bcd60e51b8152600401620004ad9062003179565b60405180910390fd5b6003546040516378154cf760e01b8152600481018690526000916001600160a01b0316906378154cf79060240160006040518083038186803b158015620004fc57600080fd5b505afa15801562000511573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200053b919081019062002c84565b90508060a00151620005615760405162461bcd60e51b8152600401620004ad9062003135565b6040808201516000878152600960205291909120546200058d5760008681526009602052604090204390555b6200059886620025cb565b6040516370a0823160e01b81526000906001600160a01b038316906370a0823190620005c990309060040162002f6f565b60206040518083038186803b158015620005e257600080fd5b505afa158015620005f7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200061d919062002dfb565b6040516323b872dd60e01b81526001600160a01b03868116600483015230602483015260448201889052919250908316906323b872dd90606401602060405180830381600087803b1580156200067257600080fd5b505af115801562000687573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006ad919062002b36565b620006cc5760405162461bcd60e51b8152600401620004ad90620030b9565b600087815260076020526040812054620006e8575084620007b8565b6040516390e7e39560e01b81526004810189905260009030906390e7e3959060240160206040518083038186803b1580156200072357600080fd5b505afa15801562000738573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200075e919062002dfb565b9050828110620007825760405162461bcd60e51b8152600401620004ad9062003105565b620007b462000792848362002810565b60008b815260076020526040902054620007ad908a62002825565b9062002833565b9150505b600088815260076020526040902054620007d3908262002841565b600089815260076020908152604080832093909355600881528282206001600160a01b0389168352905220546200080b908262002841565b60008981526008602090815260408083206001600160a01b038a1684529091528082209290925590516344669c0360e01b8152600481018a90524360248201819052919030906344669c039060440160006040518083038186803b1580156200087357600080fd5b505afa15801562000888573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620008b2919081019062002b54565b60008d8152600460209081526040808320888452909152812086905590935091508190505b82602001515181101562000a145760008360200151828151811062000900576200090062003307565b60200260200101516020015190508b6001600160a01b03168460200151838151811062000931576200093162003307565b6020026020010151600001516001600160a01b03161415620009605762000959818762002841565b9050600192505b600460008e81526020019081526020016000206000868152602001908152602001600020600101604051806040016040528086602001518581518110620009ab57620009ab62003307565b602090810291909101810151516001600160a01b03908116835291810194909452825460018082018555600094855293859020835160029092020180546001600160a01b031916919092161781559201519101558062000a0b81620032d3565b915050620008d7565b508062000a885760008b8152600460209081526040808320868452825280832081518083019092526001600160a01b038e81168352828401898152600192830180548085018255908752949095209251600290940290920180546001600160a01b0319169390921692909217815591519101555b50506000898152600560209081526040808320805460018101825590845282842001939093558a8252600681528282206001600160a01b03808c16845290825283832090891683529052205462000ae0818362002841565b60008a81526006602090815260408083206001600160a01b03808e16808652918452828520908c1680865293529281902084905551929350918b907fb4b56601301e6d487e3bc6a7911c4e20df2bced1a62f677faee5c20896b486419062000b4e9089908d90899062002f9c565b60405180910390a4505050505050505050565b60008181526005602090815260409182902080548351818402810184019094528084526060939283018282801562000bb957602002820191906000526020600020905b81548152602001906001019080831162000ba4575b50505050509050919050565b6040516343f27e4560e01b8152600481018490526024810183905260009081908190819030906343f27e459060440160006040518083038186803b15801562000c0d57600080fd5b505afa15801562000c22573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000c4c9190810190620029bc565b8151919350915060005b8181101562000cd857866001600160a01b031684828151811062000c7e5762000c7e62003307565b60200260200101516001600160a01b0316141562000cc357600183828151811062000cad5762000cad62003307565b6020026020010151955095505050505062000ce4565b8062000ccf81620032d3565b91505062000c56565b50600080945094505050505b935093915050565b60608060008362000d005750600062000d21565b60018460015462000d12919062003297565b62000d1e9190620032b9565b90505b6040516344669c0360e01b8152600481018690526024810182905260009030906344669c039060440160006040518083038186803b15801562000d6357600080fd5b505afa15801562000d78573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000da2919081019062002b54565b9250505060008160200151519050806001600160401b0381111562000dcb5762000dcb6200331d565b60405190808252806020026020018201604052801562000df5578160200160208202803683370190505b509450806001600160401b0381111562000e135762000e136200331d565b60405190808252806020026020018201604052801562000e3d578160200160208202803683370190505b50935060005b8181101562000ee65760008360200151828151811062000e675762000e6762003307565b60200260200101519050806000015187838151811062000e8b5762000e8b62003307565b60200260200101906001600160a01b031690816001600160a01b031681525050806020015186838151811062000ec55762000ec562003307565b6020908102919091010152508062000edd81620032d3565b91505062000e43565b505050509250929050565b60008062000f12604051806040016040528060008152602001606081525090565b6000858152600560205260409020805462000f3557600080935093505062001213565b8060008154811062000f4b5762000f4b62003307565b906000526020600020015485101562000f6c57600080935093505062001213565b8054600090829062000f8190600190620032b9565b8154811062000f945762000f9462003307565b906000526020600020015490508581116200105b57600087815260046020908152604080832084845282528083208151808301835281548152600182810180548551818802810188019096528086529196889694959394869486820194909392909184015b8282101562001043576000848152602090819020604080518082019091526002850290910180546001600160a01b0316825260019081015482840152908352909201910162000ff9565b50505050815250509050945094509450505062001213565b815460009081906200107090600190620032b9565b905083828154811062001087576200108762003307565b906000526020600020015495505b818111156200116d5760006002620010ae8484620032b9565b620010ba919062003274565b620010c69083620032b9565b90506000858281548110620010df57620010df62003307565b9060005260206000200154905089811415620010ff5796506200116d9050565b89811015620011335781935085848154811062001120576200112062003307565b9060005260206000200154975062001165565b62001140600183620032b9565b925085848154811062001157576200115762003307565b906000526020600020015497505b505062001095565b6000898152600460209081526040808320898452825280832081518083018352815481526001820180548451818702810187019095528085529195929486810194939192919084015b8282101562001200576000848152602090819020604080518082019091526002850290910180546001600160a01b03168252600190810154828401529083529092019101620011b6565b5050505081525050945060019650505050505b9250925092565b6000828152600760205260408120546200123757506000620014eb565b6003546040516378154cf760e01b8152600481018590526000916001600160a01b0316906378154cf79060240160006040518083038186803b1580156200127d57600080fd5b505afa15801562001292573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620012bc919081019062002c84565b6040808201516000878152600960205291822054929350914391908083106200136e576200136b620012ef848362002810565b856001600160a01b03166324e770d06040518163ffffffff1660e01b815260040160206040518083038186803b1580156200132957600080fd5b505afa1580156200133e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001364919062002dfb565b9062002825565b91505b60008881526008602090815260408083206001600160a01b03808c16855292528083205490516370a0823160e01b81529092916200141c9186918916906370a0823190620013c190309060040162002f6f565b60206040518083038186803b158015620013da57600080fd5b505afa158015620013ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001415919062002dfb565b9062002841565b6040516390e7e39560e01b8152600481018c905290915060009030906390e7e3959060240160206040518083038186803b1580156200145a57600080fd5b505afa1580156200146f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001495919062002dfb565b905081811115620014ba5760405162461bcd60e51b8152600401620004ad9062003105565b60008b815260076020526040812054620014df90620007ad8662001364878762002810565b99505050505050505050505b92915050565b6000546001600160a01b031633146200151e5760405162461bcd60e51b8152600401620004ad9062003179565b600054604080516001600160a01b03928316815291831660208301527fe2c7d1c4da37855e682bde14f17826d185497973b73fba7554daa6da467058d9910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600a60205260408120546001600160a01b0316620015ac57506000919050565b6000828152600a6020526040808220548151638a80976760e01b815291516001600160a01b039091169183918391638a8097679160048083019286929190829003018186803b158015620015ff57600080fd5b505afa15801562001614573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200163e919081019062002984565b905060005b81518110156200176a57600082828151811062001664576200166462003307565b602002602001015190506000846001600160a01b0316637d031b65836040518263ffffffff1660e01b81526004016200169e919062002f6f565b60006040518083038186803b158015620016b757600080fd5b505afa158015620016cc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620016f6919081019062002a89565b905060005b815181101562001751576200173a8282815181106200171e576200171e62003307565b602002602001015160200151886200284190919063ffffffff16565b9650806200174881620032d3565b915050620016fb565b50505080806200176190620032d3565b91505062001643565b5091949350505050565b6000806200178e600154846200283390919063ffffffff16565b90506000620017a9600154836200282590919063ffffffff16565b949350505050565b6000546001600160a01b03163314620017de5760405162461bcd60e51b8152600401620004ad9062003179565b60008211620018275760405162461bcd60e51b81526020600482015260146024820152731a5b9d985b1a59081cda185c9948185b5bdd5b9d60621b6044820152606401620004ad565b600084815260076020526040902054821115620018a85760405162461bcd60e51b815260206004820152603860248201527f74686520737562636861696e20646f6573206e6f7420686176652073756666696044820152776369656e742073686172657320746f20776974686472617760401b6064820152608401620004ad565b60008481526008602090815260408083206001600160a01b03851684529091529020548211156200193b5760405162461bcd60e51b815260206004820152603660248201527f746865207374616b657220646f6573206e6f7420686176652073756666696369604482015275656e742073686172657320746f20776974686472617760501b6064820152608401620004ad565b6200194684620025cb565b6003546040516378154cf760e01b8152600481018690526000916001600160a01b0316906378154cf79060240160006040518083038186803b1580156200198c57600080fd5b505afa158015620019a1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620019cb919081019062002c84565b60408082015190516370a0823160e01b8152919250906000906001600160a01b038316906370a082319062001a0590309060040162002f6f565b60206040518083038186803b15801562001a1e57600080fd5b505afa15801562001a33573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a59919062002dfb565b6040516390e7e39560e01b815260048101899052909150600090819030906390e7e3959060240160206040518083038186803b15801562001a9957600080fd5b505afa15801562001aae573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001ad4919062002dfb565b90508281111562001af95760405162461bcd60e51b8152600401620004ad9062003105565b60008981526007602052604090205462001b1e90620007ad8962001364878662002810565b60008a81526007602052604090205490925062001b3d91508762002810565b600089815260076020908152604080832093909355600881528282206001600160a01b03891683529052205462001b75908762002810565b60008981526008602090815260408083206001600160a01b038a1684529091528082209290925590516344669c0360e01b8152600481018a905243602482018190529190819030906344669c039060440160006040518083038186803b15801562001bdf57600080fd5b505afa15801562001bf4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001c1e919081019062002b54565b92505091508162001c895760405162461bcd60e51b815260206004820152602e60248201527f6e6f207374616b6520736e617073686f742065786974732c2063616e6e6f742060448201526d7769746864726177207374616b6560901b6064820152608401620004ad565b60008b81526004602090815260408083208684529091528120849055805b82602001515181101562001e665760008360200151828151811062001cd05762001cd062003307565b60200260200101516020015190508c6001600160a01b03168460200151838151811062001d015762001d0162003307565b6020026020010151600001516001600160a01b0316141562001da8578b81101562001d955760405162461bcd60e51b815260206004820152603c60248201527f76616c696461746f7227732072656d61696e696e67207368617265206c6f776560448201527f72207468616e20746865207769746864726177616c20616d6f756e74000000006064820152608401620004ad565b62001da1818d62002810565b9050600192505b801562001e5057600460008f8152602001908152602001600020600087815260200190815260200160002060010160405180604001604052808660200151858151811062001dfa5762001dfa62003307565b602090810291909101810151516001600160a01b039081168352918101859052835460018082018655600095865294829020845160029092020180546001600160a01b0319169190931617825591909101519101555b508062001e5d81620032d3565b91505062001ca7565b508062001ec75760405162461bcd60e51b815260206004820152602860248201527f63616e6e6f7420756e7374616b652066726f6d2061206e6f6e2d76616c696461604482015267746f72206e6f646560c01b6064820152608401620004ad565b50505060008981526005602090815260408083208054600181018255908452828420439101558b8352600682528083206001600160a01b03808d168552908352818420908a16845290915290205490508681101562001f695760405162461bcd60e51b815260206004820152601a60248201527f6e6f7420656e6f7567682072656d61696e696e672073686172650000000000006044820152606401620004ad565b62001f75818862002810565b60008a81526006602090815260408083206001600160a01b03808e1685529083528184208b8216855283528184208590558d8452600a909252909120549192501662002051578460a0015162001fdf5760405162461bcd60e51b8152600401620004ad9062003135565b833060405162001fef906200284f565b6001600160a01b03928316815291166020820152604001604051809103906000f08015801562002023573d6000803e3d6000fd5b5060008a8152600a6020526040902080546001600160a01b0319166001600160a01b03929092169190911790555b60006002544362002063919062003259565b60008b8152600a602052604090819020549051639b939b2160e01b81529192506001600160a01b031690639b939b2190620020a7908a908790869060040162002f9c565b600060405180830381600087803b158015620020c257600080fd5b505af1158015620020d7573d6000803e3d6000fd5b50505050866001600160a01b0316896001600160a01b03168b7f6f9a3eaaf9b34fce3afb673b23786645846fee391ea3f9b8a2b2741bc0627fe28960400151878d604051620021299392919062002f9c565b60405180910390a450505050505050505050565b6000546001600160a01b031633146200216a5760405162461bcd60e51b8152600401620004ad9062003179565b6000828152600a60205260409020546001600160a01b0316620022165760405162461bcd60e51b815260206004820152605760248201527f746865207769746864726177616c20717565756520646f6573206e6f7420657860448201527f69737420666f722074686520737562636861696e2c2068617320616e79207374606482015276616b65206265656e2077697468647261776e207965743f60481b608482015260a401620004ad565b6000828152600a60205260409081902054905163619172b760e01b81526001600160a01b039091169063619172b7906200225590849060040162002f6f565b60606040518083038186803b1580156200226e57600080fd5b505afa15801562002283573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620022a9919062002dc2565b60400151431015620023155760405162461bcd60e51b815260206004820152602e60248201527f6e6f207374616b6520697320726561647920746f20626520636c61696d65642060448201526d3337b9103a34329039ba30b5b2b960911b6064820152608401620004ad565b6000828152600a60205260408082205490516302f1e63f60e31b81526001600160a01b039091169063178f31f8906200235390859060040162002f6f565b606060405180830381600087803b1580156200236e57600080fd5b505af115801562002383573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620023a9919062002dc2565b60208101516003546040516378154cf760e01b81526004810187905292935090916000916001600160a01b0316906378154cf79060240160006040518083038186803b158015620023f957600080fd5b505afa1580156200240e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262002438919081019062002c84565b90508060a001516200245e5760405162461bcd60e51b8152600401620004ad9062003135565b604080820151905163a9059cbb60e01b81526001600160a01b0382169063a9059cbb9062002493908890879060040162002f83565b602060405180830381600087803b158015620024ae57600080fd5b505af1158015620024c3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620024e9919062002b36565b620025085760405162461bcd60e51b8152600401620004ad90620030b9565b846001600160a01b0316867ff2b7d7e64fef4a69e46e34e4d45de5951b9a9b2679adf7520d8bf6a16376692d83866040516200254692919062002f83565b60405180910390a3505050505050565b600560205281600052604060002081815481106200257357600080fd5b90600052602060002001600091509150505481565b6040805160048152602481019091526020810180516001600160e01b031663024e770d60e41b178152815160009283929091839182919082885af1949350505050565b600081815260096020526040902054438110620025e6575050565b6003546040516378154cf760e01b8152600481018490526000916001600160a01b0316906378154cf79060240160006040518083038186803b1580156200262c57600080fd5b505afa15801562002641573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200266b919081019062002c84565b90508060a00151620026915760405162461bcd60e51b8152600401620004ad9062003135565b604080820151905163074f698760e51b8152309063e9ed30e090620026bb90849060040162002f6f565b602060405180830381600087803b158015620026d657600080fd5b505af1158015620026eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002711919062002b36565b6200271c5750505050565b60006200272a438562002810565b905060006200276d82846001600160a01b03166324e770d06040518163ffffffff1660e01b815260040160206040518083038186803b1580156200132957600080fd5b600087815260096020526040908190204390555163ab8e786f60e01b81529091506001600160a01b0384169063ab8e786f90620027b1903090859060040162002f83565b602060405180830381600087803b158015620027cc57600080fd5b505af1158015620027e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002807919062002b36565b50505050505050565b60006200281e8284620032b9565b9392505050565b60006200281e828462003297565b60006200281e828462003274565b60006200281e828462003259565b611299806200334d83390190565b600082601f8301126200286f57600080fd5b8151602062002888620028828362003233565b62003200565b80838252828201915082860187848660051b8901011115620028a957600080fd5b60005b85811015620028d5578151620028c28162003333565b84529284019290840190600101620028ac565b5090979650505050505050565b80518015158114620028f357600080fd5b919050565b6000606082840312156200290b57600080fd5b604051606081018181106001600160401b03821117156200293057620029306200331d565b80604052508091508251620029458162003333565b8082525060208301516020820152604083015160408201525092915050565b6000602082840312156200297757600080fd5b81356200281e8162003333565b6000602082840312156200299757600080fd5b81516001600160401b03811115620029ae57600080fd5b620017a9848285016200285d565b60008060408385031215620029d057600080fd5b82516001600160401b0380821115620029e857600080fd5b620029f6868387016200285d565b935060209150818501518181111562002a0e57600080fd5b85019050601f8101861362002a2257600080fd5b805162002a33620028828262003233565b80828252848201915084840189868560051b870101111562002a5457600080fd5b600094505b8385101562002a7957805183526001949094019391850191850162002a59565b5080955050505050509250929050565b6000602080838503121562002a9d57600080fd5b82516001600160401b0381111562002ab457600080fd5b8301601f8101851362002ac657600080fd5b805162002ad7620028828262003233565b818152838101908385016060808502860187018a101562002af757600080fd5b600095505b8486101562002b285762002b118a83620028f8565b845260019590950194928601929081019062002afc565b509098975050505050505050565b60006020828403121562002b4957600080fd5b6200281e82620028e2565b60008060006060848603121562002b6a57600080fd5b62002b7584620028e2565b925060208085015192506040808601516001600160401b038082111562002b9b57600080fd5b818801915082828a03121562002bb057600080fd5b62002bba620031b0565b82518152848301518281111562002bd057600080fd5b80840193505089601f84011262002be657600080fd5b8251915062002bf9620028828362003233565b8083825286820191508685018c888660061b880101111562002c1a57600080fd5b60009550855b8581101562002c6c5787828f03121562002c38578687fd5b62002c42620031b0565b825162002c4f8162003333565b8152828a01518a8201528452928801929087019060010162002c20565b50508087840152505080955050505050509250925092565b6000602080838503121562002c9857600080fd5b82516001600160401b038082111562002cb057600080fd5b9084019060c0828703121562002cc557600080fd5b62002ccf620031db565b825162002cdc8162003333565b81528284015184820152604083015162002cf68162003333565b604082015260608301518281111562002d0e57600080fd5b8301601f8101881362002d2057600080fd5b80518381111562002d355762002d356200331d565b62002d49601f8201601f1916870162003200565b9350808452888682840101111562002d6057600080fd5b60005b8181101562002d8057828101870151858201880152860162002d63565b8181111562002d925760008783870101525b5050508160608201526080830151608082015262002db360a08401620028e2565b60a08201529695505050505050565b60006060828403121562002dd557600080fd5b6200281e8383620028f8565b60006020828403121562002df457600080fd5b5035919050565b60006020828403121562002e0e57600080fd5b5051919050565b6000806040838503121562002e2957600080fd5b82359150602083013562002e3d8162003333565b809150509250929050565b60008060006060848603121562002e5e57600080fd5b83359250602084013562002e728162003333565b9150604084013562002e848162003333565b809150509250925092565b6000806000806080858703121562002ea657600080fd5b84359350602085013562002eba8162003333565b925060408501359150606085013562002ed38162003333565b939692955090935050565b6000806040838503121562002ef257600080fd5b50508035926020909101359150565b60008060006060848603121562002f1757600080fd5b8335925060208401359150604084013562002e848162003333565b600081518084526020808501945080840160005b8381101562002f645781518752958201959082019060010162002f46565b509495945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b604080825283519082018190526000906020906060840190828701845b82811015620030015781516001600160a01b03168452928401929084019060010162002fda565b5050508381038285015262003017818662002f32565b9695505050505050565b6020815260006200281e602083018462002f32565b8315158152600060208481840152604060608185015260a08401855160608601528286015182608087015281815180845260c0880191508583019350600092505b80831015620030ab57835180516001600160a01b031683528601518683015292850192600192909201919084019062003077565b509998505050505050505050565b6020808252602c908201527f6661696c656420746f207472616e7366657220737562636861696e20676f766560408201526b393730b731b2903a37b5b2b760a11b606082015260800190565b6020808252601690820152751a5b9d985b1a59081c195b991a5b99c8185b5bdd5b9d60521b604082015260600190565b60208082526024908201527f74686520737562636861696e4944206973206e6f742072656769737465726564604082015263081e595d60e21b606082015260800190565b6020808252601c908201527f6f6e6c79206f776e65722063616e206d616b65207468652063616c6c00000000604082015260600190565b604080519081016001600160401b0381118282101715620031d557620031d56200331d565b60405290565b60405160c081016001600160401b0381118282101715620031d557620031d56200331d565b604051601f8201601f191681016001600160401b03811182821017156200322b576200322b6200331d565b604052919050565b60006001600160401b038211156200324f576200324f6200331d565b5060051b60200190565b600082198211156200326f576200326f620032f1565b500190565b6000826200329257634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615620032b457620032b4620032f1565b500290565b600082821015620032ce57620032ce620032f1565b500390565b6000600019821415620032ea57620032ea620032f1565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146200334957600080fd5b5056fe608060405234801561001057600080fd5b5060405161129938038061129983398101604081905261002f91610158565b600080546001600160a01b0319166001600160a01b038381169190911790915582166100b15760405162461bcd60e51b815260206004820152602660248201527f696e76616c696420746f6b656e20666f7220746865207769746864726177616c60448201526520717565756560d01b60648201526084015b60405180910390fd5b6001600160a01b0381166101165760405162461bcd60e51b815260206004820152602660248201527f696e76616c6964206f776e657220666f7220746865207769746864726177616c60448201526520717565756560d01b60648201526084016100a8565b50600180546001600160a01b0319166001600160a01b039290921691909117905561018b565b80516001600160a01b038116811461015357600080fd5b919050565b6000806040838503121561016b57600080fd5b6101748361013c565b91506101826020840161013c565b90509250929050565b6110ff8061019a6000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80638a809767116100715780638a809767146101595780638da5cb5b1461016e5780639b939b2114610199578063bfd772fc146101ac578063efb166d0146101bf578063fc0c546a146101e157600080fd5b806302fb4d85146100b9578063178f31f8146100df578063619172b7146100ff578063681fe70c146101125780637d031b6514610124578063880cdc3114610144575b600080fd5b6100cc6100c7366004610eb0565b6101f4565b6040519081526020015b60405180910390f35b6100f26100ed366004610e95565b61053f565b6040516100d6919061102f565b6100f261010d366004610e95565b610985565b600354604051901581526020016100d6565b610137610132366004610e95565b610a8d565b6040516100d69190610fb6565b610157610152366004610e95565b610b23565b005b610161610bb6565b6040516100d69190610f69565b600054610181906001600160a01b031681565b6040516001600160a01b0390911681526020016100d6565b6101576101a7366004610eda565b610c18565b6101816101ba366004610f0d565b610d6a565b6101d26101cd366004610eb0565b610d94565b6040516100d693929190610f48565b600154610181906001600160a01b031681565b600080546001600160a01b031633146102285760405162461bcd60e51b815260040161021f90610ff8565b60405180910390fd5b506000805b6001600160a01b0384166000908152600260205260409020548110156105375760006102598484610de0565b6001600160a01b03861660009081526002602052604090208054919250829184908110610288576102886110b3565b906000526020600020906003020160010154116103f7576001600160a01b038516600090815260026020526040902080547f856403611d5b78b55440b0a08dbac9c93dd6ceb984ac669a8c6052460115b259918791859081106102ed576102ed6110b3565b90600052602060002090600302016001015460026000896001600160a01b03166001600160a01b031681526020019081526020016000208581548110610335576103356110b3565b90600052602060002090600302016002015460405161035693929190610f48565b60405180910390a16001600160a01b038516600090815260026020526040902080546103ae91908490811061038d5761038d6110b3565b90600052602060002090600302016001015484610df390919063ffffffff16565b6001600160a01b038616600090815260026020526040812080549295509091849081106103dd576103dd6110b3565b906000526020600020906003020160010181905550610524565b7f856403611d5b78b55440b0a08dbac9c93dd6ceb984ac669a8c6052460115b259858260026000896001600160a01b03166001600160a01b031681526020019081526020016000208581548110610450576104506110b3565b90600052602060002090600302016002015460405161047193929190610f48565b60405180910390a16104838382610df3565b92506104df8160026000886001600160a01b03166001600160a01b0316815260200190815260200160002084815481106104bf576104bf6110b3565b906000526020600020906003020160010154610de090919063ffffffff16565b6001600160a01b0386166000908152600260205260409020805484908110610509576105096110b3565b90600052602060002090600302016001018190555050610537565b508061052f8161106c565b91505061022d565b505b92915050565b610547610dff565b6000546001600160a01b031633146105715760405162461bcd60e51b815260040161021f90610ff8565b6001600160a01b0382166000908152600260205260409020546105f85760405162461bcd60e51b815260206004820152603960248201527f746865207769746864726177616c20717565756520666f72207468652072656360448201527865697665722073686f756c64206e6f7420626520656d70747960381b606482015260840161021f565b6003546000805b8282101561065957846001600160a01b031660038381548110610624576106246110b3565b6000918252602090912001546001600160a01b0316141561064757506001610659565b816106518161106c565b9250506105ff565b806106b85760405162461bcd60e51b815260206004820152602960248201527f6e6f206d61746368656420726563656976657220666f756e642c2063616e6e6f60448201526874206465717565756560b81b606482015260840161021f565b6001600160a01b0385166000908152600260205260408120805482906106e0576106e06110b3565b6000918252602080832060408051606081018252600390940290910180546001600160a01b031684526001810154928401929092526002909101549082015291505b6001600160a01b03871660009081526002602052604090205461074790600190611055565b811015610819576001600160a01b038716600090815260026020526040902061077182600161103d565b81548110610781576107816110b3565b906000526020600020906003020160026000896001600160a01b03166001600160a01b0316815260200190815260200160002082815481106107c5576107c56110b3565b60009182526020909120825460039092020180546001600160a01b0319166001600160a01b0390921691909117815560018083015490820155600291820154910155806108118161106c565b915050610722565b506001600160a01b03861660009081526002602052604090208054806108415761084161109d565b6000828152602080822060036000199094019384020180546001600160a01b0319168155600181018390556002908101839055929093556001600160a01b03891681529152604090205461097a576001600160a01b03861660009081526002602052604081206108b091610e29565b6108bb600185611055565b8310156109465760036108cf84600161103d565b815481106108df576108df6110b3565b600091825260209091200154600380546001600160a01b03909216918590811061090b5761090b6110b3565b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790558261093e8161106c565b9350506108b0565b60038054806109575761095761109d565b600082815260209020810160001990810180546001600160a01b03191690550190555b93505050505b919050565b61098d610dff565b6001600160a01b038216600090815260026020908152604080832080548251818502810185019093528083529192909190849084015b82821015610a18576000848152602090819020604080516060810182526003860290920180546001600160a01b03168352600180820154848601526002909101549183019190915290835290920191016109c3565b5050505090506000815111610a645760405162461bcd60e51b815260206004820152601260248201527174686520717565756520697320656d70747960701b604482015260640161021f565b600081600081518110610a7957610a796110b3565b602002602001015190508092505050919050565b6001600160a01b0381166000908152600260209081526040808320805482518185028101850190935280835260609493849084015b82821015610b17576000848152602090819020604080516060810182526003860290920180546001600160a01b0316835260018082015484860152600290910154918301919091529083529092019101610ac2565b50929695505050505050565b6000546001600160a01b03163314610b4d5760405162461bcd60e51b815260040161021f90610ff8565b600054604080516001600160a01b03928316815291831660208301527fe2c7d1c4da37855e682bde14f17826d185497973b73fba7554daa6da467058d9910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b60606003805480602002602001604051908101604052809291908181526020018280548015610c0e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610bf0575b5050505050905090565b6000546001600160a01b03163314610c425760405162461bcd60e51b815260040161021f90610ff8565b6001600160a01b03838116600081815260026020818152604080842081516060810183529586528583018981529186018881528154600180820184559287529386209651600390940290960180546001600160a01b03191693909716929092178655519085015591519290910191909155805b600354811015610d1257846001600160a01b031660038281548110610cdc57610cdc6110b3565b6000918252602090912001546001600160a01b03161415610d005760019150610d12565b80610d0a8161106c565b915050610cb5565b5080610d6457600380546001810182556000919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319166001600160a01b0386161790555b50505050565b60038181548110610d7a57600080fd5b6000918252602090912001546001600160a01b0316905081565b60026020528160005260406000208181548110610db057600080fd5b60009182526020909120600390910201805460018201546002909201546001600160a01b03909116935090915083565b6000610dec8284611055565b9392505050565b6000610dec828461103d565b604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b5080546000825560030290600052602060002090810190610e4a9190610e4d565b50565b5b80821115610e7a5780546001600160a01b03191681556000600182018190556002820155600301610e4e565b5090565b80356001600160a01b038116811461098057600080fd5b600060208284031215610ea757600080fd5b610dec82610e7e565b60008060408385031215610ec357600080fd5b610ecc83610e7e565b946020939093013593505050565b600080600060608486031215610eef57600080fd5b610ef884610e7e565b95602085013595506040909401359392505050565b600060208284031215610f1f57600080fd5b5035919050565b80516001600160a01b0316825260208082015190830152604090810151910152565b6001600160a01b039390931683526020830191909152604082015260600190565b6020808252825182820181905260009190848201906040850190845b81811015610faa5783516001600160a01b031683529284019291840191600101610f85565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610faa57610fe5838551610f26565b9284019260609290920191600101610fd2565b6020808252601c908201527f6f6e6c79206f776e65722063616e206d616b65207468652063616c6c00000000604082015260600190565b606081016105398284610f26565b6000821982111561105057611050611087565b500190565b60008282101561106757611067611087565b500390565b600060001982141561108057611080611087565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fdfea2646970667358221220b85c496ff091dcfab35092018bfbbe07aecc0c071991e708ab14f8311277b13564736f6c63430008070033a2646970667358221220d17d239c138e6e837b6faa882187e85ce7701be66a4a2d8d1902071a288938f964736f6c63430008070033",
}

// ChainRegistrarOnMainchainABI is the input ABI used to generate the binding from.
// Deprecated: Use ChainRegistrarOnMainchainMetaData.ABI instead.
var ChainRegistrarOnMainchainABI = ChainRegistrarOnMainchainMetaData.ABI

// ChainRegistrarOnMainchainBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use ChainRegistrarOnMainchainMetaData.Bin instead.
var ChainRegistrarOnMainchainBin = ChainRegistrarOnMainchainMetaData.Bin

// DeployChainRegistrarOnMainchain deploys a new Ethereum contract, binding an instance of ChainRegistrarOnMainchain to it.
func DeployChainRegistrarOnMainchain(auth *bind.TransactOpts, backend bind.ContractBackend, wTheta_ common.Address, superAdmin_ common.Address, admin_ common.Address, governor_ common.Address, numBlocksPerDynasty_ *big.Int, withdrawalPendingPeriodInBlocks_ *big.Int, crossChainFee_ *big.Int, initialFeeRequired_ *big.Int, fallbackReceiver_ common.Address) (common.Address, *types.Transaction, *ChainRegistrarOnMainchain, error) {
	parsed, err := ChainRegistrarOnMainchainMetaData.GetAbi()
	if err != nil {
		return common.Address{}, nil, nil, err
	}
	if parsed == nil {
		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
	}

	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ChainRegistrarOnMainchainBin), backend, wTheta_, superAdmin_, admin_, governor_, numBlocksPerDynasty_, withdrawalPendingPeriodInBlocks_, crossChainFee_, initialFeeRequired_, fallbackReceiver_)
	if err != nil {
		return common.Address{}, nil, nil, err
	}
	return address, tx, &ChainRegistrarOnMainchain{ChainRegistrarOnMainchainCaller: ChainRegistrarOnMainchainCaller{contract: contract}, ChainRegistrarOnMainchainTransactor: ChainRegistrarOnMainchainTransactor{contract: contract}, ChainRegistrarOnMainchainFilterer: ChainRegistrarOnMainchainFilterer{contract: contract}}, nil
}

// ChainRegistrarOnMainchain is an auto generated Go binding around an Ethereum contract.
type ChainRegistrarOnMainchain struct {
	ChainRegistrarOnMainchainCaller     // Read-only binding to the contract
	ChainRegistrarOnMainchainTransactor // Write-only binding to the contract
	ChainRegistrarOnMainchainFilterer   // Log filterer for contract events
}

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

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

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

// ChainRegistrarOnMainchainSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type ChainRegistrarOnMainchainSession struct {
	Contract     *ChainRegistrarOnMainchain // 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
}

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

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

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

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

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

// NewChainRegistrarOnMainchain creates a new instance of ChainRegistrarOnMainchain, bound to a specific deployed contract.
func NewChainRegistrarOnMainchain(address common.Address, backend bind.ContractBackend) (*ChainRegistrarOnMainchain, error) {
	contract, err := bindChainRegistrarOnMainchain(address, backend, backend, backend)
	if err != nil {
		return nil, err
	}
	return &ChainRegistrarOnMainchain{ChainRegistrarOnMainchainCaller: ChainRegistrarOnMainchainCaller{contract: contract}, ChainRegistrarOnMainchainTransactor: ChainRegistrarOnMainchainTransactor{contract: contract}, ChainRegistrarOnMainchainFilterer: ChainRegistrarOnMainchainFilterer{contract: contract}}, nil
}

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

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

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

// bindChainRegistrarOnMainchain binds a generic wrapper to an already deployed contract.
func bindChainRegistrarOnMainchain(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
	parsed, err := abi.JSON(strings.NewReader(ChainRegistrarOnMainchainABI))
	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 (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _ChainRegistrarOnMainchain.Contract.ChainRegistrarOnMainchainCaller.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 (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.ChainRegistrarOnMainchainTransactor.contract.Transfer(opts)
}

// Transact invokes the (paid) contract method with params as input values.
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.ChainRegistrarOnMainchainTransactor.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 (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _ChainRegistrarOnMainchain.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 (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.contract.Transfer(opts)
}

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

// Admin is a free data retrieval call binding the contract method 0xf851a440.
//
// Solidity: function admin() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) Admin(opts *bind.CallOpts) (common.Address, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "admin")

	if err != nil {
		return *new(common.Address), err
	}

	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)

	return out0, err

}

// Admin is a free data retrieval call binding the contract method 0xf851a440.
//
// Solidity: function admin() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) Admin() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.Admin(&_ChainRegistrarOnMainchain.CallOpts)
}

// Admin is a free data retrieval call binding the contract method 0xf851a440.
//
// Solidity: function admin() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) Admin() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.Admin(&_ChainRegistrarOnMainchain.CallOpts)
}

// CrossChainFee is a free data retrieval call binding the contract method 0x164d29f6.
//
// Solidity: function crossChainFee() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) CrossChainFee(opts *bind.CallOpts) (*big.Int, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "crossChainFee")

	if err != nil {
		return *new(*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)

	return out0, err

}

// CrossChainFee is a free data retrieval call binding the contract method 0x164d29f6.
//
// Solidity: function crossChainFee() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) CrossChainFee() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.CrossChainFee(&_ChainRegistrarOnMainchain.CallOpts)
}

// CrossChainFee is a free data retrieval call binding the contract method 0x164d29f6.
//
// Solidity: function crossChainFee() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) CrossChainFee() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.CrossChainFee(&_ChainRegistrarOnMainchain.CallOpts)
}

// FallbackReceiver is a free data retrieval call binding the contract method 0xf2269521.
//
// Solidity: function fallbackReceiver() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) FallbackReceiver(opts *bind.CallOpts) (common.Address, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "fallbackReceiver")

	if err != nil {
		return *new(common.Address), err
	}

	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)

	return out0, err

}

// FallbackReceiver is a free data retrieval call binding the contract method 0xf2269521.
//
// Solidity: function fallbackReceiver() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) FallbackReceiver() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.FallbackReceiver(&_ChainRegistrarOnMainchain.CallOpts)
}

// FallbackReceiver is a free data retrieval call binding the contract method 0xf2269521.
//
// Solidity: function fallbackReceiver() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) FallbackReceiver() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.FallbackReceiver(&_ChainRegistrarOnMainchain.CallOpts)
}

// GetAllSubchainIDs is a free data retrieval call binding the contract method 0x13b38499.
//
// Solidity: function getAllSubchainIDs() view returns(uint256[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetAllSubchainIDs(opts *bind.CallOpts) ([]*big.Int, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getAllSubchainIDs")

	if err != nil {
		return *new([]*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new([]*big.Int)).(*[]*big.Int)

	return out0, err

}

// GetAllSubchainIDs is a free data retrieval call binding the contract method 0x13b38499.
//
// Solidity: function getAllSubchainIDs() view returns(uint256[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetAllSubchainIDs() ([]*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.GetAllSubchainIDs(&_ChainRegistrarOnMainchain.CallOpts)
}

// GetAllSubchainIDs is a free data retrieval call binding the contract method 0x13b38499.
//
// Solidity: function getAllSubchainIDs() view returns(uint256[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetAllSubchainIDs() ([]*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.GetAllSubchainIDs(&_ChainRegistrarOnMainchain.CallOpts)
}

// GetCrossChainFee is a free data retrieval call binding the contract method 0x9bbb690a.
//
// Solidity: function getCrossChainFee() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetCrossChainFee(opts *bind.CallOpts) (*big.Int, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getCrossChainFee")

	if err != nil {
		return *new(*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)

	return out0, err

}

// GetCrossChainFee is a free data retrieval call binding the contract method 0x9bbb690a.
//
// Solidity: function getCrossChainFee() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetCrossChainFee() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.GetCrossChainFee(&_ChainRegistrarOnMainchain.CallOpts)
}

// GetCrossChainFee is a free data retrieval call binding the contract method 0x9bbb690a.
//
// Solidity: function getCrossChainFee() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetCrossChainFee() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.GetCrossChainFee(&_ChainRegistrarOnMainchain.CallOpts)
}

// GetDynasty is a free data retrieval call binding the contract method 0xdba9de6b.
//
// Solidity: function getDynasty() view returns(uint256 dynasty, bool success)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetDynasty(opts *bind.CallOpts) (struct {
	Dynasty *big.Int
	Success bool
}, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getDynasty")

	outstruct := new(struct {
		Dynasty *big.Int
		Success bool
	})
	if err != nil {
		return *outstruct, err
	}

	outstruct.Dynasty = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
	outstruct.Success = *abi.ConvertType(out[1], new(bool)).(*bool)

	return *outstruct, err

}

// GetDynasty is a free data retrieval call binding the contract method 0xdba9de6b.
//
// Solidity: function getDynasty() view returns(uint256 dynasty, bool success)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetDynasty() (struct {
	Dynasty *big.Int
	Success bool
}, error) {
	return _ChainRegistrarOnMainchain.Contract.GetDynasty(&_ChainRegistrarOnMainchain.CallOpts)
}

// GetDynasty is a free data retrieval call binding the contract method 0xdba9de6b.
//
// Solidity: function getDynasty() view returns(uint256 dynasty, bool success)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetDynasty() (struct {
	Dynasty *big.Int
	Success bool
}, error) {
	return _ChainRegistrarOnMainchain.Contract.GetDynasty(&_ChainRegistrarOnMainchain.CallOpts)
}

// GetFallbackReceiver is a free data retrieval call binding the contract method 0xc2ae68f4.
//
// Solidity: function getFallbackReceiver() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetFallbackReceiver(opts *bind.CallOpts) (common.Address, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getFallbackReceiver")

	if err != nil {
		return *new(common.Address), err
	}

	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)

	return out0, err

}

// GetFallbackReceiver is a free data retrieval call binding the contract method 0xc2ae68f4.
//
// Solidity: function getFallbackReceiver() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetFallbackReceiver() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.GetFallbackReceiver(&_ChainRegistrarOnMainchain.CallOpts)
}

// GetFallbackReceiver is a free data retrieval call binding the contract method 0xc2ae68f4.
//
// Solidity: function getFallbackReceiver() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetFallbackReceiver() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.GetFallbackReceiver(&_ChainRegistrarOnMainchain.CallOpts)
}

// GetNumBlocksPerDynasty is a free data retrieval call binding the contract method 0xa7464b12.
//
// Solidity: function getNumBlocksPerDynasty() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetNumBlocksPerDynasty(opts *bind.CallOpts) (*big.Int, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getNumBlocksPerDynasty")

	if err != nil {
		return *new(*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)

	return out0, err

}

// GetNumBlocksPerDynasty is a free data retrieval call binding the contract method 0xa7464b12.
//
// Solidity: function getNumBlocksPerDynasty() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetNumBlocksPerDynasty() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.GetNumBlocksPerDynasty(&_ChainRegistrarOnMainchain.CallOpts)
}

// GetNumBlocksPerDynasty is a free data retrieval call binding the contract method 0xa7464b12.
//
// Solidity: function getNumBlocksPerDynasty() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetNumBlocksPerDynasty() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.GetNumBlocksPerDynasty(&_ChainRegistrarOnMainchain.CallOpts)
}

// GetPendingStakeWithdrawals is a free data retrieval call binding the contract method 0x1be47778.
//
// Solidity: function getPendingStakeWithdrawals(uint256 subchainID, address staker) view returns((address,uint256,uint256)[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetPendingStakeWithdrawals(opts *bind.CallOpts, subchainID *big.Int, staker common.Address) ([]WithdrawalQueueWithdrawalRequest, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getPendingStakeWithdrawals", subchainID, staker)

	if err != nil {
		return *new([]WithdrawalQueueWithdrawalRequest), err
	}

	out0 := *abi.ConvertType(out[0], new([]WithdrawalQueueWithdrawalRequest)).(*[]WithdrawalQueueWithdrawalRequest)

	return out0, err

}

// GetPendingStakeWithdrawals is a free data retrieval call binding the contract method 0x1be47778.
//
// Solidity: function getPendingStakeWithdrawals(uint256 subchainID, address staker) view returns((address,uint256,uint256)[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetPendingStakeWithdrawals(subchainID *big.Int, staker common.Address) ([]WithdrawalQueueWithdrawalRequest, error) {
	return _ChainRegistrarOnMainchain.Contract.GetPendingStakeWithdrawals(&_ChainRegistrarOnMainchain.CallOpts, subchainID, staker)
}

// GetPendingStakeWithdrawals is a free data retrieval call binding the contract method 0x1be47778.
//
// Solidity: function getPendingStakeWithdrawals(uint256 subchainID, address staker) view returns((address,uint256,uint256)[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetPendingStakeWithdrawals(subchainID *big.Int, staker common.Address) ([]WithdrawalQueueWithdrawalRequest, error) {
	return _ChainRegistrarOnMainchain.Contract.GetPendingStakeWithdrawals(&_ChainRegistrarOnMainchain.CallOpts, subchainID, staker)
}

// GetPendingValidatorCollateralWithdrawals is a free data retrieval call binding the contract method 0x464fa557.
//
// Solidity: function getPendingValidatorCollateralWithdrawals(uint256 subchainID, address guarantor) view returns((address,uint256,uint256)[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetPendingValidatorCollateralWithdrawals(opts *bind.CallOpts, subchainID *big.Int, guarantor common.Address) ([]WithdrawalQueueWithdrawalRequest, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getPendingValidatorCollateralWithdrawals", subchainID, guarantor)

	if err != nil {
		return *new([]WithdrawalQueueWithdrawalRequest), err
	}

	out0 := *abi.ConvertType(out[0], new([]WithdrawalQueueWithdrawalRequest)).(*[]WithdrawalQueueWithdrawalRequest)

	return out0, err

}

// GetPendingValidatorCollateralWithdrawals is a free data retrieval call binding the contract method 0x464fa557.
//
// Solidity: function getPendingValidatorCollateralWithdrawals(uint256 subchainID, address guarantor) view returns((address,uint256,uint256)[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetPendingValidatorCollateralWithdrawals(subchainID *big.Int, guarantor common.Address) ([]WithdrawalQueueWithdrawalRequest, error) {
	return _ChainRegistrarOnMainchain.Contract.GetPendingValidatorCollateralWithdrawals(&_ChainRegistrarOnMainchain.CallOpts, subchainID, guarantor)
}

// GetPendingValidatorCollateralWithdrawals is a free data retrieval call binding the contract method 0x464fa557.
//
// Solidity: function getPendingValidatorCollateralWithdrawals(uint256 subchainID, address guarantor) view returns((address,uint256,uint256)[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetPendingValidatorCollateralWithdrawals(subchainID *big.Int, guarantor common.Address) ([]WithdrawalQueueWithdrawalRequest, error) {
	return _ChainRegistrarOnMainchain.Contract.GetPendingValidatorCollateralWithdrawals(&_ChainRegistrarOnMainchain.CallOpts, subchainID, guarantor)
}

// GetStakeSnapshot is a free data retrieval call binding the contract method 0x44669c03.
//
// Solidity: function getStakeSnapshot(uint256 subchainID, uint256 blockHeight) view returns(bool exists, uint256 targetSnapshotHeight, (uint256,(address,uint256)[]) targetStakeSnapshot)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetStakeSnapshot(opts *bind.CallOpts, subchainID *big.Int, blockHeight *big.Int) (struct {
	Exists               bool
	TargetSnapshotHeight *big.Int
	TargetStakeSnapshot  ValidatorStakeManagerStakeSnapshot
}, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getStakeSnapshot", subchainID, blockHeight)

	outstruct := new(struct {
		Exists               bool
		TargetSnapshotHeight *big.Int
		TargetStakeSnapshot  ValidatorStakeManagerStakeSnapshot
	})
	if err != nil {
		return *outstruct, err
	}

	outstruct.Exists = *abi.ConvertType(out[0], new(bool)).(*bool)
	outstruct.TargetSnapshotHeight = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int)
	outstruct.TargetStakeSnapshot = *abi.ConvertType(out[2], new(ValidatorStakeManagerStakeSnapshot)).(*ValidatorStakeManagerStakeSnapshot)

	return *outstruct, err

}

// GetStakeSnapshot is a free data retrieval call binding the contract method 0x44669c03.
//
// Solidity: function getStakeSnapshot(uint256 subchainID, uint256 blockHeight) view returns(bool exists, uint256 targetSnapshotHeight, (uint256,(address,uint256)[]) targetStakeSnapshot)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetStakeSnapshot(subchainID *big.Int, blockHeight *big.Int) (struct {
	Exists               bool
	TargetSnapshotHeight *big.Int
	TargetStakeSnapshot  ValidatorStakeManagerStakeSnapshot
}, error) {
	return _ChainRegistrarOnMainchain.Contract.GetStakeSnapshot(&_ChainRegistrarOnMainchain.CallOpts, subchainID, blockHeight)
}

// GetStakeSnapshot is a free data retrieval call binding the contract method 0x44669c03.
//
// Solidity: function getStakeSnapshot(uint256 subchainID, uint256 blockHeight) view returns(bool exists, uint256 targetSnapshotHeight, (uint256,(address,uint256)[]) targetStakeSnapshot)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetStakeSnapshot(subchainID *big.Int, blockHeight *big.Int) (struct {
	Exists               bool
	TargetSnapshotHeight *big.Int
	TargetStakeSnapshot  ValidatorStakeManagerStakeSnapshot
}, error) {
	return _ChainRegistrarOnMainchain.Contract.GetStakeSnapshot(&_ChainRegistrarOnMainchain.CallOpts, subchainID, blockHeight)
}

// GetStakeSnapshotHeights is a free data retrieval call binding the contract method 0x331515bc.
//
// Solidity: function getStakeSnapshotHeights(uint256 subchainID) view returns(uint256[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetStakeSnapshotHeights(opts *bind.CallOpts, subchainID *big.Int) ([]*big.Int, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getStakeSnapshotHeights", subchainID)

	if err != nil {
		return *new([]*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new([]*big.Int)).(*[]*big.Int)

	return out0, err

}

// GetStakeSnapshotHeights is a free data retrieval call binding the contract method 0x331515bc.
//
// Solidity: function getStakeSnapshotHeights(uint256 subchainID) view returns(uint256[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetStakeSnapshotHeights(subchainID *big.Int) ([]*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.GetStakeSnapshotHeights(&_ChainRegistrarOnMainchain.CallOpts, subchainID)
}

// GetStakeSnapshotHeights is a free data retrieval call binding the contract method 0x331515bc.
//
// Solidity: function getStakeSnapshotHeights(uint256 subchainID) view returns(uint256[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetStakeSnapshotHeights(subchainID *big.Int) ([]*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.GetStakeSnapshotHeights(&_ChainRegistrarOnMainchain.CallOpts, subchainID)
}

// GetStakersWithPendingWithdrawals is a free data retrieval call binding the contract method 0x7744f6d4.
//
// Solidity: function getStakersWithPendingWithdrawals(uint256 subchainID) view returns(address[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetStakersWithPendingWithdrawals(opts *bind.CallOpts, subchainID *big.Int) ([]common.Address, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getStakersWithPendingWithdrawals", subchainID)

	if err != nil {
		return *new([]common.Address), err
	}

	out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address)

	return out0, err

}

// GetStakersWithPendingWithdrawals is a free data retrieval call binding the contract method 0x7744f6d4.
//
// Solidity: function getStakersWithPendingWithdrawals(uint256 subchainID) view returns(address[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetStakersWithPendingWithdrawals(subchainID *big.Int) ([]common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.GetStakersWithPendingWithdrawals(&_ChainRegistrarOnMainchain.CallOpts, subchainID)
}

// GetStakersWithPendingWithdrawals is a free data retrieval call binding the contract method 0x7744f6d4.
//
// Solidity: function getStakersWithPendingWithdrawals(uint256 subchainID) view returns(address[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetStakersWithPendingWithdrawals(subchainID *big.Int) ([]common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.GetStakersWithPendingWithdrawals(&_ChainRegistrarOnMainchain.CallOpts, subchainID)
}

// GetSubchainMetadata is a free data retrieval call binding the contract method 0x78154cf7.
//
// Solidity: function getSubchainMetadata(uint256 subchainID) view returns((address,uint256,address,string,uint256,bool))
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetSubchainMetadata(opts *bind.CallOpts, subchainID *big.Int) (ChainRegistrarOnMainchainSubchainMetadata, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getSubchainMetadata", subchainID)

	if err != nil {
		return *new(ChainRegistrarOnMainchainSubchainMetadata), err
	}

	out0 := *abi.ConvertType(out[0], new(ChainRegistrarOnMainchainSubchainMetadata)).(*ChainRegistrarOnMainchainSubchainMetadata)

	return out0, err

}

// GetSubchainMetadata is a free data retrieval call binding the contract method 0x78154cf7.
//
// Solidity: function getSubchainMetadata(uint256 subchainID) view returns((address,uint256,address,string,uint256,bool))
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetSubchainMetadata(subchainID *big.Int) (ChainRegistrarOnMainchainSubchainMetadata, error) {
	return _ChainRegistrarOnMainchain.Contract.GetSubchainMetadata(&_ChainRegistrarOnMainchain.CallOpts, subchainID)
}

// GetSubchainMetadata is a free data retrieval call binding the contract method 0x78154cf7.
//
// Solidity: function getSubchainMetadata(uint256 subchainID) view returns((address,uint256,address,string,uint256,bool))
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetSubchainMetadata(subchainID *big.Int) (ChainRegistrarOnMainchainSubchainMetadata, error) {
	return _ChainRegistrarOnMainchain.Contract.GetSubchainMetadata(&_ChainRegistrarOnMainchain.CallOpts, subchainID)
}

// GetSubchainRegistrationHeight is a free data retrieval call binding the contract method 0x2f2c13b5.
//
// Solidity: function getSubchainRegistrationHeight(uint256 subchainID) view returns(uint256, bool)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetSubchainRegistrationHeight(opts *bind.CallOpts, subchainID *big.Int) (*big.Int, bool, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getSubchainRegistrationHeight", subchainID)

	if err != nil {
		return *new(*big.Int), *new(bool), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
	out1 := *abi.ConvertType(out[1], new(bool)).(*bool)

	return out0, out1, err

}

// GetSubchainRegistrationHeight is a free data retrieval call binding the contract method 0x2f2c13b5.
//
// Solidity: function getSubchainRegistrationHeight(uint256 subchainID) view returns(uint256, bool)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetSubchainRegistrationHeight(subchainID *big.Int) (*big.Int, bool, error) {
	return _ChainRegistrarOnMainchain.Contract.GetSubchainRegistrationHeight(&_ChainRegistrarOnMainchain.CallOpts, subchainID)
}

// GetSubchainRegistrationHeight is a free data retrieval call binding the contract method 0x2f2c13b5.
//
// Solidity: function getSubchainRegistrationHeight(uint256 subchainID) view returns(uint256, bool)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetSubchainRegistrationHeight(subchainID *big.Int) (*big.Int, bool, error) {
	return _ChainRegistrarOnMainchain.Contract.GetSubchainRegistrationHeight(&_ChainRegistrarOnMainchain.CallOpts, subchainID)
}

// GetTotalValidatorShares is a free data retrieval call binding the contract method 0x7e0c6253.
//
// Solidity: function getTotalValidatorShares(uint256 subchainID, uint256 dynasty) view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetTotalValidatorShares(opts *bind.CallOpts, subchainID *big.Int, dynasty *big.Int) (*big.Int, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getTotalValidatorShares", subchainID, dynasty)

	if err != nil {
		return *new(*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)

	return out0, err

}

// GetTotalValidatorShares is a free data retrieval call binding the contract method 0x7e0c6253.
//
// Solidity: function getTotalValidatorShares(uint256 subchainID, uint256 dynasty) view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetTotalValidatorShares(subchainID *big.Int, dynasty *big.Int) (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.GetTotalValidatorShares(&_ChainRegistrarOnMainchain.CallOpts, subchainID, dynasty)
}

// GetTotalValidatorShares is a free data retrieval call binding the contract method 0x7e0c6253.
//
// Solidity: function getTotalValidatorShares(uint256 subchainID, uint256 dynasty) view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetTotalValidatorShares(subchainID *big.Int, dynasty *big.Int) (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.GetTotalValidatorShares(&_ChainRegistrarOnMainchain.CallOpts, subchainID, dynasty)
}

// GetValidatorGuarantorsWithPendingWithdrawals is a free data retrieval call binding the contract method 0xe6eaaa81.
//
// Solidity: function getValidatorGuarantorsWithPendingWithdrawals(uint256 subchainID) view returns(address[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetValidatorGuarantorsWithPendingWithdrawals(opts *bind.CallOpts, subchainID *big.Int) ([]common.Address, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getValidatorGuarantorsWithPendingWithdrawals", subchainID)

	if err != nil {
		return *new([]common.Address), err
	}

	out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address)

	return out0, err

}

// GetValidatorGuarantorsWithPendingWithdrawals is a free data retrieval call binding the contract method 0xe6eaaa81.
//
// Solidity: function getValidatorGuarantorsWithPendingWithdrawals(uint256 subchainID) view returns(address[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetValidatorGuarantorsWithPendingWithdrawals(subchainID *big.Int) ([]common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.GetValidatorGuarantorsWithPendingWithdrawals(&_ChainRegistrarOnMainchain.CallOpts, subchainID)
}

// GetValidatorGuarantorsWithPendingWithdrawals is a free data retrieval call binding the contract method 0xe6eaaa81.
//
// Solidity: function getValidatorGuarantorsWithPendingWithdrawals(uint256 subchainID) view returns(address[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetValidatorGuarantorsWithPendingWithdrawals(subchainID *big.Int) ([]common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.GetValidatorGuarantorsWithPendingWithdrawals(&_ChainRegistrarOnMainchain.CallOpts, subchainID)
}

// GetValidatorSet is a free data retrieval call binding the contract method 0x43f27e45.
//
// Solidity: function getValidatorSet(uint256 subchainID, uint256 dynasty) view returns(address[] validators, uint256[] shareAmounts)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetValidatorSet(opts *bind.CallOpts, subchainID *big.Int, dynasty *big.Int) (struct {
	Validators   []common.Address
	ShareAmounts []*big.Int
}, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getValidatorSet", subchainID, dynasty)

	outstruct := new(struct {
		Validators   []common.Address
		ShareAmounts []*big.Int
	})
	if err != nil {
		return *outstruct, err
	}

	outstruct.Validators = *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address)
	outstruct.ShareAmounts = *abi.ConvertType(out[1], new([]*big.Int)).(*[]*big.Int)

	return *outstruct, err

}

// GetValidatorSet is a free data retrieval call binding the contract method 0x43f27e45.
//
// Solidity: function getValidatorSet(uint256 subchainID, uint256 dynasty) view returns(address[] validators, uint256[] shareAmounts)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetValidatorSet(subchainID *big.Int, dynasty *big.Int) (struct {
	Validators   []common.Address
	ShareAmounts []*big.Int
}, error) {
	return _ChainRegistrarOnMainchain.Contract.GetValidatorSet(&_ChainRegistrarOnMainchain.CallOpts, subchainID, dynasty)
}

// GetValidatorSet is a free data retrieval call binding the contract method 0x43f27e45.
//
// Solidity: function getValidatorSet(uint256 subchainID, uint256 dynasty) view returns(address[] validators, uint256[] shareAmounts)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetValidatorSet(subchainID *big.Int, dynasty *big.Int) (struct {
	Validators   []common.Address
	ShareAmounts []*big.Int
}, error) {
	return _ChainRegistrarOnMainchain.Contract.GetValidatorSet(&_ChainRegistrarOnMainchain.CallOpts, subchainID, dynasty)
}

// GetValidatorShares is a free data retrieval call binding the contract method 0x3f216374.
//
// Solidity: function getValidatorShares(uint256 subchainID, uint256 blockHeight, address validator) view returns(bool isAValidator, uint256 shareAmount)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetValidatorShares(opts *bind.CallOpts, subchainID *big.Int, blockHeight *big.Int, validator common.Address) (struct {
	IsAValidator bool
	ShareAmount  *big.Int
}, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getValidatorShares", subchainID, blockHeight, validator)

	outstruct := new(struct {
		IsAValidator bool
		ShareAmount  *big.Int
	})
	if err != nil {
		return *outstruct, err
	}

	outstruct.IsAValidator = *abi.ConvertType(out[0], new(bool)).(*bool)
	outstruct.ShareAmount = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int)

	return *outstruct, err

}

// GetValidatorShares is a free data retrieval call binding the contract method 0x3f216374.
//
// Solidity: function getValidatorShares(uint256 subchainID, uint256 blockHeight, address validator) view returns(bool isAValidator, uint256 shareAmount)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetValidatorShares(subchainID *big.Int, blockHeight *big.Int, validator common.Address) (struct {
	IsAValidator bool
	ShareAmount  *big.Int
}, error) {
	return _ChainRegistrarOnMainchain.Contract.GetValidatorShares(&_ChainRegistrarOnMainchain.CallOpts, subchainID, blockHeight, validator)
}

// GetValidatorShares is a free data retrieval call binding the contract method 0x3f216374.
//
// Solidity: function getValidatorShares(uint256 subchainID, uint256 blockHeight, address validator) view returns(bool isAValidator, uint256 shareAmount)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetValidatorShares(subchainID *big.Int, blockHeight *big.Int, validator common.Address) (struct {
	IsAValidator bool
	ShareAmount  *big.Int
}, error) {
	return _ChainRegistrarOnMainchain.Contract.GetValidatorShares(&_ChainRegistrarOnMainchain.CallOpts, subchainID, blockHeight, validator)
}

// Governor is a free data retrieval call binding the contract method 0x0c340a24.
//
// Solidity: function governor() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) Governor(opts *bind.CallOpts) (common.Address, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "governor")

	if err != nil {
		return *new(common.Address), err
	}

	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)

	return out0, err

}

// Governor is a free data retrieval call binding the contract method 0x0c340a24.
//
// Solidity: function governor() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) Governor() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.Governor(&_ChainRegistrarOnMainchain.CallOpts)
}

// Governor is a free data retrieval call binding the contract method 0x0c340a24.
//
// Solidity: function governor() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) Governor() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.Governor(&_ChainRegistrarOnMainchain.CallOpts)
}

// InitialFeeRequired is a free data retrieval call binding the contract method 0x2e31ac1e.
//
// Solidity: function initialFeeRequired() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) InitialFeeRequired(opts *bind.CallOpts) (*big.Int, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "initialFeeRequired")

	if err != nil {
		return *new(*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)

	return out0, err

}

// InitialFeeRequired is a free data retrieval call binding the contract method 0x2e31ac1e.
//
// Solidity: function initialFeeRequired() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) InitialFeeRequired() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.InitialFeeRequired(&_ChainRegistrarOnMainchain.CallOpts)
}

// InitialFeeRequired is a free data retrieval call binding the contract method 0x2e31ac1e.
//
// Solidity: function initialFeeRequired() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) InitialFeeRequired() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.InitialFeeRequired(&_ChainRegistrarOnMainchain.CallOpts)
}

// IsARegisteredSubchain is a free data retrieval call binding the contract method 0x43b71f05.
//
// Solidity: function isARegisteredSubchain(uint256 subchainID) view returns(bool)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) IsARegisteredSubchain(opts *bind.CallOpts, subchainID *big.Int) (bool, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "isARegisteredSubchain", subchainID)

	if err != nil {
		return *new(bool), err
	}

	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)

	return out0, err

}

// IsARegisteredSubchain is a free data retrieval call binding the contract method 0x43b71f05.
//
// Solidity: function isARegisteredSubchain(uint256 subchainID) view returns(bool)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) IsARegisteredSubchain(subchainID *big.Int) (bool, error) {
	return _ChainRegistrarOnMainchain.Contract.IsARegisteredSubchain(&_ChainRegistrarOnMainchain.CallOpts, subchainID)
}

// IsARegisteredSubchain is a free data retrieval call binding the contract method 0x43b71f05.
//
// Solidity: function isARegisteredSubchain(uint256 subchainID) view returns(bool)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) IsARegisteredSubchain(subchainID *big.Int) (bool, error) {
	return _ChainRegistrarOnMainchain.Contract.IsARegisteredSubchain(&_ChainRegistrarOnMainchain.CallOpts, subchainID)
}

// MinChainCollateralAmount is a free data retrieval call binding the contract method 0xeae243f8.
//
// Solidity: function minChainCollateralAmount() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) MinChainCollateralAmount(opts *bind.CallOpts) (*big.Int, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "minChainCollateralAmount")

	if err != nil {
		return *new(*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)

	return out0, err

}

// MinChainCollateralAmount is a free data retrieval call binding the contract method 0xeae243f8.
//
// Solidity: function minChainCollateralAmount() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) MinChainCollateralAmount() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.MinChainCollateralAmount(&_ChainRegistrarOnMainchain.CallOpts)
}

// MinChainCollateralAmount is a free data retrieval call binding the contract method 0xeae243f8.
//
// Solidity: function minChainCollateralAmount() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) MinChainCollateralAmount() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.MinChainCollateralAmount(&_ChainRegistrarOnMainchain.CallOpts)
}

// MinSubchainID is a free data retrieval call binding the contract method 0xacca1088.
//
// Solidity: function minSubchainID() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) MinSubchainID(opts *bind.CallOpts) (*big.Int, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "minSubchainID")

	if err != nil {
		return *new(*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)

	return out0, err

}

// MinSubchainID is a free data retrieval call binding the contract method 0xacca1088.
//
// Solidity: function minSubchainID() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) MinSubchainID() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.MinSubchainID(&_ChainRegistrarOnMainchain.CallOpts)
}

// MinSubchainID is a free data retrieval call binding the contract method 0xacca1088.
//
// Solidity: function minSubchainID() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) MinSubchainID() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.MinSubchainID(&_ChainRegistrarOnMainchain.CallOpts)
}

// NumBlocksPerDynasty is a free data retrieval call binding the contract method 0x67016090.
//
// Solidity: function numBlocksPerDynasty() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) NumBlocksPerDynasty(opts *bind.CallOpts) (*big.Int, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "numBlocksPerDynasty")

	if err != nil {
		return *new(*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)

	return out0, err

}

// NumBlocksPerDynasty is a free data retrieval call binding the contract method 0x67016090.
//
// Solidity: function numBlocksPerDynasty() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) NumBlocksPerDynasty() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.NumBlocksPerDynasty(&_ChainRegistrarOnMainchain.CallOpts)
}

// NumBlocksPerDynasty is a free data retrieval call binding the contract method 0x67016090.
//
// Solidity: function numBlocksPerDynasty() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) NumBlocksPerDynasty() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.NumBlocksPerDynasty(&_ChainRegistrarOnMainchain.CallOpts)
}

// SubchainCollateralReturnPercentage is a free data retrieval call binding the contract method 0x0cc94f59.
//
// Solidity: function subchainCollateralReturnPercentage() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) SubchainCollateralReturnPercentage(opts *bind.CallOpts) (*big.Int, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "subchainCollateralReturnPercentage")

	if err != nil {
		return *new(*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)

	return out0, err

}

// SubchainCollateralReturnPercentage is a free data retrieval call binding the contract method 0x0cc94f59.
//
// Solidity: function subchainCollateralReturnPercentage() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) SubchainCollateralReturnPercentage() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.SubchainCollateralReturnPercentage(&_ChainRegistrarOnMainchain.CallOpts)
}

// SubchainCollateralReturnPercentage is a free data retrieval call binding the contract method 0x0cc94f59.
//
// Solidity: function subchainCollateralReturnPercentage() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) SubchainCollateralReturnPercentage() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.SubchainCollateralReturnPercentage(&_ChainRegistrarOnMainchain.CallOpts)
}

// SubchainIDs is a free data retrieval call binding the contract method 0xd77a6e66.
//
// Solidity: function subchainIDs(uint256 ) view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) SubchainIDs(opts *bind.CallOpts, arg0 *big.Int) (*big.Int, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "subchainIDs", arg0)

	if err != nil {
		return *new(*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)

	return out0, err

}

// SubchainIDs is a free data retrieval call binding the contract method 0xd77a6e66.
//
// Solidity: function subchainIDs(uint256 ) view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) SubchainIDs(arg0 *big.Int) (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.SubchainIDs(&_ChainRegistrarOnMainchain.CallOpts, arg0)
}

// SubchainIDs is a free data retrieval call binding the contract method 0xd77a6e66.
//
// Solidity: function subchainIDs(uint256 ) view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) SubchainIDs(arg0 *big.Int) (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.SubchainIDs(&_ChainRegistrarOnMainchain.CallOpts, arg0)
}

// SubchainMetadataMap is a free data retrieval call binding the contract method 0xec090302.
//
// Solidity: function subchainMetadataMap(uint256 ) view returns(address guarantor, uint256 collateralAmount, address governanceToken, string genesisHash, uint256 registrationHeight, bool exists)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) SubchainMetadataMap(opts *bind.CallOpts, arg0 *big.Int) (struct {
	Guarantor          common.Address
	CollateralAmount   *big.Int
	GovernanceToken    common.Address
	GenesisHash        string
	RegistrationHeight *big.Int
	Exists             bool
}, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "subchainMetadataMap", arg0)

	outstruct := new(struct {
		Guarantor          common.Address
		CollateralAmount   *big.Int
		GovernanceToken    common.Address
		GenesisHash        string
		RegistrationHeight *big.Int
		Exists             bool
	})
	if err != nil {
		return *outstruct, err
	}

	outstruct.Guarantor = *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
	outstruct.CollateralAmount = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int)
	outstruct.GovernanceToken = *abi.ConvertType(out[2], new(common.Address)).(*common.Address)
	outstruct.GenesisHash = *abi.ConvertType(out[3], new(string)).(*string)
	outstruct.RegistrationHeight = *abi.ConvertType(out[4], new(*big.Int)).(**big.Int)
	outstruct.Exists = *abi.ConvertType(out[5], new(bool)).(*bool)

	return *outstruct, err

}

// SubchainMetadataMap is a free data retrieval call binding the contract method 0xec090302.
//
// Solidity: function subchainMetadataMap(uint256 ) view returns(address guarantor, uint256 collateralAmount, address governanceToken, string genesisHash, uint256 registrationHeight, bool exists)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) SubchainMetadataMap(arg0 *big.Int) (struct {
	Guarantor          common.Address
	CollateralAmount   *big.Int
	GovernanceToken    common.Address
	GenesisHash        string
	RegistrationHeight *big.Int
	Exists             bool
}, error) {
	return _ChainRegistrarOnMainchain.Contract.SubchainMetadataMap(&_ChainRegistrarOnMainchain.CallOpts, arg0)
}

// SubchainMetadataMap is a free data retrieval call binding the contract method 0xec090302.
//
// Solidity: function subchainMetadataMap(uint256 ) view returns(address guarantor, uint256 collateralAmount, address governanceToken, string genesisHash, uint256 registrationHeight, bool exists)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) SubchainMetadataMap(arg0 *big.Int) (struct {
	Guarantor          common.Address
	CollateralAmount   *big.Int
	GovernanceToken    common.Address
	GenesisHash        string
	RegistrationHeight *big.Int
	Exists             bool
}, error) {
	return _ChainRegistrarOnMainchain.Contract.SubchainMetadataMap(&_ChainRegistrarOnMainchain.CallOpts, arg0)
}

// SuperAdmin is a free data retrieval call binding the contract method 0x29575f6a.
//
// Solidity: function superAdmin() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) SuperAdmin(opts *bind.CallOpts) (common.Address, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "superAdmin")

	if err != nil {
		return *new(common.Address), err
	}

	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)

	return out0, err

}

// SuperAdmin is a free data retrieval call binding the contract method 0x29575f6a.
//
// Solidity: function superAdmin() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) SuperAdmin() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.SuperAdmin(&_ChainRegistrarOnMainchain.CallOpts)
}

// SuperAdmin is a free data retrieval call binding the contract method 0x29575f6a.
//
// Solidity: function superAdmin() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) SuperAdmin() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.SuperAdmin(&_ChainRegistrarOnMainchain.CallOpts)
}

// Vcm is a free data retrieval call binding the contract method 0xdc1e8263.
//
// Solidity: function vcm() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) Vcm(opts *bind.CallOpts) (common.Address, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "vcm")

	if err != nil {
		return *new(common.Address), err
	}

	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)

	return out0, err

}

// Vcm is a free data retrieval call binding the contract method 0xdc1e8263.
//
// Solidity: function vcm() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) Vcm() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.Vcm(&_ChainRegistrarOnMainchain.CallOpts)
}

// Vcm is a free data retrieval call binding the contract method 0xdc1e8263.
//
// Solidity: function vcm() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) Vcm() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.Vcm(&_ChainRegistrarOnMainchain.CallOpts)
}

// Vsm is a free data retrieval call binding the contract method 0x07ddf6bc.
//
// Solidity: function vsm() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) Vsm(opts *bind.CallOpts) (common.Address, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "vsm")

	if err != nil {
		return *new(common.Address), err
	}

	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)

	return out0, err

}

// Vsm is a free data retrieval call binding the contract method 0x07ddf6bc.
//
// Solidity: function vsm() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) Vsm() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.Vsm(&_ChainRegistrarOnMainchain.CallOpts)
}

// Vsm is a free data retrieval call binding the contract method 0x07ddf6bc.
//
// Solidity: function vsm() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) Vsm() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.Vsm(&_ChainRegistrarOnMainchain.CallOpts)
}

// WTheta is a free data retrieval call binding the contract method 0xfc80ade3.
//
// Solidity: function wTheta() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) WTheta(opts *bind.CallOpts) (common.Address, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "wTheta")

	if err != nil {
		return *new(common.Address), err
	}

	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)

	return out0, err

}

// WTheta is a free data retrieval call binding the contract method 0xfc80ade3.
//
// Solidity: function wTheta() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) WTheta() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.WTheta(&_ChainRegistrarOnMainchain.CallOpts)
}

// WTheta is a free data retrieval call binding the contract method 0xfc80ade3.
//
// Solidity: function wTheta() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) WTheta() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.WTheta(&_ChainRegistrarOnMainchain.CallOpts)
}

// WithdrawalPendingPeriodInBlocks is a free data retrieval call binding the contract method 0x336c7308.
//
// Solidity: function withdrawalPendingPeriodInBlocks() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) WithdrawalPendingPeriodInBlocks(opts *bind.CallOpts) (*big.Int, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "withdrawalPendingPeriodInBlocks")

	if err != nil {
		return *new(*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)

	return out0, err

}

// WithdrawalPendingPeriodInBlocks is a free data retrieval call binding the contract method 0x336c7308.
//
// Solidity: function withdrawalPendingPeriodInBlocks() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) WithdrawalPendingPeriodInBlocks() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.WithdrawalPendingPeriodInBlocks(&_ChainRegistrarOnMainchain.CallOpts)
}

// WithdrawalPendingPeriodInBlocks is a free data retrieval call binding the contract method 0x336c7308.
//
// Solidity: function withdrawalPendingPeriodInBlocks() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) WithdrawalPendingPeriodInBlocks() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.WithdrawalPendingPeriodInBlocks(&_ChainRegistrarOnMainchain.CallOpts)
}

// AddSubchainCollateral is a paid mutator transaction binding the contract method 0x1911ee41.
//
// Solidity: function addSubchainCollateral(uint256 subchainID, uint256 additionalCollateral) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) AddSubchainCollateral(opts *bind.TransactOpts, subchainID *big.Int, additionalCollateral *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "addSubchainCollateral", subchainID, additionalCollateral)
}

// AddSubchainCollateral is a paid mutator transaction binding the contract method 0x1911ee41.
//
// Solidity: function addSubchainCollateral(uint256 subchainID, uint256 additionalCollateral) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) AddSubchainCollateral(subchainID *big.Int, additionalCollateral *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.AddSubchainCollateral(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, additionalCollateral)
}

// AddSubchainCollateral is a paid mutator transaction binding the contract method 0x1911ee41.
//
// Solidity: function addSubchainCollateral(uint256 subchainID, uint256 additionalCollateral) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) AddSubchainCollateral(subchainID *big.Int, additionalCollateral *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.AddSubchainCollateral(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, additionalCollateral)
}

// ClaimCollateral is a paid mutator transaction binding the contract method 0xc49785b4.
//
// Solidity: function claimCollateral(uint256 subchainID) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) ClaimCollateral(opts *bind.TransactOpts, subchainID *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "claimCollateral", subchainID)
}

// ClaimCollateral is a paid mutator transaction binding the contract method 0xc49785b4.
//
// Solidity: function claimCollateral(uint256 subchainID) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) ClaimCollateral(subchainID *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.ClaimCollateral(&_ChainRegistrarOnMainchain.TransactOpts, subchainID)
}

// ClaimCollateral is a paid mutator transaction binding the contract method 0xc49785b4.
//
// Solidity: function claimCollateral(uint256 subchainID) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) ClaimCollateral(subchainID *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.ClaimCollateral(&_ChainRegistrarOnMainchain.TransactOpts, subchainID)
}

// ClaimStake is a paid mutator transaction binding the contract method 0x44c7d6ef.
//
// Solidity: function claimStake(uint256 subchainID) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) ClaimStake(opts *bind.TransactOpts, subchainID *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "claimStake", subchainID)
}

// ClaimStake is a paid mutator transaction binding the contract method 0x44c7d6ef.
//
// Solidity: function claimStake(uint256 subchainID) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) ClaimStake(subchainID *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.ClaimStake(&_ChainRegistrarOnMainchain.TransactOpts, subchainID)
}

// ClaimStake is a paid mutator transaction binding the contract method 0x44c7d6ef.
//
// Solidity: function claimStake(uint256 subchainID) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) ClaimStake(subchainID *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.ClaimStake(&_ChainRegistrarOnMainchain.TransactOpts, subchainID)
}

// DepositCollateral is a paid mutator transaction binding the contract method 0xebea51b4.
//
// Solidity: function depositCollateral(uint256 subchainID, address validatorCandidate, uint256 collateralAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) DepositCollateral(opts *bind.TransactOpts, subchainID *big.Int, validatorCandidate common.Address, collateralAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "depositCollateral", subchainID, validatorCandidate, collateralAmount)
}

// DepositCollateral is a paid mutator transaction binding the contract method 0xebea51b4.
//
// Solidity: function depositCollateral(uint256 subchainID, address validatorCandidate, uint256 collateralAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) DepositCollateral(subchainID *big.Int, validatorCandidate common.Address, collateralAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.DepositCollateral(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, validatorCandidate, collateralAmount)
}

// DepositCollateral is a paid mutator transaction binding the contract method 0xebea51b4.
//
// Solidity: function depositCollateral(uint256 subchainID, address validatorCandidate, uint256 collateralAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) DepositCollateral(subchainID *big.Int, validatorCandidate common.Address, collateralAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.DepositCollateral(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, validatorCandidate, collateralAmount)
}

// DepositStake is a paid mutator transaction binding the contract method 0xaace2957.
//
// Solidity: function depositStake(uint256 subchainID, address validator, uint256 govTokenAmount) payable returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) DepositStake(opts *bind.TransactOpts, subchainID *big.Int, validator common.Address, govTokenAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "depositStake", subchainID, validator, govTokenAmount)
}

// DepositStake is a paid mutator transaction binding the contract method 0xaace2957.
//
// Solidity: function depositStake(uint256 subchainID, address validator, uint256 govTokenAmount) payable returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) DepositStake(subchainID *big.Int, validator common.Address, govTokenAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.DepositStake(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, validator, govTokenAmount)
}

// DepositStake is a paid mutator transaction binding the contract method 0xaace2957.
//
// Solidity: function depositStake(uint256 subchainID, address validator, uint256 govTokenAmount) payable returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) DepositStake(subchainID *big.Int, validator common.Address, govTokenAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.DepositStake(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, validator, govTokenAmount)
}

// DeregisterSubchain is a paid mutator transaction binding the contract method 0xe6e5e0aa.
//
// Solidity: function deregisterSubchain(uint256 subchainID) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) DeregisterSubchain(opts *bind.TransactOpts, subchainID *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "deregisterSubchain", subchainID)
}

// DeregisterSubchain is a paid mutator transaction binding the contract method 0xe6e5e0aa.
//
// Solidity: function deregisterSubchain(uint256 subchainID) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) DeregisterSubchain(subchainID *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.DeregisterSubchain(&_ChainRegistrarOnMainchain.TransactOpts, subchainID)
}

// DeregisterSubchain is a paid mutator transaction binding the contract method 0xe6e5e0aa.
//
// Solidity: function deregisterSubchain(uint256 subchainID) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) DeregisterSubchain(subchainID *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.DeregisterSubchain(&_ChainRegistrarOnMainchain.TransactOpts, subchainID)
}

// RegisterSubchain is a paid mutator transaction binding the contract method 0xc74fba44.
//
// Solidity: function registerSubchain(uint256 subchainID, address governanceToken, uint256 collateralAmount, string genesisHash) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) RegisterSubchain(opts *bind.TransactOpts, subchainID *big.Int, governanceToken common.Address, collateralAmount *big.Int, genesisHash string) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "registerSubchain", subchainID, governanceToken, collateralAmount, genesisHash)
}

// RegisterSubchain is a paid mutator transaction binding the contract method 0xc74fba44.
//
// Solidity: function registerSubchain(uint256 subchainID, address governanceToken, uint256 collateralAmount, string genesisHash) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) RegisterSubchain(subchainID *big.Int, governanceToken common.Address, collateralAmount *big.Int, genesisHash string) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.RegisterSubchain(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, governanceToken, collateralAmount, genesisHash)
}

// RegisterSubchain is a paid mutator transaction binding the contract method 0xc74fba44.
//
// Solidity: function registerSubchain(uint256 subchainID, address governanceToken, uint256 collateralAmount, string genesisHash) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) RegisterSubchain(subchainID *big.Int, governanceToken common.Address, collateralAmount *big.Int, genesisHash string) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.RegisterSubchain(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, governanceToken, collateralAmount, genesisHash)
}

// SlashChainCollateral is a paid mutator transaction binding the contract method 0xecda8779.
//
// Solidity: function slashChainCollateral(uint256 subchainID, uint256 slashAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) SlashChainCollateral(opts *bind.TransactOpts, subchainID *big.Int, slashAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "slashChainCollateral", subchainID, slashAmount)
}

// SlashChainCollateral is a paid mutator transaction binding the contract method 0xecda8779.
//
// Solidity: function slashChainCollateral(uint256 subchainID, uint256 slashAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) SlashChainCollateral(subchainID *big.Int, slashAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.SlashChainCollateral(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, slashAmount)
}

// SlashChainCollateral is a paid mutator transaction binding the contract method 0xecda8779.
//
// Solidity: function slashChainCollateral(uint256 subchainID, uint256 slashAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) SlashChainCollateral(subchainID *big.Int, slashAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.SlashChainCollateral(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, slashAmount)
}

// SlashValidatorCollateral is a paid mutator transaction binding the contract method 0xda078386.
//
// Solidity: function slashValidatorCollateral(uint256 subchainID, address validator, address guarantor, uint256 slashAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) SlashValidatorCollateral(opts *bind.TransactOpts, subchainID *big.Int, validator common.Address, guarantor common.Address, slashAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "slashValidatorCollateral", subchainID, validator, guarantor, slashAmount)
}

// SlashValidatorCollateral is a paid mutator transaction binding the contract method 0xda078386.
//
// Solidity: function slashValidatorCollateral(uint256 subchainID, address validator, address guarantor, uint256 slashAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) SlashValidatorCollateral(subchainID *big.Int, validator common.Address, guarantor common.Address, slashAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.SlashValidatorCollateral(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, validator, guarantor, slashAmount)
}

// SlashValidatorCollateral is a paid mutator transaction binding the contract method 0xda078386.
//
// Solidity: function slashValidatorCollateral(uint256 subchainID, address validator, address guarantor, uint256 slashAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) SlashValidatorCollateral(subchainID *big.Int, validator common.Address, guarantor common.Address, slashAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.SlashValidatorCollateral(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, validator, guarantor, slashAmount)
}

// UpdateAdmin is a paid mutator transaction binding the contract method 0xe2f273bd.
//
// Solidity: function updateAdmin(address newAdmin) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) UpdateAdmin(opts *bind.TransactOpts, newAdmin common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "updateAdmin", newAdmin)
}

// UpdateAdmin is a paid mutator transaction binding the contract method 0xe2f273bd.
//
// Solidity: function updateAdmin(address newAdmin) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) UpdateAdmin(newAdmin common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateAdmin(&_ChainRegistrarOnMainchain.TransactOpts, newAdmin)
}

// UpdateAdmin is a paid mutator transaction binding the contract method 0xe2f273bd.
//
// Solidity: function updateAdmin(address newAdmin) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) UpdateAdmin(newAdmin common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateAdmin(&_ChainRegistrarOnMainchain.TransactOpts, newAdmin)
}

// UpdateCrossChainFee is a paid mutator transaction binding the contract method 0x9886ddbc.
//
// Solidity: function updateCrossChainFee(uint256 newCrossChainFee) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) UpdateCrossChainFee(opts *bind.TransactOpts, newCrossChainFee *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "updateCrossChainFee", newCrossChainFee)
}

// UpdateCrossChainFee is a paid mutator transaction binding the contract method 0x9886ddbc.
//
// Solidity: function updateCrossChainFee(uint256 newCrossChainFee) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) UpdateCrossChainFee(newCrossChainFee *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateCrossChainFee(&_ChainRegistrarOnMainchain.TransactOpts, newCrossChainFee)
}

// UpdateCrossChainFee is a paid mutator transaction binding the contract method 0x9886ddbc.
//
// Solidity: function updateCrossChainFee(uint256 newCrossChainFee) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) UpdateCrossChainFee(newCrossChainFee *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateCrossChainFee(&_ChainRegistrarOnMainchain.TransactOpts, newCrossChainFee)
}

// UpdateFallbackReceiver is a paid mutator transaction binding the contract method 0xb3f99975.
//
// Solidity: function updateFallbackReceiver(address newFallbackReceiver) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) UpdateFallbackReceiver(opts *bind.TransactOpts, newFallbackReceiver common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "updateFallbackReceiver", newFallbackReceiver)
}

// UpdateFallbackReceiver is a paid mutator transaction binding the contract method 0xb3f99975.
//
// Solidity: function updateFallbackReceiver(address newFallbackReceiver) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) UpdateFallbackReceiver(newFallbackReceiver common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateFallbackReceiver(&_ChainRegistrarOnMainchain.TransactOpts, newFallbackReceiver)
}

// UpdateFallbackReceiver is a paid mutator transaction binding the contract method 0xb3f99975.
//
// Solidity: function updateFallbackReceiver(address newFallbackReceiver) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) UpdateFallbackReceiver(newFallbackReceiver common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateFallbackReceiver(&_ChainRegistrarOnMainchain.TransactOpts, newFallbackReceiver)
}

// UpdateGovernor is a paid mutator transaction binding the contract method 0x62f384ad.
//
// Solidity: function updateGovernor(address newGovernor) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) UpdateGovernor(opts *bind.TransactOpts, newGovernor common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "updateGovernor", newGovernor)
}

// UpdateGovernor is a paid mutator transaction binding the contract method 0x62f384ad.
//
// Solidity: function updateGovernor(address newGovernor) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) UpdateGovernor(newGovernor common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateGovernor(&_ChainRegistrarOnMainchain.TransactOpts, newGovernor)
}

// UpdateGovernor is a paid mutator transaction binding the contract method 0x62f384ad.
//
// Solidity: function updateGovernor(address newGovernor) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) UpdateGovernor(newGovernor common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateGovernor(&_ChainRegistrarOnMainchain.TransactOpts, newGovernor)
}

// UpdateMinChainCollateralAmount is a paid mutator transaction binding the contract method 0xcec9c6e1.
//
// Solidity: function updateMinChainCollateralAmount(uint256 amount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) UpdateMinChainCollateralAmount(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "updateMinChainCollateralAmount", amount)
}

// UpdateMinChainCollateralAmount is a paid mutator transaction binding the contract method 0xcec9c6e1.
//
// Solidity: function updateMinChainCollateralAmount(uint256 amount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) UpdateMinChainCollateralAmount(amount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateMinChainCollateralAmount(&_ChainRegistrarOnMainchain.TransactOpts, amount)
}

// UpdateMinChainCollateralAmount is a paid mutator transaction binding the contract method 0xcec9c6e1.
//
// Solidity: function updateMinChainCollateralAmount(uint256 amount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) UpdateMinChainCollateralAmount(amount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateMinChainCollateralAmount(&_ChainRegistrarOnMainchain.TransactOpts, amount)
}

// UpdateMinValidatorCollateralAmount is a paid mutator transaction binding the contract method 0x1ead7deb.
//
// Solidity: function updateMinValidatorCollateralAmount(uint256 amount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) UpdateMinValidatorCollateralAmount(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "updateMinValidatorCollateralAmount", amount)
}

// UpdateMinValidatorCollateralAmount is a paid mutator transaction binding the contract method 0x1ead7deb.
//
// Solidity: function updateMinValidatorCollateralAmount(uint256 amount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) UpdateMinValidatorCollateralAmount(amount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateMinValidatorCollateralAmount(&_ChainRegistrarOnMainchain.TransactOpts, amount)
}

// UpdateMinValidatorCollateralAmount is a paid mutator transaction binding the contract method 0x1ead7deb.
//
// Solidity: function updateMinValidatorCollateralAmount(uint256 amount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) UpdateMinValidatorCollateralAmount(amount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateMinValidatorCollateralAmount(&_ChainRegistrarOnMainchain.TransactOpts, amount)
}

// UpdateSubchainCollateralReturnPercentage is a paid mutator transaction binding the contract method 0x3cc41ef8.
//
// Solidity: function updateSubchainCollateralReturnPercentage(uint256 newPercentage) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) UpdateSubchainCollateralReturnPercentage(opts *bind.TransactOpts, newPercentage *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "updateSubchainCollateralReturnPercentage", newPercentage)
}

// UpdateSubchainCollateralReturnPercentage is a paid mutator transaction binding the contract method 0x3cc41ef8.
//
// Solidity: function updateSubchainCollateralReturnPercentage(uint256 newPercentage) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) UpdateSubchainCollateralReturnPercentage(newPercentage *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateSubchainCollateralReturnPercentage(&_ChainRegistrarOnMainchain.TransactOpts, newPercentage)
}

// UpdateSubchainCollateralReturnPercentage is a paid mutator transaction binding the contract method 0x3cc41ef8.
//
// Solidity: function updateSubchainCollateralReturnPercentage(uint256 newPercentage) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) UpdateSubchainCollateralReturnPercentage(newPercentage *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateSubchainCollateralReturnPercentage(&_ChainRegistrarOnMainchain.TransactOpts, newPercentage)
}

// UpdateSuperAdmin is a paid mutator transaction binding the contract method 0xcae43fd8.
//
// Solidity: function updateSuperAdmin(address newSuperAdmin) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) UpdateSuperAdmin(opts *bind.TransactOpts, newSuperAdmin common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "updateSuperAdmin", newSuperAdmin)
}

// UpdateSuperAdmin is a paid mutator transaction binding the contract method 0xcae43fd8.
//
// Solidity: function updateSuperAdmin(address newSuperAdmin) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) UpdateSuperAdmin(newSuperAdmin common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateSuperAdmin(&_ChainRegistrarOnMainchain.TransactOpts, newSuperAdmin)
}

// UpdateSuperAdmin is a paid mutator transaction binding the contract method 0xcae43fd8.
//
// Solidity: function updateSuperAdmin(address newSuperAdmin) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) UpdateSuperAdmin(newSuperAdmin common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateSuperAdmin(&_ChainRegistrarOnMainchain.TransactOpts, newSuperAdmin)
}

// UpdateVCMOwner is a paid mutator transaction binding the contract method 0xa74c83b7.
//
// Solidity: function updateVCMOwner(address newOwner) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) UpdateVCMOwner(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "updateVCMOwner", newOwner)
}

// UpdateVCMOwner is a paid mutator transaction binding the contract method 0xa74c83b7.
//
// Solidity: function updateVCMOwner(address newOwner) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) UpdateVCMOwner(newOwner common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateVCMOwner(&_ChainRegistrarOnMainchain.TransactOpts, newOwner)
}

// UpdateVCMOwner is a paid mutator transaction binding the contract method 0xa74c83b7.
//
// Solidity: function updateVCMOwner(address newOwner) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) UpdateVCMOwner(newOwner common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateVCMOwner(&_ChainRegistrarOnMainchain.TransactOpts, newOwner)
}

// UpdateVSMOwner is a paid mutator transaction binding the contract method 0xc21d72bf.
//
// Solidity: function updateVSMOwner(address newOwner) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) UpdateVSMOwner(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "updateVSMOwner", newOwner)
}

// UpdateVSMOwner is a paid mutator transaction binding the contract method 0xc21d72bf.
//
// Solidity: function updateVSMOwner(address newOwner) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) UpdateVSMOwner(newOwner common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateVSMOwner(&_ChainRegistrarOnMainchain.TransactOpts, newOwner)
}

// UpdateVSMOwner is a paid mutator transaction binding the contract method 0xc21d72bf.
//
// Solidity: function updateVSMOwner(address newOwner) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) UpdateVSMOwner(newOwner common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateVSMOwner(&_ChainRegistrarOnMainchain.TransactOpts, newOwner)
}

// WithdrawCollateral is a paid mutator transaction binding the contract method 0x99ea56b0.
//
// Solidity: function withdrawCollateral(uint256 subchainID, address validatorCandidate, uint256 collateralAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) WithdrawCollateral(opts *bind.TransactOpts, subchainID *big.Int, validatorCandidate common.Address, collateralAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "withdrawCollateral", subchainID, validatorCandidate, collateralAmount)
}

// WithdrawCollateral is a paid mutator transaction binding the contract method 0x99ea56b0.
//
// Solidity: function withdrawCollateral(uint256 subchainID, address validatorCandidate, uint256 collateralAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) WithdrawCollateral(subchainID *big.Int, validatorCandidate common.Address, collateralAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.WithdrawCollateral(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, validatorCandidate, collateralAmount)
}

// WithdrawCollateral is a paid mutator transaction binding the contract method 0x99ea56b0.
//
// Solidity: function withdrawCollateral(uint256 subchainID, address validatorCandidate, uint256 collateralAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) WithdrawCollateral(subchainID *big.Int, validatorCandidate common.Address, collateralAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.WithdrawCollateral(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, validatorCandidate, collateralAmount)
}

// WithdrawStake is a paid mutator transaction binding the contract method 0x9f9106cf.
//
// Solidity: function withdrawStake(uint256 subchainID, address validator, uint256 shareAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) WithdrawStake(opts *bind.TransactOpts, subchainID *big.Int, validator common.Address, shareAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "withdrawStake", subchainID, validator, shareAmount)
}

// WithdrawStake is a paid mutator transaction binding the contract method 0x9f9106cf.
//
// Solidity: function withdrawStake(uint256 subchainID, address validator, uint256 shareAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) WithdrawStake(subchainID *big.Int, validator common.Address, shareAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.WithdrawStake(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, validator, shareAmount)
}

// WithdrawStake is a paid mutator transaction binding the contract method 0x9f9106cf.
//
// Solidity: function withdrawStake(uint256 subchainID, address validator, uint256 shareAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) WithdrawStake(subchainID *big.Int, validator common.Address, shareAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.WithdrawStake(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, validator, shareAmount)
}

// ChainRegistrarOnMainchainSlashChainCollateralIterator is returned from FilterSlashChainCollateral and is used to iterate over the raw logs and unpacked data for SlashChainCollateral events raised by the ChainRegistrarOnMainchain contract.
type ChainRegistrarOnMainchainSlashChainCollateralIterator struct {
	Event *ChainRegistrarOnMainchainSlashChainCollateral // Event containing the contract specifics and raw log

	contract *bind.BoundContract // Generic contract to use for unpacking event data
	event    string              // Event name to use for unpacking event data

	logs chan types.Log        // Log channel receiving the found contract events
	sub  ethereum.Subscription // Subscription for errors, completion and termination
	done bool                  // Whether the subscription completed delivering logs
	fail error                 // Occurred error to stop iteration
}

// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
func (it *ChainRegistrarOnMainchainSlashChainCollateralIterator) Next() bool {
	// If the iterator failed, stop iterating
	if it.fail != nil {
		return false
	}
	// If the iterator completed, deliver directly whatever's available
	if it.done {
		select {
		case log := <-it.logs:
			it.Event = new(ChainRegistrarOnMainchainSlashChainCollateral)
			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
				it.fail = err
				return false
			}
			it.Event.Raw = log
			return true

		default:
			return false
		}
	}
	// Iterator still in progress, wait for either a data or an error event
	select {
	case log := <-it.logs:
		it.Event = new(ChainRegistrarOnMainchainSlashChainCollateral)
		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
			it.fail = err
			return false
		}
		it.Event.Raw = log
		return true

	case err := <-it.sub.Err():
		it.done = true
		it.fail = err
		return it.Next()
	}
}

// Error returns any retrieval or parsing error occurred during filtering.
func (it *ChainRegistrarOnMainchainSlashChainCollateralIterator) Error() error {
	return it.fail
}

// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *ChainRegistrarOnMainchainSlashChainCollateralIterator) Close() error {
	it.sub.Unsubscribe()
	return nil
}

// ChainRegistrarOnMainchainSlashChainCollateral represents a SlashChainCollateral event raised by the ChainRegistrarOnMainchain contract.
type ChainRegistrarOnMainchainSlashChainCollateral struct {
	SubchainID  *big.Int
	SlashAmount *big.Int
	Raw         types.Log // Blockchain specific contextual infos
}

// FilterSlashChainCollateral is a free log retrieval operation binding the contract event 0x75396b0e74e738b367e9c25e4168aa3b5e00d2ef5650b014c45a338ebedc5834.
//
// Solidity: event SlashChainCollateral(uint256 subchainID, uint256 slashAmount)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainFilterer) FilterSlashChainCollateral(opts *bind.FilterOpts) (*ChainRegistrarOnMainchainSlashChainCollateralIterator, error) {

	logs, sub, err := _ChainRegistrarOnMainchain.contract.FilterLogs(opts, "SlashChainCollateral")
	if err != nil {
		return nil, err
	}
	return &ChainRegistrarOnMainchainSlashChainCollateralIterator{contract: _ChainRegistrarOnMainchain.contract, event: "SlashChainCollateral", logs: logs, sub: sub}, nil
}

// WatchSlashChainCollateral is a free log subscription operation binding the contract event 0x75396b0e74e738b367e9c25e4168aa3b5e00d2ef5650b014c45a338ebedc5834.
//
// Solidity: event SlashChainCollateral(uint256 subchainID, uint256 slashAmount)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainFilterer) WatchSlashChainCollateral(opts *bind.WatchOpts, sink chan<- *ChainRegistrarOnMainchainSlashChainCollateral) (event.Subscription, error) {

	logs, sub, err := _ChainRegistrarOnMainchain.contract.WatchLogs(opts, "SlashChainCollateral")
	if err != nil {
		return nil, err
	}
	return event.NewSubscription(func(quit <-chan struct{}) error {
		defer sub.Unsubscribe()
		for {
			select {
			case log := <-logs:
				// New log arrived, parse the event and forward to the user
				event := new(ChainRegistrarOnMainchainSlashChainCollateral)
				if err := _ChainRegistrarOnMainchain.contract.UnpackLog(event, "SlashChainCollateral", log); err != nil {
					return err
				}
				event.Raw = log

				select {
				case sink <- event:
				case err := <-sub.Err():
					return err
				case <-quit:
					return nil
				}
			case err := <-sub.Err():
				return err
			case <-quit:
				return nil
			}
		}
	}), nil
}

// ParseSlashChainCollateral is a log parse operation binding the contract event 0x75396b0e74e738b367e9c25e4168aa3b5e00d2ef5650b014c45a338ebedc5834.
//
// Solidity: event SlashChainCollateral(uint256 subchainID, uint256 slashAmount)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainFilterer) ParseSlashChainCollateral(log types.Log) (*ChainRegistrarOnMainchainSlashChainCollateral, error) {
	event := new(ChainRegistrarOnMainchainSlashChainCollateral)
	if err := _ChainRegistrarOnMainchain.contract.UnpackLog(event, "SlashChainCollateral", log); err != nil {
		return nil, err
	}
	event.Raw = log
	return event, nil
}

// ChainRegistrarOnMainchainSlashValidatorCollateralIterator is returned from FilterSlashValidatorCollateral and is used to iterate over the raw logs and unpacked data for SlashValidatorCollateral events raised by the ChainRegistrarOnMainchain contract.
type ChainRegistrarOnMainchainSlashValidatorCollateralIterator struct {
	Event *ChainRegistrarOnMainchainSlashValidatorCollateral // Event containing the contract specifics and raw log

	contract *bind.BoundContract // Generic contract to use for unpacking event data
	event    string              // Event name to use for unpacking event data

	logs chan types.Log        // Log channel receiving the found contract events
	sub  ethereum.Subscription // Subscription for errors, completion and termination
	done bool                  // Whether the subscription completed delivering logs
	fail error                 // Occurred error to stop iteration
}

// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
func (it *ChainRegistrarOnMainchainSlashValidatorCollateralIterator) Next() bool {
	// If the iterator failed, stop iterating
	if it.fail != nil {
		return false
	}
	// If the iterator completed, deliver directly whatever's available
	if it.done {
		select {
		case log := <-it.logs:
			it.Event = new(ChainRegistrarOnMainchainSlashValidatorCollateral)
			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
				it.fail = err
				return false
			}
			it.Event.Raw = log
			return true

		default:
			return false
		}
	}
	// Iterator still in progress, wait for either a data or an error event
	select {
	case log := <-it.logs:
		it.Event = new(ChainRegistrarOnMainchainSlashValidatorCollateral)
		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
			it.fail = err
			return false
		}
		it.Event.Raw = log
		return true

	case err := <-it.sub.Err():
		it.done = true
		it.fail = err
		return it.Next()
	}
}

// Error returns any retrieval or parsing error occurred during filtering.
func (it *ChainRegistrarOnMainchainSlashValidatorCollateralIterator) Error() error {
	return it.fail
}

// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *ChainRegistrarOnMainchainSlashValidatorCollateralIterator) Close() error {
	it.sub.Unsubscribe()
	return nil
}

// ChainRegistrarOnMainchainSlashValidatorCollateral represents a SlashValidatorCollateral event raised by the ChainRegistrarOnMainchain contract.
type ChainRegistrarOnMainchainSlashValidatorCollateral struct {
	SubchainID          *big.Int
	Validator           common.Address
	Guarantor           common.Address
	ActualSlashedAmount *big.Int
	Raw                 types.Log // Blockchain specific contextual infos
}

// FilterSlashValidatorCollateral is a free log retrieval operation binding the contract event 0x1099c09baaa6f6984b5ecea47e7a86fb0084d23b7e13a9a453629f6a3e93c62e.
//
// Solidity: event SlashValidatorCollateral(uint256 subchainID, address validator, address guarantor, uint256 actualSlashedAmount)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainFilterer) FilterSlashValidatorCollateral(opts *bind.FilterOpts) (*ChainRegistrarOnMainchainSlashValidatorCollateralIterator, error) {

	logs, sub, err := _ChainRegistrarOnMainchain.contract.FilterLogs(opts, "SlashValidatorCollateral")
	if err != nil {
		return nil, err
	}
	return &ChainRegistrarOnMainchainSlashValidatorCollateralIterator{contract: _ChainRegistrarOnMainchain.contract, event: "SlashValidatorCollateral", logs: logs, sub: sub}, nil
}

// WatchSlashValidatorCollateral is a free log subscription operation binding the contract event 0x1099c09baaa6f6984b5ecea47e7a86fb0084d23b7e13a9a453629f6a3e93c62e.
//
// Solidity: event SlashValidatorCollateral(uint256 subchainID, address validator, address guarantor, uint256 actualSlashedAmount)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainFilterer) WatchSlashValidatorCollateral(opts *bind.WatchOpts, sink chan<- *ChainRegistrarOnMainchainSlashValidatorCollateral) (event.Subscription, error) {

	logs, sub, err := _ChainRegistrarOnMainchain.contract.WatchLogs(opts, "SlashValidatorCollateral")
	if err != nil {
		return nil, err
	}
	return event.NewSubscription(func(quit <-chan struct{}) error {
		defer sub.Unsubscribe()
		for {
			select {
			case log := <-logs:
				// New log arrived, parse the event and forward to the user
				event := new(ChainRegistrarOnMainchainSlashValidatorCollateral)
				if err := _ChainRegistrarOnMainchain.contract.UnpackLog(event, "SlashValidatorCollateral", log); err != nil {
					return err
				}
				event.Raw = log

				select {
				case sink <- event:
				case err := <-sub.Err():
					return err
				case <-quit:
					return nil
				}
			case err := <-sub.Err():
				return err
			case <-quit:
				return nil
			}
		}
	}), nil
}

// ParseSlashValidatorCollateral is a log parse operation binding the contract event 0x1099c09baaa6f6984b5ecea47e7a86fb0084d23b7e13a9a453629f6a3e93c62e.
//
// Solidity: event SlashValidatorCollateral(uint256 subchainID, address validator, address guarantor, uint256 actualSlashedAmount)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainFilterer) ParseSlashValidatorCollateral(log types.Log) (*ChainRegistrarOnMainchainSlashValidatorCollateral, error) {
	event := new(ChainRegistrarOnMainchainSlashValidatorCollateral)
	if err := _ChainRegistrarOnMainchain.contract.UnpackLog(event, "SlashValidatorCollateral", log); err != nil {
		return nil, err
	}
	event.Raw = log
	return event, nil
}
