0 txs
1.6k calls
constructor
constructor(address systemRegistry, address _vaultAsset)
functions
accessController
viewfunction accessController() view returns (address)
allowance
viewfunction allowance(address owner, address spender) view returns (uint256)
asset
viewfunction asset() view returns (address)
autoPoolStrategy
viewfunction autoPoolStrategy() view returns (address)
balanceOf
viewfunction balanceOf(address account) view returns (uint256)
balanceOfActual
viewfunction balanceOfActual(address account) view returns (uint256)
BASE_ASSET_INIT_DEPOSIT
viewfunction BASE_ASSET_INIT_DEPOSIT() view returns (uint256)
convertToAssets
viewfunction convertToAssets(uint256 shares, uint256 totalAssetsForPurpose, uint256 supply, uint8 rounding) view returns (uint256 assets)
convertToAssets
viewfunction convertToAssets(uint256 shares) view returns (uint256 assets)
convertToShares
viewfunction convertToShares(uint256 assets, uint256 totalAssetsForPurpose, uint256 supply, uint8 rounding) view returns (uint256 shares)
convertToShares
viewfunction convertToShares(uint256 assets) view returns (uint256 shares)
decimalPad
viewfunction decimalPad() view returns (uint256)
decimals
viewfunction decimals() view returns (uint8)
DOMAIN_SEPARATOR
viewfunction DOMAIN_SEPARATOR() view returns (bytes32)
factory
viewfunction factory() view returns (address)
getAssetBreakdown
viewfunction getAssetBreakdown() view returns (tuple)
getDebtReportingQueue
viewfunction getDebtReportingQueue() view returns (address[])
getDestinationInfo
viewfunction getDestinationInfo(address destVault) view returns (tuple)
getDestinations
viewfunction getDestinations() view returns (address[])
getFeeSettings
viewfunction getFeeSettings() view returns (tuple)
getHooks
viewfunction getHooks() view returns (tuple)
getProfitUnlockSettings
viewfunction getProfitUnlockSettings() view returns (tuple)
getRemovalQueue
viewfunction getRemovalQueue() view returns (address[])
getSystemRegistry
viewfunction getSystemRegistry() view returns (address)
getWithdrawalQueue
viewfunction getWithdrawalQueue() view returns (address[])
isDestinationQueuedForRemoval
viewfunction isDestinationQueuedForRemoval(address dest) view returns (bool)
isDestinationRegistered
viewfunction isDestinationRegistered(address destination) view returns (bool)
isPastRewarder
viewfunction isPastRewarder(address _pastRewarder) view returns (bool)
isShutdown
viewfunction isShutdown() view returns (bool)
name
viewfunction name() view returns (string)
nonces
viewfunction nonces(address owner) view returns (uint256)
oldestDebtReporting
viewfunction oldestDebtReporting() view returns (uint256)
ONE
viewfunction ONE() view returns (uint256)
rewarder
viewfunction rewarder() view returns (address)
shutdownStatus
viewfunction shutdownStatus() view returns (uint8)
symbol
viewfunction symbol() view returns (string)
totalAssets
viewfunction totalAssets() view returns (uint256)
totalAssets
viewfunction totalAssets(uint8 purpose) view returns (uint256)
totalSupply
viewfunction totalSupply() view returns (uint256 shares)
vaultType
viewfunction vaultType() view returns (bytes32)
addDestinations
nonpayablefunction addDestinations(address[] destinations)
addHooks
nonpayablefunction addHooks(address[] newHooks, bytes[] data)
approve
nonpayablefunction approve(address spender, uint256 value) returns (bool)
deposit
nonpayablefunction deposit(uint256 assets, address receiver) returns (uint256 shares)
flashRebalance
nonpayablefunction flashRebalance(address receiver, tuple rebalanceParams, bytes data)
initialize
nonpayablefunction initialize(string symbolSuffix, string descPrefix, bytes)
maxDeposit
nonpayablefunction maxDeposit(address wallet) returns (uint256 maxAssets)
maxMint
nonpayablefunction maxMint(address wallet) returns (uint256 maxShares)
maxRedeem
nonpayablefunction maxRedeem(address owner) returns (uint256 maxShares)
maxWithdraw
nonpayablefunction maxWithdraw(address owner) returns (uint256 maxAssets)
mint
nonpayablefunction mint(uint256 shares, address receiver) returns (uint256 assets)
pause
nonpayablefunction pause()
paused
nonpayablefunction paused() returns (bool)
permit
nonpayablefunction permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)
previewDeposit
nonpayablefunction previewDeposit(uint256 assets) returns (uint256 shares)
previewMint
nonpayablefunction previewMint(uint256 shares) returns (uint256 assets)
previewRedeem
nonpayablefunction previewRedeem(uint256 shares) returns (uint256 assets)
previewWithdraw
nonpayablefunction previewWithdraw(uint256 assets) returns (uint256 shares)
recover
nonpayablefunction recover(address[] tokens, uint256[] amounts, address[] destinations)
redeem
nonpayablefunction redeem(uint256 shares, address receiver, address owner) returns (uint256 assets)
removeDestinations
nonpayablefunction removeDestinations(address[] destinations)
removeHook
nonpayablefunction removeHook(address hookToRemove, bytes cleanupData)
setFeeSink
nonpayablefunction setFeeSink(address newFeeSink)
setPeriodicFeeBps
nonpayablefunction setPeriodicFeeBps(uint256 fee)
setPeriodicFeeSink
nonpayablefunction setPeriodicFeeSink(address newPeriodicFeeSink)
setProfitUnlockPeriod
nonpayablefunction setProfitUnlockPeriod(uint48 newUnlockPeriodSeconds)
setRebalanceFeeHighWaterMarkEnabled
nonpayablefunction setRebalanceFeeHighWaterMarkEnabled(bool enabled)
setRewarder
nonpayablefunction setRewarder(address newRewarder)
setStreamingFeeBps
nonpayablefunction setStreamingFeeBps(uint256 fee)
setSymbolAndDescAfterShutdown
nonpayablefunction setSymbolAndDescAfterShutdown(string newSymbol, string newName)
shutdown
nonpayablefunction shutdown(uint8 reason)
transfer
nonpayablefunction transfer(address to, uint256 value) returns (bool)
transferFrom
nonpayablefunction transferFrom(address from, address to, uint256 value) returns (bool)
unpause
nonpayablefunction unpause()
updateDebtReporting
nonpayablefunction updateDebtReporting(uint256 numToProcess)
withdraw
nonpayablefunction withdraw(uint256 assets, address receiver, address owner) returns (uint256 shares)
events
AddedToRemovalQueue
event AddedToRemovalQueue(address destination)
Approval
event Approval(address indexed owner, address indexed spender, uint256 value)
Deposit
event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares)
DestinationDebtReporting
event DestinationDebtReporting(address destination, (bool pricesWereSafe, uint256 totalIdleDecrease, uint256 totalIdleIncrease, uint256 totalDebtIncrease, uint256 totalDebtDecrease, uint256 totalMinDebtIncrease, uint256 totalMinDebtDecrease, uint256 totalMaxDebtIncrease, uint256 totalMaxDebtDecrease) debtInfo, uint256 claimed, uint256 claimGasUsed)
DestinationVaultAdded
event DestinationVaultAdded(address destination)
DestinationVaultRemoved
event DestinationVaultRemoved(address destination)
FeeCollected
event FeeCollected(uint256 fees, address feeSink, uint256 mintedShares, uint256 profit, uint256 totalAssets)
FeeSinkSet
event FeeSinkSet(address newFeeSink)
Initialized
event Initialized(uint8 version)
LastPeriodicFeeTakeSet
event LastPeriodicFeeTakeSet(uint256 lastPeriodicFeeTake)
Nav
event Nav(uint256 idle, uint256 debt, uint256 totalSupply)
NewNavShareFeeMark
event NewNavShareFeeMark(uint256 navPerShare, uint256 timestamp)
NewProfitUnlockTime
event NewProfitUnlockTime(uint48 timeSeconds)
NewTotalAssetsHighWatermark
event NewTotalAssetsHighWatermark(uint256 assets, uint256 timestamp)
Paused
event Paused(address account)
PeriodicFeeCollected
event PeriodicFeeCollected(uint256 fees, address feeSink, uint256 mintedShares)
PeriodicFeeSet
event PeriodicFeeSet(uint256 newFee)
PeriodicFeeSinkSet
event PeriodicFeeSinkSet(address newPeriodicFeeSink)
RebalanceCompleted
event RebalanceCompleted((uint256 startingIdle, uint256 startingDebt, uint256 startingTotalSupply, uint256 newIdle, uint256 newDebt, uint256 endingTotalSupply) updatedAssets)
RebalanceFeeHighWaterMarkEnabledSet
event RebalanceFeeHighWaterMarkEnabledSet(bool enabled)
RebalanceStarted
event RebalanceStarted(address receiver, (address destinationIn, address tokenIn, uint256 amountIn, address destinationOut, address tokenOut, uint256 amountOut) rebalanceParams)
RemovedFromRemovalQueue
event RemovedFromRemovalQueue(address destination)
RewarderSet
event RewarderSet(address newRewarder, address oldRewarder)
Shutdown
event Shutdown(uint8 reason)
StreamingFeeSet
event StreamingFeeSet(uint256 newFee)
SymbolAndDescSet
event SymbolAndDescSet(string symbol, string desc)
TokensRecovered
event TokensRecovered(address[] tokens, uint256[] amounts, address[] destinations)
Transfer
event Transfer(address indexed from, address indexed to, uint256 value)
Unpaused
event Unpaused(address account)
Withdraw
event Withdraw(address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares)
WithdrawalQueueSet
event WithdrawalQueueSet(address[] destinations)
errors
AccessDenied
error AccessDenied()
AlreadySet
error AlreadySet()
AmountExceedsAllowance
error AmountExceedsAllowance(uint256 shares, uint256 allowed)
BaseAssetMismatch
error BaseAssetMismatch(address destinationVault)
DebtReportingStale
error DebtReportingStale()
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)
ERC2612ExpiredSignature
error ERC2612ExpiredSignature(uint256 deadline)
ERC2612InvalidSigner
error ERC2612InvalidSigner(address signer, address owner)
ERC4626DepositExceedsMax
error ERC4626DepositExceedsMax(uint256 assets, uint256 maxDeposit)
ERC4626ExceededMaxRedeem
error ERC4626ExceededMaxRedeem(address owner, uint256 shares, uint256 max)
ERC4626ExceededMaxWithdraw
error ERC4626ExceededMaxWithdraw(address owner, uint256 assets, uint256 max)
ERC4626MintExceedsMax
error ERC4626MintExceedsMax(uint256 shares, uint256 maxMint)
FunctionNotSet
error FunctionNotSet(address hook, uint256 fn)
HookAlreadySet
error HookAlreadySet(address hook, uint256 fn)
HookExecutionFailed
error HookExecutionFailed(address hook, bytes underlyingError)
HookNotSet
error HookNotSet(address hook)
InsufficientAssets
error InsufficientAssets(address asset)
InvalidAccountNonce
error InvalidAccountNonce(address account, uint256 currentNonce)
InvalidDecimals
error InvalidDecimals()
InvalidDestination
error InvalidDestination(address destination)
InvalidFee
error InvalidFee(uint256 newFee)
InvalidParam
error InvalidParam(string paramName)
InvalidPrices
error InvalidPrices()
InvalidShutdownStatus
error InvalidShutdownStatus(uint8 status)
InvalidTotalAssetPurpose
error InvalidTotalAssetPurpose()
IsNotPaused
error IsNotPaused()
IsPaused
error IsPaused()
MaxHooksSet
error MaxHooksSet()
NavDecreased
error NavDecreased(uint256 oldNav, uint256 newNav)
NavOpsInProgress
error NavOpsInProgress()
OnlyRebalanceToIdleAvailable
error OnlyRebalanceToIdleAvailable()
PositivePriceRecoupNotCovered
error PositivePriceRecoupNotCovered(uint256 remaining)
RebalanceDestinationsMatch
error RebalanceDestinationsMatch()
RebalanceDestinationUnderlyerMismatch
error RebalanceDestinationUnderlyerMismatch(address destination, address trueUnderlyer, address providedUnderlyer)
RecoveryFailed
error RecoveryFailed()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
RegistryItemMissing
error RegistryItemMissing(string item)
SharesAndAssetsReceived
error SharesAndAssetsReceived(uint256 assets, uint256 shares)
TooFewAssets
error TooFewAssets(uint256 requested, uint256 actual)
UndefinedAddress
error UndefinedAddress()
UnregisteredDestination
error UnregisteredDestination(address dest)
ValueSharesMismatch
error ValueSharesMismatch(uint256 value, uint256 shares)
VaultShutdown
error VaultShutdown()
WithdrawShareCalcInvalid
error WithdrawShareCalcInvalid(uint256 currentShares, uint256 cachedShares)
ZeroAddress
error ZeroAddress(string paramName)
creation bytecode
0x6101806040527f70ad9091c73a6296ddd8e02c9a5894ad8b19c17d93de56b00ff042db59cc8e1e60e05234801562000035575f80fd5b5060405162006518380380620065188339810160408190526200005891620005ab565b81826001600160a01b031663bc43cbaf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000096573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620000bc9190620005e8565b6001600160a01b038116620000e457604051630cbe126f60e11b815260040160405180910390fd5b6001600160a01b031660805260408051808201909152600e81526d73797374656d526567697374727960901b602082015262000122908290620004a7565b5f816001600160a01b031663bc43cbaf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000160573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001869190620005e8565b90506001600160a01b038116620001d857604051636fc852e160e01b815260206004820152601060248201526f30b1b1b2b9b9a1b7b73a3937b63632b960811b60448201526064015b60405180910390fd5b5f826001600160a01b031663c3d0cbfb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000216573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200023c9190620005e8565b90506001600160a01b0381166200028857604051636fc852e160e01b815260206004820152600e60248201526d73797374656d536563757269747960901b6044820152606401620001cf565b6001600160a01b0391821660a0521660c0525060408051808201909152600e81526d73797374656d526567697374727960901b6020820152620002cd908390620004a7565b6001600160a01b03808316610120526040805163313ce56760e01b815290517f17264fbcd79a365fd3ccff89407ad487986f8b37b9035d6bc8b51cacd58322009284169163313ce5679160048083019260209291908290030181865afa1580156200033a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200036091906200060d565b60ff16610160526001600160a01b038216610140819052604080516395d89b4160e01b815290516395d89b41916004808201925f929091908290030181865afa158015620003b0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052620003d9919081019062000667565b604051602001620003eb91906200071a565b60405160208183030381529060405281601e0190816200040c9190620007e7565b5080601e01604051602001620004239190620008b3565b60405160208183030381529060405281601d019081620004449190620007e7565b506200044f620004d7565b601260ff166101605160ff1611156200047b57604051630692acc560e51b815260040160405180910390fd5b610160516200048c9060126200094f565b6200049990600a62000a6a565b610100525062000aae915050565b6001600160a01b038216620004d3578060405163eac0d38960e01b8152600401620001cf919062000a7a565b5050565b5f54610100900460ff1615620005405760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620001cf565b5f5460ff908116101562000591575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114620005a8575f80fd5b50565b5f8060408385031215620005bd575f80fd5b8251620005ca8162000593565b6020840151909250620005dd8162000593565b809150509250929050565b5f60208284031215620005f9575f80fd5b8151620006068162000593565b9392505050565b5f602082840312156200061e575f80fd5b815160ff8116811462000606575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f5b838110156200065f57818101518382015260200162000645565b50505f910152565b5f6020828403121562000678575f80fd5b81516001600160401b03808211156200068f575f80fd5b818401915084601f830112620006a3575f80fd5b815181811115620006b857620006b86200062f565b604051601f8201601f19908116603f01168101908382118183101715620006e357620006e36200062f565b81604052828152876020848701011115620006fc575f80fd5b6200070f83602083016020880162000643565b979650505050505050565b67185d5d1bdc1bdbdb60c21b81525f82516200073e81600885016020870162000643565b6754656d706c61746560c01b6008939091019283015250601001919050565b600181811c908216806200077257607f821691505b6020821081036200079157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620007e257805f5260205f20601f840160051c81016020851015620007be5750805b601f840160051c820191505b81811015620007df575f8155600101620007ca565b50505b505050565b81516001600160401b038111156200080357620008036200062f565b6200081b816200081484546200075d565b8462000797565b602080601f83116001811462000851575f8415620008395750858301515b5f19600386901b1c1916600185901b178555620008ab565b5f85815260208120601f198616915b82811015620008815788860151825594840194600190910190840162000860565b50858210156200089f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f808354620008c2816200075d565b60018281168015620008dd5760018114620008f35762000921565b60ff198416875282151583028701945062000921565b875f526020805f205f5b85811015620009185781548a820152908401908201620008fd565b50505082870194505b505065102a37b5b2b760d11b835250506006019392505050565b634e487b7160e01b5f52601160045260245ffd5b60ff82811682821603908111156200096b576200096b6200093b565b92915050565b600181815b80851115620009b157815f19048211156200099557620009956200093b565b80851615620009a357918102915b93841c939080029062000976565b509250929050565b5f82620009c9575060016200096b565b81620009d757505f6200096b565b8160018114620009f05760028114620009fb5762000a1b565b60019150506200096b565b60ff84111562000a0f5762000a0f6200093b565b50506001821b6200096b565b5060208310610133831016604e8410600b841016171562000a40575081810a6200096b565b62000a4c838362000971565b805f190482111562000a625762000a626200093b565b029392505050565b5f6200060660ff841683620009b9565b602081525f825180602084015262000a9a81604085016020870162000643565b601f01601f19169190910160400192915050565b60805160a05160c05160e0516101005161012051610140516101605161599762000b815f395f818161148f0152818161150101528181611c3001528181611e26015261384e01525f818161068501528181611bc201528181612308015281816131fc015261410201525f8181610b19015281816116f201528181611b50015281816130360152613edc01525f81816106c101528181613e8c015261400501525f61071601525f61197d01525f81816113310152611f3301525f818161095e01528181613a5e0152613b1401526159975ff3fe608060405234801561000f575f80fd5b5060043610610443575f3560e01c80638456cb5911610237578063c45a015511610135578063da62e064116100bf578063e50d8b2611610084578063e50d8b2614610a97578063e649e2fb14610ade578063e9f45bec14610af1578063ef8b30f714610b04578063f12baf5c14610b17575f80fd5b8063da62e06414610a43578063dc47c23a14610a56578063dcc3e06e14610a69578063dd62ed3e14610a71578063e225df1b14610a84575f80fd5b8063ce96cb7711610105578063ce96cb77146109e4578063d505accf146109f7578063d54ffc0b14610a0a578063d905777e14610a1d578063d9ac22d114610a30575f80fd5b8063c45a0155146109a3578063c63d75b6146109ab578063c6e6f592146109be578063c7575dac146109d1575f80fd5b8063ae35f432116101c1578063ba689a1211610186578063ba689a1214610946578063bc43cbaf14610959578063bef893e814610980578063bf86d69014610993578063c2ee3a081461099b575f80fd5b8063ae35f432146108f2578063b3d7f6b914610905578063b460af9414610918578063b639a0c11461092b578063ba08765214610933575f80fd5b806395d89b411161020757806395d89b41146108a75780639a0dbc02146108af5780639dbbabf4146108c2578063a9059cbb146108cc578063a90a227a146108df575f80fd5b80638456cb59146108665780638db619d11461086e57806392804c6c1461088157806394bf804d14610894575f80fd5b8063402d267d116103445780635cd4c8bc116102ce57806370a082311161029357806370a082311461081257806377f748d0146108255780637ecebe0014610838578063804a42191461084b5780638063e2b61461085e575f80fd5b80635cd4c8bc1461078b57806366c2072e1461079e5780636e553f65146107b15780636f6f3821146107c45780636fcb5f3d146107d7575f80fd5b806353589b741161031457806353589b741461074b578063544407e2146107535780635ba536bc146107665780635c975abb1461076e5780635cd2525e14610776575f80fd5b8063402d267d146106eb57806348b80c5d146106fe5780634ac032be146107115780634cdad50614610738575f80fd5b8063295b001f116103d05780633644e515116103955780633644e515146105b357806338d52e0f146106835780633a6462e4146106a95780633d30e60d146106bc5780633f4ba83a146106e3575f80fd5b8063295b001f146105445780632b38400e146105595780632e4c96971461056e5780632ec746bf14610583578063313ce567146105a4575f80fd5b80630a28a477116104165780630a28a477146104ad5780630e73ecef146104c057806318160ddd146104d557806319004142146104dd57806323b872dd14610531575f80fd5b806301e1d1141461044757806306fdde031461046257806307a2d13a14610477578063095ea7b31461048a575b5f80fd5b61044f610b3d565b6040519081526020015b60405180910390f35b61046a610bc5565b6040516104599190614572565b61044f610485366004614584565b610c5e565b61049d6104983660046145af565b610c80565b6040519015158152602001610459565b61044f6104bb366004614584565b610d1e565b6104c8610e5c565b60405161045991906145d9565b61044f610ede565b6104f06104eb366004614625565b610f26565b60405161045991905f60a082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b61049d61053f366004614640565b610fc2565b61055761055236600461468a565b611072565b005b61056161110a565b60405161045991906146a5565b6105766111fb565b6040516104599190614766565b61058c61dead81565b6040516001600160a01b039091168152602001610459565b60405160128152602001610459565b6040805180820182526007815266546f6b656d616b60c81b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527f23507ec2a6c39fbe11564ea15b41b88713abf0a51468497aca3adc4f90e202d1818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012061044f565b7f000000000000000000000000000000000000000000000000000000000000000061058c565b6105576106b7366004614625565b611215565b61044f7f000000000000000000000000000000000000000000000000000000000000000081565b6105576112f6565b61044f6106f9366004614625565b611428565b61044f61070c366004614779565b6114f7565b61044f7f000000000000000000000000000000000000000000000000000000000000000081565b61044f610746366004614584565b611531565b61044f6116a5565b610557610761366004614584565b6116e7565b6104c8611954565b61049d611969565b61077e6119fc565b60405161045991906147e2565b610557610799366004614a2a565b611a80565b6105576107ac366004614b2c565b611aeb565b61044f6107bf366004614b6a565b611b78565b6105576107d2366004614ba5565b611cb3565b6107df611d2a565b60405161045991908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b61044f610820366004614625565b611d90565b61044f610833366004614779565b611e1c565b61044f610846366004614625565b611e4d565b610557610859366004614b2c565b611e78565b6104c8611ee3565b610557611ef8565b61055761087c366004614bfd565b61202a565b61055761088f366004614584565b6120c8565b61044f6108a2366004614b6a565b6121eb565b61046a61239e565b6105576108bd366004614c4d565b6123b6565b61044f620186a081565b61049d6108da3660046145af565b612421565b61044f6108ed36600461468a565b612484565b610557610900366004614625565b6124c8565b61044f610913366004614584565b612549565b61044f610926366004614ca2565b612611565b6104c86127a1565b61044f610941366004614ca2565b6127e6565b61049d610954366004614625565b6129da565b61058c7f000000000000000000000000000000000000000000000000000000000000000081565b61055761098e366004614ce1565b6129f0565b61049d612a8e565b61044f612aa3565b61058c612ab2565b61044f6109b9366004614625565b612acd565b61044f6109cc366004614584565b612b38565b6105576109df366004614584565b612b54565b61044f6109f2366004614625565b612c4c565b610557610a05366004614d73565b612df1565b61044f610a18366004614625565b612ea3565b61044f610a2b366004614625565b612eca565b610557610a3e366004614de4565b612f5b565b610557610a51366004614625565b612fd8565b610557610a64366004614e09565b613023565b61058c613598565b61044f610a7f366004614ed4565b6135b3565b61049d610a92366004614625565b6135eb565b610a9f613601565b60408051825165ffffffffffff908116825260208085015182169083015283830151169181019190915260609182015191810191909152608001610459565b610557610aec366004614f00565b613678565b61049d610aff366004614625565b613954565b61044f610b12366004614584565b61396a565b7f000000000000000000000000000000000000000000000000000000000000000061058c565b5f73795e4025720a1a63e6b848976caa5acf1182fda06320bf782e610b606139f6565b6021015f6040518363ffffffff1660e01b8152600401610b81929190614f81565b602060405180830381865af4158015610b9c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bc09190614f9e565b905090565b6060610bcf6139f6565b601d018054610bdd90614fb5565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0990614fb5565b8015610c545780601f10610c2b57610100808354040283529160200191610c54565b820191905f5260205f20905b815481529060010190602001808311610c3757829003601f168201915b5050505050905090565b5f610c7a82610c6c5f612484565b610c74610ede565b5f6114f7565b92915050565b5f80610c8a6139f6565b604051630847f5ab60e21b8152600481018290526001600160a01b03861660248201526044810185905290915073ae9077cd5e0824b24a66c4d240bcfa67a8973b389063211fd6ac906064015b602060405180830381865af4158015610cf2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d169190614fed565b949350505050565b5f80610d286139f6565b9050732016e96297474f14cc2e4eeeca4a425f700be458635917e2a68260018685732016e96297474f14cc2e4eeeca4a425f700be45863378847bb909160026040518363ffffffff1660e01b8152600401610d84929190614f81565b602060405180830381865af4158015610d9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dc39190614f9e565b6040805160248082018c905282518083039091018152604490910182526020810180516001600160e01b0316630a28a47760e01b17905290516001600160e01b031960e088901b168152610e1e959493929190600401615008565b6040805180830381865af4158015610e38573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d16919061503f565b6060610e666139f6565b604051631f93128960e01b8152600a9091016004820152731f11f08aa558f6313e3885a9a1ddb5365148b17990631f931289906024015b5f60405180830381865af4158015610eb7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610bc09190810190615061565b5f73795e4025720a1a63e6b848976caa5acf1182fda06318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865af4158015610b9c573d5f803e3d5ffd5b610f536040518060a001604052805f81526020015f81526020015f81526020015f81526020015f81525090565b610f5b6139f6565b6009015f836001600160a01b03166001600160a01b031681526020019081526020015f206040518060a00160405290815f82015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509050919050565b5f610fcb613a1a565b5f610fd46139f6565b60405163de8e7abd60e01b8152600481018290526001600160a01b038088166024830152861660448201526064810185905290915073ae9077cd5e0824b24a66c4d240bcfa67a8973b389063de8e7abd90608401602060405180830381865af4158015611043573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110679190614fed565b9150505b9392505050565b61109b7f29f066ba98b1de62c9c969c781ec5d316c4e96752461c65aa1a1f8b71b818955613a42565b73795e4025720a1a63e6b848976caa5acf1182fda063fdf096a86110bd6139f6565b836040518363ffffffff1660e01b81526004016110db929190614f81565b5f6040518083038186803b1580156110f1575f80fd5b505af4158015611103573d5f803e3d5ffd5b5050505050565b61116a6040518061014001604052805f6001600160a01b031681526020015f81526020015f81526020015f81526020015f6001600160a01b031681526020015f81526020015f81526020015f81526020015f81526020015f151581525090565b6111726139f6565b604080516101408101825260108301546001600160a01b039081168252601184015460208301526012840154928201929092526013830154606082015260148301549091166080820152601582015460a0820152601682015460c0820152601782015460e0820152601882015461010082015260199091015460ff161515610120820152919050565b5f6112046139f6565b60080154610100900460ff16919050565b5f61121e6139f6565b60208101549091506001600160a01b0316331480159061126557506112637ffde2f69a846a71295e563d91ade82dc70e9eda278403d1aece24d0ded949403a33613aec565b155b1561128357604051634ca8886760e01b815260040160405180910390fd5b60405163be6a5f4d60e01b8152600481018290526001600160a01b038316602482015273795e4025720a1a63e6b848976caa5acf1182fda09063be6a5f4d906044015b5f6040518083038186803b1580156112dc575f80fd5b505af41580156112ee573d5f803e3d5ffd5b505050505050565b604051632474521560e21b81527f62c67cb852e451f36ab720db75ef4514bb68a3897d1a5c81c9a83b7c98000a7360048201523360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906391d1485490604401602060405180830381865afa15801561137e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113a29190614fed565b6113bf57604051634ca8886760e01b815260040160405180910390fd5b5f5462010000900460ff166113e75760405163bc871ce560e01b815260040160405180910390fd5b5f805462ff0000191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b5f806114326139f6565b905073795e4025720a1a63e6b848976caa5acf1182fda0633dc637a78285611458611969565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b0390911660248301521515604482015260ff7f00000000000000000000000000000000000000000000000000000000000000001660648201526084015b602060405180830381865af41580156114d3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061106b9190614f9e565b5f611528858585857f000000000000000000000000000000000000000000000000000000000000000060ff16613b7f565b95945050505050565b5f8061153b6139f6565b90505f803033036115d15760405163378847bb60e01b8152732016e96297474f14cc2e4eeeca4a425f700be4589063378847bb90611580908690600290600401614f81565b602060405180830381865af415801561159b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115bf9190614f9e565b91506115ce8583610c74610ede565b90505b732016e96297474f14cc2e4eeeca4a425f700be458635917e2a6845f8486306001600160a01b0316634cdad5068c60405160240161161191815260200190565b60408051808303601f1901815291815260208201805160e094851b6001600160e01b03909116179052519188901b6001600160e01b031916825261165d96959493925090600401615008565b6040805180830381865af4158015611677573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061169b919061503f565b5095945050505050565b5f6116ae6139f6565b604051636d39c2a360e01b81526004810191909152732016e96297474f14cc2e4eeeca4a425f700be45890636d39c2a390602401610b81565b6116ef613bad565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c3d0cbfb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561174c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061177091906150ea565b9050806001600160a01b03166378b3218e6040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156117aa575f80fd5b505af11580156117bc573d5f803e3d5ffd5b505050506117e97fcc8d84e7812292bf7d6520663883418777cc25c70d0afb177cf436a4b193f43f613a42565b5f6117f26139f6565b60405163b21b650f60e01b8152600481018290529091505f9073569bdb528d11f4d7be141bc217e1e4f11c92c62e9063b21b650f906024015f60405180830381865af4158015611844573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261186b9190810190615105565b90505f732016e96297474f14cc2e4eeeca4a425f700be458633c7b866d8487856040518463ffffffff1660e01b81526004016118a99392919061516d565b60c060405180830381865af41580156118c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118e8919061518b565b90506118f681836001613bd7565b505050806001600160a01b031663565f36526040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611931575f80fd5b505af1158015611943573d5f803e3d5ffd5b505050505061195160018055565b50565b6060610bc06119616139f6565b600401613e5d565b5f805462010000900460ff1680610bc057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637691c4ac6040518163ffffffff1660e01b81526004016020604051808303815f875af11580156119d8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bc09190614fed565b611a04614492565b611a0c6139f6565b604051634e21c1c360e01b8152600481019190915273569bdb528d11f4d7be141bc217e1e4f11c92c62e90634e21c1c390602401610a0060405180830381865af4158015611a5c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bc09190615256565b611aa97fb9ee578399b30adde52e50aec40588f47e0410ff79189453eabe1223b277d01f613a42565b611ab16139f6565b60405163092821b160e21b815273569bdb528d11f4d7be141bc217e1e4f11c92c62e916324a086c4916112c6919086908690600401615307565b611b147f34a7520d3d78202e2ebf2e8fd1438c03a5b2d8f76e9ed166769da91b4084c8a9613a42565b611b1c6139f6565b604051635babeb3160e11b815273395a0c311705b8f910fee13998b82925b768bf919163b757d662916112c69190869086907f0000000000000000000000000000000000000000000000000000000000000000906004016153f6565b5f611b81613bad565b60015f80611b8e83613e69565b91509150611b9a613ed9565b5f611ba36139f6565b905073795e4025720a1a63e6b848976caa5acf1182fda06362afd7f0827f00000000000000000000000000000000000000000000000000000000000000008a8a611beb611969565b60405160e087901b6001600160e01b031916815260048101959095526001600160a01b03938416602486015260448501929092529091166064830152151560848201527f000000000000000000000000000000000000000000000000000000000000000060ff1660a482015260c401602060405180830381865af4158015611c75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c999190614f9e565b945050611ca7828285613fdd565b505050610c7a60018055565b611cdc7f0cf879d4130d1406f9ac47c9bad2570cc4a127a954af798da98488d730523ec4613a42565b5f611ce56139f6565b604051632b3f818160e11b8152601082016004820152831515602482015290915073e1525f3d2e2dfbb7003e143b116dce9ab3db28349063567f0302906044016112c6565b611d5160405180608001604052805f81526020015f81526020015f81526020015f81525090565b611d596139f6565b6040805160808101825260218301548152602283015460208201526023830154918101919091526024909101546060820152919050565b5f611d996139f6565b604051631c1ae82360e11b815260048101919091526001600160a01b038316602482015273795e4025720a1a63e6b848976caa5acf1182fda090633835d046906044015b602060405180830381865af4158015611df8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c7a9190614f9e565b5f611528858585857f000000000000000000000000000000000000000000000000000000000000000060ff16614078565b5f80611e576139f6565b6001600160a01b039093165f90815260039093016020525050604090205490565b611ea17f34a7520d3d78202e2ebf2e8fd1438c03a5b2d8f76e9ed166769da91b4084c8a9613a42565b611ea96139f6565b60405163137e0b6160e21b815273395a0c311705b8f910fee13998b82925b768bf9191634df82d84916112c6919086908690600401615428565b6060610bc0611ef06139f6565b600601613e5d565b604051632474521560e21b81527f62c67cb852e451f36ab720db75ef4514bb68a3897d1a5c81c9a83b7c98000a7360048201523360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906391d1485490604401602060405180830381865afa158015611f80573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fa49190614fed565b611fc157604051634ca8886760e01b815260040160405180910390fd5b5f5462010000900460ff1615611fea57604051631309a56360e01b815260040160405180910390fd5b5f805462ff00001916620100001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589060200161141e565b6120537fb9ee578399b30adde52e50aec40588f47e0410ff79189453eabe1223b277d01f613a42565b61205b6139f6565b60405163d59b8d1d60e01b815273569bdb528d11f4d7be141bc217e1e4f11c92c62e9163d59b8d1d916120979190879087908790600401615469565b5f6040518083038186803b1580156120ad575f80fd5b505af41580156120bf573d5f803e3d5ffd5b50505050505050565b6120d0613bad565b6120f97f0cf879d4130d1406f9ac47c9bad2570cc4a127a954af798da98488d730523ec4613a42565b5f6121026139f6565b604051636d39c2a360e01b81526004810182905290915073e1525f3d2e2dfbb7003e143b116dce9ab3db2834906397ef13969083908590732016e96297474f14cc2e4eeeca4a425f700be45890636d39c2a390602401602060405180830381865af4158015612173573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121979190614f9e565b6040516001600160e01b031960e086901b1681526004810193909352602483019190915260448201526064015f6040518083038186803b1580156121d9575f80fd5b505af4158015611943573d5f803e3d5ffd5b5f6121f4613bad565b60015f8061220183613e69565b9150915061220d613ed9565b5f6122166139f6565b905061222186612acd565b871115612259578661223287612acd565b604051631091ffef60e01b8152600481019290925260248201526044015b60405180910390fd5b60405163378847bb60e01b81525f90732016e96297474f14cc2e4eeeca4a425f700be4589063378847bb90612295908590600190600401614f81565b602060405180830381865af41580156122b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122d49190614f9e565b90506122ea88826122e3610ede565b60016114f7565b60405163470390ff60e01b8152600481018490526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116602483015260448201839052606482018b90528916608482015290965073795e4025720a1a63e6b848976caa5acf1182fda09063470390ff9060a4015f6040518083038186803b15801561237b575f80fd5b505af415801561238d573d5f803e3d5ffd5b505050505050611ca7828285613fdd565b60606123a86139f6565b601e018054610bdd90614fb5565b6123df7f29f066ba98b1de62c9c969c781ec5d316c4e96752461c65aa1a1f8b71b818955613a42565b6123e76139f6565b604051631dbabb4960e01b815273795e4025720a1a63e6b848976caa5acf1182fda091631dbabb49916112c6919086908690600401615493565b5f61242a613a1a565b5f6124336139f6565b604051634d439f7f60e01b8152600481018290526001600160a01b03861660248201526044810185905290915073ae9077cd5e0824b24a66c4d240bcfa67a8973b3890634d439f7f90606401610cd7565b5f73795e4025720a1a63e6b848976caa5acf1182fda06320bf782e6124a76139f6565b602101846040518363ffffffff1660e01b8152600401611ddd929190614f81565b6124f17f9f359c53986b24240c7294fef1abdaf22ae1e4cff9fc850868d5141eb3a4a24f613a42565b73e1525f3d2e2dfbb7003e143b116dce9ab3db283463a6b8b9b96125136139f6565b6040516001600160e01b031960e084901b16815260109190910160048201526001600160a01b03841660248201526044016110db565b5f806125536139f6565b60405163378847bb60e01b81529091505f90732016e96297474f14cc2e4eeeca4a425f700be4589063378847bb90612592908590600190600401614f81565b602060405180830381865af41580156125ad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d19190614f9e565b90506125e084826122e3610ede565b925061260a836040518060400160405280600681526020016561737365747360d01b8152506140a0565b5050919050565b5f61261a613bad565b612622613a1a565b60025f8061262f83613e69565b9150915061263b613ed9565b612663876040518060400160405280600681526020016561737365747360d01b8152506140a0565b5f61266c6139f6565b90505f80732016e96297474f14cc2e4eeeca4a425f700be458630cca5f4d848c86732016e96297474f14cc2e4eeeca4a425f700be45863378847bb909160026040518363ffffffff1660e01b81526004016126c8929190614f81565b602060405180830381865af41580156126e3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127079190614f9e565b6040516001600160e01b031960e086901b168152600481019390935260248301919091526044820152606401606060405180830381865af415801561274e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061277291906154bd565b50915091508096506127878383898b8d6140c6565b505050612795828285613fdd565b50505061106b60018055565b60606127ab6139f6565b604051631f93128960e01b8152600c9091016004820152731f11f08aa558f6313e3885a9a1ddb5365148b17990631f93128990602401610e9d565b5f6127ef613bad565b6127f7613a1a565b60025f8061280483613e69565b91509150612810613ed9565b5f6128196139f6565b60405163378847bb60e01b81529091505f90732016e96297474f14cc2e4eeeca4a425f700be4589063378847bb90612858908590600290600401614f81565b602060405180830381865af4158015612873573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128979190614f9e565b90505f6128a48883614179565b9050808a11156128e057604051632e52afbb60e21b81526001600160a01b0389166004820152602481018b905260448101829052606401612250565b505f6128ef8a83610c74610ede565b9050612921816040518060400160405280600e81526020016d706f737369626c6541737365747360901b8152506140a0565b60405163d167bbbf60e01b81526004810184905260248101829052604481018390525f908190732016e96297474f14cc2e4eeeca4a425f700be4589063d167bbbf90606401606060405180830381865af4158015612981573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129a591906154bd565b50915091508198508b8111156129bd576129bd6154e8565b6129ca85838e8d8f6140c6565b5050505050612795828285613fdd565b5f610c7a826129e76139f6565b600401906141a2565b612a197f712b73613835f525c3c675d2245c737ba70afbd0b97264479c97d623f2141594613a42565b6040516317df127d60e31b815273795e4025720a1a63e6b848976caa5acf1182fda09063bef893e890612a5a908990899089908990899089906004016154fc565b5f6040518083038186803b158015612a70575f80fd5b505af4158015612a82573d5f803e3d5ffd5b50505050505050505050565b5f612a976139f6565b6008015460ff16919050565b612aaf6012600a615654565b81565b5f612abb6139f6565b602001546001600160a01b0316919050565b5f80612ad76139f6565b905073795e4025720a1a63e6b848976caa5acf1182fda063a4c5889e8285612afd611969565b6040516001600160e01b031960e086901b16815260048101939093526001600160a01b039091166024830152151560448201526064016114b8565b5f610c7a82612b465f612484565b612b4e610ede565b5f611e1c565b612b7d7f9f359c53986b24240c7294fef1abdaf22ae1e4cff9fc850868d5141eb3a4a24f613a42565b5f612b866139f6565b604051636d39c2a360e01b81526004810182905290915073e1525f3d2e2dfbb7003e143b116dce9ab3db28349063197dfbff9083908590732016e96297474f14cc2e4eeeca4a425f700be45890636d39c2a390602401602060405180830381865af4158015612bf7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c1b9190614f9e565b6040516001600160e01b031960e086901b1681526004810193909352602483019190915260448201526064016112c6565b5f80612c566139f6565b90505f612c6284611d90565b60405163378847bb60e01b81529091505f90732016e96297474f14cc2e4eeeca4a425f700be4589063378847bb90612ca1908690600290600401614f81565b602060405180830381865af4158015612cbc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ce09190614f9e565b9050612cea611969565b80612cf3575081155b80612cfc575080155b15612d0b57505f949350505050565b5f612d198383610c74610ede565b9050732016e96297474f14cc2e4eeeca4a425f700be458635917e2a68560018486306001600160a01b0316630a28a47788604051602401612d5c91815260200190565b60408051808303601f1901815291815260208201805160e094851b6001600160e01b03909116179052519188901b6001600160e01b0319168252612da896959493925090600401615008565b6040805180830381865af4158015612dc2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612de6919061503f565b509695505050505050565b5f612dfa6139f6565b604051633a35807d60e21b8152600481018290526001600160a01b03808b16602483015289166044820152606481018890526084810187905260ff861660a482015260c4810185905260e4810184905290915073ae9077cd5e0824b24a66c4d240bcfa67a8973b389063e8d601f490610104015f6040518083038186803b158015612e83575f80fd5b505af4158015612e95573d5f803e3d5ffd5b505050505050505050505050565b5f612eac6139f6565b6001600160a01b039092165f90815260209290925250604090205490565b5f80612ed46139f6565b60405163378847bb60e01b815290915061106b908490732016e96297474f14cc2e4eeeca4a425f700be4589063378847bb90612f17908690600290600401614f81565b602060405180830381865af4158015612f32573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f569190614f9e565b614179565b612f847f29f066ba98b1de62c9c969c781ec5d316c4e96752461c65aa1a1f8b71b818955613a42565b73e1525f3d2e2dfbb7003e143b116dce9ab3db2834637bfd402a612fa66139f6565b6040516001600160e01b031960e084901b168152600481019190915265ffffffffffff841660248201526044016110db565b6130017f0cf879d4130d1406f9ac47c9bad2570cc4a127a954af798da98488d730523ec4613a42565b73e1525f3d2e2dfbb7003e143b116dce9ab3db283463dbe5b32a6125136139f6565b61302b613bad565b613033613a1a565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c3d0cbfb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613090573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130b491906150ea565b9050806001600160a01b03166378b3218e6040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156130ee575f80fd5b505af1158015613100573d5f803e3d5ffd5b5050505061312d7f0ca87275d169c8ebebebf4aab9c6c710c7681b39422556e90b16a44c68ee4e46613a42565b7feb13b2b1ecae8f425568fdea9b34f9a48f28df89c027ee34637cb798234b6153858560405161315e9291906156ab565b60405180910390a15f61316f6139f6565b60405163b21b650f60e01b8152600481018290529091505f9073569bdb528d11f4d7be141bc217e1e4f11c92c62e9063b21b650f906024015f60405180830381865af41580156131c1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526131e89190810190615105565b604080516060810182526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811682528a166020820152808201899052905163a6c0f55160e01b8152919250905f90732016e96297474f14cc2e4eeeca4a425f700be4589063a6c0f5519061327090879086908c908c908a906004016156c8565b60c060405180830381865af415801561328b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132af919061518b565b90506132bc81845f613bd7565b73569bdb528d11f4d7be141bc217e1e4f11c92c62e6339516f3884600485336040516024016132ec929190615734565b60408051601f198184030181529181526020820180516001600160e01b031663afdac4e360e01b179052516001600160e01b031960e086901b1681526133379392919060040161577a565b5f6040518083038186803b15801561334d575f80fd5b505af415801561335f573d5f803e3d5ffd5b505050506060880151604051632f6c196360e21b8152600481018690526001600160a01b0390911660248201525f604482015273395a0c311705b8f910fee13998b82925b768bf919063bdb0658c906064015f6040518083038186803b1580156133c7575f80fd5b505af41580156133d9573d5f803e3d5ffd5b50508951604051632f6c196360e21b8152600481018890526001600160a01b0390911660248201526001604482015273395a0c311705b8f910fee13998b82925b768bf91925063bdb0658c91506064015f6040518083038186803b15801561343f575f80fd5b505af4158015613451573d5f803e3d5ffd5b5073569bdb528d11f4d7be141bc217e1e4f11c92c62e92506339516f38915085905060058533604051602401613488929190615734565b60408051601f198184030181529181526020820180516001600160e01b03166305a6cc1960e21b179052516001600160e01b031960e086901b1681526134d39392919060040161577a565b5f6040518083038186803b1580156134e9575f80fd5b505af41580156134fb573d5f803e3d5ffd5b505050507f7b0b9d7a59fa63711d67d468d3cd002f9803e4861c203bc8728c5fa6667fdfae8160405161352e91906157a4565b60405180910390a150505050806001600160a01b031663565f36526040518163ffffffff1660e01b81526004015f604051808303815f87803b158015613572575f80fd5b505af1158015613584573d5f803e3d5ffd5b505050505061359260018055565b50505050565b5f6135a16139f6565b601c01546001600160a01b0316919050565b5f6135bc6139f6565b6001600160a01b039384165f908152600191909101602090815260408083209490951682529290925250205490565b5f610c7a826135f86139f6565b600601906141a2565b604080516080810182525f80825260208201819052918101829052606081019190915261362c6139f6565b60408051608081018252600e83015465ffffffffffff80821683526601000000000000820481166020840152600160601b9091041691810191909152600f909101546060820152919050565b5f54610100900460ff161580801561369657505f54600160ff909116105b806136af5750303b1580156136af57505f5460ff166001145b6137125760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401612250565b5f805460ff191660011790558015613733575f805461ff0019166101001790555b61373b6141c3565b613769846040518060400160405280600c81526020016b0e6f2dac4ded8a6eaccccd2f60a31b81525061422d565b613795836040518060400160405280600a8152602001690c8cae6c6a0e4caccd2f60b31b81525061422d565b5f61379e6139f6565b9050601e81016137ae868261582b565b50601d81016137bd858261582b565b506020810180546001600160a01b031916331790556040516342ce07f160e11b81526004810182905273e1525f3d2e2dfbb7003e143b116dce9ab3db28349063859c0fe2906024015f6040518083038186803b15801561381b575f80fd5b505af415801561382d573d5f803e3d5ffd5b505050505f613841620186a061dead611b78565b9050613875620186a060ff7f0000000000000000000000000000000000000000000000000000000000000000166012614250565b81146138a0576040516309469bc160e21b8152620186a0600482015260248101829052604401612250565b604051633dfea01560e11b81526004810183905262015180602482015273e1525f3d2e2dfbb7003e143b116dce9ab3db283490637bfd402a906044015f6040518083038186803b1580156138f2575f80fd5b505af4158015613904573d5f803e3d5ffd5b5050505050508015613592575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b5f610c7a826139616139f6565b601a01906141a2565b5f806139746139f6565b60405163378847bb60e01b815290915061106b908490732016e96297474f14cc2e4eeeca4a425f700be4589063378847bb906139b7908690600190600401614f81565b602060405180830381865af41580156139d2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b469190614f9e565b7f17264fbcd79a365fd3ccff89407ad487986f8b37b9035d6bc8b51cacd583220090565b613a22611969565b15613a4057604051631309a56360e01b815260040160405180910390fd5b565b604051632474521560e21b8152600481018290523360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906391d1485490604401602060405180830381865afa158015613aab573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613acf9190614fed565b61195157604051634ca8886760e01b815260040160405180910390fd5b604051632474521560e21b8152600481018390526001600160a01b0382811660248301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906391d1485490604401602060405180830381865afa158015613b5b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061106b9190614fed565b5f8315613b9757613b92868686866142ac565b613ba3565b613ba386601284614250565b9695505050505050565b600260015403613bd057604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b5f613be06139f6565b90505f8460200151855f0151613bf691906158e6565b90505f85608001518660600151613c0d91906158e6565b604051635bb644f160e01b81526004810185905290915073e1525f3d2e2dfbb7003e143b116dce9ab3db283490635bb644f1906024015f6040518083038186803b158015613c59575f80fd5b505af4158015613c6b573d5f803e3d5ffd5b50505050613c77610ede565b60408701819052613c8a908290866142fb565b60a08701819052604087015173e1525f3d2e2dfbb7003e143b116dce9ab3db28349163c0b1cd5591600e8701918791613cc2916158f9565b85878c60a00151613cd230612ea3565b6040516001600160e01b031960e08a901b1681526004810197909752602487019590955260448601939093526064850191909152608484015260a483015260c482015260e401602060405180830381865af4158015613d33573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d579190614f9e565b60a087015273569bdb528d11f4d7be141bc217e1e4f11c92c62e6339516f3886600789604051602401613d8a91906157a4565b60408051601f198184030181529181526020820180516001600160e01b031663f6c1bb7d60e01b179052516001600160e01b031960e086901b168152613dd59392919060040161577a565b5f6040518083038186803b158015613deb575f80fd5b505af4158015613dfd573d5f803e3d5ffd5b505050606080880151608089015160a08a0151604080519384526020840192909252908201527ffde591d4268ec544cdd14ce6872b792705c3a22041dda226551134062d3e05e892500160405180910390a1505050505050565b60018055565b60605f61106b83614390565b5f80613e73610ede565b9050805f03613e8657505f928392509050565b806127107f0000000000000000000000000000000000000000000000000000000000000000613eb486612484565b613ebe919061590c565b613ec8919061590c565b613ed29190615937565b9150915091565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c3d0cbfb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613f36573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f5a91906150ea565b6001600160a01b031663f403e7846040518163ffffffff1660e01b8152600401602060405180830381865afa158015613f95573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613fb99190614f9e565b1115613a40576040516318b29b3d60e31b815260040160405180910390fd5b505050565b5f613fe6610ede565b9050801580613ff3575082155b15613ffe5750505050565b5f816127107f000000000000000000000000000000000000000000000000000000000000000061402d86612484565b614037919061590c565b614041919061590c565b61404b9190615937565b9050848110156111035760405163caf853f960e01b81526004810186905260248101829052604401612250565b5f851580614084575083155b61409457613b92868587866142ac565b613ba386836012614250565b815f036140c25780604051634389d5ab60e01b81526004016122509190614572565b5050565b6040516376817ac360e01b81526004810186905260248101859052604481018490526001600160a01b03808416606483015280831660848301527f00000000000000000000000000000000000000000000000000000000000000001660a4820152732016e96297474f14cc2e4eeeca4a425f700be458906376817ac39060c4015f6040518083038186803b15801561415c575f80fd5b505af415801561416e573d5f803e3d5ffd5b505050505050505050565b5f8115610c7a57614188611969565b61419a5761419583611d90565b61106b565b505f92915050565b6001600160a01b0381165f908152600183016020526040812054151561106b565b5f54610100900460ff16613e575760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401612250565b81515f036140c25780604051634389d5ab60e01b81526004016122509190614572565b5f81830361425f57508261106b565b8183111561428d5761427182846158f9565b61427c90600a615956565b6142869085615937565b905061106b565b61429783836158f9565b6142a290600a615956565b614286908561590c565b5f806142b98686866143e9565b905060018360028111156142cf576142cf614736565b1480156142eb57505f84806142e6576142e6615923565b868809115b1561152857613ba36001826158e6565b5f806143056139f6565b604051631d11f2c560e31b8152600481018290526024810187905260448101869052841515606482015290915073e1525f3d2e2dfbb7003e143b116dce9ab3db28349063e88f962890608401602060405180830381865af415801561436c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110679190614f9e565b6060815f018054806020026020016040519081016040528092919081815260200182805480156143dd57602002820191905f5260205f20905b8154815260200190600101908083116143c9575b50505050509050919050565b5f80805f19858709858702925082811083820303915050805f036144205783828161441657614416615923565b049250505061106b565b80841161442b575f80fd5b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b6040518061010001604052806144a6614506565b81526020016144b3614506565b81526020016144c0614506565b81526020016144cd614506565b81526020016144da614506565b81526020016144e7614506565b81526020016144f4614506565b8152602001614501614506565b905290565b604051806101400160405280600a906020820280368337509192915050565b5f5b8381101561453f578181015183820152602001614527565b50505f910152565b5f815180845261455e816020860160208601614525565b601f01601f19169290920160200192915050565b602081525f61106b6020830184614547565b5f60208284031215614594575f80fd5b5035919050565b6001600160a01b0381168114611951575f80fd5b5f80604083850312156145c0575f80fd5b82356145cb8161459b565b946020939093013593505050565b602080825282518282018190525f9190848201906040850190845b818110156146195783516001600160a01b0316835292840192918401916001016145f4565b50909695505050505050565b5f60208284031215614635575f80fd5b813561106b8161459b565b5f805f60608486031215614652575f80fd5b833561465d8161459b565b9250602084013561466d8161459b565b929592945050506040919091013590565b60038110611951575f80fd5b5f6020828403121561469a575f80fd5b813561106b8161467e565b81516001600160a01b03168152610140810160208301516020830152604083015160408301526060830151606083015260808301516146ef60808401826001600160a01b03169052565b5060a083015160a083015260c083015160c083015260e083015160e08301526101008084015181840152506101208084015161472e8285018215159052565b505092915050565b634e487b7160e01b5f52602160045260245ffd5b6003811061195157634e487b7160e01b5f52602160045260245ffd5b602081016147738361474a565b91905290565b5f805f806080858703121561478c575f80fd5b84359350602085013592506040850135915060608501356147ac8161467e565b939692955090935050565b805f5b600a8110156135925781516001600160a01b03168452602093840193909101906001016147ba565b5f610a00820190506147f58284516147b7565b60208301516148086101408401826147b7565b50604083015161481c6102808401826147b7565b5060608301516148306103c08401826147b7565b5060808301516148446105008401826147b7565b5060a08301516148586106408401826147b7565b5060c083015161486c6107808401826147b7565b5060e08301516148806108c08401826147b7565b5092915050565b634e487b7160e01b5f52604160045260245ffd5b60405160c081016001600160401b03811182821017156148bd576148bd614887565b60405290565b60405161010081016001600160401b03811182821017156148bd576148bd614887565b604051601f8201601f191681016001600160401b038111828210171561490e5761490e614887565b604052919050565b5f6001600160401b0382111561492e5761492e614887565b5060051b60200190565b5f6001600160401b0382111561495057614950614887565b50601f01601f191660200190565b5f82601f83011261496d575f80fd5b813561498061497b82614938565b6148e6565b818152846020838601011115614994575f80fd5b816020850160208301375f918101602001919091529392505050565b5f82601f8301126149bf575f80fd5b813560206149cf61497b83614916565b82815260059290921b840181019181810190868411156149ed575f80fd5b8286015b84811015612de65780356001600160401b03811115614a0e575f80fd5b614a1c8986838b010161495e565b8452509183019183016149f1565b5f8060408385031215614a3b575f80fd5b82356001600160401b0380821115614a51575f80fd5b818501915085601f830112614a64575f80fd5b81356020614a7461497b83614916565b82815260059290921b84018101918181019089841115614a92575f80fd5b948201945b83861015614ab9578535614aaa8161459b565b82529482019490820190614a97565b96505086013592505080821115614ace575f80fd5b50614adb858286016149b0565b9150509250929050565b5f8083601f840112614af5575f80fd5b5081356001600160401b03811115614b0b575f80fd5b6020830191508360208260051b8501011115614b25575f80fd5b9250929050565b5f8060208385031215614b3d575f80fd5b82356001600160401b03811115614b52575f80fd5b614b5e85828601614ae5565b90969095509350505050565b5f8060408385031215614b7b575f80fd5b823591506020830135614b8d8161459b565b809150509250929050565b8015158114611951575f80fd5b5f60208284031215614bb5575f80fd5b813561106b81614b98565b5f8083601f840112614bd0575f80fd5b5081356001600160401b03811115614be6575f80fd5b602083019150836020828501011115614b25575f80fd5b5f805f60408486031215614c0f575f80fd5b8335614c1a8161459b565b925060208401356001600160401b03811115614c34575f80fd5b614c4086828701614bc0565b9497909650939450505050565b5f8060408385031215614c5e575f80fd5b82356001600160401b0380821115614c74575f80fd5b614c808683870161495e565b93506020850135915080821115614c95575f80fd5b50614adb8582860161495e565b5f805f60608486031215614cb4575f80fd5b833592506020840135614cc68161459b565b91506040840135614cd68161459b565b809150509250925092565b5f805f805f8060608789031215614cf6575f80fd5b86356001600160401b0380821115614d0c575f80fd5b614d188a838b01614ae5565b90985096506020890135915080821115614d30575f80fd5b614d3c8a838b01614ae5565b90965094506040890135915080821115614d54575f80fd5b50614d6189828a01614ae5565b979a9699509497509295939492505050565b5f805f805f805f60e0888a031215614d89575f80fd5b8735614d948161459b565b96506020880135614da48161459b565b95506040880135945060608801359350608088013560ff81168114614dc7575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f60208284031215614df4575f80fd5b813565ffffffffffff8116811461106b575f80fd5b5f805f80848603610100811215614e1e575f80fd5b8535614e298161459b565b945060c0601f1982011215614e3c575f80fd5b50614e4561489b565b6020860135614e538161459b565b81526040860135614e638161459b565b6020820152606086013560408201526080860135614e808161459b565b606082015260a0860135614e938161459b565b608082015260c086013560a0820152925060e08501356001600160401b03811115614ebc575f80fd5b614ec887828801614bc0565b95989497509550505050565b5f8060408385031215614ee5575f80fd5b8235614ef08161459b565b91506020830135614b8d8161459b565b5f805f60608486031215614f12575f80fd5b83356001600160401b0380821115614f28575f80fd5b614f348783880161495e565b94506020860135915080821115614f49575f80fd5b614f558783880161495e565b93506040860135915080821115614f6a575f80fd5b50614f778682870161495e565b9150509250925092565b82815260408101614f918361474a565b8260208301529392505050565b5f60208284031215614fae575f80fd5b5051919050565b600181811c90821680614fc957607f821691505b602082108103614fe757634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215614ffd575f80fd5b815161106b81614b98565b858152841515602082015283604082015282606082015260a060808201525f61503460a0830184614547565b979650505050505050565b5f8060408385031215615050575f80fd5b505080516020909101519092909150565b5f6020808385031215615072575f80fd5b82516001600160401b03811115615087575f80fd5b8301601f81018513615097575f80fd5b80516150a561497b82614916565b81815260059190911b820183019083810190878311156150c3575f80fd5b928401925b828410156150345783516150db8161459b565b825292840192908401906150c8565b5f602082840312156150fa575f80fd5b815161106b8161459b565b5f60208284031215615115575f80fd5b81516001600160401b0381111561512a575f80fd5b8201601f8101841361513a575f80fd5b805161514861497b82614938565b81815285602083850101111561515c575f80fd5b611528826020830160208601614525565b838152826020820152606060408201525f6115286060830184614547565b5f60c0828403121561519b575f80fd5b6151a361489b565b825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a08201528091505092915050565b5f82601f8301126151f2575f80fd5b6040516101408082018281106001600160401b038211171561521657615216614887565b60405283018185821115615228575f80fd5b845b8281101561524b57805161523d8161459b565b82526020918201910161522a565b509195945050505050565b5f610a008284031215615267575f80fd5b61526f6148c3565b61527984846151e3565b81526152898461014085016151e3565b602082015261529c8461028085016151e3565b60408201526152af846103c085016151e3565b60608201526152c28461050085016151e3565b60808201526152d58461064085016151e3565b60a08201526152e88461078085016151e3565b60c08201526152fb846108c085016151e3565b60e08201529392505050565b5f60608201858352602060608185015281865180845260808601915082880193505f5b8181101561534f5784516001600160a01b03168352938301939183019160010161532a565b5050848103604086015285518082528282019350600581901b820183018388015f5b8381101561539f57601f1985840301875261538d838351614547565b96860196925090850190600101615371565b50909a9950505050505050505050565b8183525f60208085019450825f5b858110156153eb5781356153d08161459b565b6001600160a01b0316875295820195908201906001016153bd565b509495945050505050565b848152606060208201525f61540f6060830185876153af565b905060018060a01b038316604083015295945050505050565b838152604060208201525f6115286040830184866153af565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b8481526001600160a01b03841660208201526060604082018190525f90613ba39083018486615441565b838152606060208201525f6154ab6060830185614547565b8281036040840152613ba38185614547565b5f805f606084860312156154cf575f80fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b5f52600160045260245ffd5b606081525f61550f60608301888a6153af565b82810360208401528581526001600160fb1b0386111561552d575f80fd5b8560051b80886020840137018281036020908101604085015261555390820185876153af565b9998505050505050505050565b634e487b7160e01b5f52601160045260245ffd5b600181815b808511156155ae57815f190482111561559457615594615560565b808516156155a157918102915b93841c9390800290615579565b509250929050565b5f826155c457506001610c7a565b816155d057505f610c7a565b81600181146155e657600281146155f05761560c565b6001915050610c7a565b60ff84111561560157615601615560565b50506001821b610c7a565b5060208310610133831016604e8410600b841016171561562f575081810a610c7a565b6156398383615574565b805f190482111561564c5761564c615560565b029392505050565b5f61106b60ff8416836155b6565b80516001600160a01b039081168352602080830151821690840152604080830151908401526060808301518216908401526080808301519091169083015260a090810151910152565b6001600160a01b038316815260e0810161106b6020830184615662565b5f61016087835260018060a01b038088511660208501528060208901511660408501525060408701516156fe6060850182615662565b50806101208401526157138184018688615441565b90508281036101408401526157288185614547565b98975050505050505050565b82516001600160a01b0390811682526020808501518216908301526040808501516101208401929161576890850182615662565b50808416610100840152509392505050565b606081525f61578c6060830186614547565b8460208401528281036040840152613ba38185614547565b5f60c082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015292915050565b601f821115613fd857805f5260205f20601f840160051c8101602085101561580c5750805b601f840160051c820191505b81811015611103575f8155600101615818565b81516001600160401b0381111561584457615844614887565b615858816158528454614fb5565b846157e7565b602080601f83116001811461588b575f84156158745750858301515b5f19600386901b1c1916600185901b1785556112ee565b5f85815260208120601f198616915b828110156158b95788860151825594840194600190910190840161589a565b50858210156158d657878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610c7a57610c7a615560565b81810381811115610c7a57610c7a615560565b8082028115828204841417610c7a57610c7a615560565b634e487b7160e01b5f52601260045260245ffd5b5f8261595157634e487b7160e01b5f52601260045260245ffd5b500490565b5f61106b83836155b656fea264697066735822122061ed251e6a8c710403954b1e4cf60e3a7ed561ff86187af5cb4c5a036209702664736f6c634300081800330000000000000000000000002218f90a98b0c070676f249ef44834686daa4285000000000000000000000000865377367054516e17014ccded1e7d814edc9ce4