0 txs
1 call
constructor
constructor()
functions
accruedPerformanceFee
viewfunction accruedPerformanceFee() view returns (uint256)
accruedProtocolFee
viewfunction accruedProtocolFee() view returns (uint256)
allowance
viewfunction allowance(address owner, address spender) view returns (uint256)
asset
viewfunction asset() view returns (address)
balanceOf
viewfunction balanceOf(address account) view returns (uint256)
convertToAssets
viewfunction convertToAssets(uint256 shares) view returns (uint256)
convertToShares
viewfunction convertToShares(uint256 assets) view returns (uint256)
decimalOffset
viewfunction decimalOffset() view returns (uint8)
decimals
viewfunction decimals() view returns (uint8)
depositLimit
viewfunction depositLimit() view returns (uint256)
feeRecipient
viewfunction feeRecipient() view returns (address)
feesUpdatedAt
viewfunction feesUpdatedAt() view returns (uint256)
firstDeposit
viewfunction firstDeposit() view returns (uint256)
getAvailableAssetsForWithdrawal
viewfunction getAvailableAssetsForWithdrawal() view returns (uint256)
getRewardTokens
viewfunction getRewardTokens() view returns (address[])
getStrategies
viewfunction getStrategies() view returns (tuple[])
getTotalRewardsClaimed
viewfunction getTotalRewardsClaimed(address userAddress) view returns (tuple[])
getUserRewards
viewfunction getUserRewards(address userAddress) view returns (tuple[])
getVaultFees
viewfunction getVaultFees() view returns (tuple)
highWaterMark
viewfunction highWaterMark() view returns (uint256)
isQueueMandatory
viewfunction isQueueMandatory() view returns (bool)
isUpgradeable
purefunction isUpgradeable() pure returns (bool)
isWhitelisted
viewfunction isWhitelisted(address user_) view returns (bool)
maxDeposit
viewfunction maxDeposit(address user) view returns (uint256)
maxMint
viewfunction maxMint(address user) view returns (uint256)
maxRedeem
viewfunction maxRedeem(address owner) view returns (uint256)
maxWithdraw
viewfunction maxWithdraw(address owner) view returns (uint256)
minQueueRequest
viewfunction minQueueRequest() view returns (uint256)
name
viewfunction name() view returns (string)
owner
viewfunction owner() view returns (address)
parkingLot
viewfunction parkingLot() view returns (address)
paused
viewfunction paused() view returns (bool)
previewDeposit
viewfunction previewDeposit(uint256 assets_) view returns (uint256)
previewMint
viewfunction previewMint(uint256 shares_) view returns (uint256)
previewRedeem
viewfunction previewRedeem(uint256 shares_) view returns (uint256)
previewWithdraw
viewfunction previewWithdraw(uint256 assets_) view returns (uint256 shares)
protectStrategy
viewfunction protectStrategy() view returns (address)
rewardIndex
viewfunction rewardIndex(address) view returns (uint256)
symbol
viewfunction symbol() view returns (string)
totalAssets
viewfunction totalAssets() view returns (uint256 total)
totalRewardsClaimed
viewfunction totalRewardsClaimed(address, address) view returns (uint256)
totalSupply
viewfunction totalSupply() view returns (uint256 total)
userRewardIndex
viewfunction userRewardIndex(address, address) view returns (uint256)
vaultIdle
viewfunction vaultIdle() view returns (bool)
whitelisted
viewfunction whitelisted(address) view returns (bool)
whitelistEnabled
viewfunction whitelistEnabled() view returns (bool)
withdrawalQueue
viewfunction withdrawalQueue() view returns (address)
withdrawalsPaused
viewfunction withdrawalsPaused() view returns (bool)
addStrategy
nonpayablefunction addStrategy(uint256 index_, bool replace_, tuple newStrategy_)
addToWhitelist
nonpayablefunction addToWhitelist(address user_)
approve
nonpayablefunction approve(address spender, uint256 value) returns (bool)
batchClaimWithdrawal
nonpayablefunction batchClaimWithdrawal(uint256 maxRequests)
changeAllocations
nonpayablefunction changeAllocations(tuple[] allocations_, bool redistribute)
claimRewards
nonpayablefunction claimRewards()
deposit
nonpayablefunction deposit(uint256 assets_, address receiver_) returns (uint256 shares)
deposit
nonpayablefunction deposit(uint256 assets_) returns (uint256)
emergencyRemoveStrategy
nonpayablefunction emergencyRemoveStrategy(uint256 index_, bool forceEject_)
harvestRewards
nonpayablefunction harvestRewards(bytes encodedData)
initialize
nonpayablefunction initialize(address baseAsset_, string shareName_, string shareSymbol_, tuple[] strategies_, address feeRecipient_, tuple fees_, uint256 depositLimit_, address owner_, bool isQueueMandatory_)
mint
nonpayablefunction mint(uint256 shares_, address receiver_) returns (uint256 assets)
mint
nonpayablefunction mint(uint256 shares_) returns (uint256)
pause
nonpayablefunction pause()
pullFundsFromSingleStrategy
nonpayablefunction pullFundsFromSingleStrategy(uint256 index_)
pullFundsFromStrategies
nonpayablefunction pullFundsFromStrategies()
pushFundsIntoSingleStrategy
nonpayablefunction pushFundsIntoSingleStrategy(uint256 index_, uint256 amount)
pushFundsIntoSingleStrategy
nonpayablefunction pushFundsIntoSingleStrategy(uint256 index_)
pushFundsToStrategies
nonpayablefunction pushFundsToStrategies()
redeem
nonpayablefunction redeem(uint256 shares_, address receiver_, address owner_) returns (uint256 assets)
redeem
nonpayablefunction redeem(uint256 shares_) returns (uint256)
removeFromWhitelist
nonpayablefunction removeFromWhitelist(address user_)
removeStrategy
nonpayablefunction removeStrategy(uint256 index_)
renounceOwnership
nonpayablefunction renounceOwnership()
requestFunds
nonpayablefunction requestFunds(uint256 amount)
setDepositLimit
nonpayablefunction setDepositLimit(uint256 newLimit_)
setFeeRecipient
nonpayablefunction setFeeRecipient(address newRecipient_)
setIsQueueMandatory
nonpayablefunction setIsQueueMandatory(bool _isQueueMandatory)
setMinimunQueueRequest
nonpayablefunction setMinimunQueueRequest(uint256 minQueueRequest_)
setParkingLot
nonpayablefunction setParkingLot(address parkingLot_)
setVaultFees
nonpayablefunction setVaultFees(tuple newFees_)
setWhitelistEnabled
nonpayablefunction setWhitelistEnabled(bool _whitelistEnabled)
setWithdrawalQueue
nonpayablefunction setWithdrawalQueue(address withdrawalQueue_)
takePortfolioAndProtocolFees
nonpayablefunction takePortfolioAndProtocolFees()
toggleVaultIdle
nonpayablefunction toggleVaultIdle()
toggleWithdrawalsPaused
nonpayablefunction toggleWithdrawalsPaused(bool withdrawalsPaused_)
transfer
nonpayablefunction transfer(address to, uint256 value) returns (bool)
transferFrom
nonpayablefunction transferFrom(address from, address to, uint256 value) returns (bool)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
unpause
nonpayablefunction unpause()
withdraw
nonpayablefunction withdraw(uint256 assets_, address receiver_, address owner_) returns (uint256 shares)
withdraw
nonpayablefunction withdraw(uint256 assets_) returns (uint256)
events
Approval
event Approval(address indexed owner, address indexed spender, uint256 value)
Deposit
event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares)
DepositLimitSet
event DepositLimitSet(uint256 limit)
FeeRecipientUpdated
event FeeRecipientUpdated(address indexed oldRecipient, address indexed newRecipient)
Initialized
event Initialized(address indexed vaultName, address indexed underlyingAsset)
Initialized
event Initialized(uint64 version)
IsQueueMandatoryUpdated
event IsQueueMandatoryUpdated(bool pastValue, bool newValue)
MinimunQueueRequestUpdated
event MinimunQueueRequestUpdated(uint256 _oldMinQueueRequest, uint256 _newMinQueueRequest)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
ParkingLotUpdated
event ParkingLotUpdated(address indexed oldParkingLot, address indexed newParkingLot, bool successfulApproval)
Paused
event Paused(address account)
RequestedFunds
event RequestedFunds(address indexed protectStrategy, uint256 amount)
RewardsHarvested
event RewardsHarvested()
StrategyAdded
event StrategyAdded(address newStrategy)
StrategyAllocationsChanged
event StrategyAllocationsChanged((uint256 index, uint256 amount)[] newAllocations)
StrategyRemoved
event StrategyRemoved(address oldStrategy)
ToggleVaultIdle
event ToggleVaultIdle(bool pastValue, bool newValue)
Transfer
event Transfer(address indexed from, address indexed to, uint256 value)
Unpaused
event Unpaused(address account)
UserAddedToWhitelist
event UserAddedToWhitelist(address indexed user)
UserRemovedFromWhitelist
event UserRemovedFromWhitelist(address indexed user)
WhitelistEnabledUpdated
event WhitelistEnabledUpdated(bool oldWhitelistEnabled, bool newWhitelistEnabled)
Withdraw
event Withdraw(address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares)
WithdrawalPausedToggled
event WithdrawalPausedToggled(bool pastValue, bool newValue)
WithdrawalQueueUpdated
event WithdrawalQueueUpdated(address oldQueue, address newQueue)
errors
AccumulatedFeeAccountedMustBeZero
error AccumulatedFeeAccountedMustBeZero()
AddressEmptyCode
error AddressEmptyCode(address target)
AddressInsufficientBalance
error AddressInsufficientBalance(address account)
AllotmentTotalTooHigh
error AllotmentTotalTooHigh()
ApprovalFailed
error ApprovalFailed(address token, address spender, uint256 amount)
BlueprintUnauthorizedAccount
error BlueprintUnauthorizedAccount(address account)
ClaimRouterUnauthorizedAccount
error ClaimRouterUnauthorizedAccount(address account)
DepositFailed
error DepositFailed()
EnforcedPause
error EnforcedPause()
ERC20ApproveFail
error ERC20ApproveFail()
ERC20InsufficientAllowance
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed)
ERC20InsufficientBalance
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed)
ERC20InvalidApprover
error ERC20InvalidApprover(address approver)
ERC20InvalidReceiver
error ERC20InvalidReceiver(address receiver)
ERC20InvalidSender
error ERC20InvalidSender(address sender)
ERC20InvalidSpender
error ERC20InvalidSpender(address spender)
ERC4626ExceededMaxDeposit
error ERC4626ExceededMaxDeposit(address receiver, uint256 assets, uint256 max)
ERC4626ExceededMaxMint
error ERC4626ExceededMaxMint(address receiver, uint256 shares, uint256 max)
ERC4626ExceededMaxRedeem
error ERC4626ExceededMaxRedeem(address owner, uint256 shares, uint256 max)
ERC4626ExceededMaxWithdraw
error ERC4626ExceededMaxWithdraw(address owner, uint256 assets, uint256 max)
ExpectedPause
error ExpectedPause()
FailedInnerCall
error FailedInnerCall()
ImplementationAlreadyExists
error ImplementationAlreadyExists(bytes32 id)
ImplementationDoesNotExist
error ImplementationDoesNotExist(bytes32 id)
InsufficientFunds
error InsufficientFunds(address strategy, uint256 amount, uint256 available)
InsufficientQueueRequest
error InsufficientQueueRequest(uint256 assets, uint256 minRequest)
InsufficientUnderlyingBalance
error InsufficientUnderlyingBalance()
InsufficientVaultFunds
error InsufficientVaultFunds(address vault, uint256 amount, uint256 available)
InvalidAllocationIndex
error InvalidAllocationIndex(uint256 index, uint256 expectedIndex)
InvalidAmount
error InvalidAmount()
InvalidAssetAddress
error InvalidAssetAddress()
InvalidBeneficiary
error InvalidBeneficiary()
InvalidClaimRouterAddress
error InvalidClaimRouterAddress()
InvalidDefaultAdminAddress
error InvalidDefaultAdminAddress()
InvalidDepositLimit
error InvalidDepositLimit()
InvalidFeeRecipient
error InvalidFeeRecipient()
InvalidImplementation
error InvalidImplementation(bytes32 id)
InvalidIndex
error InvalidIndex(uint256 index)
InvalidInitialization
error InvalidInitialization()
InvalidLength
error InvalidLength(uint256 argLength, uint256 expectedLength)
InvalidMultiSigAddress
error InvalidMultiSigAddress()
InvalidParkingLot
error InvalidParkingLot()
InvalidRecipient
error InvalidRecipient()
InvalidRescuer
error InvalidRescuer()
InvalidRewardTokenAddress
error InvalidRewardTokenAddress()
InvalidSigner
error InvalidSigner(address signer)
InvalidSubstraction
error InvalidSubstraction()
InvalidTargetVaultAddress
error InvalidTargetVaultAddress()
InvalidToken
error InvalidToken()
InvalidTokenRegistry
error InvalidTokenRegistry()
InvalidTreasuryAddress
error InvalidTreasuryAddress()
InvalidUserAddress
error InvalidUserAddress()
InvalidVaultFees
error InvalidVaultFees()
InvalidVaultRegistry
error InvalidVaultRegistry()
InvalidWithdrawlQueue
error InvalidWithdrawlQueue()
MathOverflowedMulDiv
error MathOverflowedMulDiv()
MaxError
error MaxError()
MultipleProtectStrat
error MultipleProtectStrat()
MultiSigUnauthorizedAccount
error MultiSigUnauthorizedAccount(address account)
NoProtectionStrategiesFound
error NoProtectionStrategiesFound()
NotAvailableForWithdrawal
error NotAvailableForWithdrawal(address token, uint256 amount)
NotInitializing
error NotInitializing()
NotPassedYear
error NotPassedYear()
NotValidRewardToken
error NotValidRewardToken(address tokenAddress)
OnlyVault
error OnlyVault(address caller)
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
PermitDeadlineExpired
error PermitDeadlineExpired(uint256 deadline)
ProtectUnauthorizedAccount
error ProtectUnauthorizedAccount(address account)
QueueNotSet
error QueueNotSet()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
RewardTokenAlreadyApproved
error RewardTokenAlreadyApproved()
RewardTokenNotApproved
error RewardTokenNotApproved()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
StrategyHasLockedAssets
error StrategyHasLockedAssets(address strategy)
SwapperBaseRewardrate
error SwapperBaseRewardrate()
SwapperBonusRewardrateCtToken
error SwapperBonusRewardrateCtToken()
SwapperBonusRewardrateSwapToken
error SwapperBonusRewardrateSwapToken()
SwapperBonusRewardrateUser
error SwapperBonusRewardrateUser()
SwapperMaxProgressionFactor
error SwapperMaxProgressionFactor()
TokenAlreadyRegistered
error TokenAlreadyRegistered(address tokenAddress)
TokenNotRegistered
error TokenNotRegistered(address tokenAddress)
TotalVaultsAllowedExceeded
error TotalVaultsAllowedExceeded(uint256 total)
TreasuryAlreadySet
error TreasuryAlreadySet(address attacker)
TreasuryChangeRequestCooldownNotElapsed
error TreasuryChangeRequestCooldownNotElapsed(address sender)
UnfinalizedWithdrawal
error UnfinalizedWithdrawal(address queue)
UnregisteredTokensCannotBeRewards
error UnregisteredTokensCannotBeRewards(address tokenAddress)
UserAlreadyWhitelisted
error UserAlreadyWhitelisted(address user_)
UserNotWhitelisted
error UserNotWhitelisted(address user_)
VaultAlreadyExists
error VaultAlreadyExists()
VaultAssetMismatch
error VaultAssetMismatch()
VaultByTokenLimitExceeded
error VaultByTokenLimitExceeded(address token, uint256 total)
VaultDeployInitFailed
error VaultDeployInitFailed()
VaultDoesNotExist
error VaultDoesNotExist(address vault)
VaultIsIdle
error VaultIsIdle()
VaultNotUpgradeable
error VaultNotUpgradeable()
VaultZeroAddress
error VaultZeroAddress()
WhitelistDisabled
error WhitelistDisabled()
WithdrawalsPaused
error WithdrawalsPaused()
WithdrawDisabled
error WithdrawDisabled()
ZeroAmount
error ZeroAmount()
creation bytecode
0x60808060405234620000c0575f80557ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c16620000b157506001600160401b036002600160401b0319828216016200006b575b604051615f019081620000c58239f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f80806200005b565b63f92ee8a960e01b8152600490fd5b5f80fdfe60806040526004361015610011575f80fd5b5f803560e01c806270e59514613ca557806301e1d11414613c8b578063052d9e7e14613c1c57806306fdde0314613b56578063078b0fb714613a8d57806307a2d13a14613a6f578063095ea7b3146139c05780630a28a4771461394d5780630c14935e14613933578063111c84531461390e5780631160265b146138ec57806313ee9df41461376657806318160ddd1461374c57806319e672461461372f5780631d2af0b9146136e25780631e8410da146136c557806323b872dd1461368d5780632a81196c1461327f5780632e1a7d4d1461325f578063313ce5671461323c57806332a8f9d4146127fc578063372500ab146127e357806337d5fe99146127bb57806337f1834e146127a157806338d52e0f1461276d5780633af32abf146127405780633f4ba83a14612630578063402d267d1461260d5780634657189914612536578063469048401461250e57806349d0ea97146124e65780634cdad506146124c857806351fb012d146124a65780635337e670146123dd57806355b8b781146122c857806359f7c8451461209e5780635c975abb1461206f57806366584f8c1461200e5780636bedc46c14611d805780636d3300e514611d135780636e2a6fe514611c9f5780636e553f6514611c7857806370a0823114611c33578063715018a614611bca57806372e7160114611b2657806375a046a514611aa6578063839e950f146119a65780638456cb59146118a857806388fba0661461182b5780638ab1d6811461178d5780638da5cb5b1461175857806394bf804d1461173157806395d89b411461164e5780639e2f0e22146116255780639f3d0a4814611607578063a039c129146115ba578063a0712d681461159a578063a5f5be541461157d578063a9059cbb1461154b578063acfd792814611530578063b39ed6d91461142d578063b3d7f6b9146113b2578063b3e3211414611379578063b45ba4a8146110ea578063b460af94146110d0578063b49a60bb14610fd2578063b6b55f2514610fb2578063ba08765214610f98578063bdc8144b14610f4a578063bf3bd25d14610df7578063c0cbbca614610c29578063c4f59f9b14610b63578063c63d75b614610b3f578063c6e6f59214610b20578063ce96cb7714610afc578063d1b39ae514610ae0578063d905777e14610abc578063d936547e14610a7d578063daa3a16314610a61578063db006a7514610a40578063dd62ed3e146109f8578063e43252d71461092e578063e74b981b146108ac578063e9f2838e14610886578063ecf7085814610868578063ef8b30f7146107fa578063f1f741b4146106b1578063f2fde38b14610684578063f4aa3efa1461044e5763f745d6ca146103f7575f80fd5b3461044b57602036600319011261044b57600435610413615078565b7f47ecb16e79d3795bad1b15b763dad4136c346b10a729a5e22a60ae3416b571ba6040600b548151908152836020820152a1600b5580f35b80fd5b503461044b57604036600319011261044b57600435906001600160401b038083116106805736602384011215610680578260040135908111610680573660248260061b85010111610680576104a1613db9565b6104a96153b8565b6104b1615078565b8254158015610671575b610668575b60ff5f80516020615e4c8339815191525416156105c3575b5f80516020615e0c833981519152547386d7f797636bd55fa3ad55b8c6954631c70c0f4e916001600160a01b0390911690823b156105bf5760405193632f42e93b60e21b85528060848601600660048801526080602488015252602460a48601970190865b81811061059f5750505091838086978194889615156044840152606483015203915af4801561059457610580575b5060015f80516020615e8c8339815191525580f35b61058990613f1c565b61044b57805f61056b565b6040513d84823e3d90fd5b82358952602080840135908a01526040988901989092019160010161053d565b8480fd5b6105dc6105ce614b56565b6105d66142dc565b9061449d565b6105e46150e3565b6105ec61409a565b90600254811161065f575b5081151580610656575b61060d575b50506104d8565b610633916106196143ff565b8061063e575090505b6005546001600160a01b03166154ba565b426004555f80610606565b61064b82610651946142cf565b91615b58565b610622565b50801515610601565b6002555f6105f7565b426004556104c0565b5061067a6143ff565b156104bb565b5080fd5b503461044b57602036600319011261044b576106ae6106a1613e15565b6106a9615078565b615007565b80f35b503461044b57602036600319011261044b576106cb615078565b6106d36153b8565b6009546001600160a01b03908116156107e85781906106f86106f36144aa565b61517b565b61070061409a565b916107096143ff565b6040519361071685613ee6565b84526020840190815260408401926009845273b64bd6df349823d883146980421c876ffa14e6d991836009541690845f80516020615e0c833981519152541694600a541690843b156107e457889660ff91604051998a988997889763408d459560e11b8952600489015260043560248901526044880152606487015261012060848701526107a76101248701614033565b9460a48701525160c48601525160e4850152511661010483015203915af4801561059457610580575060015f80516020615e8c8339815191525580f35b8880fd5b604051637c0c423f60e11b8152600490fd5b503461044b57602036600319011261044b5761085860209160043561081e8161517b565b6005549092906001600160a01b03163314610860575061084d610852916001600160401b0360075416906151ee565b615148565b906142cf565b604051908152f35b9050906142cf565b503461044b578060031936011261044b576020600354604051908152f35b503461044b578060031936011261044b57602060ff60055460a81c166040519015158152f35b503461044b57602036600319011261044b576108c6613e15565b6108ce615078565b6001600160a01b0390811690811561091c57816005549182167faaebcf1bfa00580e41d966056b48521fa9f202645c86d4ddf28113e617c1b1d38580a36001600160a01b0319161760055580f35b604051630ed1b8b360e31b8152600490fd5b503461044b57602036600319011261044b57610948613e15565b610950615078565b60ff60125416156109e6576001600160a01b031680156109d457808252601160205260ff6040832054166109bc57808252601160205260408220805460ff191660011790557f3ebdc59c5154f681813582b63e04d503c44f515f80fa2d558d663f4e3fdf508a8280a280f35b60249060405190634254a0ed60e01b82526004820152fd5b604051630702b3d960e41b8152600490fd5b60405163212c6e1d60e01b8152600490fd5b503461044b57604036600319011261044b57610a12613e15565b610a23610a1d613e2b565b91613e93565b9060018060a01b03165f52602052602060405f2054604051908152f35b503461044b57602036600319011261044b5760206108583333600435614d5a565b503461044b578060031936011261044b57602090604051908152f35b503461044b57602036600319011261044b5760209060ff906040906001600160a01b03610aa8613e15565b168152601184522054166040519015158152f35b503461044b57602036600319011261044b576020610858610adb613e15565b614f7a565b503461044b578060031936011261044b57602060405160098152f35b503461044b57602036600319011261044b576020610858610b1b613e15565b615895565b503461044b57602036600319011261044b57602061085860043561517b565b503461044b57602036600319011261044b576020610858610b5e613e15565b614f0e565b503461044b578060031936011261044b576040518091600c549081835260208093018092600c83527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c790835b818110610c0c5750505084610bc5910385613f2f565b60405193838594850191818652518092526040850193925b828110610bec57505050500390f35b83516001600160a01b031685528695509381019392810192600101610bdd565b82546001600160a01b031684529286019260019283019201610baf565b503461044b57602036600319011261044b57600435610c466153b8565b610c4e615078565b8154158015610de8575b610ddf575b60ff5f80516020615e4c833981519152541615610d7a575b600654811015610d62576001545f80516020615e0c8339815191525460405163266554c160e21b81526006600482015260248101939093526001600160a01b03918216604484015281166064830152906020816084817386d7f797636bd55fa3ad55b8c6954631c70c0f4e5af4908115610d57578391610d19575b50166001600160601b0360a01b600154161760015560015f80516020615e8c8339815191525580f35b90506020813d602011610d4f575b81610d3460209383613f2f565b81010312610d4b57610d459061401f565b5f610cf0565b8280fd5b3d9150610d27565b6040513d85823e3d90fd5b6024906040519063042a2e7160e11b82526004820152fd5b610d856105ce614b56565b610d8d6150e3565b610d9561409a565b906002548111610dd6575b5081151580610dcd575b610db6575b5050610c75565b610dc2916106196143ff565b426004555f80610daf565b50801515610daa565b6002555f610da0565b42600455610c5d565b50610df16143ff565b15610c58565b503461044b57602036600319011261044b576001546001600160a01b0390811690600435338303610f32578392825f80516020615e0c83398151915254169060405191630de492b960e11b8352600483015282602483015260448201526006606482015260208160848173ff1773d975da0c000888c5715b7cf38968ff78195af4908115610f27578491610eee575b5073b64bd6df349823d883146980421c876ffa14e6d9926001541692803b156105bf5784926064916040519586948593639db88c9360e01b85526004850152602484015260448301525af4801561059457610ede5750f35b610ee790613f1c565b61044b5780f35b9350506020833d602011610f1f575b81610f0a60209383613f2f565b81010312610f1b578392515f610e86565b5f80fd5b3d9150610efd565b6040513d86823e3d90fd5b6040516311dc66cd60e11b8152336004820152602490fd5b503461044b57602036600319011261044b577f5d2e73196f8ba1b44e887e2bcc9bcd1f3e657add341d4a0a632ffff00d6903f26020600435610f8a615078565b80600355604051908152a180f35b503461044b576020610858610fac36613fea565b91614d5a565b503461044b57602036600319011261044b576020610858336004356145d7565b503461044b578060031936011261044b57600654610fef81613fbf565b90610ffd6040519283613f2f565b8082526006835260209182810191845f80516020615e2c833981519152845b83831061107c57505050506040519280840191818552518092526040840192945b82811061104a5784840385f35b855180516001600160a01b0316855282015180518584015282015160408501529481019460609093019260010161103d565b60038760019260409a9997989a5161109381613f01565b848060a01b0386541681526040516110aa81613f01565b85870154815260028701548482015283820152815201920192019190969493959661101c565b503461044b5760206108586110e436613fea565b91614bc4565b503461044b5760a036600319011261044b57611104613db9565b6060366043190112610680576111186153b8565b611120615078565b815415801561136a575b611361575b60ff5f80516020615e4c8339815191525416156112fc575b6001545f80516020615e0c83398151915254604051630e1739ad60e31b815260066004820152926001600160a01b03929183169183169060443580851690819003610f1b576024860152606435604486015260843560648601521515608485015260043560a485015260c484015260e4830152606082610104817386d7f797636bd55fa3ad55b8c6954631c70c0f4e5af48015610d5757838493859261127a575b5091807f3f008fd510eae7a9e7bee13513d7b83bef8003d488b5a3d0b0da4de71d6846f1949281602095166001600160601b0360a01b6001541617600155168061124a575b5060405191168152a160015f80516020615e8c8339815191525580f35b837f09a1db4b80c32706328728508c941a6b954f31eb5affd32f236c1fd405f8fea491604051908152a15f61122d565b935050506060823d6060116112f4575b8161129760609383613f2f565b81010312610d4b5781816020926112ce7f3f008fd510eae7a9e7bee13513d7b83bef8003d488b5a3d0b0da4de71d6846f19561401f565b92816112e760406112e088850161401f565b930161401f565b94919650509193506111e8565b3d915061128a565b6113076105ce614b56565b61130f6150e3565b61131761409a565b906002548111611358575b508115158061134f575b611338575b5050611147565b611344916106196143ff565b426004555f80611331565b5080151561132c565b6002555f611322565b4260045561112f565b506113736143ff565b1561112a565b503461044b57602036600319011261044b576020906040906001600160a01b036113a1613e15565b168152600d83522054604051908152f35b503461044b57602036600319011261044b5760055460043591906001600160a01b031633036113e7575b602061085883615115565b906001600160401b0360075416916127109283039283116114195750611412602092610858926151ae565b91506113dc565b634e487b7160e01b81526011600452602490fd5b503461044b57602036600319011261044b57611447615078565b5f80516020615e0c833981519152546040516370a0823160e01b815230600482015282917386d7f797636bd55fa3ad55b8c6954631c70c0f4e9190602090829060249082906001600160a01b03165afa908115610d575783916114fb575b5060ff60055460a01c16823b156114f657608484926040519485938492633eb4e02160e11b84526006600485015260248401526004356044840152151560648301525af4801561059457610ede5750f35b505050fd5b9250506020823d602011611528575b8161151760209383613f2f565b81010312610f1b578291515f6114a5565b3d915061150a565b503461044b578060031936011261044b576020610858614b56565b503461044b57604036600319011261044b57611572611568613e15565b60243590336152ba565b602060405160018152f35b503461044b578060031936011261044b5760209054604051908152f35b503461044b57602036600319011261044b576020610858336004356148f0565b503461044b57604036600319011261044b576115d4613e15565b60406115de613e2b565b9260018060a01b038093168152600e6020522091165f52602052602060405f2054604051908152f35b503461044b578060031936011261044b576020600454604051908152f35b503461044b578060031936011261044b576001546040516001600160a01b039091168152602090f35b503461044b578060031936011261044b576040519080825f80516020615dac83398151915292835461167f8161418d565b93848452602095600192876001821691825f1461170d5750506001146116c7575b5050506116af92500383613f2f565b6116c3604051928284938452830190613dd7565b0390f35b8152859250905f80516020615e6c8339815191525b8583106116f55750506116af93508201015f80806116a0565b805483890185015287945086939092019181016116dc565b9350945050506116af94915060ff191682840152151560051b8201015f80806116a0565b503461044b57604036600319011261044b576020610858611750613e2b565b6004356148f0565b503461044b578060031936011261044b575f80516020615dcc833981519152546040516001600160a01b039091168152602090f35b503461044b57602036600319011261044b576117a7613e15565b6117af615078565b60ff60125416156109e6576001600160a01b03168082526011602052604082205460ff161561181357808252601160205260408220805460ff191690557fe285bb51ee9ef78b36fb9eca52aede9c9f4234d2bb72917200f87005edb25a558280a280f35b60249060405190632e6eba8560e11b82526004820152fd5b503461044b57602036600319011261044b577f522d3c2ddc88f29bac386c82e605c5bf322d91aa85997ef97a688539d9d6033360ff611868613dc8565b611870615078565b6118a2601054918381151516841984161760105560405193849316839092916020906040830194151583521515910152565b0390a180f35b503461044b578060031936011261044b578054158015611997575b61198e575b5f80516020615e4c83398151915260ff81541615611929575b6118e9615078565b6118f161554d565b600160ff198254161790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a180f35b6119346105ce614b56565b61193c6150e3565b61194461409a565b906002548111611985575b508115158061197c575b611965575b50506118e1565b611971916106196143ff565b426004555f8061195e565b50801515611959565b6002555f61194f565b426004556118c8565b506119a06143ff565b156118c3565b503461044b57604036600319011261044b576119c0615078565b807386d7f797636bd55fa3ad55b8c6954631c70c0f4e60ff60055460a01c166024602060018060a01b035f80516020615e0c8339815191525416604051928380926370a0823160e01b82523060048301525afa908115610f27578491611a71575b50823b156114f65760a4849260405194859384926312967a2960e31b845260066004850152151560248401526044830152600435606483015260243560848301525af4801561059457610ede5750f35b9350506020833d602011611a9e575b81611a8d60209383613f2f565b81010312610f1b578392515f611a21565b3d9150611a80565b503461044b57602036600319011261044b57611ac0613dc8565b611ac8615078565b6005546040805160ff60a884901c161515815283151560208201529192917ffdc806f366660aa3e77ed7f1da541577007de0e4b7e0c5d351ae99d2d01cc8f39190a160ff60a81b1990911690151560a81b60ff60a81b161760055580f35b503461044b57602036600319011261044b57611b40613e15565b604051630274467d60e11b8152600c6004820152600f60248201526001600160a01b039091166044820152818160648173f6880a04a5df3ba54e5d196471927daa4fcfc2d95af490811561059457826116c39392611ba7575b505060405191829182613e41565b611bc392503d8091833e611bbb8183613f2f565b8101906141c5565b5f80611b99565b503461044b578060031936011261044b57611be3615078565b5f80516020615dcc83398151915280546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461044b57602036600319011261044b576020906040906001600160a01b03611c5b613e15565b1681525f80516020615d8c83398151915283522054604051908152f35b503461044b57604036600319011261044b576020610858611c97613e2b565b6004356145d7565b503461044b578060031936011261044b57611cb8615078565b6005546040805160ff60a084901c16158015825260208201819052917f40f0175b5fde6802a96ba1ba9eeaaa9564b53a1c021b6fcde51422b574abcdbd91a160ff60a01b1990911660a09190911b60ff60a01b161760055580f35b503461044b57602036600319011261044b57611d2d615078565b807386d7f797636bd55fa3ad55b8c6954631c70c0f4e803b15611d7d57816044916040519283809263dd40c63b60e01b82526006600483015260043560248301525af4801561059457610ede5750f35b50fd5b503461044b57602090600319602081360112610680576001600160401b0390600435828111611f8d57608081360392830112611f8d578354158015611fff575b611ff6575b60ff5f80516020615e4c833981519152541615611f91575b611de5615078565b82611df2826004016145c3565b16600754906fffffffffffffffff0000000000000000611e14602485016145c3565b60401b169067ffffffffffffffff60801b611e31604486016145c3565b60801b16926001600160401b0360c01b1617171760075560648101359160221901821215611f8d570190600482013591818311611f8d5760240160609060608402360381136105bf57600160401b8411611f795760085484600855808510611ef9575b506008855284925f80516020615dec833981519152915b858510611eba57864260045580f35b600384826001933586558a810135848701556002860185611edd604084016145c3565b166001600160401b031982541617905501930194019391611eab565b60039080600302906003820403611f655785600302600381048703611f51575f80516020615dec83398151915291820191015b818110611f3a575050611e94565b808884925588600182015588600282015501611f2c565b634e487b7160e01b88526011600452602488fd5b634e487b7160e01b87526011600452602487fd5b634e487b7160e01b85526041600452602485fd5b8380fd5b611f9c6105ce614b56565b611fa46150e3565b611fac61409a565b906002548111611fed575b5081151580611fe4575b611fcd575b5050611ddd565b611fd9916106196143ff565b426004555f80611fc6565b50801515611fc1565b6002555f611fb7565b42600455611dc5565b506120086143ff565b15611dc0565b503461044b578060031936011261044b57612027615078565b807386d7f797636bd55fa3ad55b8c6954631c70c0f4e803b15611d7d5781602491604051928380926356380c2b60e01b8252600660048301525af4801561059457610ede5750f35b503461044b578060031936011261044b57602060ff5f80516020615e4c83398151915254166040519015158152f35b503461044b57602080600319360112610680576120b9613e15565b6120c1615078565b6001600160a01b039081169182156122b6575f80516020615e0c83398151915254600a5483169216826121f5575b60405163095ea7b360e01b80848301528560248301525f19918260448201526044815261211b81613ecb565b6121258185615bcb565b9182156121aa575b505015806121a2575b61217e575050907f8a8682c8e0b406a8cfcc7c7c4ac90372d088ddb8dfaf1baea5435b69e832a43a839260405160018152a36001600160601b0360a01b600a541617600a5580f35b606492508460405192632d28f16360e21b8452600484015260248301526044820152fd5b506001612136565b6121d791925060405190868201528760248201525f6044820152604481526121d181613ecb565b84615bcb565b90816121e4575b8061212d565b6121ef915083615bcb565b5f6121de565b60405163095ea7b360e01b9081848201528460248201525f60448201526044815261221f81613ecb565b6122298184615bcb565b91821561226b575b50501580612263575b156120ef576064908360405191632d28f16360e21b8352600483015260248201525f6044820152fd5b50600161223a565b61229891925060405190858201528560248201525f60448201526044815261229281613ecb565b83615bcb565b90816122a5575b80612231565b6122b0915082615bcb565b5f61229f565b60405163dd2fe90160e01b8152600490fd5b5034610f1b575f366003190112610f1b576122e1615078565b60ff60055460a01c166123cb575f80516020615e0c833981519152546040516370a0823160e01b81523060048201527386d7f797636bd55fa3ad55b8c6954631c70c0f4e91602090829060249082906001600160a01b03165afa90811561238e575f91612399575b50813b15610f1b575f906044604051809481936338abfe2b60e01b83526006600484015260248301525af4801561238e57612382575080f35b61238c9150613f1c565b005b6040513d5f823e3d90fd5b90506020813d6020116123c3575b816123b460209383613f2f565b81010312610f1b57515f612349565b3d91506123a7565b6040516303eb29d960e01b8152600490fd5b34610f1b576020366003190112610f1b576123f6613e15565b6123fe615078565b6009546040516344401bd560e01b81526001600160a01b03918216600482015291811660248301529060208160448173b64bd6df349823d883146980421c876ffa14e6d95af490811561238e575f9161246b575b50166001600160601b0360a01b60095416176009555f80f35b90506020813d60201161249e575b8161248660209383613f2f565b81010312610f1b57518181168103610f1b5782612452565b3d9150612479565b34610f1b575f366003190112610f1b57602060ff601254166040519015158152f35b34610f1b576020366003190112610f1b576020610858600435614584565b34610f1b575f366003190112610f1b57600a546040516001600160a01b039091168152602090f35b34610f1b575f366003190112610f1b576005546040516001600160a01b039091168152602090f35b34610f1b575f366003190112610f1b5761254e6153b8565b5f541580156125fe575b6125f5575b60ff5f80516020615e4c833981519152541615612590575b61257d615078565b60015f80516020615e8c83398151915255005b61259b6105ce614b56565b6125a36150e3565b6125ab61409a565b9060025481116125ec575b50811515806125e3575b6125cc575b5050612575565b6125d8916106196143ff565b4260045580806125c5565b508015156125c0565b600255826125b6565b4260045561255d565b506126076143ff565b15612558565b34610f1b576020366003190112610f1b57602061085861262b613e15565b614516565b34610f1b575f366003190112610f1b575f54158015612731575b612728575b5f80516020615e4c83398151915260ff815416156126c3575b612670615078565b805460ff8116156126b15760ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a142600455005b604051638dfc202b60e01b8152600490fd5b6126ce6105ce614b56565b6126d66150e3565b6126de61409a565b90600254811161271f575b5081151580612716575b6126ff575b5050612668565b61270b916106196143ff565b4260045581806126f8565b508015156126f3565b600255836126e9565b4260045561264f565b5061273a6143ff565b1561264a565b34610f1b576020366003190112610f1b57602061276361275e613e15565b615489565b6040519015158152f35b34610f1b575f366003190112610f1b575f80516020615e0c833981519152546040516001600160a01b039091168152602090f35b34610f1b575f366003190112610f1b5760206108586144aa565b34610f1b575f366003190112610f1b576009546040516001600160a01b039091168152602090f35b34610f1b575f366003190112610f1b5761238c336153e7565b34610f1b57610120366003190112610f1b576004356001600160a01b0381169003610f1b576024356001600160401b038111610f1b57612840903690600401613fa1565b6044356001600160401b038111610f1b5761285f903690600401613fa1565b6064356001600160401b038111610f1b5736602382011215610f1b5780600401359061288a82613fbf565b906128986040519283613f2f565b82825260208201906024606083950282010190368211610f1b57602401915b8183106131d35750506084359290506001600160a01b0383168303610f1b5760a4356001600160401b038111610f1b5760806003198236030112610f1b576040519061290282613ecb565b61290e81600401613fd6565b825261291c60248201613fd6565b602083015261292d60448201613fd6565b60408301526064810135906001600160401b038211610f1b57366023838301011215610f1b576004828201013561296381613fbf565b926129716040519485613f2f565b818452602084019236602460608502848401010111610f1b5780820160240193915b6024606085028284010101851061318a575050505050606082015260e4356001600160a01b0381169003610f1b5761010435948515158603610f1b575f80516020615eac83398151915254966001600160401b038816158061317c575b60016001600160401b038a16149081613172575b159081613169575b506131575760016001600160401b03198916175f80516020615eac8339815191525560ff8860401c161561312b575b612a436153b8565b612a4b615c12565b612a53615c12565b5f80516020615e4c833981519152805460ff19169055612a71615c12565b612a79615c12565b612a84600435615c6f565b9015613123575b5f80516020615e0c83398151915280546001600160a81b03191660a09290921b60ff60a01b16919091176004356001600160a01b0316179055612acc615c12565b612ad4615c12565b8051906001600160401b038211612ffd578190612afe5f80516020615d6c8339815191525461418d565b601f81116130a8575b50602090601f831160011461301c575f92613011575b50508160011b915f199060031b1c1916175f80516020615d6c833981519152555b8051906001600160401b038211612ffd578190612b685f80516020615dac8339815191525461418d565b601f8111612f82575b50602090601f8311600114612ef6575f92612eeb575b50508160011b915f199060031b1c1916175f80516020615dac833981519152555b612bb0615c12565b612bb8615c12565b612bc360e435615007565b612bcb615c12565b612bd3615c12565b60015f80516020615e8c833981519152556004356001600160a01b031615612ed95760015460405163c03e99d960e01b81526001600160a01b03600480358216908301526009602483015260e06044830152945160e48201819052909485946101048601949391909116915f5b818110612ea1575050506064840152600660848401526003198383030160a4840152602060a0606060808501936001600160401b0381511686526001600160401b038482015116848701526001600160401b036040820151166040870152015193608060608201528451809452019201905f5b818110612e60575050509080604092600760c4830152038173ff1773d975da0c000888c5715b7cf38968ff78195af490811561238e575f905f92612e15575b50600180546001600160a81b03191660a09390931b60ff60a01b16929092176001600160a01b039182161790915581161561091c5760058054633b9aca0060025560c4356003556010805494151560ff90811660ff1996871617909155601280549095169094556001600160b01b0319166001600160a01b039283161790554260049081556040519391903516307f3cd5ec01b1ae7cfec6ca1863e2cd6aa25d6d1702825803ff2b7cc95010fffdc25f80a360015f80516020615e8c8339815191525560401c1615612dc057005b60207fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29168ff0000000000000000195f80516020615eac83398151915254165f80516020615eac8339815191525560018152a1005b9150506040813d604011612e58575b81612e3160409383613f2f565b81010312610f1b576020612e448261401f565b9101519060ff82168203610f1b5785612cf2565b3d9150612e24565b919350916020606082612e9360019488516001600160401b03604080928051855260208101516020860152015116910152565b019401910191849392612cb3565b825180516001600160a01b03168752602090810151805182890152810151604088015288975060609096019590920191600101612c40565b604051630ccd248560e21b8152600490fd5b015190508880612b87565b92505f80516020615dac8339815191525f525f80516020615e6c833981519152905f935b601f1984168510612f67576001945083601f19811610612f4f575b505050811b015f80516020615dac83398151915255612ba8565b01515f1960f88460031b161c19169055888080612f35565b81810151835560209485019460019093019290910190612f1a565b9091505f80516020615dac8339815191525f52601f830160051c5f80516020615e6c8339815191520160208410612fe9575b908392915b601f820160051c5f80516020615e6c833981519152018110612fdb5750612b71565b5f8155849350600101612fb9565b505f80516020615e6c833981519152612fb4565b634e487b7160e01b5f52604160045260245ffd5b015190508980612b1d565b92505f80516020615d6c8339815191525f525f80516020615d4c833981519152905f935b601f198416851061308d576001945083601f19811610613075575b505050811b015f80516020615d6c83398151915255612b3e565b01515f1960f88460031b161c1916905589808061305b565b81810151835560209485019460019093019290910190613040565b9091505f80516020615d6c8339815191525f52601f830160051c5f80516020615d4c833981519152016020841061310f575b908392915b601f820160051c5f80516020615d4c8339815191520181106131015750612b07565b5f81558493506001016130df565b505f80516020615d4c8339815191526130da565b506012612a8b565b68ffffffffffffffffff19881668010000000000000001175f80516020615eac83398151915255612a3b565b60405163f92ee8a960e01b8152600490fd5b90501589612a0c565b303b159150612a04565b5060ff8860401c16156129f0565b606085360312610f1b5760608060206024956040516131a881613ee6565b89358152828a0135838201526131c060408b01613fd6565b6040820152815201960195935050612993565b82360360608112610f1b57604051906131eb82613f01565b8435906001600160a01b0382168203610f1b576040918352601f190112610f1b5760609160209160405161321e81613f01565b838701358152604087013584820152838201528152019201916128b7565b34610f1b575f366003190112610f1b57602060ff60015460a01c16604051908152f35b34610f1b576020366003190112610f1b5760206108583333600435614bc4565b34610f1b576020366003190112610f1b576004356001600160401b038111610f1b5736602382011215610f1b5780600401356001600160401b038111610f1b5760249181810190838201368111610f1b576132d86153b8565b6132e0615078565b60609260609461355f575b5050506132f66143ff565b916060928251600692600654945f5b868110613343577f429eabcd6b69e5ca232c6a9d2c5af1805e375e951df8e9bfe831b445e5f69b2b5f80a160015f80516020615e8c83398151915255005b5f5b8481106134fc575b5085548110156134e957855f5261339f5f8960018060a01b03600385025f80516020615e2c8339815191520154168c83604051809681958294630aa0465b60e21b845260206004850152830190613dd7565b03925af190811561238e575f916134cf575b508051905f5b8281106133c957505050600101613305565b60206133d58284614475565b510151906001600160a01b036133eb8285614475565b515116826133ff575b5060019150016133b7565b805f52600d60205260405f20541561344d575b6001928a80613423575b50506133f4565b61342c916159f2565b905f52600d60205261344360405f2091825461449d565b90558d808a61341c565b600c5492600160401b8410156134bc576001840180600c558410156134a957600c5f527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c790930180546001600160a01b03191682179055613412565b8e634e487b7160e01b5f5260326004525ffd5b8e634e487b7160e01b5f5260416004525ffd5b6134e391503d805f833e611bbb8183613f2f565b8a6133b1565b88634e487b7160e01b5f5260326004525ffd5b9750806135098984614475565b511461354c5760405160208101908082106001600160401b03831117613539576001916040525f81529801613345565b8a634e487b7160e01b5f5260416004525ffd5b966135579083614475565b51968961334d565b8294506040929193500312610f1b57828201356001600160401b038111610f1b5782019080604383011215610f1b57838201359260449261359f85613fbf565b946135ad6040519687613f2f565b80865284602087019160051b83010191848311610f1b578501905b82821061367d5750505082810135906001600160401b038211610f1b570181604382011215610f1b5784810135926135ff84613fbf565b9361360d6040519586613f2f565b80855281602086019160051b84010192848411610f1b57828101915b84831061363f57505050505050908380806132eb565b82356001600160401b038111610f1b57820186606382011215610f1b576020916136728883606489879601359101613f6b565b815201920191613629565b81358152602091820191016135c8565b34610f1b576060366003190112610f1b576115726136a9613e15565b6136b1613e2b565b604435916136c0833383615222565b6152ba565b34610f1b575f366003190112610f1b576020600254604051908152f35b34610f1b576040366003190112610f1b576136fb613e15565b613703613e2b565b9060018060a01b038091165f52600f60205260405f2091165f52602052602060405f2054604051908152f35b34610f1b575f366003190112610f1b576020600b54604051908152f35b34610f1b575f366003190112610f1b5760206108586143ff565b34610f1b575f366003190112610f1b5760405161378281613ecb565b5f81526020905f828201525f604082015260608080920152604051916137a783613ecb565b600754916001600160401b0393848416815282810193858160401c16855285604083019160801c168152600854906137de82613fbf565b916137ec6040519384613f2f565b80835285830160085f525f80516020615dec8339815191525f915b8383106138a657505050508690606084019283526040519788978789528160a08a01965116888a01525116604088015251166060860152519260808086015283518092528060c086019401925f905b8382106138635786860387f35b91849650828661389660019496988498516001600160401b03604080928051855260208101516020860152015116910152565b0196019201869594929391613856565b60038960019260409d98999b9a9c9d516138bf81613ee6565b85548152848601548382015289600287015416604082015281520192019201919099989697959499613807565b34610f1b575f366003190112610f1b57602060ff601054166040519015158152f35b34610f1b575f366003190112610f1b57602060ff60055460a01c166040519015158152f35b34610f1b575f366003190112610f1b5760206108586142dc565b34610f1b576020366003190112610f1b57613969600435615148565b6005546001600160a01b031633146139b8576001600160401b0360075460401c16906127109182039182116139a4576020916108589161595d565b634e487b7160e01b5f52601160045260245ffd5b602090610858565b34610f1b576040366003190112610f1b576139d9613e15565b602435903315613a57576001600160a01b0316908115613a3f576139fc33613e93565b825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b604051634a1406b160e11b81525f6004820152602490fd5b60405163e602df0560e01b81525f6004820152602490fd5b34610f1b576020366003190112610f1b5760206108586004356150b0565b34610f1b576020366003190112610f1b576001600160a01b03613aae613e15565b16805f525f80516020615d8c83398151915260205260405f205490604051916313d6991d60e31b83526004830152602482015260a060448201525f8180613af760a4820161426b565b600d6064830152600e6084830152038173f6880a04a5df3ba54e5d196471927daa4fcfc2d95af4801561238e576116c3915f91613b3c575b5060405191829182613e41565b613b5091503d805f833e611bbb8183613f2f565b82613b2f565b34610f1b575f366003190112610f1b576040515f80516020615d6c8339815191528054825f613b848361418d565b92838352602094600191866001821691825f14613bfa575050600114613bb3575b50506116af92500383613f2f565b8592505f525f80516020615d4c833981519152905f915b858310613be25750506116af93508201018580613ba5565b80548389018501528794508693909201918101613bca565b92509350506116af94915060ff191682840152151560051b8201018580613ba5565b34610f1b576020366003190112610f1b57613c35613dc8565b613c3d615078565b6012546040805160ff8084161515825284151560208301529293917f7a9ce9fadfad7fa30c993357b27d46d599daf8af9d701ff8efebdbcf40bb344591a160ff199092169115151617601255005b34610f1b575f366003190112610f1b57602061085861409a565b34610f1b576040366003190112610f1b57600435613cc1613db9565b613cc9615078565b600654821015613da0575f80516020615e0c833981519152546001546040516309a0b6b360e31b8152600660048201526001600160a01b0392831660248201526044810194909452911515606484015290811660848301529060208160a4817386d7f797636bd55fa3ad55b8c6954631c70c0f4e5af490811561238e575f91613d66575b50166001600160601b0360a01b60015416176001555f80f35b90506020813d602011613d98575b81613d8160209383613f2f565b81010312610f1b57613d929061401f565b82613d4d565b3d9150613d74565b60405163042a2e7160e11b815260048101839052602490fd5b602435908115158203610f1b57565b600435908115158203610f1b57565b91908251928382525f5b848110613e01575050825f602080949584010152601f8019910116010190565b602081830181015184830182015201613de1565b600435906001600160a01b0382168203610f1b57565b602435906001600160a01b0382168203610f1b57565b60208082019080835283518092528060408094019401925f905b838210613e6a57505050505090565b845180516001600160a01b03168752830151868401529485019493820193600190910190613e5b565b6001600160a01b03165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020526040902090565b608081019081106001600160401b03821117612ffd57604052565b606081019081106001600160401b03821117612ffd57604052565b604081019081106001600160401b03821117612ffd57604052565b6001600160401b038111612ffd57604052565b90601f801991011681019081106001600160401b03821117612ffd57604052565b6001600160401b038111612ffd57601f01601f191660200190565b929192613f7782613f50565b91613f856040519384613f2f565b829481845281830111610f1b578281602093845f960137010152565b9080601f83011215610f1b57816020613fbc93359101613f6b565b90565b6001600160401b038111612ffd5760051b60200190565b35906001600160401b0382168203610f1b57565b6060906003190112610f1b57600435906001600160a01b03906024358281168103610f1b57916044359081168103610f1b5790565b51906001600160a01b0382168203610f1b57565b6006549081815260208091019160065f525f80516020615e2c833981519152915f905b828210614064575050505090565b83546001600160a01b03168552600180850154868301526002850154604087015260609095019460039094019390910190614056565b5f80516020615e0c833981519152546040516370a0823160e01b81523060048201526020918290829060249082906001600160a01b03165afa90811561238e575f91614160575b5060405190635aafb00160e11b825260048201526040602482015281818061410b60448201614033565b038173e974c9e967e63701a889c7defbb49c6d7432475f5af491821561238e575f9261413657505090565b90809250813d8311614159575b61414d8183613f2f565b81010312610f1b575190565b503d614143565b90508181813d8311614186575b6141778183613f2f565b81010312610f1b57515f6140e1565b503d61416d565b90600182811c921680156141bb575b60208310146141a757565b634e487b7160e01b5f52602260045260245ffd5b91607f169161419c565b906020918281830312610f1b578051906001600160401b038211610f1b570181601f82011215610f1b578051926141fb84613fbf565b9360409361420c6040519687613f2f565b818652828087019260061b85010193818511610f1b578301915b8483106142365750505050505090565b8583830312610f1b57838691825161424d81613f01565b6142568661401f565b81528286015183820152815201920191614226565b600c5490818152602080910191600c5f527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7915f905b8282106142af575050505090565b83546001600160a01b0316855293840193600193840193909101906142a1565b919082039182116139a457565b6142e46150e3565b6142ec61409a565b906002906002549160018060a01b035f80516020615e0c83398151915254169260409260405195869463aabbf18d60e01b865260c4860160c0600488015260085480915260e487019560085f525f80516020615dec833981519152925f915b8383106143c757505050505091602095918594936024860152604485015260648401526084830152600760a48301520381736a7bdc827eb3669af20d3d55dcf3af1b5691ea2e5af490811561238e575f916143a4575090565b90506020813d6020116143bf575b8161414d60209383613f2f565b3d91506143b2565b8454895260018086015460208b0152858201546001600160401b03168a8401528c9a506060909901986003909501949092019161434b565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254600954604051632389621360e11b815260048101929092526001600160a01b0316602482015260208160448173e974c9e967e63701a889c7defbb49c6d7432475f5af490811561238e575f916143a4575090565b80518210156144895760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b919082018092116139a457565b5f80516020615e0c83398151915254604080516369e4822760e01b81526001600160a01b0390921660048301526024820152602081806144ec60448201614033565b038173b64bd6df349823d883146980421c876ffa14e6d95af490811561238e575f916143a4575090565b60ff5f80516020615e4c8339815191525416908115614573575b508015614569575b8015614556575b15614548575f90565b613fbc60035461085261409a565b5061455f61409a565b600354111561453f565b5060035415614538565b61457d9150615489565b155f614530565b6005546001600160a01b031633146145ba576145b5613fbc916108526001600160401b0360075460401c16826151ee565b6150b0565b613fbc906150b0565b356001600160401b0381168103610f1b5790565b6145df6153b8565b6145e761554d565b60ff6012541680614850575b614838575f54158015614829575b614820575b60ff5f80516020615e4c8339815191525416156147bb575b61462782615577565b6146388161463361409a565b61449d565b600354106147a9576005546001600160a01b0390339082160361475d5761465e8261517b565b925b6305f5e10084111561474b5761467684826154ba565b61469483835f80516020615e0c833981519152541630903390615593565b60ff60055460a01c16156146eb575b60405192835283602084015216907fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d760403392a39060015f80516020615e8c83398151915255565b7386d7f797636bd55fa3ad55b8c6954631c70c0f4e803b15610f1b575f604051809263ed9add7360e01b82528180614727308a60048401614867565b03915af4801561238e5761473c575b506146a3565b61474590613f1c565b5f614736565b604051631f2a200560e01b8152600490fd5b61477561084d6001600160401b0360075416846151ee565b92614788846147838561517b565b6142cf565b9380614795575b50614660565b6147a39083600554166154ba565b5f61478f565b604051631264675f60e01b8152600490fd5b6147c66105ce614b56565b6147ce6150e3565b6147d661409a565b906002548111614817575b508115158061480e575b6147f7575b505061461e565b614803916106196143ff565b426004555f806147f0565b508015156147eb565b6002555f6147e1565b42600455614606565b506148326143ff565b15614601565b604051632e6eba8560e11b8152336004820152602490fd5b50335f52601160205260ff60405f205416156145f3565b909291608082016080835260065480915260a083019060065f525f80516020615e2c833981519152905f5b8181106148bc5750505060208301949094526001600160a01b031660408201526001606090910152565b82546001600160a01b0316845260018084015460208601526002840154604086015260609094019360039093019201614892565b6148f86153b8565b61490061554d565b60ff6012541680614b3f575b614838575f54158015614b30575b614b27575b60ff5f80516020615e4c833981519152541615614ac2575b61494082615577565b6305f5e10081111561474b576007546005546001600160a01b03916001600160401b03169082163314614aba576127109081039081116139a4578261478361498892826151ae565b925b61499c614997858561449d565b615115565b936149a98561463361409a565b600354106147a9576149ba82614516565b85116147a95780614aa6575b506149d183826154ba565b6149ef84835f80516020615e0c833981519152541630903390615593565b60ff60055460a01c1615614a46575b60405192848452602084015216907fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d760403392a39060015f80516020615e8c83398151915255565b7386d7f797636bd55fa3ad55b8c6954631c70c0f4e803b15610f1b575f604051809263ed9add7360e01b82528180614a82308b60048401614867565b03915af4801561238e57614a97575b506149fe565b614aa090613f1c565b5f614a91565b614ab49083600554166154ba565b5f6149c6565b505f9261498a565b614acd6105ce614b56565b614ad56150e3565b614add61409a565b906002548111614b1e575b5081151580614b15575b614afe575b5050614937565b614b0a916106196143ff565b426004555f80614af7565b50801515614af2565b6002555f614ae8565b4260045561491f565b50614b396143ff565b1561491a565b50335f52601160205260ff60405f2054161561490c565b614b5e61554d565b6001600160401b0360075460801c16614b7561409a565b6004549060405192632740b27d60e21b8452600484015260248301526044820152602081606481736a7bdc827eb3669af20d3d55dcf3af1b5691ea2e5af490811561238e575f916143a4575090565b919091614bcf6153b8565b614bd761554d565b60ff6012541680614d43575b614838575f54158015614d34575b614d2b575b60ff5f80516020615e4c833981519152541615614cc6575b6001600160a01b039183831615614cb457614c2881615895565b82116147a957614c3782615148565b906305f5e10082111561474b576001600160401b0360075460401c1693600554163314155f14614ca4576127109384039384116139a457614c89614c8283614783614c9097826151ae565b809361449d565b9485615656565b9060015f80516020615e8c83398151915255565b614c909350614c895f809361449d565b604051634e46966960e11b8152600490fd5b614cd16105ce614b56565b614cd96150e3565b614ce161409a565b906002548111614d22575b5081151580614d19575b614d02575b5050614c0e565b614d0e916106196143ff565b426004555f80614cfb565b50801515614cf6565b6002555f614cec565b42600455614bf6565b50614d3d6143ff565b15614bf1565b50335f52601160205260ff60405f20541615614be3565b9190915f91614d676153b8565b614d6f61554d565b60ff6012541680614ef7575b614838575f54158015614ee8575b614edf575b60ff5f80516020615e4c833981519152541615614e7a575b73e974c9e967e63701a889c7defbb49c6d7432475f614dc482614f7a565b90803b15610f1b576040516383ff48f560e01b81526001600160a01b03871660048201526024810185905260448101929092525f90829060649082905af4801561238e57614e67575b506305f5e10082111561474b57600554614c9093906001600160a01b03163314614e615750614e4a6001600160401b0360075460401c16836151ee565b905b614e596145b583856142cf565b948593615656565b90614e4c565b614e72919350613f1c565b5f915f614e0d565b614e856105ce614b56565b614e8d6150e3565b614e9561409a565b906002548111614ed6575b5081151580614ecd575b614eb6575b5050614da6565b614ec2916106196143ff565b426004555f80614eaf565b50801515614eaa565b6002555f614ea0565b42600455614d8e565b50614ef16143ff565b15614d89565b50335f52601160205260ff60405f20541615614d7b565b60ff5f80516020615e4c8339815191525416908115614f6f575b8115614f5e575b50614f5a576003545f19808214614f555750614f4d613fbc9161517b565b6108526143ff565b905090565b5f90565b614f689150615489565b155f614f2f565b600354159150614f28565b60ff5f80516020615e4c83398151915254168015614ff8575b8015614fe8575b614fe3576001600160a01b039081165f9081525f80516020615d8c8339815191526020526040902054600954909116613fbc57614fd86106f36144aa565b818110614f55575090565b505f90565b50614ff281615489565b15614f9a565b5060ff60055460a81c16614f93565b6001600160a01b03908116908115615060575f80516020615dcc83398151915280546001600160a01b031981168417909155167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b604051631e4fbdf760e01b81525f6004820152602490fd5b5f80516020615dcc833981519152546001600160a01b0316330361509857565b60405163118cdaa760e01b8152336004820152602490fd5b6150b861409a565b600181018091116139a4576150cb6143ff565b90633b9aca0082018092116139a457613fbc92615b58565b6150eb61409a565b600181018091116139a4576150fe6143ff565b633b9aca0081018091116139a457613fbc91615adc565b61511d61409a565b600181018091116139a4576151306143ff565b90633b9aca0082018092116139a457613fbc92615206565b6151506143ff565b633b9aca0081018091116139a45761516661409a565b90600182018092116139a457613fbc92615206565b6151836143ff565b633b9aca0081018091116139a45761519961409a565b90600182018092116139a457613fbc92615b58565b906151b9818361595d565b9181156151da5761271090096151cc5790565b600181018091116139a45790565b634e487b7160e01b5f52601260045260245ffd5b90612710906151fd8184615a74565b92096151cc5790565b9190615213828285615b58565b9282156151da57096151cc5790565b61522b81613e93565b9060018060a01b0380841692835f5260205260405f2054935f198503615254575b505050505050565b8585106152895750811615613a57578115613a3f5761527290613e93565b905f526020520360405f20555f808080808061524c565b604051637dc7a0d960e11b81526001600160a01b039190911660048201526024810185905260448101869052606490fd5b90916001600160a01b03808316929083156153a0578416938415615388576152ea906152e5836153e7565b6153e7565b825f525f80516020615d8c8339815191528060205260405f205491838310615355575091806020927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef94865f5284520360405f2055845f5260405f20818154019055604051908152a3565b60405163391434e360e21b81526001600160a01b0391909116600482015260248101929092525060448101829052606490fd5b60405163ec442f0560e01b81525f6004820152602490fd5b604051634b637e8f60e11b81525f6004820152602490fd5b5f80516020615e8c83398151915260028154146153d55760029055565b604051633ee5aeb560e01b8152600490fd5b6001600160a01b03165f8181525f80516020615d8c833981519152602052604090205473f6880a04a5df3ba54e5d196471927daa4fcfc2d990813b15610f1b575f91604051938492631cdd916360e01b84526004840152602483015260c06044830152818061545860c4820161426b565b600d6064830152600e6084830152600f60a483015203915af4801561238e5761547e5750565b61548790613f1c565b565b60ff601254161590811561549b575090565b6001600160a01b03165f9081526011602052604090205460ff16919050565b6001600160a01b0381169182156153885760207fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef916154f95f946153e7565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0261552582825461449d565b90558484525f80516020615d8c833981519152825260408420818154019055604051908152a3565b60ff5f80516020615e4c833981519152541661556557565b60405163d93c066560e01b8152600490fd5b6001600160a01b031615614cb4575f541561558e57565b425f55565b6040516323b872dd60e01b602082019081526001600160a01b0393841660248301529383166044820152606480820195909552938452909160a08401906001600160401b03821185831017612ffd57615604935f9384936040521694519082865af16155fd615c40565b9083615ce8565b8051908115159182615632575b505061561a5750565b60249060405190635274afe760e01b82526004820152fd5b8192509060209181010312610f1b5760200151801590811503610f1b575f80615611565b939190929360ff60055460a81c16615883576001600160a01b038281169533879003615873575b86156153a05761568c846153e7565b865f525f80516020615d8c8339815191529384602052604094855f2054918583106158415750908491895f5260205203845f20557f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace028381540390555f877fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60208751878152a38061582e575b6157206144aa565b9561574073b64bd6df349823d883146980421c876ffa14e6d992856142cf565b91835f80516020615e0c833981519152541692846009541693600b5486600a54169060ff6010541690853b15610f1b575f978c948c519a8b998a98899863a49fe6f760e01b8a5260048a01526024890152169e8f60448801526064870152608486015260a485015260c484015261014060e48401526157c26101448401614033565b91610104840152151561012483015203915af4801561582457907ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db939291615815575b50815193845260208401523392a4565b61581e90613f1c565b5f615805565b83513d5f823e3d90fd5b61583c8183600554166154ba565b615718565b865163391434e360e21b81526001600160a01b0391909116600482015260248101929092525060448101849052606490fd5b61587e833386615222565b61567d565b604051636022a9e760e01b8152600490fd5b60ff5f80516020615e4c8339815191525416801561594e575b801561593e575b614fe3576001600160a01b039081165f9081525f80516020615d8c83398151915260205260409020546158e7906150b0565b6158fe6158f56105ce614b56565b8261064b61409a565b6001600160401b0360075460401c16916127109283039283116139a4576159289261478391615a74565b600954909116156159365790565b614fd86144aa565b5061594881615489565b156158b5565b5060ff60055460a81c166158ae565b61271091818302915f19848209938380861095039480860395146159e457848311156159d257829109815f038216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b60405163227bc15360e01b8152600490fd5b5050809250156151da570490565b6ec097ce7bc90715b34b9f100000000091818302915f19848209938380861095039480860395146159e457848311156159d257829109815f038216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b90808202905f1981840990828083109203918083039214615ad15761271090828211156159d2577fbc01a36e2eb1c432ca57a786c226809d495182a9930be0ded288ce703afb7e91940990828211900360fc1b910360041c170290565b505061271091500490565b90670de0b6b3a764000080830291905f19848209938380861095039480860395146159e457848311156159d257829109815f038216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b9091828202915f19848209938380861095039480860395146159e457848311156159d257829109815f038216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b905f602091828151910182855af1903d5f519083615bea575b50505090565b91925090615c0857506001600160a01b03163b15155b5f8080615be4565b6001915014615c00565b60ff5f80516020615eac8339815191525460401c1615615c2e57565b604051631afcd79f60e31b8152600490fd5b3d15615c6a573d90615c5182613f50565b91615c5f6040519384613f2f565b82523d5f602084013e565b606090565b5f8091604051602081019063313ce56760e01b825260048152615c9181613f01565b51916001600160a01b03165afa615ca6615c40565b9080615cdc575b615cb9575b505f905f90565b602081805181010312610f1b576020015160ff8111615cb2579060ff6001921690565b50602081511015615cad565b90615d0f5750805115615cfd57805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580615d42575b615d20575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15615d1856fe2ae08a8e29253f69ac5d979a101956ab8f8d9d7ded63fa7a83b16fc47648eab052c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0352c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0052c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace049016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300f3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e00f652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330046a2803e59a4de4e7a4c574b1243f25977ac4c77d5a1a4a609b5394cebb4a2aa9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a2646970667358221220e0ed4bb5a2e29ea5defebd89c9f1c78c5595d6013729459d582110dec9d2e49d64736f6c63430008180033