0 txs
90 calls
constructor
constructor()
functions
allowance
viewfunction allowance(address owner, address spender) view returns (uint256)
asset
viewfunction asset() view returns (address)
assetDecimals
viewfunction assetDecimals() view returns (uint8)
assetShareScale
viewfunction assetShareScale() view returns (uint256)
assetsToShares
viewfunction assetsToShares(uint256 assets, tuple state) view returns (uint256)
balanceOf
viewfunction balanceOf(address account) view returns (uint256)
decimals
viewfunction decimals() view returns (uint8)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
depositAssets
viewfunction depositAssets() view returns (uint256)
depositRequestTtl
viewfunction depositRequestTtl() view returns (uint64)
feeRecipient
viewfunction feeRecipient() view returns (address)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
isAuthorizedInvestor
viewfunction isAuthorizedInvestor(address investor) view returns (bool)
lockedShares
viewfunction lockedShares(address account) view returns (uint256)
managementFeeNextNonce
viewfunction managementFeeNextNonce(address account) view returns (uint256)
name
viewfunction name() view returns (string)
normalizer
viewfunction normalizer() view returns (uint256)
pendingDepositRequests
viewfunction pendingDepositRequests(uint256 id) view returns (tuple)
pendingRedeemRequests
viewfunction pendingRedeemRequests(uint256 id) view returns (tuple)
performanceFeeNextNonce
viewfunction performanceFeeNextNonce(address account) view returns (uint256)
permissionType
viewfunction permissionType() view returns (uint8)
previewDeposit
viewfunction previewDeposit(uint256 assets, tuple state, address beneficiary) view returns (tuple request)
previewRedeem
viewfunction previewRedeem(uint256 shares, tuple state, address beneficiary) view returns (tuple request)
priceImpactMarginPct
viewfunction priceImpactMarginPct() view returns (uint256)
proxiableUUID
viewfunction proxiableUUID() view returns (bytes32)
redeemRequestTtl
viewfunction redeemRequestTtl() view returns (uint64)
requestId
viewfunction requestId() view returns (uint256)
safe
viewfunction safe() view returns (address)
sharesToAssets
viewfunction sharesToAssets(uint256 shares, tuple state) view returns (uint256)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
symbol
viewfunction symbol() view returns (string)
totalSupply
viewfunction totalSupply() view returns (uint256)
transferLock
viewfunction transferLock() view returns (bool)
UPGRADE_INTERFACE_VERSION
viewfunction UPGRADE_INTERFACE_VERSION() view returns (string)
approve
nonpayablefunction approve(address spender, uint256 value) returns (bool)
cancelDeposit
nonpayablefunction cancelDeposit(uint256 id)
cancelRedeem
nonpayablefunction cancelRedeem(uint256 id)
chargeManagementFees
nonpayablefunction chargeManagementFees(tuple[] fees)
chargePerformanceFees
nonpayablefunction chargePerformanceFees(tuple[] fees)
confiscateShares
nonpayablefunction confiscateShares(address confiscatee)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
initialize
nonpayablefunction initialize(tuple params)
processDepositRequests
nonpayablefunction processDepositRequests(uint256[] approveRequests, uint256[] rejectRequests)
processRedeemRequests
nonpayablefunction processRedeemRequests(tuple[] approveRequests, uint256[] rejectRequests)
recoverAssets
nonpayablefunction recoverAssets(address[] assets)
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
requestDeposit
nonpayablefunction requestDeposit(uint256 assets, tuple state, address beneficiary) returns (uint256)
requestRedeem
nonpayablefunction requestRedeem(uint256 shares, tuple state, address beneficiary) returns (uint256)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
setDepositRequestTtl
nonpayablefunction setDepositRequestTtl(uint64 ttl)
setFeeRecipient
nonpayablefunction setFeeRecipient(address recipient)
setPriceImpactMarginPct
nonpayablefunction setPriceImpactMarginPct(uint256 priceImpactMarginPct_)
setRedeemRequestTtl
nonpayablefunction setRedeemRequestTtl(uint64 ttl)
transfer
nonpayablefunction transfer(address to, uint256 value) returns (bool)
transferFrom
nonpayablefunction transferFrom(address from, address to, uint256 value) returns (bool)
upgradeToAndCall
payablefunction upgradeToAndCall(address newImplementation, bytes data) payable
events
Approval
event Approval(address indexed owner, address indexed spender, uint256 value)
ConfiscateShares
event ConfiscateShares(address confiscatee, uint256 shares)
DepositApprove
event DepositApprove(address beneficiary, uint256 requestId, uint256 assets, uint256 shares)
DepositCanceled
event DepositCanceled(uint256 requestId, address canceler)
DepositDeny
event DepositDeny(address beneficiary, uint256 requestId, uint256 assets, uint256 shares)
DepositRequest
event DepositRequest(address indexed beneficiary, uint256 requestId, address indexed requester, uint256 assetsToDeposit, uint256 sharesToIssue, uint256 priceImpactMargin, uint64 ttl, int256 nav, uint256 supply)
DepositRequestTtlUpdated
event DepositRequestTtlUpdated(uint64 ttl)
FeeRecipientUpdated
event FeeRecipientUpdated(address recipient)
Initialized
event Initialized(uint64 version)
ManagementFeeCharged
event ManagementFeeCharged(uint256 value, address indexed payee, int256 nonce)
PerformanceFeeCharged
event PerformanceFeeCharged(uint256 value, address indexed payee, int256 nonce)
PriceImpactMarginPctUpdated
event PriceImpactMarginPctUpdated(uint256 priceImpactMarginPct)
RedeemApprove
event RedeemApprove(address beneficiary, uint256 requestId, uint256 assets, uint256 shares, uint256 fee)
RedeemCanceled
event RedeemCanceled(uint256 requestId, address canceler)
RedeemDeny
event RedeemDeny(address beneficiary, uint256 requestId, uint256 assets, uint256 shares)
RedeemRequest
event RedeemRequest(address indexed beneficiary, uint256 requestId, address indexed requester, uint256 assets, uint256 shares, uint64 ttl, int256 nav, uint256 supply)
RedeemRequestTtlUpdated
event RedeemRequestTtlUpdated(uint64 ttl)
RoleAdminChanged
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)
RoleGranted
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)
RoleRevoked
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)
Transfer
event Transfer(address indexed from, address indexed to, uint256 value)
Upgraded
event Upgraded(address indexed implementation)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
AddressEmptyCode
error AddressEmptyCode(address target)
AddressInsufficientBalance
error AddressInsufficientBalance(address account)
ERC1967InvalidImplementation
error ERC1967InvalidImplementation(address implementation)
ERC1967NonPayable
error ERC1967NonPayable()
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)
FailedInnerCall
error FailedInnerCall()
InsufficientAssets
error InsufficientAssets()
InsufficientShares
error InsufficientShares()
InsufficientSharesForFee
error InsufficientSharesForFee(address payee, uint256 value)
InvalidArguments
error InvalidArguments()
InvalidInitialization
error InvalidInitialization()
MathOverflowedMulDiv
error MathOverflowedMulDiv()
NoPendingDepositRequest
error NoPendingDepositRequest()
NoPendingRedeemRequest
error NoPendingRedeemRequest()
NotAuthorized
error NotAuthorized()
NotInitializing
error NotInitializing()
RequestNotPastTtl
error RequestNotPastTtl()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
TransferNotAllowed
error TransferNotAllowed()
UUPSUnauthorizedCallContext
error UUPSUnauthorizedCallContext()
UUPSUnsupportedProxiableUUID
error UUPSUnsupportedProxiableUUID(bytes32 slot)
creation bytecode
0x60a080604052346100c257306080525f51602061401e5f395f51905f525460ff8160401c166100b3576002600160401b03196001600160401b03821601610060575b604051613f5790816100c78239608051818181611cd10152611ded0152f35b6001600160401b0319166001600160401b039081175f51602061401e5f395f51905f525581527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f80610041565b63f92ee8a960e01b5f5260045ffd5b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c9081626d6cae146127765750806301ffc9a71461270657806306fdde0314612649578063095ea7b3146125a45780630dd11f391461257d57806311d2b1b514612554578063171250481461252d57806318160ddd14612504578063186f0354146124dc57806323b872dd146124a4578063248a9ca3146124655780632d85bb681461224c5780632f0edcae146122265780632f2ff15d146121dc578063313ce567146121c157806336568abe1461217d578063388f6ebb146120ec57806338d52e0f146120c45780633aa87d3314611fdd5780634690484014611fb55780634dcae1a314611f985780634f1ef28614611d9f5780635261d0ee14611d2557806352d1902d14611cbf578063539ffb7714611b6357806354bbb5f714611b4657806354cadfaf14611a655780637090b25114611a1157806370a08231146119cd57806372fada5c1461181757806373124ced146117f55780637587b54a1461174c5780638af55230146117265780638d867446146116d25780638ea35b5b14610e9357806391d1485414610e3e57806395d89b4114610d50578063a217fddf14610d36578063a39c884914610d10578063a5d3781714610ab7578063a839e38d14610a7f578063a9059cbb14610a4e578063a919987b14610a31578063ad3cb1cc146109ee578063c2d41601146109ce578063d1df7df814610828578063d47026d21461080b578063d547741f146107ba578063dd62ed3e14610773578063df665ab2146106ab578063e04256bf1461067e578063e0caf62d146105f4578063e336ac44146105bc578063e74b981b14610506578063e7b78392146104c6578063f8d29a841461048e5763fb5e8fef1461028e575f80fd5b3461048a5761029c36612a48565b6102a581612e1d565b15610442576001600160a01b0381163381141580610465575b8015610451575b610442577fcc2f083b773e11cc607368304a213a6f83757401512c2f8b0b3c4787c7970c6860e06102f98486602098612d74565b93845161031661030e89880192835190612c16565b603654612c16565b603655610324603354612e0f565b9687603355875f52603c8952866001600160401b0360405f206103fa8351968783558651978860018501556103f260408701998a5160028701556103e060a0600460608b0198600180841b038a51166003820190600180861b03166001600160601b03851b8254161790550199600180831b03600180841b03608083015116166001600160601b03831b8c5416178b550198888a51168154906001600160401b0360a01b9060a01b16906001600160401b0360a01b1916179055565b6032546001600160a01b031692612c16565b913091613a17565b60018060a01b03905116985194519351915116908a835193015193604051958b87528c87015260408601526060850152608084015260a083015260c0820152a3604051908152f35b63ea8e4eb560e01b5f5260045ffd5b506034546001600160a01b031681146102c5565b50335f9081525f516020613e025f395f51905f52602052604090205460ff16156102be565b5f80fd5b3461048a57602036600319011261048a576001600160a01b036104af6127d7565b165f52603f602052602060405f2054604051908152f35b3461048a575f36600319011261048a5760ff60325460a01c1660405160028210156104f2576020918152f35b634e487b7160e01b5f52602160045260245ffd5b3461048a57602036600319011261048a5761051f6127d7565b335f9081525f516020613ea25f395f51905f52602052604090205460ff1615610442576001600160a01b0316801580156105a8575b610599576020817f7a7b5a0a132f9e0581eb8527f66eae9ee89c2a3e79d4ac7e41a1f1f4d48a7fc2926001600160601b0360a01b6035541617603555604051908152a1005b6317dbc4cb60e21b5f5260045ffd5b506034546001600160a01b03168114610554565b3461048a57602036600319011261048a576001600160a01b036105dd6127d7565b165f52603e602052602060405f2054604051908152f35b3461048a57602036600319011261048a576004356001600160401b03811161048a5761062490369060040161298e565b905f5b82811061063057005b6001906106786001600160a01b0361065161064c848888612c53565b612bbd565b16838060a01b036034541661067261066d61064c868a8a612c53565b61392a565b916136c2565b01610627565b3461048a57602036600319011261048a5760206106a161069c6127d7565b612e1d565b6040519015158152f35b3461048a57604036600319011261048a576004356001600160401b03811161048a576106db90369060040161298e565b6024356001600160401b03811161048a576106fa90369060040161298e565b335f9081525f516020613e025f395f51905f526020526040902054909391929060ff1615610442575f5b818110610756575050505f5b82811061073957005b8061075061074a6001938686612c53565b356138dd565b01610730565b8061076d6107676001938587612c53565b356137b2565b01610724565b3461048a57604036600319011261048a5761078c6127d7565b61079d6107976127ed565b91612bd1565b9060018060a01b03165f52602052602060405f2054604051908152f35b3461048a57604036600319011261048a576108096004356107d96127ed565b906108046107ff825f525f516020613ee25f395f51905f52602052600160405f20015490565b613005565b613172565b005b3461048a575f36600319011261048a576020603654604051908152f35b3461048a5761084361083936612a48565b8181949293612cc7565b602081018051939192916001600160a01b0381169190853384036109bc575b5050815f525f516020613e425f395f51905f5260205261089360405f205495835f52603e60205260405f2054612c16565b9485116109ad5760c07f4f783d858b9f0fdfc59ed8840b99c4a4882b958c419f22138100758c39224e7391602096845f52603e885260405f20556108d8603354612e0f565b60338190555f818152603d8952604090819020885180825593516001820181905591890151805160028301558a0151600382015560608901516004820180546001600160a01b0319166001600160a01b0392831690811790915560808b01516005909301805460a09c8d01516001600160e01b031990911694909316939093179a82901b67ffffffffffffffff60a01b169a909a1790915591979690916001600160401b031689825192015192604051948a86528b86015260408501526060840152608083015260a0820152a3604051908152f35b633999656760e01b5f5260045ffd5b6109c7913390612e78565b8585610862565b3461048a575f36600319011261048a57602060ff60385416604051908152f35b3461048a575f36600319011261048a57610a2d604051610a0f60408261284d565b60058152640352e302e360dc1b602082015260405191829182612790565b0390f35b3461048a575f36600319011261048a576020603954604051908152f35b3461048a57604036600319011261048a57610a74610a6a6127d7565b6024359033612f16565b602060405160018152f35b3461048a57602036600319011261048a576001600160a01b03610aa06127d7565b165f526040602052602060405f2054604051908152f35b3461048a57610ac536612896565b335f9081525f516020613e025f395f51905f52602052604090205460ff161561044257905f915b808310610af557005b6001600160a01b03610b136040610b0d868587612b99565b01612bbd565b16158015610cfd575b8015610cc2575b8015610c7b575b610599576020610b3b848385612b99565b013560018101809111610c67576001600160a01b03610b606040610b0d878688612b99565b165f52603f60205260405f2055610b7d6040610b0d858486612b99565b92610b89818385612b99565b35936020610b98838587612b99565b013560415460ff8116610c585760ff19166001176041556034546001600160a01b03838116939116831461059957825f525f516020613e425f395f51905f526020528660405f20541115610c4157867f03313f246575784e513e25a7018a83739cf120cd0b10d044718e74733f61476d92610c246001979899604094898060a01b036035541690612f16565b82519182526020820152a260ff1960415416604155019190610aec565b8683635c4d77ed60e11b5f5260045260245260445ffd5b638cd22d1960e01b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b506103e8610cbc6020610c8f868587612b99565b01356001600160a01b03610ca96040610b0d89888a612b99565b165f52603f60205260405f205490612c09565b11610b2a565b506020610cd0848385612b99565b01356001600160a01b03610cea6040610b0d878688612b99565b165f52603f60205260405f205411610b23565b50610d09838284612b99565b3515610b1c565b3461048a57610a2d610d2a610d2436612a48565b91612d74565b604051918291826128e8565b3461048a575f36600319011261048a5760206040515f8152f35b3461048a575f36600319011261048a576040515f5f516020613e625f395f51905f5254610d7c81612ab1565b8084529060018116908115610e1a5750600114610db0575b610a2d83610da48185038261284d565b60405191829182612790565b5f516020613e625f395f51905f525f9081527f46a2803e59a4de4e7a4c574b1243f25977ac4c77d5a1a4a609b5394cebb4a2aa939250905b808210610e0057509091508101602001610da4610d94565b919260018160209254838588010152019101909291610de8565b60ff191660208086019190915291151560051b84019091019150610da49050610d94565b3461048a57604036600319011261048a57610e576127ed565b6004355f525f516020613ee25f395f51905f5260205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b3461048a57602036600319011261048a576004356001600160401b03811161048a57610140600319823603011261048a5760405161014081018181106001600160401b0382111761156557604052610eed82600401612803565b8152610efb60248301612803565b906020810191825260448301356001600160401b03811161048a57610f269060043691860101612a93565b926040820193845260648101356001600160401b03811161048a57610f519060043691840101612a93565b9060608301918252610f6560848201612803565b9060808401918252610f7960a48201612803565b9060a0850191825260c085019160c48201358352610f9960e483016129d4565b9360e08701948552610124610fb161010485016129d4565b936101008901948552013595600287101561048a5761012088019687525f516020613f025f395f51905f52549960ff8b60401c16159a6001600160401b038116801590816116ca575b60011490816116c0575b1590816116b7575b506116a85767ffffffffffffffff1981166001175f516020613f025f395f51905f52558b61167c575b5061103e613c6e565b611046613c6e565b51905190611052613c6e565b61105a613c6e565b8051906001600160401b0382116115655781906110845f516020613e225f395f51905f5254612ab1565b601f8111611602575b50602090601f8311600114611584575f92611579575b50508160011b915f199060031b1c1916175f516020613e225f395f51905f52555b8051906001600160401b0382116115655781906110ee5f516020613e625f395f51905f5254612ab1565b601f81116114eb575b50602090601f831160011461146d575f92611462575b50508160011b915f199060031b1c1916175f516020613e625f395f51905f52555b86516001600160a01b0316158015611450575b801561143e575b801561142c575b8015611414575b8015611400575b80156113ee575b80156113dc575b610599578651603280546001600160a01b039283166001600160a01b031991821617909155915160348054918316918416919091179055915160358054919093169116179055905160375590516111d7916001600160401b03916111d0908316613626565b5116613705565b5160028110156104f2576032805460ff60a01b191660a09290921b60ff60a01b169190911790555160405163313ce56760e01b815290602090829060049082906001600160a01b03165afa80156113d1575f90611394575b60ff9150168060ff1960385416176038558060080360ff8111610c675761125590612d63565b6039556012039060ff8211610c675761127061128292612d63565b603a55516001600160a01b031661304b565b507f5614e11ca6d7673c9c8dcec913465d676494aad1151bb2c1cf40b9d99be4d9355f8181525f516020613ee25f395f51905f526020527f5c3febe824edc4fa91ead8098809a6ec9d3c757245985aa6886887e73e35df4f80547f873de580cf47584c80eea30ee9e61a99afd4e0beea5ccaa47156b0b82e00defe91829055604051949391929091907fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9080a460ff196041541660415561133f57005b60207fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29168ff0000000000000000195f516020613f025f395f51905f5254165f516020613f025f395f51905f525560018152a1005b506020813d6020116113c9575b816113ae6020938361284d565b8101031261048a575160ff8116810361048a5760ff9061122f565b3d91506113a1565b6040513d5f823e3d90fd5b506001600160401b038351161561116b565b506001600160401b0385511615611164565b5068056bc75e2d631000008451101561115d565b50815181516001600160a01b03908116911614611156565b5081516001600160a01b03161561114f565b5080516001600160a01b031615611148565b5087516001600160a01b031615611141565b015190508b8061110d565b5f516020613e625f395f51905f525f9081528281209350601f198516905b8181106114d357509084600195949392106114bb575b505050811b015f516020613e625f395f51905f525561112e565b01515f1960f88460031b161c191690558b80806114a1565b9293602060018192878601518155019501930161148b565b5f516020613e625f395f51905f525f529091507f46a2803e59a4de4e7a4c574b1243f25977ac4c77d5a1a4a609b5394cebb4a2aa601f840160051c8101916020851061155b575b90601f859493920160051c01905b81811061154d57506110f7565b5f8155849350600101611540565b9091508190611532565b634e487b7160e01b5f52604160045260245ffd5b015190508c806110a3565b5f516020613e225f395f51905f525f9081528281209350601f198516905b8181106115ea57509084600195949392106115d2575b505050811b015f516020613e225f395f51905f52556110c4565b01515f1960f88460031b161c191690558c80806115b8565b929360206001819287860151815501950193016115a2565b5f516020613e225f395f51905f525f529091507f2ae08a8e29253f69ac5d979a101956ab8f8d9d7ded63fa7a83b16fc47648eab0601f840160051c81019160208510611672575b90601f859493920160051c01905b818110611664575061108d565b5f8155849350600101611657565b9091508190611649565b68ffffffffffffffffff191668010000000000000001175f516020613f025f395f51905f52558b611035565b63f92ee8a960e01b5f5260045ffd5b9050158d61100c565b303b159150611004565b8d9150610ffa565b3461048a57602036600319011261048a576116eb6129be565b335f9081525f516020613ea25f395f51905f52602052604090205460ff1615610442576001600160401b038116156105995761080990613705565b3461048a57610a2d61174061173a36612a48565b91612cc7565b604051918291826129e8565b3461048a57602036600319011261048a57611765612c63565b506004355f52603d602052610a2d60405f206001600160401b0360056040519261178e84612817565b80548452600181015460208501526040516117a881612832565b6002820154815260038201546020820152604085015260018060a01b036004820154166060850152015460018060a01b038116608084015260a01c1660a0820152604051918291826129e8565b3461048a575f36600319011261048a57602060ff604154166040519015158152f35b3461048a57602036600319011261048a57600435805f52603c60205260405f20906040519061184582612817565b825482526001830154602083019081526002840154604084015260038401546001600160a01b03908116606085019081526004909501549081166080850181815260a092831c6001600160401b0316928601928352959190156119be57516001600160401b031642106119af5784519051336001600160a01b0392831681141592919091161480159061198a575b81611982575b50610442577f3251f9d7f232f7be8a9d9756cf16c9371d85f11359d3a4866081228a6cef8f9a936119146119679261197d9551905190612c16565b9061192182603654612c09565b603655835f52603c60205261195060405f2060045f918281558260018201558260028201558260038201550155565b60325490516001600160a01b0390811691166136c2565b6040805191825233602083015290918291820190565b0390a1005b9050856118d9565b50335f9081525f516020613e025f395f51905f52602052604090205460ff16156118d3565b632706d26f60e11b5f5260045ffd5b63fdc8b49b60e01b5f5260045ffd5b3461048a57602036600319011261048a576001600160a01b036119ee6127d7565b165f525f516020613e425f395f51905f52602052602060405f2054604051908152f35b3461048a57602036600319011261048a57611a2a6129be565b335f9081525f516020613ea25f395f51905f52602052604090205460ff1615610442576001600160401b038116156105995761080990613626565b3461048a57604036600319011261048a576004356001600160401b03811161048a573660238201121561048a5780600401356001600160401b03811161048a573660248260071b8401011161048a576024356001600160401b03811161048a57611ad390369060040161298e565b335f9081525f516020613e025f395f51905f52602052604090205490919060ff1615610442575f5b83811015611b1d57600190611b1760248260071b880101613230565b01611afb565b505f5b828110611b2957005b80611b40611b3a6001938686612c53565b356135ac565b01611b20565b3461048a575f36600319011261048a576020603754604051908152f35b3461048a57602036600319011261048a57600435805f52603d60205260405f2060405191611b9083612817565b8154835260018201549160208401928352604051611bad81612832565b6002820154815260038201546020820152604085015260048101546001600160a01b03908116606086019081526005909201549081166080860181815260a092831c6001600160401b03169290960191825215611cb057516001600160401b031642106119af5783516001600160a01b03163314159081611c9b575b506104425761196761197d927f86d86340ac86f8ba644c90670f1e86cbd927438f8eac4c054457630e8a9ab08b94835f52603d602052611c8960405f2060055f918281558260018201558260028201558260038201558260048201550155565b519051906001600160a01b031661320e565b516001600160a01b0316331415905084611c29565b636040212f60e11b5f5260045ffd5b3461048a575f36600319011261048a577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003611d165760206040515f516020613ec25f395f51905f528152f35b63703e46dd60e11b5f5260045ffd5b3461048a57602036600319011261048a57335f9081525f516020613ea25f395f51905f5260205260409020546004359060ff16156104425768056bc75e2d63100000811015610599576020817f808331f89b295f30712c3eaa69aef332016e50fc43dc60d9f10dce0a3dde023b92603755604051908152a1005b604036600319011261048a57611db36127d7565b6024356001600160401b03811161048a573660238201121561048a57611de3903690602481600401359101612958565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016308114908115611f76575b50611d1657335f9081525f516020613ea25f395f51905f52602052604090205460ff1615610442576040516352d1902d60e01b81526001600160a01b0383169290602081600481875afa5f9181611f42575b50611e825783634c9c8ce360e01b5f5260045260245ffd5b805f516020613ec25f395f51905f52859203611f305750813b15611f1e575f516020613ec25f395f51905f5280546001600160a01b031916821790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2815115611f06575f8083602061080995519101845af4611f00613d74565b91613da3565b505034611f0f57005b63b398979f60e01b5f5260045ffd5b634c9c8ce360e01b5f5260045260245ffd5b632a87526960e21b5f5260045260245ffd5b9091506020813d602011611f6e575b81611f5e6020938361284d565b8101031261048a57519085611e6a565b3d9150611f51565b5f516020613ec25f395f51905f52546001600160a01b03161415905083611e18565b3461048a575f36600319011261048a576020603a54604051908152f35b3461048a575f36600319011261048a576035546040516001600160a01b039091168152602090f35b3461048a57602036600319011261048a57611ff66127d7565b60415460ff8116610c585760ff1916600117604155335f9081525f516020613ea25f395f51905f52602052604090205460ff1615610442576034546001600160a01b0382811691168114610599575f525f516020613e425f395f51905f5260205260405f205480156109ad576035547ffeae00d687e659f74d87b83e4eac2560ad79e9517a2cfd172a6664e64213bfa4929061209d9083906001600160a01b031683612f16565b604080516001600160a01b039290921682526020820192909252a16041805460ff19169055005b3461048a575f36600319011261048a576032546040516001600160a01b039091168152602090f35b3461048a57602036600319011261048a57612105612c23565b506004355f52603c602052610a2d60405f206001600160401b0360046040519261212e84612817565b80548452600181015460208501526002810154604085015260018060a01b036003820154166060850152015460018060a01b038116608084015260a01c1660a0820152604051918291826128e8565b3461048a57604036600319011261048a576121966127ed565b336001600160a01b038216036121b25761080990600435613172565b63334bd91960e11b5f5260045ffd5b3461048a575f36600319011261048a57602060405160128152f35b3461048a57604036600319011261048a576108096004356121fb6127ed565b906122216107ff825f525f516020613ee25f395f51905f52602052600160405f20015490565b6130d4565b3461048a575f36600319011261048a5760206001600160401b03603b5416604051908152f35b3461048a5761225a36612896565b335f9081525f516020613e025f395f51905f52602052604090205460ff161561044257905f915b80831061228a57005b6001600160a01b036122a26040610b0d868587612b99565b16158015612452575b8015612417575b80156123d0575b6105995760206122ca848385612b99565b013560018101809111610c67576001600160a01b036122ef6040610b0d878688612b99565b165f52604060205260405f205561230c6040610b0d858486612b99565b92612318818385612b99565b35936020612327838587612b99565b013560415460ff8116610c585760ff19166001176041556034546001600160a01b03838116939116831461059957825f525f516020613e425f395f51905f526020528660405f20541115610c4157867f511039e4e862822bb045b33aa05067f9aa980d568adfbc8bc505561daba1bf05926123b36001979899604094898060a01b036035541690612f16565b82519182526020820152a260ff1960415416604155019190612281565b506103e861241160206123e4868587612b99565b01356001600160a01b036123fe6040610b0d89888a612b99565b165f52604060205260405f205490612c09565b116122b9565b506020612425848385612b99565b01356001600160a01b0361243f6040610b0d878688612b99565b165f52604060205260405f2054116122b2565b5061245e838284612b99565b35156122ab565b3461048a57602036600319011261048a57602061249c6004355f525f516020613ee25f395f51905f52602052600160405f20015490565b604051908152f35b3461048a57606036600319011261048a57610a746124c06127d7565b6124c86127ed565b604435916124d7833383612e78565b612f16565b3461048a575f36600319011261048a576034546040516001600160a01b039091168152602090f35b3461048a575f36600319011261048a5760205f516020613e825f395f51905f5254604051908152f35b3461048a57606036600319011261048a57602061249c61254c3661286e565b600435612b5a565b3461048a575f36600319011261048a5760206001600160401b03603b5460401c16604051908152f35b3461048a57606036600319011261048a57602061249c61259c3661286e565b600435612afc565b3461048a57604036600319011261048a576125bd6127d7565b602435903315612636576001600160a01b0316908115612623576125e033612bd1565b825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b3461048a575f36600319011261048a576040515f5f516020613e225f395f51905f525461267581612ab1565b8084529060018116908115610e1a575060011461269c57610a2d83610da48185038261284d565b5f516020613e225f395f51905f525f9081527f2ae08a8e29253f69ac5d979a101956ab8f8d9d7ded63fa7a83b16fc47648eab0939250905b8082106126ec57509091508101602001610da4610d94565b9192600181602092548385880101520191019092916126d4565b3461048a57602036600319011261048a5760043563ffffffff60e01b811680910361048a57602090636f62858b60e01b811490811561274b575b506040519015158152f35b637965db0b60e01b811491508115612765575b5082612740565b6301ffc9a760e01b1490508261275e565b3461048a575f36600319011261048a576020906033548152f35b9190916020815282518060208301525f5b8181106127c1575060409293505f838284010152601f8019910116010190565b80602080928701015160408286010152016127a1565b600435906001600160a01b038216820361048a57565b602435906001600160a01b038216820361048a57565b35906001600160a01b038216820361048a57565b60c081019081106001600160401b0382111761156557604052565b604081019081106001600160401b0382111761156557604052565b90601f801991011681019081106001600160401b0382111761156557604052565b604090602319011261048a576040519061288782612832565b60243582526044356020830152565b90602060031983011261048a576004356001600160401b03811161048a578260238201121561048a578060040135926001600160401b03841161048a576024606085028301011161048a576024019190565b91909160a06001600160401b038160c0840195805185526020810151602086015260408101516040860152600180831b036060820151166060860152600180831b036080820151166080860152015116910152565b6001600160401b03811161156557601f01601f191660200190565b9291926129648261293d565b91612972604051938461284d565b82948184528183011161048a578281602093845f960137010152565b9181601f8401121561048a578235916001600160401b03831161048a576020808501948460051b01011161048a57565b600435906001600160401b038216820361048a57565b35906001600160401b038216820361048a57565b91909160c06001600160401b0360a060e08401958051855260208101516020860152602060408201518051604088015201516060860152600180831b036060820151166080860152600180831b0360808201511682860152015116910152565b90608060031983011261048a576040602460043593031261048a57604051612a6f81612832565b60243581526044356020820152906064356001600160a01b038116810361048a5790565b9080601f8301121561048a57816020612aae93359101612958565b90565b90600182811c92168015612adf575b6020831014612acb57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691612ac0565b81810292918115918404141715610c6757565b5f825112612b365760208201519182612b1e5750612aae9150603a5490612ae9565b612b2e612aae9360395490612ae9565b905191613a5b565b50505f90565b8115612b46570490565b634e487b7160e01b5f52601260045260245ffd5b8151915f8312612b92576020015180612b7c5750612aae9150603a5490612b3c565b612aae92612b8992613a5b565b60395490612b3c565b5050505f90565b9190811015612ba9576060020190565b634e487b7160e01b5f52603260045260245ffd5b356001600160a01b038116810361048a5790565b6001600160a01b03165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020526040902090565b91908203918211610c6757565b91908201809211610c6757565b60405190612c3082612817565b5f60a0838281528260208201528260408201528260608201528260808201520152565b9190811015612ba95760051b0190565b60405190612c7082612817565b5f60a083828152826020820152604051612c8981612832565b83815283602082015260408201528260608201528260808201520152565b906001600160401b03809116911601906001600160401b038211610c6757565b612ccf612c63565b50612cda8282612b5a565b9283158015612d5b575b610599576001600160a01b03165f8181525f516020613e425f395f51905f52602052604090205482116109ad576001600160401b0392612d2d84603b5460401c16854216612ca7565b9260405195612d3b87612817565b86526020860152604085015233606085015260808401521660a082015290565b508115612ce4565b60ff16604d8111610c6757600a0a90565b9091612d7e612c23565b50612d9568056bc75e2d6310000060375484613a5b565b90612daa612da38385612c09565b9485612afc565b92158015612e07575b610599576001600160401b0392612dd084603b5416854216612ca7565b9260405195612dde87612817565b8652602086015260408501523360608501526001600160a01b031660808401521660a082015290565b508215612db3565b5f198114610c675760010190565b60ff60325460a01c1660028110156104f257600103612e3c5750600190565b6001600160a01b03165f9081527f5c3febe824edc4fa91ead8098809a6ec9d3c757245985aa6886887e73e35df4e602052604090205460ff1690565b9190612e8383612bd1565b60018060a01b0382165f5260205260405f2054925f198403612ea6575b50505050565b828410612ef3576001600160a01b03811615612636576001600160a01b0382161561262357612ed490612bd1565b9060018060a01b03165f5260205260405f20910390555f808080612ea0565b508290637dc7a0d960e11b5f5260018060a01b031660045260245260445260645ffd5b6001600160a01b0316908115612ff2576001600160a01b0316918215612fdf5760415460ff1615610c5857815f525f516020613e425f395f51905f5260205260405f2054818110612fc657817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f516020613e425f395f51905f5284520360405f2055845f525f516020613e425f395f51905f52825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffd5b5f8181525f516020613ee25f395f51905f526020908152604080832033845290915290205460ff16156130355750565b63e2517d3f60e01b5f523360045260245260445ffd5b6001600160a01b0381165f9081525f516020613ea25f395f51905f52602052604090205460ff166130cf576001600160a01b03165f8181525f516020613ea25f395f51905f5260205260408120805460ff191660011790553391907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8180a4600190565b505f90565b5f8181525f516020613ee25f395f51905f52602090815260408083206001600160a01b038616845290915290205460ff16612b36575f8181525f516020613ee25f395f51905f52602090815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b5f8181525f516020613ee25f395f51905f52602090815260408083206001600160a01b038616845290915290205460ff1615612b36575f8181525f516020613ee25f395f51905f52602090815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b60018060a01b03165f52603e60205261322c60405f20918254612c09565b9055565b9081359161323d83613aef565b9392959095156135a457602083013592678ac7230489e800008411610599576060810135806134ff575b506040013580613443575b5060018060a01b03841693845f525f516020613e425f395f51905f5260205260405f2054968397808511613439575b506132c368056bc75e2d631000006132bc6132ca938b612b5a565b9687613a5b565b8095612c09565b9260415460ff8116610c585760ff19166001176041558515612ff25760415460ff1615610c5857855f525f516020613e425f395f51905f5260205260405f205488811061341e5784879695936133bb8b96947f737bb791cde30e7685a2be071e473764ce74fe91af0a97187145cb276d7609bd9b9c6133d89560a09c5f525f516020613e425f395f51905f526020520360405f2055875f516020613e825f395f51905f5254035f516020613e825f395f51905f52555f8a7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60206040518c8152a360ff19604154166041558261320e565b866133f5575b6032546034545f1960018c1b019081169116613a17565b6040519485526020850152604084015260608301526080820152a1565b603254603454603554613419928a925f1960018f1b01928316929081169116613a17565b6133c1565b88908763391434e360e21b5f5260045260245260445260645ffd5b97506132c36132a1565b60415460ff8116610c585760ff19166001176041556034546001600160a01b03868116929116821461059957815f525f516020613e425f395f51905f526020528060405f205411156134e9576035547f03313f246575784e513e25a7018a83739cf120cd0b10d044718e74733f61476d916040916134cc9082906001600160a01b03168a612f16565b81519081525f196020820152a260ff19604154166041555f613272565b90635c4d77ed60e11b5f5260045260245260445ffd5b60415460ff8116610c585760ff19166001176041556034546001600160a01b03878116929116821461059957815f525f516020613e425f395f51905f526020528060405f205411156134e957907f511039e4e862822bb045b33aa05067f9aa980d568adfbc8bc505561daba1bf0560408361358782969560018060a01b03603554168c612f16565b81519081525f196020820152a260ff196041541660415590613267565b505050509050565b6135b581613aef565b91939215612ea057836135ec613621927fb3d97ae56351651492b683fd86cfaa3cde5626af5c2d43c924a36bf2b1aab25e96612b5a565b6135f6828561320e565b6040519485948590949392606092608083019660018060a01b03168352602083015260408201520152565b0390a1565b677fffffffffffffff6001600160401b038216111561369157507fd5a7d25404488d83275ae7802134e3f9d5834166c6368f7b0e43bc935e8f953060206001600160401b03677fffffffffffffff5b16806001600160401b0319603b541617603b55604051908152a1565b60206001600160401b037fd5a7d25404488d83275ae7802134e3f9d5834166c6368f7b0e43bc935e8f953092613675565b60405163a9059cbb60e01b60208201526001600160a01b03929092166024830152604480830193909352918152613703916136fe60648361284d565b613bfa565b565b677fffffffffffffff6001600160401b038216111561378957507f12b03a12f6a0b1246abdd74ee9f3a23899b0e1f1ab33c2f1fc34bd214cec1c4b6020677fffffffffffffff5b67ffffffffffffffff60401b603b549160401b169067ffffffffffffffff60401b19161780603b556001600160401b036040519160401c168152a1565b60207f12b03a12f6a0b1246abdd74ee9f3a23899b0e1f1ab33c2f1fc34bd214cec1c4b9161374c565b6137bb81613c99565b91939215612ea0576032546034546137e19186916001600160a01b0390811691166136c2565b60415460ff8116610c585760ff19166001176041556001600160a01b038216908115612fdf5760415460ff1615610c58577ff5d89e110e3b0258e7f90e86b4b8f87d5cd4a4c33c99d268eb47abdfafe99e579461362192613850835f516020613e825f395f51905f5254612c16565b5f516020613e825f395f51905f5255805f525f516020613e425f395f51905f5260205260405f208381540190555f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020604051868152a360ff19604154166041556040519485948590949392606092608083019660018060a01b03168352602083015260408201520152565b6138e681613c99565b9190939215612ea0577f3a7bb80886e04ce00a7322a70657d8ca54138d81b9870cbb838beb3b54d8c59093816135f6613621938560018060a01b03603254166136c2565b6032546001600160a01b0391821691168181146139a757503081146130cf576020602491604051928380926370a0823160e01b82523060048301525afa9081156113d1575f91613978575090565b90506020813d60201161399f575b816139936020938361284d565b8101031261048a575190565b3d9150613986565b6040516370a0823160e01b81523060048201529150602090829060249082905afa80156113d1575f906139e3575b612aae915060365490612c09565b506020813d602011613a0f575b816139fd6020938361284d565b8101031261048a57612aae90516139d5565b3d91506139f0565b6040516323b872dd60e01b60208201526001600160a01b039283166024820152929091166044830152606480830193909352918152613703916136fe60848361284d565b9091828202915f1984820993838086109503948086039514613ae25784831115613ad357829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b63227bc15360e01b5f5260045ffd5b505090612aae9250612b3c565b604051613afb81612832565b5f81525f602082015250805f52603d60205260405f209060405190613b1f82612817565b8254825260018301549360208301948552600560405194613b3f86612832565b60028101548652600381015460208701526040850195865260048101546001600160a01b0390811660608701529101549081166080850181815260a092831c6001600160401b0316929095019190915215613bd7576001945193519260018060a01b03905116915f52603d60205261370360405f2060055f918281558260018201558260028201558260038201558260048201550155565b9350505050604051613be881612832565b5f81525f60208201525f915f91905f90565b5f80613c229260018060a01b03169360208151910182865af1613c1b613d74565b9083613da3565b8051908115159182613c4a575b5050613c385750565b635274afe760e01b5f5260045260245ffd5b819250906020918101031261048a576020015180159081150361048a575f80613c2f565b60ff5f516020613f025f395f51905f525460401c1615613c8a57565b631afcd79f60e31b5f5260045ffd5b805f52603c60205260405f209060405190613cb382612817565b825493848352600184015480602085015260046002860154956040860196875260018060a01b03600382015416606087015201549360018060a01b0385169060a06001600160401b036080830197848952821c1691015215613d6557613d1b90600196612c16565b93519260018060a01b03905116915f52603c602052613d5460405f2060045f918281558260018201558260028201558260038201550155565b613d6084603654612c09565b603655565b505f9450849350839250829150565b3d15613d9e573d90613d858261293d565b91613d93604051938461284d565b82523d5f602084013e565b606090565b90613dc75750805115613db857805190602001fd5b630a12f52160e11b5f5260045ffd5b81511580613df8575b613dd8575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b15613dd056fe6c1f9458047d31dfff469f4a6ebc68d6c17114a1bf98e905fb59b15827298d4252c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0352c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0052c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0452c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02b7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00a264697066735822122006d7605b7ed973a90153965e282c2e7190663e6464fde1fa89f6e0d23d32187964736f6c634300081b0033f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00