250 txs
628 calls
constructor
constructor((bytes32 merkleRoot, uint8 whitelistStatus, address stakingToken, uint256 poolMaxCap, uint64 unbondingPeriod, uint64 maxStakeDuration, uint64 apyPercentage, uint256 tierUpperBound, uint256 tierLowerBound, uint80 startStakingDate, uint80 endStakingDate, uint8 feeType, uint256 fee, address feeCollector, uint8 feeFunctions) params, address owner_)
functions
APY_PERCENTAGE
viewfunction APY_PERCENTAGE() view returns (uint64)
BASIS_POINTS
viewfunction BASIS_POINTS() view returns (uint256)
END_STAKING_DATE
viewfunction END_STAKING_DATE() view returns (uint80)
FEE_TYPE
viewfunction FEE_TYPE() view returns (uint8)
FEE
viewfunction FEE() view returns (uint256)
feeCollector
viewfunction feeCollector() view returns (address)
FEES_FUNCTIONS
viewfunction FEES_FUNCTIONS() view returns (uint8)
getAddressIndex
viewfunction getAddressIndex(address _staker) view returns (uint64)
getAPY
viewfunction getAPY() view returns (uint64)
getStakeInfo
viewfunction getStakeInfo(address _staker) view returns (uint256 _tokensStaked, uint256 _rewards, uint256 _unbondingAmount, uint256 _timeUntilUnbondingComplete, uint128 _firstStakeTime)
getStakingTokenBalance
viewfunction getStakingTokenBalance() view returns (uint256)
getTotalAvailableReward
viewfunction getTotalAvailableReward() view returns (uint256)
isInStakerList
viewfunction isInStakerList(address _staker) view returns (bool)
MAX_STAKE_DURATION
viewfunction MAX_STAKE_DURATION() view returns (uint64)
MAX_UNBONDING_PERIOD
viewfunction MAX_UNBONDING_PERIOD() view returns (uint64)
merkleRoot
viewfunction merkleRoot() view returns (bytes32)
numTokenReservedForFee
viewfunction numTokenReservedForFee() view returns (uint256)
owner
viewfunction owner() view returns (address)
poolMaxCap
viewfunction poolMaxCap() view returns (uint256)
rewardsAvailable
viewfunction rewardsAvailable() view returns (uint256)
stakers
viewfunction stakers(address) view returns (uint256 amountStaked, uint256 unclaimedRewards, uint128 timeOfFirstStake, uint128 timeOfLastUpdate, uint128 unbondingTimestamp, uint256 unbondingAmount, uint64 stakersArrayIndex)
stakersArray
viewfunction stakersArray(uint256) view returns (address)
STAKING_TOKEN
viewfunction STAKING_TOKEN() view returns (address)
stakingSettings
viewfunction stakingSettings() view returns (tuple)
stakingTokenBalance
viewfunction stakingTokenBalance() view returns (uint256)
START_STAKING_DATE
viewfunction START_STAKING_DATE() view returns (uint80)
TIER_LOWER_BOUND
viewfunction TIER_LOWER_BOUND() view returns (uint256)
TIER_UPPER_BOUND
viewfunction TIER_UPPER_BOUND() view returns (uint256)
trustedDistributors
viewfunction trustedDistributors(address) view returns (bool)
unbondingPeriod
viewfunction unbondingPeriod() view returns (uint64)
whitelistStatus
viewfunction whitelistStatus() view returns (uint8)
claimRewards
payablefunction claimRewards() payable
claimRewards
payablefunction claimRewards(uint256 _amount) payable
completeUnbonding
payablefunction completeUnbonding() payable
fundStakingContract
nonpayablefunction fundStakingContract(uint256 _amount)
initiateUnbonding
nonpayablefunction initiateUnbonding(uint256 _amount)
removeTrustedDistributor
nonpayablefunction removeTrustedDistributor(address distributor)
renounceOwnership
nonpayablefunction renounceOwnership()
setBatchTrustedDistributors
nonpayablefunction setBatchTrustedDistributors(address[] distributors)
setPoolMaxCap
nonpayablefunction setPoolMaxCap(uint256 _newPoolMaxCap)
setUnbondingPeriod
nonpayablefunction setUnbondingPeriod(uint64 _newUnbondingPeriod)
setWhitelistStatus
nonpayablefunction setWhitelistStatus(uint8 _status, bytes32 _merkleRoot)
stake
payablefunction stake(uint256 _amount, address _receiver, bytes32[] merkleProof) payable
stake
payablefunction stake(uint256 _amount, address _receiver) payable
stake
payablefunction stake(uint256 _amount) payable
transferFeeCollectorRole
nonpayablefunction transferFeeCollectorRole(address newFeeCollector)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
updatePoolMaxCap
nonpayablefunction updatePoolMaxCap(uint256 _newPoolMaxCap)
withdrawExcessRewards
nonpayablefunction withdrawExcessRewards(uint256 _amount, address _recipient, bool _fromExcessTokens)
withdrawGasFee
nonpayablefunction withdrawGasFee(address recipient, uint256 amount)
withdrawOtherToken
nonpayablefunction withdrawOtherToken(address _tokenAddress)
withdrawTokenFee
nonpayablefunction withdrawTokenFee(address recipient, uint256 amount)
events
ContractFunded
event ContractFunded(address indexed funder, uint256 amount)
ExcessRewardsWithdrawn
event ExcessRewardsWithdrawn(address indexed admin, uint256 amount, bool fromExcessTokens)
FeeCollectorUpdated
event FeeCollectorUpdated(address indexed oldFeeCollector, address indexed newFeeCollector)
GasFeeWithdrawn
event GasFeeWithdrawn(address indexed recipient, uint256 amount)
OtherTokenWithdrawn
event OtherTokenWithdrawn(address indexed admin, address indexed token, uint256 amount)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
PoolMaxCapUpdated
event PoolMaxCapUpdated(uint256 oldPoolMaxCap, uint256 newPoolMaxCap)
RewardsClaimed
event RewardsClaimed(address indexed staker, uint256 rewardAmount, uint256 feeAmount)
TokenFeeWithdrawn
event TokenFeeWithdrawn(address indexed recipient, address indexed token, uint256 amount)
TokensStaked
event TokensStaked(address indexed staker, uint256 amount, uint256 feeAmount)
TokensWithdrawn
event TokensWithdrawn(address indexed staker, uint256 amount, uint256 feeAmount)
TrustedDistributorUpdated
event TrustedDistributorUpdated(address distributor, bool status)
UnbondingInitiated
event UnbondingInitiated(address indexed staker, uint256 amount)
UnbondingPeriodUpdated
event UnbondingPeriodUpdated(uint64 oldUnbondingPeriod, uint64 newUnbondingPeriod)
WhitelistStatusUpdated
event WhitelistStatusUpdated(uint8 oldStatus, uint8 newStatus, bytes32 merkleRoot)
errors
EmptyArray
error EmptyArray()
InsufficientExcessTokens
error InsufficientExcessTokens()
InsufficientFee
error InsufficientFee()
InsufficientRewards
error InsufficientRewards()
InsufficientRewardsAvailable
error InsufficientRewardsAvailable()
InvalidAddress
error InvalidAddress()
InvalidFeeFunctionsMask
error InvalidFeeFunctionsMask()
InvalidFeePercentage
error InvalidFeePercentage()
InvalidFeeType
error InvalidFeeType()
InvalidMaxStakeDuration
error InvalidMaxStakeDuration()
InvalidMerkleProof
error InvalidMerkleProof()
InvalidMerkleRoot
error InvalidMerkleRoot()
InvalidStakingDates
error InvalidStakingDates()
InvalidTierBounds
error InvalidTierBounds()
InvalidUnbondingPeriod
error InvalidUnbondingPeriod()
NewCapBelowCurrentStake
error NewCapBelowCurrentStake()
NoRewards
error NoRewards()
NoTokensUnbonding
error NoTokensUnbonding()
OnlyFeeCollector
error OnlyFeeCollector()
OnlyTrustedDistributor
error OnlyTrustedDistributor()
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
PoolMaxCapExceeded
error PoolMaxCapExceeded()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
RemainingAmountBelowLowerBound
error RemainingAmountBelowLowerBound()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
StakingAmountBelowLowerBound
error StakingAmountBelowLowerBound()
StakingAmountExceedsUpperBound
error StakingAmountExceedsUpperBound()
StakingEnded
error StakingEnded()
StakingNotStarted
error StakingNotStarted()
StakingZeroTokens
error StakingZeroTokens()
StartDateInPast
error StartDateInPast()
TransferFailed
error TransferFailed()
UnbondingPeriodNotCompleted
error UnbondingPeriodNotCompleted()
WhitelistEnabled
error WhitelistEnabled()
WithdrawingMoreThanStaked
error WithdrawingMoreThanStaked()
ZeroAmount
error ZeroAmount()
creation bytecode
0x6101e0604052346107b2576040516137e138819003601f8101601f191683016001600160401b0381118482101761079e5783928291604052833981010361020081126107b2576101e0136107b2576040516101e081016001600160401b0381118282101761079e57604052815190818152602083015160048110156107b257806020830152610090604085016107b6565b9260408301938452606085015191606084019283526100b1608087016107ca565b93608081019485526100c560a088016107ca565b9560a082019687526100d960c089016107ca565b9760c0830198895260e08101519160e08401928352610100820151610100850190815261010961012084016107de565b90610120860191825261011f61014085016107de565b61014087019081526101608501519160028310156107b257610160880192835261018086015193610180890194855261015b6101a088016107b6565b966101a08a019788526101c08101519960ff8b168b036107b2576101c001998a52610189906101e0016107b6565b95519b51975191519051925193516001600160a01b03909c169b946001600160501b039485169490931692600286101561069d5751965198516040519c6001600160a01b03909a169960ff90911696906101a08e018e81106001600160401b0382111761079e576040908152908e5260208e019c8d528d019a8b5260608d0191825260808d0192835260a08d0193845260c08d0194855260e08d019889526101008d019586526101208d019788526101408d01998a526101608d019687526001600160a01b03166101808d018190529b8c1561078b575f80546001600160a01b031981168f1782556040519e916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a380516001600160a01b03161561077c5789516001600160a01b03161561077c57815183511061076d57835185516001600160501b039182169116111561075e5783516001600160501b0316421161074f578551600281101561069d57610735575b600760ff88511611610726578a51600481101561069d576001148015610712575b80610709575b6106b1578a51600481101561069d571580156106f5575b806106eb575b6106b157516001600160a01b031660a05251610120525161010052516001600160501b0390811661014052905116610160525191600283101561069d5760ff9260e0525160c05251166080525160025560018060a01b0390511660018060a01b031960045416176004555190600482101561069d5751915f926001831480156106de575b806106d6575b6106b1578361069d57821580156106c9575b806106c0575b6106b1576006549361069d576104468361043c8460ff7f767539d46ed87e2cdc3cadf0e29fa5f4c88ab6f4c2cf8381017be4d177ab24d6988160609916821982161760065586600555166107f2565b60208401906107f2565b6040820152a163096601806101c05281516001600160401b03161561068e57805163096601806001600160401b039091161161067f5751600b80546001600160401b0319166001600160401b03928316179055905181166101a05290511661018052604051612fe19081610800823960805181818161157a0152818161172101528181611d2e015281816120f2015281816121ba01526129d2015260a0518181816104b5015281816109aa01528181610a1d015281816113ee015281816117cb01528181611ba701528181611db801528181612412015281816124660152612a2b015260c05181818161076c01528181611545015281816118540152818161189a01528181611a8d01528181611e7d01528181611eca01528181611ef401528181612277015281816122c3015281816122ed01528181612af801528181612b3c0152612c2e015260e05181818161072f0152818161111d0152818161138e015281816118c301528181611ae401528181611e350152818161222b0152818161238a01528181612b650152612c5d0152610100518181816110b80152818161147a0152612978015261012051818181610b5a015281816114a00152818161206d01526129a80152610140518181816114d101528181611cd901526128f901526101605181818161107d01528181611504015261292c015261018051818181611453015281816124f00152612f7201526101a051818181610ccb015281816114230152612f1101526101c0518181816103c00152610f460152f35b63027a6b4360e61b5f5260045ffd5b6389529d3160e01b5f5260045ffd5b634e487b7160e01b5f52602160045260245ffd5b639dd854d360e01b5f5260045ffd5b508015156103ed565b505f9350600283146103e7565b5080156103d5565b505f9350600383146103cf565b508b51151561034b565b508a51600481101561069d57600214610345565b508b511561032e565b508a51600481101561069d57600314610328565b63531b5af960e11b5f5260045ffd5b612710885111156103075763390edff560e11b5f5260045ffd5b63219e4ba160e11b5f5260045ffd5b635433f1eb60e11b5f5260045ffd5b6307c6df7760e21b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b631e4fbdf760e01b5f525f60045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b5f80fd5b51906001600160a01b03821682036107b257565b51906001600160401b03821682036107b257565b51906001600160501b03821682036107b257565b90600482101561069d575256fe6080806040526004361015610012575f80fd5b5f3560e01c908163021c7b3d1461248a575080630479d64414612447578063092c9340146123495780630962ef791461217a578063155eb3b21461213357806320a1318c14610f8f578063263e15e31461211657806328530d8e146120d95780632eb4a7ab146120bc5780632ec33e1414611f48578063372500ab14611cfd5780634204631214611cb757806345ca67c01461070f5780634a7be73914611c365780634e2f354914611c0d5780635357e91614611bcc578063553c997614611b3a5780636c904261146116ef5780636cf6d675146116c85780636d7ae837146112e9578063715018a6146112855780637382526b14611268578063775907f7146110db57806377b74b9c146110a15780637aa3f35c1461105b5780637acb775714610fac5780638caaa27114610f8f5780638da5cb5b14610f6a5780638e445d3314610f265780639168ae7214610e925780639ad1bf7014610d835780639ddf7ad314610d5e578063a694fc3a14610cef578063aa902b4d14610cab578063b706004214610b7d578063b776c1e914610b43578063ba938c0e14610919578063bbbe320b146106eb578063c3453153146107b5578063c415b95c1461078f578063c57981b514610755578063cf61a09714610714578063d2cbf7ad1461070f578063daa7a649146106eb578063e1f1c4a7146106cf578063e22eab32146105ec578063e50373f91461047b578063e7a7250a1461045e578063f10d1de114610387578063f2fde38b146102de578063f80ded41146102a15763ff7e2be914610258575f80fd5b3461029d57602060031936011261029d576001600160a01b036102796124a4565b165f52600a602052602067ffffffffffffffff600560405f20015416604051908152f35b5f80fd5b3461029d57602060031936011261029d576001600160a01b036102c26124a4565b165f526008602052602060ff60405f2054166040519015158152f35b3461029d57602060031936011261029d576001600160a01b036102ff6124a4565b61030761284c565b16801561035b576001600160a01b035f548273ffffffffffffffffffffffffffffffffffffffff198216175f55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b7f1e4fbdf7000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b3461029d57602060031936011261029d5760043567ffffffffffffffff811680910361029d576103b561284c565b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001681116104365760407fb63dfb3782776fe53d70eb7aeaf3379f5e482fca391e5a5453d4b310bdbbb66691600b54908067ffffffffffffffff19831617600b5567ffffffffffffffff8351921682526020820152a1005b7f9e9ad0c0000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461029d575f60031936011261029d576020600754604051908152f35b3461029d57602060031936011261029d576001600160a01b0361049c6124a4565b6104a461284c565b1680156105c4576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001681146105c4576040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152602081602481855afa9081156105b9575f91610587575b50801561055f578161055d926040518381527fdc1d8086dd20629fc49a23ec8595b0f1b14b09afac76324dfcbfcd216a9ea92760203392a3339061271a565b005b7f1f2a2005000000000000000000000000000000000000000000000000000000005f5260045ffd5b90506020813d6020116105b1575b816105a26020938361267d565b8101031261029d57518261051e565b3d9150610595565b6040513d5f823e3d90fd5b7fe6c4247b000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461029d57602060031936011261029d5760043567ffffffffffffffff811161029d5761061d90369060040161255a565b61062561284c565b80156106a7575f5b81811061063657005b61064181838561270a565b35906001600160a01b03821680920361029d5781156105c4577f248397fddcbccb7915dc8856b4a9cf5045b1c2a2cd2832955207dfeac8d416756040836001945f526008602052815f208560ff198254161790558151908152846020820152a10161062d565b7f521299a9000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461029d575f60031936011261029d5760206040516127108152f35b3461029d57602060031936011261029d5761070461284c565b61055d6004356126a0565b6124d0565b3461029d575f60031936011261029d576020604051610753817f000000000000000000000000000000000000000000000000000000000000000061254d565bf35b3461029d575f60031936011261029d5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461029d575f60031936011261029d5760206001600160a01b0360045416604051908152f35b3461029d57602060031936011261029d5760a06107d06124a4565b6001600160a01b0381165f52600a60205260405f20604051906107f282612661565b805492838352600182015460208401526001600160801b036108586002840154926040860193838116855260801c606087015282600386015416956080810196875260c067ffffffffffffffff60056004890154988c8501998a52015416910152612d53565b9251915116926001600160801b038151168015159081610903575b816108d9575b50156108d1576108a36001600160801b036108b392511667ffffffffffffffff600b541690612611565b6001600160801b0342911661258b565b915b6040519485526020850152604084015260608301526080820152f35b505f916108b5565b6001600160801b0391506108fa9067ffffffffffffffff600b541690612611565b16421087610879565b600b5467ffffffffffffffff1615159150610873565b3461029d57606060031936011261029d576004356109356124ba565b604435908115159182810361029d5761094c612771565b61095461284c565b831561055f576001600160a01b038216156105c45715610afa576040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526020816024816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa9081156105b9575f91610ac8575b506109f66109ed60015460075490612598565b60095490612598565b80821115610ac057610a079161258b565b8311610a985782610a42915b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001661271a565b60405191825260208201527f5c5a3ecd9a6d1f18afeb08202bf08b1417459ce6c1bbecc617276a6bb63248fc60403392a25f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005d005b7f89a4af97000000000000000000000000000000000000000000000000000000005f5260045ffd5b50505f610a07565b90506020813d602011610af2575b81610ae36020938361267d565b8101031261029d5751846109da565b3d9150610ad6565b600754808411610b1b57610a4291610b1385809361258b565b600755610a13565b7fb9bdd3c2000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461029d575f60031936011261029d5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b606060031936011261029d57610b916124ba565b60443567ffffffffffffffff811161029d57610bb190369060040161255a565b90610bba612771565b60405160208101907fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008560601b16825260148152610bf960348261267d565b5190209160055492915f915b808310610c6d5750505003610c4557610c20906004356128e5565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005d005b7fb05e92fa000000000000000000000000000000000000000000000000000000005f5260045ffd5b909192610c7b84838561270a565b359081811015610c9a575f52602052600160405f205b93019190610c05565b905f52602052600160405f20610c91565b3461029d575f60031936011261029d57602060405167ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b602060031936011261029d57610d03612771565b60ff600654166004811015610d4a57610d2257610c20336004356128e5565b7fe5e5846f000000000000000000000000000000000000000000000000000000005f5260045ffd5b634e487b7160e01b5f52602160045260245ffd5b3461029d575f60031936011261029d57602060ff600654166107536040518092612540565b3461029d57604060031936011261029d57600435600481101561029d5760243590610dac61284c565b5f90600181148015610e85575b80610e7d575b610e3f5781610d4a5780158015610e70575b80610e67575b610e3f5760065491610d4a577f767539d46ed87e2cdc3cadf0e29fa5f4c88ab6f4c2cf8381017be4d177ab24d692610e3782610e2d60609560ff80961660ff198216176006558460055560405195869116612540565b6020840190612540565b6040820152a1005b7f9dd854d3000000000000000000000000000000000000000000000000000000005f5260045ffd5b50821515610dd7565b505f915060028114610dd1565b508215610dbf565b505f915060038114610db9565b3461029d57602060031936011261029d576001600160a01b03610eb36124a4565b165f52600a60205260e060405f2080549060018101549060028101546001600160801b036003830154169067ffffffffffffffff60056004850154940154169360405195865260208601526001600160801b038116604086015260801c6060850152608084015260a083015260c0820152f35b3461029d575f60031936011261029d57602060405167ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461029d575f60031936011261029d5760206001600160a01b035f5416604051908152f35b3461029d575f60031936011261029d576020600154604051908152f35b604060031936011261029d57610fc06124ba565b610fc8612771565b6001600160a01b038116156105c45760ff600654166004811015610d4a5760018114610d225760028114908115611050575b5080611039575b61101157610c20906004356128e5565b7f58f79e05000000000000000000000000000000000000000000000000000000005f5260045ffd5b50335f52600860205260ff60405f20541615611001565b600391501482610ffa565b3461029d575f60031936011261029d57602060405169ffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461029d575f60031936011261029d5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461029d57604060031936011261029d576110f46124a4565b602435906001600160a01b03600454163303611240576001600160a01b0381169182156105c4577f00000000000000000000000000000000000000000000000000000000000000006002811015610d4a576112185780611212575047905b811561055f5747821161055f575f8080938193867fee3a3e8b975ee1a894fd6ed0a36ec6d1db3dc70e575382d21e9aed5a2c72f5146020604051858152a25af13d1561120d573d67ffffffffffffffff81116111f957604051906111c06020601f19601f840116018361267d565b81525f60203d92013e5b156111d157005b7f90b8ec18000000000000000000000000000000000000000000000000000000005f5260045ffd5b634e487b7160e01b5f52604160045260245ffd5b6111ca565b90611152565b7f3a083499000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f91034599000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461029d575f60031936011261029d576020600954604051908152f35b3461029d575f60031936011261029d5761129d61284c565b5f6001600160a01b03815473ffffffffffffffffffffffffffffffffffffffff1981168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461029d575f60031936011261029d575f61020060405161130981612644565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e08201528261010082015282610120820152826101408201528261016082015282610180820152826101a0820152826101c0820152826101e0820152015260055460ff60065416906002549167ffffffffffffffff600b5416927f0000000000000000000000000000000000000000000000000000000000000000936001600160a01b0360045416916001600160a01b035f541693604051956113d487612644565b86526004811015610d4a5760208601526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166040860152606085015267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016608085015267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660a08501527f000000000000000000000000000000000000000000000000000000000000000060c08501527f000000000000000000000000000000000000000000000000000000000000000060e085015269ffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001661010085015269ffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166101208501526101408401526002841015610d4a57610220936101608401527f00000000000000000000000000000000000000000000000000000000000000006101808401526101a08301526101c082015260ff7f0000000000000000000000000000000000000000000000000000000000000000166101e082015261271061020082015261020060405191805183526115c660208201516020850190612540565b6001600160a01b0360408201511660408401526060810151606084015267ffffffffffffffff608082015116608084015267ffffffffffffffff60a08201511660a084015260c081015160c084015260e081015160e084015269ffffffffffffffffffff6101008201511661010084015269ffffffffffffffffffff6101208201511661012084015267ffffffffffffffff6101408201511661014084015261167961016082015161016085019061254d565b6101808101516101808401526001600160a01b036101a0820151166101a08401526001600160a01b036101c0820151166101c084015260ff6101e0820151166101e08401520151610200820152f35b3461029d575f60031936011261029d57602067ffffffffffffffff600b5416604051908152f35b5f60031936011261029d57611702612771565b335f52600a60205260405f20600481019081548015611b12575f9160027f0000000000000000000000000000000000000000000000000000000000000000161515908180611ae1575b611a89575b67ffffffffffffffff600b54168015159081611a66575b50611a3e575f839555600381016fffffffffffffffffffffffffffffffff1981541690556117978360015461258b565b6001558054159081611a31575b506118f3575b806118c0575b80611897575b611846575b506117f082336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001661271a565b60405191825260208201527fffe903c0abe6b2dbb2f3474ef43d7a3c1fca49e5a774453423ca8e1952aabffa60403392a25f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005d005b9150506118816127106118797f000000000000000000000000000000000000000000000000000000000000000084612631565b04809261258b565b9061188e81600954612598565b600955826117bb565b507f000000000000000000000000000000000000000000000000000000000000000015156117b6565b507f00000000000000000000000000000000000000000000000000000000000000006002811015610d4a576001146117b0565b335f52600a6020525f1967ffffffffffffffff600560405f200154160167ffffffffffffffff8111611a09576003545f198101908111611a095761193e6001600160a01b0391612514565b90549060031b1c16906119738261195483612514565b9091906001600160a01b038084549260031b9316831b921b1916179055565b6003548015611a1d5760019167ffffffffffffffff915f190161199581612514565b6001600160a01b0382549160031b1b1916905560035516019067ffffffffffffffff8211611a09575f52600a60205267ffffffffffffffff600560405f2001911667ffffffffffffffff19825416179055335f52600a602052600560405f200167ffffffffffffffff1981541690556117aa565b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b60019150015415856117a4565b7f987e3fa6000000000000000000000000000000000000000000000000000000005f5260045ffd5b6001600160801b039150611a809082600385015416612611565b16421086611767565b92507f0000000000000000000000000000000000000000000000000000000000000000803403611ab95792611750565b7f025dbdd4000000000000000000000000000000000000000000000000000000005f5260045ffd5b507f00000000000000000000000000000000000000000000000000000000000000006002811015610d4a571561174b565b7f92dae139000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461029d57602060031936011261029d57600435611b5661284c565b801561055f5780611b6c61055d92600754612598565b6007556040518181527f0939f6f4877faf071412e527bc4c6d0bd65ad077e52b57334f7765265647a7f160203392a230336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001661288b565b3461029d57602060031936011261029d5760043560035481101561029d576001600160a01b03611bfd602092612514565b90549060031b1c16604051908152f35b3461029d57602060031936011261029d5761055d611c296124a4565b611c3161284c565b6125a5565b3461029d57602060031936011261029d57611c4f6124a4565b600454906001600160a01b03821690813303611240576001600160a01b03169182156105c45773ffffffffffffffffffffffffffffffffffffffff191682176004557f5d16ad41baeb009cd23eb8f6c7cde5c2e0cd5acf4a33926ab488875c37c37f385f80a3005b3461029d575f60031936011261029d57602060405169ffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b5f60031936011261029d57611d10612771565b611d1933612d53565b8015611f20576007548111610b1b575f8160047f000000000000000000000000000000000000000000000000000000000000000016611e33575b335f908152600a602052604090206002810180546001600160801b03164260801b6fffffffffffffffffffffffffffffffff1916179055611da691906001611d9b838061258b565b91015560075461258b565b600755611ddd82336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001661271a565b60405191825260208201527fdacbdde355ba930696a362ea6738feb9f8bd52dfb3d81947558fd3217e23e32560403392a25f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005d005b7f00000000000000000000000000000000000000000000000000000000000000006002811015610d4a578015611ef0575b60011480611ec7575b15611d5357915050612710611ea27f000000000000000000000000000000000000000000000000000000000000000083612631565b04611da6611eb0828461258b565b92611ebd83600954612598565b6009559050611d53565b507f00000000000000000000000000000000000000000000000000000000000000001515611e6d565b91507f0000000000000000000000000000000000000000000000000000000000000000803403611ab95791611e64565b7f3fb087f4000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461029d57602060031936011261029d57600435611f64612771565b335f52600a60205260405f20811561055f5780548281106120945782611f8a818361258b565b15159182612061575b505061203957611fa2336127e5565b60048101611fb1838254612598565b9055600381016001600160801b03804216166fffffffffffffffffffffffffffffffff19825416179055611fe682825461258b565b90556040519081527f91d83bc372614b9fb23824d8bfad588e0de7fe5500d2274066b39f097362616360203392a25f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005d005b7f6bdd9c47000000000000000000000000000000000000000000000000000000005f5260045ffd5b61206b925061258b565b7f0000000000000000000000000000000000000000000000000000000000000000118284611f93565b7f93c5dc1a000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461029d575f60031936011261029d576020600554604051908152f35b3461029d575f60031936011261029d57602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461029d575f60031936011261029d576020600254604051908152f35b3461029d57602060031936011261029d576001600160a01b036121546124a4565b165f52600a602052602067ffffffffffffffff600560405f200154161515604051908152f35b602060031936011261029d57600435612191612771565b61219a33612d53565b908115611f2057806123195750805b6007548111610b1b575f90809260047f000000000000000000000000000000000000000000000000000000000000000016612229575b335f908152600a602052604090206002810180546001600160801b03164260801b6fffffffffffffffffffffffffffffffff1916179055611da69291600190611d9b90849061258b565b7f00000000000000000000000000000000000000000000000000000000000000006002811015610d4a5780156122e9575b600114806122c0575b156121df5792509050611da661271061229c7f000000000000000000000000000000000000000000000000000000000000000084612631565b04916122a8838261258b565b936122b584600954612598565b6009559091506121df565b507f00000000000000000000000000000000000000000000000000000000000000001515612263565b92507f0000000000000000000000000000000000000000000000000000000000000000803403611ab9579261225a565b818111156121a9577fadc2dbfe000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461029d57604060031936011261029d576123626124a4565b6024356001600160a01b03600454163303611240576001600160a01b0382169081156105c4577f00000000000000000000000000000000000000000000000000000000000000006002811015610d4a57600103611218578061244257506009545b801561055f5760095480821161055f57816124017f14f7c82e513e1c45523692386ca72ff853393b9b4228a9f6cc27fd6238d929d89360209361258b565b600955612439816001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016968761271a565b604051908152a3005b6123c3565b3461029d575f60031936011261029d5760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461029d575f60031936011261029d576020906007548152f35b600435906001600160a01b038216820361029d57565b602435906001600160a01b038216820361029d57565b3461029d575f60031936011261029d57602060405167ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b60035481101561252c5760035f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b906004821015610d4a5752565b906002821015610d4a5752565b9181601f8401121561029d5782359167ffffffffffffffff831161029d576020808501948460051b01011161029d57565b91908203918211611a0957565b91908201809211611a0957565b6001600160a01b031680156105c457805f52600860205260ff60405f2054161561260e576040817f248397fddcbccb7915dc8856b4a9cf5045b1c2a2cd2832955207dfeac8d41675925f526008602052815f2060ff19815416905581519081525f6020820152a1565b50565b906001600160801b03809116911601906001600160801b038211611a0957565b81810292918115918404141715611a0957565b610220810190811067ffffffffffffffff8211176111f957604052565b60e0810190811067ffffffffffffffff8211176111f957604052565b90601f601f19910116810190811067ffffffffffffffff8211176111f957604052565b60015481106126e25760407f8738e087d5d98d2b42b151a0782b3dd3c9bf886fcf4f23f46a6b030fa7b5014d91600254908060025582519182526020820152a1565b7f473a5bdc000000000000000000000000000000000000000000000000000000005f5260045ffd5b919081101561252c5760051b0190565b61276f926001600160a01b03604051937fa9059cbb00000000000000000000000000000000000000000000000000000000602086015216602484015260448301526044825261276a60648361267d565b612e05565b565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005c6127bd5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005d565b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b6001600160a01b036127f682612e72565b911690815f52600a602052612813600160405f2001918254612598565b90555f908152600a6020526040902060020180546001600160801b03164260801b6fffffffffffffffffffffffffffffffff1916179055565b6001600160a01b035f5416330361285f57565b7f118cdaa7000000000000000000000000000000000000000000000000000000005f523360045260245ffd5b9091926001600160a01b0361276f9481604051957f23b872dd00000000000000000000000000000000000000000000000000000000602088015216602486015216604484015260648301526064825261276a60848361267d565b908115612d2b5769ffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000164210612d035769ffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000164211612cdb576001600160a01b03811691825f52600a60205260405f209081546129768183612598565b7f000000000000000000000000000000000000000000000000000000000000000010612cb3576129a68183612598565b7f000000000000000000000000000000000000000000000000000000000000000011612c8b575f9360017f0000000000000000000000000000000000000000000000000000000000000000161515918280612c5a575b612c2a575b426001600160801b03169015612b955750612a1b906127e5565b612a508230336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001661288b565b80612b62575b80612b39575b612aeb575b612a6d81600154612598565b60025410612ac3577fdd2a19c3bdd089cbe77c04f5655f83de0504d6140d12c8667646f55d0557c4dc9282612aa58360409554612598565b9055612ab382600154612598565b60015582519182526020820152a2565b7fb0c8b367000000000000000000000000000000000000000000000000000000005f5260045ffd5b9150612b25612710612b1d7f000000000000000000000000000000000000000000000000000000000000000085612631565b04809361258b565b612b3183600954612598565b600955612a61565b507f00000000000000000000000000000000000000000000000000000000000000001515612a5c565b507f00000000000000000000000000000000000000000000000000000000000000006002811015610d4a57600114612a56565b600354680100000000000000008110156111f957612c1f92611954826001612bc09401600355612514565b6003545f888152600a60205260409020600501805467ffffffffffffffff191667ffffffffffffffff92909216919091179055608081901b6fffffffffffffffffffffffffffffffff19166001600160801b0391909116176002850155565b5f6001840155612a1b565b94507f0000000000000000000000000000000000000000000000000000000000000000803403611ab95794612a01565b507f00000000000000000000000000000000000000000000000000000000000000006002811015610d4a57156129fc565b7f68d0a1d1000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f9d3358ed000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f12776a07000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fa0899fdd000000000000000000000000000000000000000000000000000000005f5260045ffd5b7ff2c8310b000000000000000000000000000000000000000000000000000000005f5260045ffd5b6001600160a01b0381165f52600a60205260405f2060405190612d7582612661565b805480835260018201549283602082015260c067ffffffffffffffff600560028601546001600160801b038116604086015260801c958660608601526001600160801b036003820154166080860152600481015460a0860152015416910152159081612dfc575b50612df657612ded612df392612e72565b90612598565b90565b50505f90565b9050155f612ddc565b905f602091828151910182855af1156105b9575f513d612e6957506001600160a01b0381163b155b612e345750565b6001600160a01b03907f5274afe7000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b60011415612e2d565b6001600160a01b03165f52600a60205260405f2060405190612e9382612661565b8054908183526001810154602084015260028101549167ffffffffffffffff60056001600160801b0385169485604088015260801c938460608801526001600160801b036003820154166080880152600481015460a088015201541660c085015215612f9c576001600160801b03612f37429367ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690612611565b16804211612fa3575b5081811015612f9c5764496cebb80092612f60612f6792612f989461258b565b9051612631565b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690612631565b0490565b5050505f90565b91505f612f4056fea26469706673582212205fe731bb7718fe92fbb3ead3ff199762e08f2ce39800e175f29cbcfa320dd2fb64736f6c634300081c0033000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fedba9178b70e8b54e2af08ebffcf28a1e5a43b0000000000000000000000000000000000000000019d971e4fe8401e7400000000000000000000000000000000000000000000000000000000000000001275000000000000000000000000000000000000000000000000000000000005250a8000000000000000000000000000000000000000000000000000000000000005dc0000000000000000000000000000000000000000019d971e4fe8401e7400000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000068a307b0000000000000000000000000000000000000000000000000000000006dc7778000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001476b081e800000000000000000000000000038cb1b3bd9779b4afc9144854dd0e71e47d000ca000000000000000000000000000000000000000000000000000000000000000700000000000000000000000013f7b3c65392e231197315bacd66807fd348c8a9