0 txs
3.4k calls
constructor
constructor(address protocolBeneficiary_, uint256 creationFee_, uint256 claimFee_)
functions
claimableReward
viewfunction claimableReward(uint256 poolId, address staker) view returns (uint256 rewardClaimable, uint256 fee, uint256 claimedTotal, uint256 feeTotal)
claimableRewardBulk
viewfunction claimableRewardBulk(uint256 poolIdFrom, uint256 poolIdTo, address staker) view returns (uint256[5][] results)
claimFee
viewfunction claimFee() view returns (uint256)
creationFee
viewfunction creationFee() view returns (uint256)
getPool
viewfunction getPool(uint256 poolId) view returns (tuple)
getPools
viewfunction getPools(uint256 poolIdFrom, uint256 poolIdTo) view returns (tuple[] poolList)
getPoolsByCreator
viewfunction getPoolsByCreator(uint256 poolIdFrom, uint256 poolIdTo, address creator) view returns (tuple[] poolList)
MAX_REWARD_DURATION
viewfunction MAX_REWARD_DURATION() view returns (uint256)
MIN_REWARD_DURATION
viewfunction MIN_REWARD_DURATION() view returns (uint256)
onERC1155Received
purefunction onERC1155Received(address, address, uint256 id, uint256, bytes) pure returns (bytes4)
owner
viewfunction owner() view returns (address)
poolCount
viewfunction poolCount() view returns (uint256)
pools
viewfunction pools(uint256) view returns (address stakingToken, bool isStakingTokenERC20, address rewardToken, address creator, uint104 rewardAmount, uint32 rewardDuration, uint40 rewardStartsAt, uint40 rewardStartedAt, uint40 cancelledAt, uint128 totalStaked, uint32 activeStakerCount, uint40 lastRewardUpdatedAt, uint256 accRewardPerShare, uint104 totalAllocatedRewards)
protocolBeneficiary
viewfunction protocolBeneficiary() view returns (address)
userPoolStake
viewfunction userPoolStake(address, uint256) view returns (uint104 stakedAmount, uint104 claimedTotal, uint104 feeTotal, uint256 rewardDebt)
version
purefunction version() pure returns (string)
cancelPool
nonpayablefunction cancelPool(uint256 poolId)
claim
nonpayablefunction claim(uint256 poolId)
createPool
payablefunction createPool(address stakingToken, bool isStakingTokenERC20, address rewardToken, uint104 rewardAmount, uint40 rewardStartsAt, uint32 rewardDuration) payable returns (uint256 poolId)
emergencyUnstake
nonpayablefunction emergencyUnstake(uint256 poolId)
renounceOwnership
nonpayablefunction renounceOwnership()
stake
nonpayablefunction stake(uint256 poolId, uint104 amount)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
unstake
nonpayablefunction unstake(uint256 poolId, uint104 amount)
updateClaimFee
nonpayablefunction updateClaimFee(uint256 claimFee_)
updateCreationFee
nonpayablefunction updateCreationFee(uint256 creationFee_)
updateProtocolBeneficiary
nonpayablefunction updateProtocolBeneficiary(address protocolBeneficiary_)
events
ClaimFeeUpdated
event ClaimFeeUpdated(uint256 oldFee, uint256 newFee)
CreationFeeUpdated
event CreationFeeUpdated(uint256 oldFee, uint256 newFee)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
PoolCancelled
event PoolCancelled(uint256 indexed poolId, uint256 indexed leftoverRewards)
PoolCreated
event PoolCreated(uint256 poolId, address indexed creator, address indexed stakingToken, bool isStakingTokenERC20, address indexed rewardToken, uint104 rewardAmount, uint40 rewardStartsAt, uint32 rewardDuration)
ProtocolBeneficiaryUpdated
event ProtocolBeneficiaryUpdated(address oldBeneficiary, address newBeneficiary)
RewardClaimed
event RewardClaimed(uint256 indexed poolId, address indexed staker, uint104 indexed reward, uint104 fee)
Staked
event Staked(uint256 indexed poolId, address indexed staker, uint104 indexed amount)
Unstaked
event Unstaked(uint256 indexed poolId, address indexed staker, uint104 indexed amount, bool rewardClaimed)
errors
AddressEmptyCode
error AddressEmptyCode(address target)
AddressInsufficientBalance
error AddressInsufficientBalance(address account)
FailedInnerCall
error FailedInnerCall()
MathOverflowedMulDiv
error MathOverflowedMulDiv()
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
Stake__FeeTransferFailed
error Stake__FeeTransferFailed()
Stake__InsufficientBalance
error Stake__InsufficientBalance()
Stake__InvalidAddress
error Stake__InvalidAddress()
Stake__InvalidClaimFee
error Stake__InvalidClaimFee()
Stake__InvalidCreationFee
error Stake__InvalidCreationFee()
Stake__InvalidDuration
error Stake__InvalidDuration()
Stake__InvalidPaginationParameters
error Stake__InvalidPaginationParameters()
Stake__InvalidRewardStartsAt
error Stake__InvalidRewardStartsAt()
Stake__InvalidToken
error Stake__InvalidToken()
Stake__InvalidTokenId
error Stake__InvalidTokenId()
Stake__InvalidTokenType
error Stake__InvalidTokenType()
Stake__PoolCancelled
error Stake__PoolCancelled()
Stake__PoolFinished
error Stake__PoolFinished()
Stake__PoolNotFound
error Stake__PoolNotFound()
Stake__RewardRateTooLow
error Stake__RewardRateTooLow()
Stake__StakeAmountTooLarge
error Stake__StakeAmountTooLarge()
Stake__TokenHasTransferFeesOrRebasing
error Stake__TokenHasTransferFeesOrRebasing()
Stake__Unauthorized
error Stake__Unauthorized()
Stake__ZeroAmount
error Stake__ZeroAmount()
creation bytecode
0x6080346101da57601f6145cf38819003918201601f19168301916001600160401b038311848410176101df578084926060946040528339810103126101da5780516001600160a01b03811691908290036101da57604060208201519101519133156101c45760008054336001600160a01b0319821681178355916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3600180556100b56101f5565b80156101b357600280546001600160a01b031981168317909155604080516001600160a01b03909216825260208201929092527f5de302eeb1c80d4fb0c0953b692353f09ddf431411b8eb2034d5e8576956191292907fc49018c9854c68de72ec478f1962e3d872a70aadb0dba137983fefcedf687e03908390a16101386101f5565b600354908060035582519182526020820152a16101536101f5565b6107d081116101a25760407f3c4e14c3f450a320de9683e5ffeec6e95e4e02755f862e36ff6f8f6c21086f6091600454908060045582519182526020820152a16040516143b0908161021f8239f35b630f92d19360e31b60005260046000fd5b63134ac20d60e31b60005260046000fd5b631e4fbdf760e01b600052600060045260246000fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b6000546001600160a01b0316330361020957565b63118cdaa760e01b6000523360045260246000fdfe6080604052600436101561001257600080fd5b6000803560e01c8063012ce5011461234b578063068bcd8d1461229657806327e381a9146121bc578063379607f51461217a5780633f4520f514612159578063402c7c59146118385780634f285d29146117a757806354fd4d50146117465780635cc27d6f146117295780636fa23795146116d3578063715018a614611655578063827c7889146113b15780638da5cb5b1461137e578063990e60051461134a57806399d32fc41461132c578063ac4afa38146111ec578063b20b840314611164578063bbe9583714611141578063c432924a146110c0578063ca0b441f14611095578063d60b516414610fab578063dce0b4e414610f8d578063e4c54e6314610be1578063f05bcd6f1461030f578063f23a6e6114610236578063f2fde38b146101665763f525cb681461014657600080fd5b346101635780600319360112610163576020600554604051908152f35b80fd5b50346101635760206003193601126101635773ffffffffffffffffffffffffffffffffffffffff61019561291f565b61019d613788565b16801561020a5773ffffffffffffffffffffffffffffffffffffffff8254827fffffffffffffffffffffffff00000000000000000000000000000000000000008216178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b6024827f1e4fbdf700000000000000000000000000000000000000000000000000000000815280600452fd5b50346101635760a06003193601126101635761025061291f565b50610259612942565b508060843567ffffffffffffffff811161030c573660238201121561030c57806004013561028681612b17565b6102936040519182612ad6565b81815236602483850101116103095781602460209401848301370101526044356102e15760206040517ff23a6e61000000000000000000000000000000000000000000000000000000008152f35b807fe61fdb0d0000000000000000000000000000000000000000000000000000000060049252fd5b50505b50fd5b50346101635760406003193601126101635760043561032c612965565b906103356134ea565b600554811015610bb9576cffffffffffffffffffffffffff8216918215610b91578184526006602052604084209060038201908154918260d81c610b695764ffffffffff8360b01c169283159384159081610b43575b50610b1b573388526007602052604088208689526020526040882093876cffffffffffffffffffffffffff036cffffffffffffffffffffffffff8111610aee576cffffffffffffffffffffffffff808754169116108015610aa3575b610a7b57610968575b50506103fb846137d7565b81546cffffffffffffffffffffffffff16156108c4576104366cffffffffffffffffffffffffff9161042d3387613987565b828454166134be565b167fffffffffffffffffffffffffffffffffffffff00000000000000000000000000825416178155600261047f6cffffffffffffffffffffffffff835416600585015490613f2e565b91015560048101836fffffffffffffffffffffffffffffffff825416016fffffffffffffffffffffffffffffffff8111610897576fffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffff000000000000000000000000000000008254161790555460ff73ffffffffffffffffffffffffffffffffffffffff82169160a01c166000146106d357604051907f70a08231000000000000000000000000000000000000000000000000000000008252306004830152602082602481845afa91821561069357859261069e575b509060206024926105ae6040517f23b872dd00000000000000000000000000000000000000000000000000000000848201523386820152306044820152876064820152606481526105a8608482612ad6565b82614248565b604051938480927f70a082310000000000000000000000000000000000000000000000000000000082523060048301525afa80156106935784928691610655575b50906105fa91612dd8565b0361062d575b33907f52acb05969c71d9f4ec3fa707b6ed04b3e2a38512c52b7d0f177ccc60c0776ae8480a46001805580f35b6004837f9d0ede4c000000000000000000000000000000000000000000000000000000008152fd5b919250506020813d60201161068b575b8161067260209383612ad6565b8101031261068657518391906105fa6105ef565b600080fd5b3d9150610665565b6040513d87823e3d90fd5b91506020823d6020116106cb575b816106b960209383612ad6565b81010312610686579051906020610556565b3d91506106ac565b6040517efdd58e000000000000000000000000000000000000000000000000000000008152306004820152846024820152602081604481855afa908115610693578591610865575b50813b1561085657846040517ff242432a00000000000000000000000000000000000000000000000000000000815233600482015230602482015281604482015285606482015260a060848201528160a4820152818160c48183885af1801561085a57610841575b50506020604492604051938480927efdd58e0000000000000000000000000000000000000000000000000000000082523060048301528960248301525afa80156106935784928691610808575b50906107db91612dd8565b14610600576004837f9d0ede4c000000000000000000000000000000000000000000000000000000008152fd5b919250506020813d602011610839575b8161082560209383612ad6565b8101031261068657518391906107db6107d0565b3d9150610818565b8161084b91612ad6565b610856578438610783565b8480fd5b6040513d84823e3d90fd5b90506020813d60201161088f575b8161088060209383612ad6565b8101031261068657513861071b565b3d9150610873565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6004830163ffffffff815460801c1663ffffffff811461093b5781547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff16600190910160801b73ffffffff00000000000000000000000000000000161790556cffffffffffffffffffffffffff906104369061042d565b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b64ffffffffff4281169160881c16808210610a22575081547fffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffff1660b082901b7affffffffff000000000000000000000000000000000000000000001617909155610a1b905b60048501907fffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff78ffffffffff000000000000000000000000000000000000000083549260a01b169116179055565b38806103f0565b82547fffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffff1660b082901b7affffffffff00000000000000000000000000000000000000000000161790925550610a76906109cd565b610a1b565b6004897f5ad55c6d000000000000000000000000000000000000000000000000000000008152fd5b50876fffffffffffffffffffffffffffffffff036fffffffffffffffffffffffffffffffff8111610aee576fffffffffffffffffffffffffffffffff806004890154169116106103e7565b60248a7f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6004887f9b802cbe000000000000000000000000000000000000000000000000000000008152fd5b64ffffffffff9150610b5f9063ffffffff8460681c16906134a2565b164210153861038b565b6004877f4cd78777000000000000000000000000000000000000000000000000000000008152fd5b6004847f4719ffdb000000000000000000000000000000000000000000000000000000008152fd5b6004837ffc3d5913000000000000000000000000000000000000000000000000000000008152fd5b503461016357604060031936011261016357600435610bfe612965565b90610c076134ea565b600554811015610bb9576cffffffffffffffffffffffffff8216918215610b9157818452600660205260408420903385526007602052604085208386526020526040852090846cffffffffffffffffffffffffff83541610610f65579184916cffffffffffffffffffffffffff808895610c80886137d7565b610c8a3389613987565b818454160316167fffffffffffffffffffffffffffffffffffffff0000000000000000000000000082541617815560048201906fffffffffffffffffffffffffffffffff8085818554160316167fffffffffffffffffffffffffffffffff000000000000000000000000000000008354161782556cffffffffffffffffffffffffff815416906002610d20600586015484613f2e565b91015515610ee2575b6fffffffffffffffffffffffffffffffff8154161580610ecb575b80610eb4575b610e5e575b50805460ff8160a01c16600014610db95750610d84925073ffffffffffffffffffffffffffffffffffffffff33915416613d42565b60405190600182527fe2596fac793f3c02e1699ee0e62e33a967c44c62f723dc794446361c15278e3660203393a46001805580f35b73ffffffffffffffffffffffffffffffffffffffff16915050803b15610e5a5781809160c4604051809481937ff242432a00000000000000000000000000000000000000000000000000000000835230600484015233602484015281604484015289606484015260a060848401528160a48401525af1801561085a57610e41575b5050610d84565b81610e4b91612ad6565b610e56578238610e3a565b8280fd5b5080fd5b600382017fffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffff81541690557fffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff815416905538610d4f565b5064ffffffffff600383015460b01c164210610d4a565b5064ffffffffff600383015460b01c161515610d44565b63ffffffff9193508092505460801c1680156108975781547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90910160801b73ffffffff000000000000000000000000000000001617815584918491610d29565b6004867fa1c57736000000000000000000000000000000000000000000000000000000008152fd5b50346101635780600319360112610163576020600354604051908152f35b503461016357604060031936011261016357600435610fc8612942565b90600554811015610bb957604083826cffffffffffffffffffffffffff9360809652600660205273ffffffffffffffffffffffffffffffffffffffff61100f848420612c16565b951682526007602052828220908252602052208161107560405161103281612a36565b835495838716825283602083019760681c1687528361106a600282600189015416976040860198895201549260608501938452613da4565b925116905191613edf565b939094511691511691604051938452602084015260408301526060820152f35b5034610163576110bc6110b06110aa366129ff565b91613310565b60405191829182612981565b0390f35b5034610163576110d86110d2366129ff565b9161309a565b6040519060208201602083528151809152602060408401920193805b8282106111015784840385f35b9091928551819083915b6005831061112b575050506020959095019460a0019291600101906110f4565b602080600192845181520192019201919061110b565b5034610163576040600319360112610163576110bc6110b0602435600435612ee7565b503461016357602060031936011261016357600435611181613788565b6107d081116111c45760407f3c4e14c3f450a320de9683e5ffeec6e95e4e02755f862e36ff6f8f6c21086f6091600454908060045582519182526020820152a180f35b6004827f7c968c98000000000000000000000000000000000000000000000000000000008152fd5b50346101635760206003193601126101635760406101c091600435815260066020522080549073ffffffffffffffffffffffffffffffffffffffff6001820154169064ffffffffff73ffffffffffffffffffffffffffffffffffffffff60028301541660038301546004840154916cffffffffffffffffffffffffff60066005870154960154169560ff6040519873ffffffffffffffffffffffffffffffffffffffff81168a5260a01c1615156020890152604088015260608701526cffffffffffffffffffffffffff8116608087015263ffffffff8160681c1660a0870152828160881c1660c0870152828160b01c1660e087015260d81c6101008601526fffffffffffffffffffffffffffffffff811661012086015263ffffffff8160801c1661014086015260a01c166101608401526101808301526101a0820152f35b50346101635780600319360112610163576020600454604051908152f35b5034610163578060031936011261016357602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b503461016357806003193601126101635773ffffffffffffffffffffffffffffffffffffffff6020915416604051908152f35b5034610163576020600319360112610163576004356113ce6134ea565b60055481101561162d57808252600660205260408220906002820173ffffffffffffffffffffffffffffffffffffffff8154163303611605576003830192835460d81c6115dd5761141e836137d7565b6cffffffffffffffffffffffffff8454166cffffffffffffffffffffffffff60068301541690036cffffffffffffffffffffffffff81116108975784547affffffffffffffffffffffffffffffffffffffffffffffffffffff164260d81b7fffffffffff000000000000000000000000000000000000000000000000000000161785556cffffffffffffffffffffffffff1693846114e5575b5050507fcb217dc5cde7608105c5fa8af63d961a4210e06dc3c3dafa9396d05251952f858380a36001805580f35b73ffffffffffffffffffffffffffffffffffffffff916115196cffffffffffffffffffffffffff6001935416871115612da2565b015416604051907f70a08231000000000000000000000000000000000000000000000000000000008252306004830152602082602481845afa80156115d25785928791611597575b5061158f9361158773ffffffffffffffffffffffffffffffffffffffff92851115612da2565b541690613d42565b3880806114b7565b939250506020833d6020116115ca575b816115b460209383612ad6565b810103126106865791519091849161158f611561565b3d91506115a7565b6040513d88823e3d90fd5b6004857f4cd78777000000000000000000000000000000000000000000000000000000008152fd5b6004847f77dc3587000000000000000000000000000000000000000000000000000000008152fd5b6004827ffc3d5913000000000000000000000000000000000000000000000000000000008152fd5b503461016357806003193601126101635761166e613788565b8073ffffffffffffffffffffffffffffffffffffffff81547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034610163576020600319360112610163577f5de302eeb1c80d4fb0c0953b692353f09ddf431411b8eb2034d5e857695619126040600435611713613788565b600354908060035582519182526020820152a180f35b50346101635780600319360112610163576020604051610e108152f35b5034610163578060031936011261016357506110bc604051611769604082612ad6565b600581527f312e302e300000000000000000000000000000000000000000000000000000006020820152604051918291602083526020830190612742565b503461016357604060031936011261016357604060809173ffffffffffffffffffffffffffffffffffffffff6117db61291f565b168152600760205281812060243582526020522080549060026cffffffffffffffffffffffffff600183015416910154906cffffffffffffffffffffffffff60405193818116855260681c16602084015260408301526060820152f35b5060c06003193601126101635761184d61291f565b6024359081151590818303612155576044359173ffffffffffffffffffffffffffffffffffffffff831680930361085657606435936cffffffffffffffffffffffffff85168095036121515760843564ffffffffff811680910361214d5760a4359163ffffffff8316809303612149576118c56134ea565b73ffffffffffffffffffffffffffffffffffffffff85169485156121215786156121215787156120f957610e10841080156120ec575b6120c4578315612097576cffffffffffffffffffffffffff848904161561206f5762093a804201804211610aee5783116120475760035480340361201f57808a91611fc3575b50509061194d91613bcc565b15611f9b576005549560018701808811611f6e5760055560405161197081612a81565b858152888060208301878152838b604082018c81526060830190338252608084019189835260a085018c815260c08601908c825260e08701928984526101008801948a86526101208901998b8b528b6101408b0199818b526101608c019b828d5261018081019e8f526101a0019e8f528152600660205260409020809e5173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681547fffffffffffffffffffffffff0000000000000000000000000000000000000000161790555115158d549060a01b74ff000000000000000000000000000000000000000016907fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16178d555173ffffffffffffffffffffffffffffffffffffffff1660018d019073ffffffffffffffffffffffffffffffffffffffff1681547fffffffffffffffffffffffff0000000000000000000000000000000000000000161790555173ffffffffffffffffffffffffffffffffffffffff1660028c019073ffffffffffffffffffffffffffffffffffffffff1681547fffffffffffffffffffffffff00000000000000000000000000000000000000001617905560038b0194516cffffffffffffffffffffffffff166cffffffffffffffffffffffffff1685547fffffffffffffffffffffffffffffffffffffff000000000000000000000000001617855551908454905160881b75ffffffffff0000000000000000000000000000000000169160681b70ffffffff0000000000000000000000000016907fffffffffffffffffffff000000000000000000ffffffffffffffffffffffffff16171783555164ffffffffff16611c3c9083907fffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffff7affffffffff0000000000000000000000000000000000000000000083549260b01b169116179055565b5181547affffffffffffffffffffffffffffffffffffffffffffffffffffff1660d89190911b7fffffffffff000000000000000000000000000000000000000000000000000000161790559151600486018054935173ffffffff0000000000000000000000000000000060809190911b166fffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff0000000000000000000000000000000000000000909416939093171782555181547fffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff1660a09190911b78ffffffffff000000000000000000000000000000000000000016179055516005830155516cffffffffffffffffffffffffff1690600601906cffffffffffffffffffffffffff1681547fffffffffffffffffffffffffffffffffffffff00000000000000000000000000161790556040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201528080885a92602491602094fa908115611f63578991611f31575b50611e206040517f23b872dd00000000000000000000000000000000000000000000000000000000602082015233602482015230604482015283606482015260648152611e1a608482612ad6565b88614248565b604051907f70a082310000000000000000000000000000000000000000000000000000000082523060048301526020826024818b5afa8015611f265783928b91611eed575b5090611e7091612dd8565b03611ec5576020975060405193878552888501526040840152606083015260808201527f2d07ab3d8a0000fcc86e521ba2df8be9ba7dd9159bf0cefedf38cc1e1e4b9b3460a03392a460018055604051908152f35b6004887f9d0ede4c000000000000000000000000000000000000000000000000000000008152fd5b919250506020813d602011611f1e575b81611f0a60209383612ad6565b810103126106865751829190611e70611e65565b3d9150611efd565b6040513d8c823e3d90fd5b90506020813d602011611f5b575b81611f4c60209383612ad6565b81010312610686575138611dcc565b3d9150611f3f565b6040513d8b823e3d90fd5b6024897f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6004877f98bba0ae000000000000000000000000000000000000000000000000000000008152fd5b8180809273ffffffffffffffffffffffffffffffffffffffff600254165af1611fea612d72565b5015611ff7578838611941565b6004897f8004a38f000000000000000000000000000000000000000000000000000000008152fd5b60048a7f80995ba7000000000000000000000000000000000000000000000000000000008152fd5b6004897f6a30cc01000000000000000000000000000000000000000000000000000000008152fd5b6004897f28d5a80d000000000000000000000000000000000000000000000000000000008152fd5b6024897f4e487b710000000000000000000000000000000000000000000000000000000081526012600452fd5b6004897f49b08957000000000000000000000000000000000000000000000000000000008152fd5b506312cc030084116118fb565b6004897f4719ffdb000000000000000000000000000000000000000000000000000000008152fd5b6004897f92dd44ae000000000000000000000000000000000000000000000000000000008152fd5b8780fd5b8680fd5b8580fd5b8380fd5b50346101635780600319360112610163575060206312cc0300604051908152f35b5034610163576020600319360112610163576004356121976134ea565b60055481101561162d57806121ae6121b5926137d7565b3390613987565b6001805580f35b50346101635760206003193601126101635773ffffffffffffffffffffffffffffffffffffffff6121eb61291f565b6121f3613788565b16801561226e5760407fc49018c9854c68de72ec478f1962e3d872a70aadb0dba137983fefcedf687e039160025490807fffffffffffffffffffffffff000000000000000000000000000000000000000083161760025573ffffffffffffffffffffffffffffffffffffffff8351921682526020820152a180f35b6004827f9a561068000000000000000000000000000000000000000000000000000000008152fd5b5034610163576020600319360112610163576004356122b3612b72565b5060055481101561162d576122d5604083836110bc9552600660205220612c16565b6122f573ffffffffffffffffffffffffffffffffffffffff8251166135bf565b61231873ffffffffffffffffffffffffffffffffffffffff6040840151166135bf565b916040519361232685612a36565b84526020840152604083015260608201526040519182916020835260208301906127bd565b5034610163576020600319360112610163576004356123686134ea565b60055481101561162d573382526007602052604082208183526020526cffffffffffffffffffffffffff6040832054169081156126f75780835260066020526040832033845260076020526040842082855260205260408420836cffffffffffffffffffffffffff825416106126cf57849184916123e5856137d7565b6cffffffffffffffffffffffffff8084818454160316167fffffffffffffffffffffffffffffffffffffff0000000000000000000000000082541617815560048201906fffffffffffffffffffffffffffffffff8085818554160316167fffffffffffffffffffffffffffffffff000000000000000000000000000000008354161782556cffffffffffffffffffffffffff81541690600261248b600586015484613f2e565b9101551561264c575b6fffffffffffffffffffffffffffffffff8154161580612635575b8061261e575b6125c8575b50805460ff8160a01c1660001461252357506124ef925073ffffffffffffffffffffffffffffffffffffffff33915416613d42565b604051908382527fe2596fac793f3c02e1699ee0e62e33a967c44c62f723dc794446361c15278e3660203393a46001805580f35b73ffffffffffffffffffffffffffffffffffffffff16915050803b15610e5a57819060c4604051809481937ff242432a00000000000000000000000000000000000000000000000000000000835230600484015233602484015281604484015288606484015260a060848401528160a48401525af180156125bd576125a9575b506124ef565b836125b691949294612ad6565b91386125a3565b6040513d86823e3d90fd5b600382017fffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffff81541690557fffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff8154169055386124ba565b5064ffffffffff600383015460b01c1642106124b5565b5064ffffffffff600383015460b01c1615156124af565b63ffffffff9193508092505460801c1680156108975781547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90910160801b73ffffffff000000000000000000000000000000001617815584918491612494565b6004857fa1c57736000000000000000000000000000000000000000000000000000000008152fd5b6004837f4719ffdb000000000000000000000000000000000000000000000000000000008152fd5b60005b8381106127325750506000910152565b8181015183820152602001612722565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209361277e8151809281875287808801910161271f565b0116010190565b90604060ff816127b36127a18651606087526060870190612742565b60208701518682036020880152612742565b9401511691015290565b61291c91815181526cffffffffffffffffffffffffff6101a0602084015173ffffffffffffffffffffffffffffffffffffffff815116602085015260208101511515604085015273ffffffffffffffffffffffffffffffffffffffff604082015116606085015273ffffffffffffffffffffffffffffffffffffffff60608201511660808501528260808201511660a085015263ffffffff60a08201511660c085015264ffffffffff60c08201511660e085015264ffffffffff60e08201511661010085015264ffffffffff610100820151166101208501526fffffffffffffffffffffffffffffffff6101208201511661014085015263ffffffff6101408201511661016085015264ffffffffff61016082015116610180850152610180810151828501520151166101c0820152606061290a60408401516102206101e0850152610220840190612785565b92015190610200818403910152612785565b90565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361068657565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361068657565b602435906cffffffffffffffffffffffffff8216820361068657565b602081016020825282518091526040820191602060408360051b8301019401926000915b8383106129b457505050505090565b90919293946020806129f0837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0866001960301875289516127bd565b970193019301919392906129a5565b600319606091011261068657600435906024359060443573ffffffffffffffffffffffffffffffffffffffff811681036106865790565b6080810190811067ffffffffffffffff821117612a5257604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6101c0810190811067ffffffffffffffff821117612a5257604052565b6060810190811067ffffffffffffffff821117612a5257604052565b60a0810190811067ffffffffffffffff821117612a5257604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612a5257604052565b67ffffffffffffffff8111612a5257601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60405190612b5e82612a9e565b600060408360608152606060208201520152565b60405190612b7f82612a36565b8160008152604051612b9081612a81565b6000815260006020820152600060408201526000606082015260006080820152600060a0820152600060c0820152600060e08201526000610100820152600061012082015260006101408201526000610160820152600061018082015260006101a08201526020820152612c02612b51565b60408201526060612c11612b51565b910152565b90604051612c2381612a81565b6101a06cffffffffffffffffffffffffff6006839560ff815473ffffffffffffffffffffffffffffffffffffffff8116875260a01c161515602086015273ffffffffffffffffffffffffffffffffffffffff600182015416604086015273ffffffffffffffffffffffffffffffffffffffff60028201541660608601526003810154838116608087015263ffffffff8160681c1660a087015264ffffffffff8160881c1660c087015264ffffffffff8160b01c1660e087015260d81c61010086015264ffffffffff60048201546fffffffffffffffffffffffffffffffff811661012088015263ffffffff8160801c1661014088015260a01c166101608601526005810154610180860152015416910152565b91908201809211612d4357565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b3d15612d9d573d90612d8382612b17565b91612d916040519384612ad6565b82523d6000602084013e565b606090565b15612da957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b91908203918211612d4357565b67ffffffffffffffff8111612a525760051b60200190565b60405190612e0c602083612ad6565b600080835282815b828110612e2057505050565b602090612e2b612b72565b82828501015201612e14565b90612e4182612de5565b612e4e6040519182612ad6565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0612e7c8294612de5565b019060005b828110612e8d57505050565b602090612e98612b72565b82828501015201612e81565b8051821015612eb85760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b919080831080159061300e575b612fe4576005549081811115612fdd57505b80831015612fd25782612f1891612dd8565b612f2181612e37565b9260005b828110612f3157505050565b80612f3e60019284612d36565b806000526006602052612f546040600020612c16565b612f7473ffffffffffffffffffffffffffffffffffffffff8251166135bf565b612f9773ffffffffffffffffffffffffffffffffffffffff6040840151166135bf565b9160405193612fa585612a36565b8452602084015260408301526060820152612fc08288612ea4565b52612fcb8187612ea4565b5001612f25565b50905061291c612dfd565b9050612f06565b7f20a305de0000000000000000000000000000000000000000000000000000000060005260046000fd5b506101f461301c8483612dd8565b11612ef4565b9061302c82612de5565b6130396040519182612ad6565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06130678294612de5565b019060005b82811061307857505050565b60209060a06040519061308b8183612ad6565b3682378282850101520161306c565b909291928082108015906132fc575b612fe45760055490818111156132f557505b808210156132ac57926130cf828503613022565b93600092915b818310613122575050506130e881613022565b9260005b8281106130f857505050565b8061310560019284612ea4565b516131108288612ea4565b5261311b8187612ea4565b50016130ec565b90919273ffffffffffffffffffffffffffffffffffffffff8216600052600760205260406000208460005260205260406000206040519061316282612a36565b8054916cffffffffffffffffffffffffff8084169384835260681c1692602082019380855260026cffffffffffffffffffffffffff60018601541694604085019586520154916060840192835215809181926132a3575b50613295579260019593926cffffffffffffffffffffffffff928796946132495783916131ff918c60005260066020528361106a6131fa6040600020612c16565b613da4565b604051959161320d87612aba565b8c8752602087015260408601525116606084015251166080820152613232828a612ea4565b5261323d8189612ea4565b5001935b0191906130d5565b5050816040519361325985612aba565b8a855260006020860152600060408601525116606084015251166080820152613282828a612ea4565b5261328d8189612ea4565b500193613241565b505050505092600190613241565b905015386131b9565b505060405190915060006132c1602083612ad6565b81526000805b8181106132d357505090565b60209060a0604051906132e68183612ad6565b368237828286010152016132c7565b90506130bb565b506103e861330a8383612dd8565b116130a9565b9092919280821080159061348e575b612fe457600554908181111561348757505b8082101561347b5792613345828503612e37565b93600092915b8183106133985750505061335e81612e37565b9260005b82811061336e57505050565b8061337b60019284612ea4565b516133868288612ea4565b526133918187612ea4565b5001613362565b9091928360005260066020526133b16040600020612c16565b73ffffffffffffffffffffffffffffffffffffffff60608201511673ffffffffffffffffffffffffffffffffffffffff841603613471576001918161340d73ffffffffffffffffffffffffffffffffffffffff859451166135bf565b61343073ffffffffffffffffffffffffffffffffffffffff6040840151166135bf565b906040519261343e84612a36565b89845260208401526040830152606082015261345a828a612ea4565b526134658189612ea4565b5001935b01919061334b565b5092600190613469565b5050905061291c612dfd565b9050613331565b506101f461349c8383612dd8565b1161331f565b9064ffffffffff8091169116019064ffffffffff8211612d4357565b906cffffffffffffffffffffffffff809116911601906cffffffffffffffffffffffffff8211612d4357565b6002600154146134fb576002600155565b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b60405190613534604083612ad6565b600982527f756e646566696e656400000000000000000000000000000000000000000000006020830152565b6020818303126106865780519067ffffffffffffffff8211610686570181601f8201121561068657805161359381612b17565b926135a16040519485612ad6565b818452602082840101116106865761291c916020808501910161271f565b6135c7612b51565b506135d0613525565b906135d9613525565b90600090818060405160208101907f95d89b4100000000000000000000000000000000000000000000000000000000825260048152613619602482612ad6565b519084614e20fa613628612d72565b908061377c575b613760575b50818060405160208101907f06fdde0300000000000000000000000000000000000000000000000000000000825260048152613671602482612ad6565b519084614e20fa613680612d72565b9080613754575b613734575b5081809160405160208101907f313ce567000000000000000000000000000000000000000000000000000000008252600481526136ca602482612ad6565b5191614e20fa6136d8612d72565b9080613729575b613705575b5060ff91604051936136f585612a9e565b8452602084015216604082015290565b602081805181010312610e5a57602001519060ff82168203610163575060ff6136e4565b5060208151146136df565b8291935061374c816020808594518301019101613560565b93915061368c565b50604081511015613687565b61377591945060208082518301019101613560565b9238613634565b5060408151101561362f565b73ffffffffffffffffffffffffffffffffffffffff6000541633036137a957565b7f118cdaa7000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b6000526006602052604060002064ffffffffff421690600381015464ffffffffff8160b01c16906004830192835464ffffffffff8160a01c16928415801561397d575b613974576138e5966fffffffffffffffffffffffffffffffff61387964ffffffffff9763ffffffff8560681c169389613857868860d81c946134a2565b16918015158061396b575b613963575b508181111561395b5750965b87612dd8565b9316151580613952575b6138e7575b50505060056138996131fa83612c16565b91015582547fffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff16911660a01b78ffffffffff000000000000000000000000000000000000000016179055565b565b6cffffffffffffffffffffffffff92836139029316906141a1565b166cffffffffffffffffffffffffff6139226006840192828454166134be565b167fffffffffffffffffffffffffffffffffffffff00000000000000000000000000825416179055388080613888565b50821515613883565b905096613873565b915038613867565b50828110613862565b50505050505050565b508387111561381a565b9081600052600660205260406000209173ffffffffffffffffffffffffffffffffffffffff82169182600052600760205260406000208260005260205260406000209060058501549180549560028201926139f5845480966cffffffffffffffffffffffffff8b1690613edf565b9190613a018382612d36565b95613a216cffffffffffffffffffffffffff600387015416881115612da2565b8615613ba757613a546020977f39ff35f451926ff5cd1926ae40ef218b8613cc15a7e9b567cbdecdfa65861b7f99612d36565b90556cffffffffffffffffffffffffff8116997fffffffffffff00000000000000000000000000ffffffffffffffffffffffffff79ffffffffffffffffffffffffff00000000000000000000000000613abf8d6cffffffffffffffffffffffffff8560681c166134be565b60681b16911617855560016cffffffffffffffffffffffffff841695016cffffffffffffffffffffffffff613af787828454166134be565b167fffffffffffffffffffffffffffffffffffffff0000000000000000000000000082541617905580613b7c575b505080613b38575b5050604051908152a4565b73ffffffffffffffffffffffffffffffffffffffff6001613b759301541673ffffffffffffffffffffffffffffffffffffffff6002541690613d42565b3880613b2d565b613ba09173ffffffffffffffffffffffffffffffffffffffff600186015416613d42565b3880613b25565b5050505050505050505050565b90816020910312610686575180151581036106865790565b9015613cf95760008060405160208101907f01ffc9a70000000000000000000000000000000000000000000000000000000082527fd9b67a2600000000000000000000000000000000000000000000000000000000602482015260248152613c35604482612ad6565b519084614e20fa613c44612d72565b81613ced575b81613cd3575b50613ccd576000809160405160208101907f70a0823100000000000000000000000000000000000000000000000000000000825230602482015260248152613c99604482612ad6565b5191614e20fa613ca7612d72565b9015908115613cc0575b50613cbb57600190565b600090565b6020915051141538613cb1565b50600090565b613ce7915060208082518301019101613bb4565b38613c50565b80516020149150613c4a565b6000809160405160208101907efdd58e00000000000000000000000000000000000000000000000000000000825230602482015283604482015260448152613c99606482612ad6565b6138e59273ffffffffffffffffffffffffffffffffffffffff604051937fa9059cbb000000000000000000000000000000000000000000000000000000006020860152166024840152604483015260448252613d9f606483612ad6565b614248565b64ffffffffff42169064ffffffffff60e0820151169182158015613ec0575b8015613eaa575b613e8757613e299064ffffffffff613dee60a085019563ffffffff875116906134a2565b169064ffffffffff6101008501511680151580613ea1575b613e99575b5081811115613e9257505b64ffffffffff6101608401511690612dd8565b918215613e8757613e5d61291c93613e819263ffffffff6cffffffffffffffffffffffffff608087015116915116916141a1565b6fffffffffffffffffffffffffffffffff6101206101808501519401511690613ff9565b90612d36565b506101809150015190565b9050613e16565b915038613e0b565b50828110613e06565b5064ffffffffff61016083015116811115613dca565b506fffffffffffffffffffffffffffffffff6101208301511615613dc3565b8115613f2357613eee91613f2e565b9080821115613f1957613f0091612dd8565b613f16613f0f60045483614110565b8092612dd8565b91565b5050600090600090565b505050600090600090565b9190916000838202917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85820991838084109303928084039314613fe65782670de0b6b3a76400001115613fbe57507faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac106699394670de0b6b3a7640000910990828211900360ee1b910360121c170290565b807f227bc1530000000000000000000000000000000000000000000000000000000060049252fd5b505050670de0b6b3a76400009192500490565b90670de0b6b3a76400008202907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff670de0b6b3a76400008409928280851094039380850394146140d457838211156140aa57670de0b6b3a7640000829109816000038216809204600281600302188082026002030280820260020302808202600203028082026002030280820260020302809102600203029360018380600003040190848311900302920304170290565b7f227bc1530000000000000000000000000000000000000000000000000000000060005260046000fd5b50809250156140e1570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b9190916000838202917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8582099183808410930392808403931461419457826127101115613fbe57507fbc01a36e2eb1c432ca57a786c226809d495182a9930be0ded288ce703afb7e919394612710910990828211900360fc1b910360041c170290565b5050506127109192500490565b9091828202917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8482099383808610950394808603951461423a57848311156140aa57829109816000038216809204600281600302188082026002030280820260020302808202600203028082026002030280820260020302809102600203029360018380600003040190848311900302920304170290565b5050809250156140e1570490565b60008073ffffffffffffffffffffffffffffffffffffffff61427f93169360208151910182865af1614278612d72565b90836142dd565b80519081151591826142c2575b50506142955750565b7f5274afe70000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6142d59250602080918301019101613bb4565b15388061428c565b9061431c57508051156142f257805190602001fd5b7f1425ea420000000000000000000000000000000000000000000000000000000060005260046000fd5b81511580614371575b61432d575090565b73ffffffffffffffffffffffffffffffffffffffff907f9996b315000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50803b1561432556fea2646970667358221220d69c96d0b635aa5f852142590c2779163aa16576e16de3a6a1d7d467082b851c64736f6c634300081e003300000000000000000000000082ca6d313bffe56e9096b16633dfd414148d66b1000000000000000000000000000000000000000000000000000c6f3b40b6c0000000000000000000000000000000000000000000000000000000000000000190