0 txs
1 call
constructor
constructor(uint256 _adminUpdateBufferSeconds, address _helios, address _hubPoolStore, address _wrappedNativeTokenAddress, uint32 _depositQuoteTimeBuffer, uint32 _fillDeadlineBuffer, address _l2Usdc, address _cctpTokenMessenger, uint32 _oftDstEid, uint256 _oftFeeCap)
functions
ADMIN_UPDATE_BUFFER
viewfunction ADMIN_UPDATE_BUFFER() view returns (uint256)
cctpTokenMessenger
viewfunction cctpTokenMessenger() view returns (address)
cctpV2
viewfunction cctpV2() view returns (bool)
chainId
viewfunction chainId() view returns (uint256)
crossDomainAdmin
viewfunction crossDomainAdmin() view returns (address)
depositQuoteTimeBuffer
viewfunction depositQuoteTimeBuffer() view returns (uint32)
EMPTY_MSG_BYTES
viewfunction EMPTY_MSG_BYTES() view returns (bytes)
EMPTY_RELAYER
viewfunction EMPTY_RELAYER() view returns (bytes32)
EMPTY_REPAYMENT_CHAIN_ID
viewfunction EMPTY_REPAYMENT_CHAIN_ID() view returns (uint256)
executedMessages
viewfunction executedMessages(uint256) view returns (bool)
fillDeadlineBuffer
viewfunction fillDeadlineBuffer() view returns (uint32)
fillStatuses
viewfunction fillStatuses(bytes32) view returns (uint256)
getCurrentTime
viewfunction getCurrentTime() view returns (uint256)
getRelayerRefund
viewfunction getRelayerRefund(address l2TokenAddress, address refundAddress) view returns (uint256)
getSlotKey
purefunction getSlotKey(uint256 _nonce) pure returns (bytes32)
getUnsafeDepositId
purefunction getUnsafeDepositId(address msgSender, bytes32 depositor, uint256 depositNonce) pure returns (uint256)
getV3RelayHash
viewfunction getV3RelayHash(tuple relayData) view returns (bytes32)
helios
viewfunction helios() view returns (address)
HUB_POOL_STORE_CALLDATA_MAPPING_SLOT_INDEX
viewfunction HUB_POOL_STORE_CALLDATA_MAPPING_SLOT_INDEX() view returns (uint256)
hubPoolStore
viewfunction hubPoolStore() view returns (address)
INFINITE_FILL_DEADLINE
viewfunction INFINITE_FILL_DEADLINE() view returns (uint32)
MAX_EXCLUSIVITY_PERIOD_SECONDS
viewfunction MAX_EXCLUSIVITY_PERIOD_SECONDS() view returns (uint32)
MAX_TRANSFER_SIZE
viewfunction MAX_TRANSFER_SIZE() view returns (uint256)
numberOfDeposits
viewfunction numberOfDeposits() view returns (uint32)
OFT_DST_EID
viewfunction OFT_DST_EID() view returns (uint32)
OFT_FEE_CAP
viewfunction OFT_FEE_CAP() view returns (uint256)
oftMessengers
viewfunction oftMessengers(address l2TokenAddress) view returns (address l2OftMessenger)
owner
viewfunction owner() view returns (address)
pausedDeposits
viewfunction pausedDeposits() view returns (bool)
pausedFills
viewfunction pausedFills() view returns (bool)
proxiableUUID
viewfunction proxiableUUID() view returns (bytes32)
recipientCircleDomainId
viewfunction recipientCircleDomainId() view returns (uint32)
relayerRefund
viewfunction relayerRefund(address, address) view returns (uint256)
rootBundles
viewfunction rootBundles(uint256) view returns (bytes32 slowRelayRoot, bytes32 relayerRefundRoot)
UPDATE_BYTES32_DEPOSIT_DETAILS_HASH
viewfunction UPDATE_BYTES32_DEPOSIT_DETAILS_HASH() view returns (bytes32)
usdcToken
viewfunction usdcToken() view returns (address)
withdrawalRecipient
viewfunction withdrawalRecipient() view returns (address)
wrappedNativeToken
viewfunction wrappedNativeToken() view returns (address)
__SpokePool_init
nonpayablefunction __SpokePool_init(uint32 _initialDepositId, address _crossDomainAdmin, address _withdrawalRecipient)
adminExecuteMessage
nonpayablefunction adminExecuteMessage(bytes _message)
claimRelayerRefund
nonpayablefunction claimRelayerRefund(bytes32 l2TokenAddress, bytes32 refundAddress)
deposit
payablefunction deposit(bytes32 depositor, bytes32 recipient, bytes32 inputToken, bytes32 outputToken, uint256 inputAmount, uint256 outputAmount, uint256 destinationChainId, bytes32 exclusiveRelayer, uint32 quoteTimestamp, uint32 fillDeadline, uint32 exclusivityParameter, bytes message) payable
depositDeprecated_5947912356
payablefunction depositDeprecated_5947912356(address recipient, address originToken, uint256 amount, uint256 destinationChainId, int64 relayerFeePct, uint32 quoteTimestamp, bytes message, uint256) payable
depositFor
payablefunction depositFor(address depositor, address recipient, address originToken, uint256 amount, uint256 destinationChainId, int64 relayerFeePct, uint32 quoteTimestamp, bytes message, uint256) payable
depositNow
payablefunction depositNow(bytes32 depositor, bytes32 recipient, bytes32 inputToken, bytes32 outputToken, uint256 inputAmount, uint256 outputAmount, uint256 destinationChainId, bytes32 exclusiveRelayer, uint32 fillDeadlineOffset, uint32 exclusivityParameter, bytes message) payable
depositV3
payablefunction depositV3(address depositor, address recipient, address inputToken, address outputToken, uint256 inputAmount, uint256 outputAmount, uint256 destinationChainId, address exclusiveRelayer, uint32 quoteTimestamp, uint32 fillDeadline, uint32 exclusivityParameter, bytes message) payable
depositV3Now
payablefunction depositV3Now(address depositor, address recipient, address inputToken, address outputToken, uint256 inputAmount, uint256 outputAmount, uint256 destinationChainId, address exclusiveRelayer, uint32 fillDeadlineOffset, uint32 exclusivityParameter, bytes message) payable
emergencyDeleteRootBundle
nonpayablefunction emergencyDeleteRootBundle(uint256 rootBundleId)
executeMessage
nonpayablefunction executeMessage(uint256 _messageNonce, bytes _message, uint256 _blockNumber)
executeRelayerRefundLeaf
payablefunction executeRelayerRefundLeaf(uint32 rootBundleId, tuple relayerRefundLeaf, bytes32[] proof) payable
executeSlowRelayLeaf
nonpayablefunction executeSlowRelayLeaf(tuple slowFillLeaf, uint32 rootBundleId, bytes32[] proof)
fill
nonpayablefunction fill(bytes32 orderId, bytes originData, bytes fillerData)
fillRelay
nonpayablefunction fillRelay(tuple relayData, uint256 repaymentChainId, bytes32 repaymentAddress)
fillRelayWithUpdatedDeposit
nonpayablefunction fillRelayWithUpdatedDeposit(tuple relayData, uint256 repaymentChainId, bytes32 repaymentAddress, uint256 updatedOutputAmount, bytes32 updatedRecipient, bytes updatedMessage, bytes depositorSignature)
fillV3Relay
nonpayablefunction fillV3Relay(tuple relayData, uint256 repaymentChainId)
initialize
nonpayablefunction initialize(uint32 _initialDepositId, address _crossDomainAdmin, address _withdrawalRecipient)
multicall
nonpayablefunction multicall(bytes[] data) returns (bytes[] results)
pauseDeposits
nonpayablefunction pauseDeposits(bool pause)
pauseFills
nonpayablefunction pauseFills(bool pause)
relayRootBundle
nonpayablefunction relayRootBundle(bytes32 relayerRefundRoot, bytes32 slowRelayRoot)
renounceOwnership
nonpayablefunction renounceOwnership()
requestSlowFill
nonpayablefunction requestSlowFill(tuple relayData)
setCrossDomainAdmin
nonpayablefunction setCrossDomainAdmin(address newCrossDomainAdmin)
setOftMessenger
nonpayablefunction setOftMessenger(address token, address messenger)
setWithdrawalRecipient
nonpayablefunction setWithdrawalRecipient(address newWithdrawalRecipient)
speedUpDeposit
nonpayablefunction speedUpDeposit(bytes32 depositor, uint256 depositId, uint256 updatedOutputAmount, bytes32 updatedRecipient, bytes updatedMessage, bytes depositorSignature)
speedUpV3Deposit
nonpayablefunction speedUpV3Deposit(address depositor, uint256 depositId, uint256 updatedOutputAmount, address updatedRecipient, bytes updatedMessage, bytes depositorSignature)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
tryMulticall
nonpayablefunction tryMulticall(bytes[] data) returns (tuple[] results)
unsafeDeposit
payablefunction unsafeDeposit(bytes32 depositor, bytes32 recipient, bytes32 inputToken, bytes32 outputToken, uint256 inputAmount, uint256 outputAmount, uint256 destinationChainId, bytes32 exclusiveRelayer, uint256 depositNonce, uint32 quoteTimestamp, uint32 fillDeadline, uint32 exclusivityParameter, bytes message) payable
upgradeTo
nonpayablefunction upgradeTo(address newImplementation)
upgradeToAndCall
payablefunction upgradeToAndCall(address newImplementation, bytes data) payable
events
AdminChanged
event AdminChanged(address previousAdmin, address newAdmin)
BeaconUpgraded
event BeaconUpgraded(address indexed beacon)
ClaimedRelayerRefund
event ClaimedRelayerRefund(bytes32 indexed l2TokenAddress, bytes32 indexed refundAddress, uint256 amount, address indexed caller)
EmergencyDeletedRootBundle
event EmergencyDeletedRootBundle(uint256 indexed rootBundleId)
EnabledDepositRoute
event EnabledDepositRoute(address indexed originToken, uint256 indexed destinationChainId, bool enabled)
ExecutedRelayerRefundRoot
event ExecutedRelayerRefundRoot(uint256 amountToReturn, uint256 indexed chainId, uint256[] refundAmounts, uint32 indexed rootBundleId, uint32 indexed leafId, address l2TokenAddress, address[] refundAddresses, bool deferredRefunds, address caller)
FilledRelay
event FilledRelay(bytes32 inputToken, bytes32 outputToken, uint256 inputAmount, uint256 outputAmount, uint256 repaymentChainId, uint256 indexed originChainId, uint256 indexed depositId, uint32 fillDeadline, uint32 exclusivityDeadline, bytes32 exclusiveRelayer, bytes32 indexed relayer, bytes32 depositor, bytes32 recipient, bytes32 messageHash, (bytes32 updatedRecipient, bytes32 updatedMessageHash, uint256 updatedOutputAmount, uint8 fillType) relayExecutionInfo)
FilledV3Relay
event FilledV3Relay(address inputToken, address outputToken, uint256 inputAmount, uint256 outputAmount, uint256 repaymentChainId, uint256 indexed originChainId, uint32 indexed depositId, uint32 fillDeadline, uint32 exclusivityDeadline, address exclusiveRelayer, address indexed relayer, address depositor, address recipient, bytes message, (address updatedRecipient, bytes updatedMessage, uint256 updatedOutputAmount, uint8 fillType) relayExecutionInfo)
FundsDeposited
event FundsDeposited(bytes32 inputToken, bytes32 outputToken, uint256 inputAmount, uint256 outputAmount, uint256 indexed destinationChainId, uint256 indexed depositId, uint32 quoteTimestamp, uint32 fillDeadline, uint32 exclusivityDeadline, bytes32 indexed depositor, bytes32 recipient, bytes32 exclusiveRelayer, bytes message)
Initialized
event Initialized(uint8 version)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
PausedDeposits
event PausedDeposits(bool isPaused)
PausedFills
event PausedFills(bool isPaused)
RelayedCallData
event RelayedCallData(uint256 indexed nonce, address caller)
RelayedRootBundle
event RelayedRootBundle(uint32 indexed rootBundleId, bytes32 indexed relayerRefundRoot, bytes32 indexed slowRelayRoot)
RequestedSlowFill
event RequestedSlowFill(bytes32 inputToken, bytes32 outputToken, uint256 inputAmount, uint256 outputAmount, uint256 indexed originChainId, uint256 indexed depositId, uint32 fillDeadline, uint32 exclusivityDeadline, bytes32 exclusiveRelayer, bytes32 depositor, bytes32 recipient, bytes32 messageHash)
RequestedSpeedUpDeposit
event RequestedSpeedUpDeposit(uint256 updatedOutputAmount, uint256 indexed depositId, bytes32 indexed depositor, bytes32 updatedRecipient, bytes updatedMessage, bytes depositorSignature)
RequestedSpeedUpV3Deposit
event RequestedSpeedUpV3Deposit(uint256 updatedOutputAmount, uint32 indexed depositId, address indexed depositor, address updatedRecipient, bytes updatedMessage, bytes depositorSignature)
RequestedV3SlowFill
event RequestedV3SlowFill(address inputToken, address outputToken, uint256 inputAmount, uint256 outputAmount, uint256 indexed originChainId, uint32 indexed depositId, uint32 fillDeadline, uint32 exclusivityDeadline, address exclusiveRelayer, address depositor, address recipient, bytes message)
SetOFTMessenger
event SetOFTMessenger(address indexed token, address indexed messenger)
SetWithdrawalRecipient
event SetWithdrawalRecipient(address indexed newWithdrawalRecipient)
SetXDomainAdmin
event SetXDomainAdmin(address indexed newAdmin)
TokensBridged
event TokensBridged(uint256 amountToReturn, uint256 indexed chainId, uint32 indexed leafId, bytes32 indexed l2TokenAddress, address caller)
Upgraded
event Upgraded(address indexed implementation)
V3FundsDeposited
event V3FundsDeposited(address inputToken, address outputToken, uint256 inputAmount, uint256 outputAmount, uint256 indexed destinationChainId, uint32 indexed depositId, uint32 quoteTimestamp, uint32 fillDeadline, uint32 exclusivityDeadline, address indexed depositor, address recipient, address exclusiveRelayer, bytes message)
errors
AdminCallAlreadySet
error AdminCallAlreadySet()
AdminCallNotValidated
error AdminCallNotValidated()
AdminUpdateTooCloseToLastHeliosUpdate
error AdminUpdateTooCloseToLastHeliosUpdate()
AlreadyExecuted
error AlreadyExecuted()
ClaimedMerkleLeaf
error ClaimedMerkleLeaf()
DelegateCallFailed
error DelegateCallFailed()
DepositsArePaused
error DepositsArePaused()
DisabledRoute
error DisabledRoute()
ExpiredFillDeadline
error ExpiredFillDeadline()
FillsArePaused
error FillsArePaused()
InsufficientSpokePoolBalanceToExecuteLeaf
error InsufficientSpokePoolBalanceToExecuteLeaf()
InvalidBytes32
error InvalidBytes32()
InvalidChainId
error InvalidChainId()
InvalidCrossDomainAdmin
error InvalidCrossDomainAdmin()
InvalidDepositorSignature
error InvalidDepositorSignature()
InvalidExclusiveRelayer
error InvalidExclusiveRelayer()
InvalidFillDeadline
error InvalidFillDeadline()
InvalidMerkleLeaf
error InvalidMerkleLeaf()
InvalidMerkleProof
error InvalidMerkleProof()
InvalidPayoutAdjustmentPct
error InvalidPayoutAdjustmentPct()
InvalidQuoteTimestamp
error InvalidQuoteTimestamp()
InvalidRelayerFeePct
error InvalidRelayerFeePct()
InvalidSlowFillRequest
error InvalidSlowFillRequest()
InvalidWithdrawalRecipient
error InvalidWithdrawalRecipient()
LowLevelCallFailed
error LowLevelCallFailed(bytes data)
MaxTransferSizeExceeded
error MaxTransferSizeExceeded()
MsgValueDoesNotMatchInputAmount
error MsgValueDoesNotMatchInputAmount()
NoRelayerRefundToClaim
error NoRelayerRefundToClaim()
NoSlowFillsInExclusivityWindow
error NoSlowFillsInExclusivityWindow()
NotEOA
error NotEOA()
NotExclusiveRelayer
error NotExclusiveRelayer()
NotImplemented
error NotImplemented()
NotTarget
error NotTarget()
OftFeeCapExceeded
error OftFeeCapExceeded()
OFTFeeUnderpaid
error OFTFeeUnderpaid()
OftIncorrectAmountReceivedLD
error OftIncorrectAmountReceivedLD()
OftIncorrectAmountSentLD
error OftIncorrectAmountSentLD()
OftInsufficientBalanceForFee
error OftInsufficientBalanceForFee()
OftLzFeeNotZero
error OftLzFeeNotZero()
OFTTokenMismatch
error OFTTokenMismatch()
RelayFilled
error RelayFilled()
SlotValueMismatch
error SlotValueMismatch()
WrongERC7683OrderId
error WrongERC7683OrderId()
creation bytecode
0x61022060405234620003675761014062005ba1803803809162000025826102206200036b565b6102203912620003675761022051620000406102406200038f565b6200004d6102606200038f565b916200005b6102806200038f565b91620000696102a0620003a4565b93620000776102c0620003a4565b6102e051956001600160a01b0387168703620003675761030051956001600160a01b03871687036200036757620000b0610320620003a4565b610340513060805260c09190915260a0526001600160a01b031660e05261010052610120525f54600881901c60ff16620003675760ff808216036200032c575b506101609485526101808481525f610140526040805163011a412160e61b602082019081526004825292966001600160401b03939192830191848311848410176200030f575f938493604052519160018060a01b03165afa903d1562000323573d9081116200030f576040519062000173601f8201601f1916602001836200036b565b81523d5f602083013e5b8162000302575b81620002c9575b506101a09081526102009384526101e09283526101c0918252604051946157ea9687620003b78839608051878181611309015281816116850152611799015260a051878181611af401526153ed015260c051878181611cb60152614a3a015260e05187818161084d0152818161388201528181613f7e015281816142100152818161455f01528181614b9d0152614c18015261010051878181611a930152818161383901526146fc0152610120518781816104b90152614512015261014051878181611c7601528181615080015261512b0152518681816107ef01528181614b3b0152614f810152518581816121e0015281816149a80152614f5c015251848181611dfa0152615020015251838181610dbf01526128b1015251828181610e07015281816118d50152612bf901525181818161194601526128f70152f35b9050602081519101519060208110620002f0575b506001600160a01b031615155f6200018b565b5f199060200360031b1b165f620002dd565b8051602014915062000184565b634e487b7160e01b5f52604160045260245ffd5b5060606200017d565b60ff90811916175f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a15f620000f0565b5f80fd5b601f909101601f19168101906001600160401b038211908210176200030f57604052565b51906001600160a01b03821682036200036757565b519063ffffffff82168203620003675756fe6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c8063079bd2c71461048a5780630cb84d9a146104855780631186ec331461048057806311eac8551461047b57806315348e44146103e557806317fcb39b1461047657806319c1648c146104715780631b3d55591461046c5780631fab657c1461046757806326b105d21461046257806329cb924d1461045d5780632e378115146104585780632e63e59a146104535780633659cfe61461044e578063437b911614610449578063490e49ef14610444578063493a4f841461043f5780634f1ef2861461043a5780635285e0581461043557806352d1902d14610430578063541f4f141461042b5780635743a7b914610426578063577f51f81461042157806357f6dcb81461041c5780636068d6cb1461041757806361a04d3014610412578063647c576c1461040d578063670fa8ac146104085780636bbbcd2e146103e55780636e400983146104035780636fd5c10e146103fe578063715018a6146103f9578063738b62e5146103f457806373fd4836146103ef578063775c0d03146103ea578063793d2be0146103e55780637aef642c146103e05780637b939232146103db5780637ef413e1146103d657806382e2c43f146103d15780638a7860ce146103cc5780638b15788e146103c75780638da5cb5b146103c25780639748cf7c146103bd57806397943aa9146103b8578063979f2bc2146103b357806399cc2968146103ae5780639a8a0592146103a9578063a1244c67146103a4578063a18a096e1461039f578063ac9650d81461039a578063ad5425c614610395578063adb5a6a614610340578063b370b7f514610390578063b4c0d7ab1461038b578063babb6aac14610386578063bce63c0014610381578063c2bb0c551461037c578063c35c83fc14610377578063ceb4c98714610372578063d7e1583a1461036d578063dda5211314610368578063ddd224f114610363578063de7eba781461035e578063deff4b2414610359578063e45a469414610354578063ea86bd461461034f578063ee2a53f81461034a578063f2fde38b14610345578063f79f29ed14610340578063fb4c37491461033b5763fc8a584f0361000e57612db7565b612d87565b6126fe565b612d4a565b612d0c565b612c28565b612be4565b612af0565b612ac0565b612a98565b612a72565b612a3d565b612945565b61291a565b6128e0565b61289c565b6127c6565b612797565b612737565b6125e1565b612541565b6123f5565b6123ce565b6123b4565b612336565b61228e565b61220f565b6121cb565b6121a3565b612126565b6120ae565b611f94565b611f65565b611ebe565b611e1f565b61081e565b611de3565b611dbd565b611d3f565b611cda565b611c9a565b611c5a565b611c20565b611b49565b611add565b611ab7565b611a77565b61199d565b611872565b6117de565b611787565b61175e565b611644565b6115c2565b6115a4565b6114d7565b6112e2565b6110e9565b610f8a565b610f61565b610d37565b610c10565b610b09565b6108a1565b610838565b6107da565b61073a565b610510565b61049d565b5f91031261049957565b5f80fd5b34610499575f36600319011261049957602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b6001600160a01b0381160361049957565b35906104f9826104dd565b565b9060018060a01b03165f5260205260405f2090565b3461049957602036600319011261049957602060043561052f816104dd565b60018060a01b038091165f526108d8825260405f205416604051908152f35b63ffffffff81160361049957565b61014435906104f98261054e565b35906104f98261054e565b634e487b7160e01b5f52604160045260245ffd5b604081019081106001600160401b038211176105a457604052565b610575565b6101a081019081106001600160401b038211176105a457604052565b6001600160401b0381116105a457604052565b606081019081106001600160401b038211176105a457604052565b608081019081106001600160401b038211176105a457604052565b60e081019081106001600160401b038211176105a457604052565b60a081019081106001600160401b038211176105a457604052565b90601f801991011681019081106001600160401b038211176105a457604052565b6040519060c082018281106001600160401b038211176105a457604052565b6040519061018082018281106001600160401b038211176105a457604052565b604051906104f9826105a9565b604051906104f9826105f3565b604051906104f98261060e565b6001600160401b0381116105a457601f01601f191660200190565b9291926106f2826106cb565b916107006040519384610644565b829481845281830111610499578281602093845f960137010152565b9080601f8301121561049957816020610737933591016106e6565b90565b61010036600319011261049957600435610753816104dd565b60243561075f816104dd565b6084358060070b81036104995760a435906107798261054e565b60c4356001600160401b0381116104995761079890369060040161071c565b926107a1613789565b60ff6108cf5460e81c166107c8576107c1946064359160443591336137ec565b600160c955005b604051630b4cba3160e31b8152600490fd5b34610499575f366003190112610499576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610499575f3660031901126104995760206040515f8152f35b34610499575f366003190112610499576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b604090600319011261049957600435610894816104dd565b90602435610737816104dd565b34610499576108af3661087c565b906108b86139b6565b6108c0613789565b6001600160a01b038281169290919083151580610959575b610947576001600160a01b0382165f9081526108d860205260409020610918919080546001600160a01b0319166001600160a01b03909216919091179055565b167f323983f5343e25b2c1396361b1b791be31484841fdfb95b8615cd02d910b1e085f80a3610018600160c955565b60405163a63e8c6b60e01b8152600490fd5b50604051637e062a3560e11b8152602081600481885afa9081156109ba575f9161098b575b50831682841614156108d8565b6109ad915060203d6020116109b3575b6109a58183610644565b8101906139d6565b5f61097e565b503d61099b565b612fdb565b6001600160401b0381116105a45760051b60200190565b9080601f830112156104995760209082356109f0816109bf565b936109fe6040519586610644565b81855260208086019260051b82010192831161049957602001905b828210610a27575050505090565b81358152908301908301610a19565b9080601f83011215610499576020908235610a50816109bf565b93610a5e6040519586610644565b81855260208086019260051b82010192831161049957602001905b828210610a87575050505090565b8380918335610a95816104dd565b815201910190610a79565b9291610aab826109bf565b91610ab96040519384610644565b829481845260208094019160051b810192831161049957905b828210610adf5750505050565b81358152908301908301610ad2565b9080601f830112156104995781602061073793359101610aa0565b60031960603682011261049957600435610b228161054e565b6024356001600160401b03928382116104995760c090823603011261049957610b49610665565b908060040135825260248101356020830152604481013584811161049957610b7790600436918401016109d6565b6040830152610b886064820161056a565b6060830152610b99608482016104ee565b608083015260a481013590848211610499576004610bba9236920101610a36565b60a082015260443592831161049957610bda610018933690600401610aee565b91612de7565b9181601f84011215610499578235916001600160401b038311610499576020808501948460051b01011161049957565b3461049957600319606036820112610499576004356001600160401b03808211610499576060823603938401126104995760243590610c4e8261054e565b60443590811161049957610c66903690600401610be0565b919093610c71613789565b600484013590610182190181121561049957610d0094610cfb93610c9e610cf49360043691890101612963565b95610cac6080880151613cb8565b50610cb6876136bc565b9060446020890151916101608a015193610cce610665565b9a8b5260208b015201356040890152606088015260808701525f60a08701523691610aa0565b9083613cc1565b613e11565b610018600160c955565b9181601f84011215610499578235916001600160401b038311610499576020838186019501011161049957565b3461049957606036600319011261049957600480356024356001600160401b03811161049957610d6a9036908401610d0a565b610cbf929192805460ff8116610f505760ff19166001179055610d8c82613204565b92610e02610d9b3684846106e6565b60208151910120602060018060a01b039660405180948192630829c59f60e01b83527f00000000000000000000000000000000000000000000000000000000000000006044358d85016040919493926060820195825260018060a01b031660208201520152565b0381897f0000000000000000000000000000000000000000000000000000000000000000165afa9182156109ba575f92610f1f575b5003610f0e57610e4991810190612fe6565b92168015159081610f03575b50610ef257610e77610e70825f52610cbe60205260405f2090565b5460ff1690565b610ee157610ed49250610ea3610e96825f52610cbe60205260405f2090565b805460ff19166001179055565b6040513381527f3b0b856314838f509dfe81e9e13c651b0e544b42639c58be2c161b2c3892949d90602090a26142e6565b610cbf805460ff19169055005b604051630dc1019760e01b81528390fd5b6040516332f602d160e11b81528390fd5b90503014155f610e55565b6040516301b6e1e760e21b81528590fd5b610f4291925060203d602011610f49575b610f3a8183610644565b810190612fcc565b905f610e37565b503d610f30565b60405163087f80c160e31b81528690fd5b34610499575f366003190112610499576020604051428152f35b90816101809103126104995790565b34610499576040366003190112610499576004356001600160401b03811161049957610fba903690600401610f7b565b610fc38161301c565b6001600160a01b031690610fd96020820161301c565b6001600160a01b031691610fef6040830161301c565b6001600160a01b03166110046060840161301c565b6001600160a01b03169261101a6080820161301c565b6001600160a01b031690610100611032818301613026565b9061012090611042848301613026565b926101409485810161105390613026565b966101609a8b83016110659084613030565b9a909b611070610684565b9e8f91825260208201526040015260608d015260808c015260a081013560a08c015260c081013560c08c015260e0013560e08b015263ffffffff16908901528701906110c1919063ffffffff169052565b63ffffffff9091169085015236906110d8926106e6565b9082015233602435610018926136ed565b3461049957602036600319011261049957600480356001600160401b038111610499576111199036908301610f7b565b611121613789565b60ff6108cf5460e01c166112d25763ffffffff8042169261014083019361115a8161114b87613026565b63ffffffff9182169116101590565b6112c25761012084019261116d84613026565b16106112b3576111856111803685612963565b6136bc565b90611199825f526108d660205260405f2090565b546112a557506111e87f3cee3e290f36226751cd0b3321b213890fe9c768e922f267fa6111836ce05c32926111e36111dd6111ee945f526108d660205260405f2090565b60019055565b613026565b93613026565b61120e611209611202610160860186613030565b36916106e6565b614314565b906112986040519283926101008701359760e08801359760208101359281359260408301359260c08101359060a081013590606060808201359101358b9693909a999895919261012098959361014089019c895260208901526040880152606087015263ffffffff80921660808701521660a085015260c084015260e08301526101008201520152565b0390a3610018600160c955565b604051624be79160e21b8152fd5b60405163d642b7d960e01b8152fd5b50604051630277ae7b60e21b8152fd5b50604051633d90fc5560e11b8152fd5b34610499576020366003190112610499576004356112ff816104dd565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116308114610499575f80516020615795833981519152908282541603610499576113516139b6565b611359612760565b9160ff7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd914354165f146113915750505061001890614da5565b6020600491604051928380926352d1902d60e01b825288165afa5f91816113ca575b506113bc575f80fd5b036104995761001891614c9f565b6113e491925060203d602011610f4957610f3a8183610644565b905f6113b3565b602060031982011261049957600435906001600160401b0382116104995761141591600401610be0565b9091565b5f5b83811061142a5750505f910152565b818101518382015260200161141b565b9060209161145381518092818552858086019101611419565b601f01601f1916010190565b6020808201908083528351809252604092604081018260408560051b8401019601945f925b858410611495575050505050505090565b9091929394959685806114c6600193603f1986820301885286838d518051151584520151918185820152019061143a565b990194019401929594939190611484565b34610499576114e5366113eb565b6114ee816109bf565b9160406114fe6040519485610644565b828452601f1961150d846109bf565b015f5b8181106115815750505f5b8381106115345760405180611530878261145f565b0390f35b8061157b61154460019388613085565b515f80611552858a8a613099565b906115618951809381936130b0565b0390305af49061156f6130bd565b60208201529015159052565b0161151b565b602090835161158f81610589565b5f815282606081830152828901015201611510565b34610499575f3660031901126104995760206040516301e133808152f35b34610499576040366003190112610499576024356004356115e16139b6565b6115e9613789565b6108d08054600160401b8110156105a45763ffffffff916001820190558361161082612ceb565b5084600182015555167fc86ba04c55bc5eb2f2876b91c438849a296dbec7b08751c3074d92e04f0a77af5f80a4600160c955005b60403660031901126104995760043561165c816104dd565b6024356001600160401b0381116104995761167b90369060040161071c565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811690308214610499575f80516020615795833981519152918183541603610499576116ce6139b6565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156117045750505061001890614da5565b6020600491604051928380926352d1902d60e01b825288165afa5f918161173d575b5061172f575f80fd5b036104995761001891614d54565b61175791925060203d602011610f4957610f3a8183610644565b905f611726565b34610499575f366003190112610499576108cd546040516001600160a01b039091168152602090f35b34610499575f366003190112610499577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031630036104995760206040515f805160206157958339815191528152f35b610120366003190112610499576004356117f7816104dd565b60243590611804826104dd565b60443591611811836104dd565b60a4358060070b81036104995760c4359161182b8361054e565b60e4356001600160401b0381116104995761184a90369060040161071c565b93611853613789565b60ff6108cf5460e81c166107c8576107c19560843592606435926137ec565b34610499576020366003190112610499576004356001600160401b038111610499576118a290369060040161071c565b6118aa614329565b610cbf805460ff811661198b5760ff191660011790556040516349b5c56d60e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156109ba575f9161196c575b50428111908115611939575b5061192757610ed4906142e6565b604051633ff377d160e11b8152600490fd5b611944915042613100565b7f0000000000000000000000000000000000000000000000000000000000000000115f611919565b611985915060203d602011610f4957610f3a8183610644565b5f61190d565b60405163087f80c160e31b8152600490fd5b346104995760c0366003190112610499576004356119ba816104dd565b602435604435916064356119cd816104dd565b6001600160401b0391608435838111610499576119ee903690600401610d0a565b60a494919435918211610499577f45e04bc8f121ba11466985789ca2822a91109f31bb8ac85504a37b7eaf873c2694611a2e611a72933690600401610d0a565b6001600160a01b039690939192908716611a648a8c83611a4f3688886106e6565b91611a5b368b8b6106e6565b9346908d61433d565b604051978897169a87613132565b0390a3005b34610499575f36600319011261049957602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610499575f36600319011261049957602060ff6108cf5460e81c166040519015158152f35b34610499575f3660031901126104995760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b606090600319011261049957600435611b2f8161054e565b90602435611b3c816104dd565b90604435610737816104dd565b3461049957611b5736611b17565b5f54600881901c60ff1615939290849081611c12575b8115611bf2575b501561049957611b989284611b8f600160ff195f5416175f55565b611bdb57613165565b611b9e57005b611bac61ff00195f54165f55565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1005b611bed61010061ff00195f5416175f55565b613165565b303b15915081611c04575b505f611b74565b6001915060ff16145f611bfd565b600160ff8216109150611b6d565b34610499575f3660031901126104995760206040517f8d1994e2bbbd77564cdca06dd819e7ee2a5efa06c80dcb59a4a7b6e39edc538f8152f35b34610499575f36600319011261049957602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610499575f36600319011261049957602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610499575f36600319011261049957611cf2614329565b603380546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b8015150361049957565b34610499576020366003190112610499577fe88463c2f254e2b070013a2dc7ee1e099f9bc00534cbdf03af551dc26ae492196020600435611d7f81611d35565b611d876139b6565b611d8f613789565b6108cf805460ff60e81b191691151560e881901b60ff60e81b16929092179055604051908152a1600160c955005b34610499576020366003190112610499576020611ddb600435613204565b604051908152f35b34610499575f3660031901126104995760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b61016036600319011261049957600435611e38816104dd565b60243590611e45826104dd565b604435611e51816104dd565b60643590611e5e826104dd565b60e435611e6a816104dd565b6101043590611e788261054e565b6101243592611e868461054e565b61014435966001600160401b03881161049957611eaa610018983690600401610d0a565b97909660c4359360a435936084359361323f565b61018036600319011261049957600435611ed7816104dd565b60243590611ee4826104dd565b604435611ef0816104dd565b60643590611efd826104dd565b60e435611f09816104dd565b61010435611f168161054e565b6101243591611f248361054e565b611f2c61055c565b9361016435976001600160401b03891161049957611f51610018993690600401610d0a565b98909760c4359360a4359360843593613261565b34610499576060366003190112610499576020611ddb600435611f87816104dd565b6044359060243590613343565b34610499576060366003190112610499576001600160401b0360243581811161049957611fc5903690600401610d0a565b9160443590811161049957611fde903690600401610d0a565b9060405193602085019480611ff54684888a613373565b0395612009601f1997888101845283610644565b600435915190200361209c575f9461203861205a9361202f87612066958a990190612a18565b95810190613390565b519360405193849160208301966337bfd2c960e21b8852339160248501613457565b03908101835282610644565b5190305af46120736130bd565b901561207b57005b60405163b8fe37a760e01b81529081906120989060048301612786565b0390fd5b604051630f0c8f4760e11b8152600490fd5b34610499576020366003190112610499576004356120ca6139b6565b6120d2613789565b6120db81612ceb565b612113576001815f80935501557f7c1af0646963afc3343245b103731965735a893347bfa0d58a5dc77a77ae691c5f80a2600160c955005b634e487b7160e01b5f525f60045260245ffd5b6101a036600319011261049957610124356121408161054e565b6101443561214d8161054e565b610164359161215b8361054e565b61018435926001600160401b0384116104995761217f610018943690600401610d0a565b9390926101043560e43560c43560a435608435606435604435602435600435613479565b34610499575f366003190112610499576033546040516001600160a01b039091168152602090f35b34610499575f366003190112610499576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346104995760e0366003190112610499576001600160401b0360043581811161049957612240903690600401610f7b565b60a43582811161049957612258903690600401610d0a565b60c49291923593841161049957612276610018943690600401610d0a565b939092608435906064359060443590602435906134f1565b346104995761229c36611b17565b909160ff5f5460081c1615610499576122b4906135da565b604051916122c183610589565b6009835260208301906820a1a927a9a996ab1960b91b825260206040516122e781610589565b6005815201640312e302e360dc1b815260ff5f5460081c161561049957600561233193610018965190209120906104e3556104e455612324614723565b61232c614732565b614746565b6147a0565b34610499576020366003190112610499577f2d5b62420992e5a4afce0e77742636ca2608ef58289fd2e1baa5161ef6e7e41e602060043561237681611d35565b61237e6139b6565b612386613789565b6108cf805460ff60e01b191691151560e081901b60ff60e01b16929092179055604051908152a1600160c955005b34610499575f366003190112610499576020604051468152f35b34610499575f36600319011261049957602063ffffffff6108cf5460c01c16604051908152f35b346104995760403660031901126104995760043560243561241582614b64565b6001600160a01b0382165f9081526108d7602052604090206124389033906104fb565b549182156124cc575f6124703361246b61245185613cb8565b6001600160a01b03165f9081526108d76020526040902090565b6104fb565b5561249c8361248d61248184613cb8565b6001600160a01b031690565b61249685613cb8565b90614815565b60405192835233927f6c172ea51018fb2eb2118f3f8a507c4df71eb519b8c0052834dc3c920182fef490602090a4005b6040516336542bf760e21b8152600490fd5b6020808201906020835283518092526040830192602060408460051b8301019501935f915b8483106125135750505050505090565b9091929394958480612531600193603f198682030187528a5161143a565b9801930193019194939290612503565b346104995761254f366113eb565b9061255982613600565b915f5b818110612571576040518061153086826124de565b5f8061257e838587613099565b9061258e604051809381936130b0565b0390305af461259b6130bd565b90156125c157906001916125af8287613085565b526125ba8186613085565b500161255c565b604481511061049957806004610499920151602480918301019101613649565b6101808060031936011261049957610104356125fc8161054e565b610124359161260a8361054e565b61014435926126188461054e565b610164356001600160401b03811161049957612638903690600401610d0a565b612640613789565b6108cf549260ff8460e81c166107c857610d00966126e7611202926126d963ffffffff6126f59860c01c169961267d6126788c6136a7565b6135da565b6126856106a4565b9a6004358c5260243560208d015260443560408d015260643560608d015260843560808d015260a43560a08d015260c43560c08d015260e43560e08d01526101008c01526101208b019063ffffffff169052565b63ffffffff16610140890152565b63ffffffff16610160870152565b908201526144b7565b3461049957602061272e6127113661087c565b6001600160a01b039091165f9081526108d78452604090206104fb565b54604051908152f35b34610499575f366003190112610499576108ce546040516001600160a01b039091168152602090f35b604051602081018181106001600160401b038211176105a4576040525f8152905f368137565b90602061073792818152019061143a565b34610499575f366003190112610499576115306127b2612760565b60405191829160208352602083019061143a565b346104995760c0366003190112610499576004356024356001600160401b0360643560443560843583811161049957612803903690600401610d0a565b60a494919435918211610499577f45e04bc8f121ba11466985789ca2822a91109f31bb8ac85504a37b7eaf873c2694612843612892933690600401610d0a565b92909161284e613789565b6128578a614b64565b612886898b89896128693688886106e6565b92612875368b8b6106e6565b9446916001600160a01b031661433d565b60405196879687613132565b0390a3600160c955005b34610499575f366003190112610499576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610499575f3660031901126104995760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610499576020366003190112610499576004355f526108d6602052602060405f2054604051908152f35b34610499575f36600319011261049957602060405163ffffffff8152f35b91906101808382031261049957612978610684565b92803584526020810135602085015260408101356040850152606081013560608501526080810135608085015260a081013560a085015260c081013560c085015260e081013560e085015261010080820135908501526101206129dc81830161056a565b908501526101406129ee81830161056a565b9085015261016091828201356001600160401b03811161049957612a12920161071c565b90830152565b906020828203126104995781356001600160401b038111610499576107379201612963565b34610499576020366003190112610499576004356001600160401b03811161049957611ddb6111806020923690600401612963565b34610499575f36600319011261049957602060ff6108cf5460e01c166040519015158152f35b34610499575f3660031901126104995760206040516a0c097ce7bc90715b34b9f160241b8152f35b34610499576020366003190112610499576107c1600435612ae0816104dd565b612ae86139b6565b61232c613789565b34610499576060366003190112610499576004356001600160401b03811161049957612b20903690600401612963565b612b28613789565b60ff6108cf5460e01c16612bd25761014081015163ffffffff4281169116101580612bb3575b612ba15780612b5f610d00926136bc565b60c082015160208301519061016084015192612b79610665565b948552602085015260408401526060830152608082015260243560a082015260443590614085565b604051630c3a9b9d60e41b8152600490fd5b50612bc16040820151613cb8565b6001600160a01b0316331415612b4e565b604051633d90fc5560e11b8152600490fd5b34610499575f366003190112610499576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b610160806003193601126104995761010435612c438161054e565b61012435612c508161054e565b610144356001600160401b03811161049957612c70903690600401610d0a565b63ffffffff94612c838642169586613227565b93612c8c613789565b6108cf549160ff8360e81c166107c857612cbf612ccc966126d9610d009a6112029660c01c169961267d6126788c6136a7565b86019063ffffffff169052565b6101808201526144b7565b634e487b7160e01b5f52603260045260245ffd5b6108d08054821015612d07575f52600360205f20910201905f90565b612cd7565b34610499576020366003190112610499576004356108d05481101561049957612d36604091612ceb565b506001815491015482519182526020820152f35b3461049957602036600319011261049957600435612d67816104dd565b612d6f614329565b6001600160a01b038116156104995761001890614419565b34610499576020366003190112610499576004355f52610cbe602052602060ff60405f2054166040519015158152f35b34610499576020366003190112610499576107c1600435612dd7816104dd565b612ddf6139b6565b612331613789565b9190612df1613789565b602081019182514603612eff57612e19612e1d91836001612e1188612ceb565b5001546139eb565b1590565b612eed577ff4ad92585b1bc117fbdd644990adf0827bc4c95baeae8a23322af807b6d0020e6060820192612e5e612e58855163ffffffff1690565b86613a7c565b8051612ee08451926040860195612ec5612eb7612ea6895196612e858c5163ffffffff1690565b608086018051909991906001600160a01b03169160a088019b8c5194613ade565b925193519851995163ffffffff1690565b94516001600160a01b031690565b945163ffffffff9586604051978897169b1699339487612f80565b0390a46104f9600160c955565b60405163582f497d60e11b8152600490fd5b604051633d23e4d160e11b8152600490fd5b9081518082526020808093019301915f5b828110612f30575050505090565b835185529381019392810192600101612f22565b9081518082526020808093019301915f5b828110612f63575050505090565b83516001600160a01b031685529381019392810192600101612f55565b9496959193612fa260a095612fbe93885260c0602089015260c0880190612f11565b90600180871b0380951660408801528682036060880152612f44565b951515608085015216910152565b90816020910312610499575190565b6040513d5f823e3d90fd5b919091604081840312610499578035612ffe816104dd565b9260208201356001600160401b03811161049957610737920161071c565b35610737816104dd565b356107378161054e565b903590601e198136030182121561049957018035906001600160401b0382116104995760200191813603831361049957565b634e487b7160e01b5f52602160045260245ffd5b6003111561308057565b613062565b8051821015612d075760209160051b010190565b90821015612d07576114159160051b810190613030565b908092918237015f815290565b3d156130e7573d906130ce826106cb565b916130dc6040519384610644565b82523d5f602084013e565b606090565b634e487b7160e01b5f52601160045260245ffd5b9190820391821161310d57565b6130ec565b908060209392818452848401375f828201840152601f01601f1916010190565b9492909361315792610737979587526020870152608060408701526080860191613112565b926060818503910152613112565b91909160ff5f5460081c16156104995761317e33614419565b60ff5f5460081c161561049957613194906135da565b604051916131a183610589565b6009835260208301906820a1a927a9a996ab1960b91b825260206040516131c781610589565b6005815201640312e302e360dc1b815260ff5f5460081c1615610499576005612331936104f9965190209120906104e3556104e455612324614723565b604051602081019182525f604082015260408152613221816105d8565b51902090565b91909163ffffffff8080941691160191821161310d57565b96949290916104f99b9a999896949261325f63ffffffff42169889613227565b985b9593919b999897969492909b613275613789565b6108cf549660ff8860e81c166107c8578760c01c63ffffffff16613298906136a7565b6132a1906135da565b6132a96106a4565b6001600160a01b0391821681529d811660208f015290811660408e015290811660608d015260808c019190915260a08b019190915260c0808b01929092529190911660e08901521c63ffffffff908116610100880152166101208601525b63ffffffff1661014085015263ffffffff16610160840152369061332a926106e6565b610180820152613339906144b7565b6104f9600160c955565b9160405191602083019360018060601b03199060601b1684526034830152605482015260548152613221816105f3565b93929160209161338b91604087526040870191613112565b930152565b908160209103126104995760405190602082018281106001600160401b038211176105a45760405235815290565b6107379161018090825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015190820152613433610120808501519083019063ffffffff169052565b6101408381015163ffffffff1690820152816101608094015193820152019061143a565b61346f604092959493956060835260608301906133be565b9460208201520152565b9c9a999897969594939291909661348e613789565b60ff6108cf5460e81c166107c8576134a7908e33613343565b96604051809e6134b6826105a9565b81526020015260408d015260608c015260808b015260a08a015260c089015260e088015261010087015263ffffffff16610120860152613307565b979290959391969497613502613789565b60ff6108cf5460e01c16612bd25761351d6101408201613026565b63ffffffff80421691161015806135bb575b612ba1576135a46135b69661359c6133399b61354e6111803687612963565b9a613557610665565b9b6135623688612963565b8d5260208d01528660408d01528760608d0152613580368b846106e6565b60808d015260a08c01526135948535613cb8565b9836916106e6565b9536916106e6565b9461010060e08301359201359061433d565b614085565b506135c96040820135613cb8565b6001600160a01b031633141561352f565b6108cf805463ffffffff60c01b191660c09290921b63ffffffff60c01b16919091179055565b9061360a826109bf565b6136176040519182610644565b8281528092613628601f19916109bf565b01905f5b82811061363857505050565b80606060208093850101520161362c565b602081830312610499578051906001600160401b038211610499570181601f8201121561049957805161367b816106cb565b926136896040519485610644565b81845260208284010111610499576107379160208085019101611419565b63ffffffff80911690811461310d5760010190565b604051613221816136d960208201946040865260608301906133be565b46604083015203601f198101835282610644565b9190916136f8613789565b60ff6108cf5460e01c16612bd25761014081015163ffffffff428116911610158061376a575b612ba1576133399261372f826136bc565b60c083015160208401519061016085015192613749610665565b958652602086015260408501526060840152608083015260a0820152614085565b506137786040820151613cb8565b6001600160a01b031633141561371e565b600260c9541461049957600260c955565b926107379695929491946101409585525f60208601526040850152606084015263ffffffff809116608084015260a08301525f60c083015260e08201525f61010082015281610120820152019061143a565b9193949690959660070b906706f05b59d3b200006138098361484f565b10156139a4576a0c097ce7bc90715b34b9f160241b84116139925763ffffffff93613836858a1642613100565b857f00000000000000000000000000000000000000000000000000000000000000001610613980576108cf5460c01c63ffffffff16986138786126788b6136a7565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169790969087169283891480613977575b1561394e5780340361393c57883b15610499575f6004996040519a8b8092630d0e30db60e41b825234905af19889156109ba5761390b61391e978a925f805160206157758339815191529c613923575b505b836148a0565b92604051998a99169d169b16938761379a565b0390a4565b80613930613936926105c5565b8061048f565b5f613903565b604051636452a35d60e01b8152600490fd5b5f8051602061577583398151915298508761390b61391e976139728430338a61485e565b613905565b503415156138b3565b60405163f722177f60e01b8152600490fd5b60405163622db5a960e11b8152600490fd5b60405163284f109760e21b8152600490fd5b60ff610cbf5416156139c457565b604051631147e02f60e11b8152600490fd5b908160209103126104995751610737816104dd565b6107379291604051613a7381613a65602082019460208652805160408401526020810151606084015260a0613a30604083015160c06080870152610100860190612f11565b606083015163ffffffff168583015260808301515f196001841b011660c0860152910151838203603f190160e0850152612f44565b03601f198101835282610644565b519020916148d6565b613a87600291612ceb565b500162ffffff8260081c16805f5281602052600160ff60405f205494161b8080941614613abf575f5260205260405f20908154179055565b60405163954476d960e01b8152600490fd5b9190820180921161310d57565b91959495939092935f9681519081815103613ca65781613b62575b50505082613b08575b50505050565b63ffffffff81613b397ffa7fa7cf6d7dde5f9be65a67e6a1a747e7aa864dcd2d793353c722d80fbbb3579386614986565b604080519586523360208701526001600160a01b0391909116959190911693a45f808080613b02565b604080516370a0823160e01b81523060048083019190915291906020816024816001600160a01b038b165afa9081156109ba575f91613c87575b505f805b868110613bb1575050505050613af9565b613bbb8189613085565b51613bc9575b600101613ba0565b90613bdf90613bd8838a613085565b5190613ad1565b90828211613c7757613c19612e19613c07613bfa848a613085565b516001600160a01b031690565b613c11848c613085565b51908c614927565b15613bc1579c5087613c6d613c658f613c5f613bfa613c58613c3b848f613085565b516001600160a01b039097165f9081526108d76020526040902090565b928b613085565b906104fb565b918254613ad1565b905560019c613bc1565b50505051632ddaa83160e11b8152fd5b613ca0915060203d602011610f4957610f3a8183610644565b5f613b9c565b6040516319a5316760e31b8152600490fd5b61248181614b64565b91612e1990613d3a92845160408096015191865191613cdf836105d8565b8252613a73613cfa6020840192468452898501958652612ceb565b5054938851928391613d1f6020840196602088525160608d86015260a08501906133be565b9151606084015251608083015203601f198101835282610644565b613d415750565b5163582f497d60e11b8152600490fd5b613d5a82613076565b52565b9a989693919c9b9997959492909c6101e08c019d8c5260208c015260408b015260608a0152608089015263ffffffff80921660a08901521660c087015260e08601526101008501526101208401526101408301528051610160830152602081015161018083015260408101516101a08301526060015190613ddd82613076565b6101c00152565b90610737949360809360018060a01b0380931684526020840152166040820152816060820152019061143a565b905f82516101208101613e28815163ffffffff1690565b63ffffffff42911610614073576020850151906002613e50835f526108d660205260405f2090565b541461406157613e6a86925f526108d660205260405f2090565b6002905560608301519060808401519160a08501519260c0860151918560a0810151938860e0810151956101008201519751613ea99063ffffffff1690565b61014083015163ffffffff166040840151918451936020860151956101600151613ed290614314565b966060890151986080019e8f51613ee890614314565b906040015190613ef66106b1565b9a8b5260208b015260408a0152600260608a01526040519d8e9b613f1a9b8d613d5d565b037f44b559f101f8fbcc8a0ea43fa91a05a729a5ea6e14a7c75aa750374690137208905f94a46080820151613f4e90613cb8565b9060408601519560600151613f6290613cb8565b9260800151613f7090613cb8565b6001600160a01b03919082167f000000000000000000000000000000000000000000000000000000000000000083160361404c5784614039575b613fb687838616614b7f565b5192835115158061402f575b613fd0575b50505050509050565b1690813b1561402b5783613ffe959660405196879586948593633a5be8cb60e01b8552339160048601613de4565b03925af180156109ba57614018575b808080808594613fc7565b80613930614025926105c5565b5f61400d565b8380fd5b50803b1515613fc2565b61404787303385871661485e565b613faa565b5f945061405c8785858516614815565b613fb6565b604051630479306360e51b8152600490fd5b60405163d642b7d960e01b8152600490fd5b805191610120830161409b815163ffffffff1690565b63ffffffff4291161061407357602083015160016140c2825f526108d660205260405f2090565b54036142df576001905b60026140e1825f526108d660205260405f2090565b5414614061576140fd614103915f526108d660205260405f2090565b60029055565b7f44b559f101f8fbcc8a0ea43fa91a05a729a5ea6e14a7c75aa75037469013720860608601516080870151906141d08760a08a0151958a60c08101519760a08401519860e0830151996141606101008501519c5163ffffffff1690565b61014085015163ffffffff16916040860151938651956141c461418c61016060208b01519a0151614314565b9960608c01519b60406141a26080830151614314565b9101519060206141b06106b1565b9e8f528e015260408d015260608c01613d51565b6040519c8d9c8d613d5d565b0390a46141e06080830151613cb8565b916040820151916080614202816141fa6060850151613cb8565b940151613cb8565b6001600160a01b03929083167f00000000000000000000000000000000000000000000000000000000000000008416036142cc57614244853033868a1661485e565b61425085848616614b7f565b01519182511515806142c2575b614269575b5050505050565b16803b1561049957614297935f809460405196879586948593633a5be8cb60e01b8552339160048601613de4565b03925af180156109ba576142af575b80808080614262565b806139306142bc926105c5565b5f6142a6565b50803b151561425d565b6142da858533868a1661485e565b614250565b5f906140cc565b5f8091602081519101305af46142fa6130bd565b501561430257565b6040516318cecad560e01b8152600490fd5b805190816143225750505f90565b6020012090565b6033546001600160a01b0316330361049957565b93926042936104f9979660208151910120906040519260208401947f8d1994e2bbbd77564cdca06dd819e7ee2a5efa06c80dcb59a4a7b6e39edc538f86526040850152856060850152608084015260a083015260c082015260c081526143a28161060e565b519020906104e354906104e454906040519160208301937fc2f8787176b8ac6bf7215b4adcc1e069bf4ab82d9ab1df05a57a91d425935b6e8552604084015260608301526080820152608081526143f881610629565b519020906040519161190160f01b8352600283015260228201522090614dd9565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b96926107379a9996949198959261014099895260208901526040880152606087015263ffffffff928380921660808801521660a08601521660c084015260e083015261010082015281610120820152019061143a565b6144c18151614b64565b61012081016144e06144d7825163ffffffff1690565b63ffffffff1690565b8042109081156146ea575b5061398057610140820191614504835163ffffffff1690565b9063ffffffff9182614538817f00000000000000000000000000000000000000000000000000000000000000001642613ad1565b9116116146d85761016081015163ffffffff169180831680614693575b50506040810180517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692919083148061468a575b15614650576080820151340361393c57823b15610499575f60049360405194858092630d0e30db60e41b825234905af19283156109ba575f805160206157758339815191529361463d575b505b5161391e60608301519260808101519060a081015160c08201519761461c6146116101008501519b5163ffffffff1690565b9b5163ffffffff1690565b83519b60208501519361018060e0870151960151966040519a8b9a8b614461565b8061393061464a926105c5565b5f6145dd565b91503461393c57816146856146766124815f805160206157758339815191529551613cb8565b6080840151903090339061485e565b6145df565b50341515614592565b6301e1338010156146c3575b5060e0810151156146b1575f80614555565b60405163495d907f60e01b8152600490fd5b916146d19192421690613227565b905f61469f565b60405163582e388960e01b8152600490fd5b6146f5915042613100565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000000016105f6144eb565b60ff5f5460081c161561049957565b60ff5f5460081c161561049957600160c955565b6001600160a01b0316801561478e576108cd80546001600160a01b031916821790557fa9e8c42c9e7fca7f62755189a16b2f5314d43d8fb24e91ba54e6d65f9314e8495f80a2565b60405163ba97b39d60e01b8152600490fd5b6001600160a01b031680156147e8576108ce80546001600160a01b031916821790557fa73e8909f8616742d7fe701153d82666f7b7cd480552e23ebb05d358c22fd04e5f80a2565b604051635b03092b60e11b8152600490fd5b6001600160a01b039091168152602081019190915260400190565b61484a6104f9939261483c60405194859263a9059cbb60e01b6020850152602484016147fa565b03601f198101845283610644565b614ecc565b5f81126148595790565b5f0390565b6040516323b872dd60e01b60208201526001600160a01b0392831660248201529290911660448301526064808301939093529181526104f99161484a82610629565b90670de0b6b3a7640000915f82840392128383128116908484139015161761310d5781810291818304149015171561310d570490565b929091905f915b845183101561491f576148f08386613085565b51908181101561490e575f52602052600160405f205b9201916148dd565b905f52602052600160405f20614906565b915092501490565b91602091613a656149505f936040519283918783019563a9059cbb60e01b8752602484016147fa565b519082855af1903d5f519083614967575b50505090565b9192509061497c57503b15155b5f8080614961565b6001915014614974565b6001600160a01b038281165f9081526108d860205260409020549193929181167f00000000000000000000000000000000000000000000000000000000000000008216151580614b37575b156149f35750506108ce5491926104f9929091506001600160a01b0316614f52565b8015614b2557816108ce541691614a0861522a565b50614a11615270565b50614a1a612760565b614a22612760565b614a2a612760565b91614a336106be565b63ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152956020870152604098808a8801526060870152608086015260a085015260c0840152855193633b6f743b60e01b8552868580614a9b8760048301615331565b0381865afa9485156109ba575f95614af6575b5084513410614ae5576104f9959650614ac8855134613100565b80614ad5575b50166153e5565b614adf9033615200565b5f614ace565b865163557a94ff60e11b8152600490fd5b614b17919550873d8911614b1e575b614b0f8183610644565b8101906152b0565b935f614aae565b503d614b05565b60405163d623472560e01b8152600490fd5b50817f000000000000000000000000000000000000000000000000000000000000000016828416146149d1565b60a01c614b6d57565b6040516379ec0ed760e11b8152600490fd5b906001600160a01b03808316803b158015614c3d575b15614c1057507f00000000000000000000000000000000000000000000000000000000000000001691823b1561049957604051632e1a7d4d60e01b815260048101839052925f908490602490829084905af19283156109ba576104f993614bfd575b50615200565b80613930614c0a926105c5565b5f614bf7565b906104f993507f000000000000000000000000000000000000000000000000000000000000000016614815565b50803b614c49816106cb565b614c566040519182610644565b81815260208101915f83853c51905162ffffff60e81b908181169260038110614c89575b50501661ef0160f01b14614b95565b829350829060030360031b1b1616905f80614c7a565b614ca881614da5565b6001600160a01b0381167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2815115801590614d4d575b614ce9575050565b5f80614d4a93660819985a5b195960ca1b60408051614d07816105d8565b602781527f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c60208201520152602081519101845af4614d446130bd565b916156da565b50565b505f614ce1565b614d5d81614da5565b6001600160a01b0381167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2815115801590614d9d57614ce9575050565b506001614ce1565b803b15610499575f8051602061579583398151915280546001600160a01b0319166001600160a01b03909216919091179055565b614de38383615524565b600581959295101561308057159384614ea1575b508315614e1b575b50505015614e0957565b60405163938a182160e01b8152600490fd5b5f929350908291604051614e5381613a656020820194630b135d3f60e11b998a8752602484015260406044840152606483019061143a565b51915afa90614e606130bd565b82614e93575b82614e76575b50505f8080614dff565b614e8b91925060208082518301019101612fcc565b145f80614e6c565b915060208251101591614e66565b6001600160a01b0383811691161493505f614df7565b90816020910312610499575161073781611d35565b905f80614f229360018060a01b0316927f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020604051614f0b81610589565b818152015260208151910182855af1614d446130bd565b8051908115918215614f38575b50501561049957565b614f4b9250602080918301019101614eb7565b5f80614f2f565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811692917f00000000000000000000000000000000000000000000000000000000000000009190811690614fb0848685615646565b604094604051926332dd704760e21b84526020956004948781600481875afa9687156109ba5788915f986151df575b506040516352b7631960e11b81529086166001600160a01b03811660048301529097909588916024918391165afa9586156109ba575f966151c0575b5095867f0000000000000000000000000000000000000000000000000000000000000000975b61505057505050505050505050565b868111156151ba57865b881561511257843b15610499578951634701287760e11b815287810182815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000000166020820152604081018690526001600160a01b03881660608201525f6080820181905260a082018190526107d060c0830152919391908490819060e0010381838a5af19283156109ba576150f9936150ff575b50613100565b80615041565b8061393061510c926105c5565b5f6150f3565b89516337e9a82760e11b815287810182815263ffffffff7f0000000000000000000000000000000000000000000000000000000000000000166020820152604081018690526001600160a01b038816606082015290929084908490819060800103815f8a5af19283156109ba576150f99361518d5750613100565b6151ac90853d87116151b3575b6151a48183610644565b810190615510565b505f6150f3565b503d61519a565b8061505a565b6151d8919650873d8911610f4957610f3a8183610644565b945f61501b565b869198506151f990833d85116109b3576109a58183610644565b9790614fdf565b814710610499575f918291829182916001600160a01b03165af16152226130bd565b501561049957565b6040519060e082018281106001600160401b038211176105a457604052606060c0835f81525f60208201525f60408201525f838201528260808201528260a08201520152565b6040519061527d82610589565b5f6020838281520152565b9190826040910312610499576040516152a081610589565b6020808294805184520151910152565b906040828203126104995761073791615288565b6107379163ffffffff825116815260208201516020820152604082015160408201526060820151606082015260c061532061530e608085015160e0608086015260e085019061143a565b60a085015184820360a086015261143a565b9201519060c081840391015261143a565b9190602061338b5f926040865260408601906152c4565b51906001600160401b038216820361049957565b919082810360c081126104995760801361049957610737906080604051615382816105d8565b8551815261539260208701615348565b60208201526153a48360408801615288565b60408201529401615288565b91939260206153c96060936080865260808601906152c4565b86518583015295015160408401526001600160a01b0316910152565b9092918251917f000000000000000000000000000000000000000000000000000000000000000083116154fe574783116154ec5760208401516154da576154609360c0936154426040850151809860018060a01b03168095615555565b60405180968195829463c7c7f5b360e01b84523091600485016153b0565b03925af19081156109ba575f916154a9575b506020810151820361549757510361548657565b604051623c548b60ea1b8152600490fd5b604051631bfc3cb560e11b8152600490fd5b6154cb915060c03d60c0116154d3575b6154c38183610644565b81019061535c565b90505f615472565b503d6154b9565b604051630e282ec960e21b8152600490fd5b60405163a6226f8560e01b8152600490fd5b604051631754d7a960e01b8152600490fd5b908160209103126104995761073790615348565b9060418151145f1461554c5761141591602082015190606060408401519301515f1a90615703565b50505f90600290565b6040519160208301908361557863095ea7b360e01b9687855283602484016147fa565b039161558c601f1993848101875286610644565b84516001600160a01b038516915f91829182855af1906155aa6130bd565b82615614575b5081615609575b50156155c4575050505050565b60405160208101959095526001600160a01b031660248501525f60448501526155ff9361484a916155f990826064810161205a565b82614ecc565b5f80808080614262565b90503b15155f6155b7565b8051919250811591821561562c575b5050905f6155b0565b61563f9250602080918301019101614eb7565b5f80615623565b604051636eb1769f60e11b81523060048201526001600160a01b038084166024830152929390926020908490604490829086165afa9283156109ba575f936156b9575b50820180921161310d5761484a6104f99361483c60405194859263095ea7b360e01b6020850152602484016147fa565b6156d391935060203d602011610f4957610f3a8183610644565b915f615689565b90156156f4578151156156eb575090565b3b156104995790565b50805190811561049957602001fd5b6fa2a8918ca85bafe22016d0b997e4df60600160ff1b038411615769576020935f9360ff60809460405194855216868401526040830152606082015282805260015afa156109ba575f516001600160a01b0381161561576157905f90565b505f90600190565b505050505f9060039056fe32ed1a409ef04c7b0227189c3a103dc5ac10e775a15b785dcc510201f7c25ad3360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca26469706673582212202261cd17947f54e05cb21a230b4fab2599d85a3a329628720c1bc29feeac7af464736f6c634300081700330000000000000000000000000000000000000000000000000000000000015180000000000000000000000000e58480ca74f1a819fafd777beded4e2d5629943d0000000000000000000000001ace3bbd69b63063f859514eca29c9bdd8310e61000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c0000000000000000000000000000000000000000000000000000000000000e1000000000000000000000000000000000000000000000000000000000000054600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075950000000000000000000000000000000000000000000000003d0ff0b013b80000