0 txs
13 calls
constructor
constructor(address dataProvider)
functions
borrowingOf
viewfunction borrowingOf(address user, address borrowToken) view returns (uint256)
borrowingOf
viewfunction borrowingOf(address user) view returns (tuple[], uint256)
convertUsdToCollateralToken
viewfunction convertUsdToCollateralToken(address collateralToken, uint256 debtUsdAmount) view returns (uint256)
DEBT_MANAGER_ADMIN_ROLE
viewfunction DEBT_MANAGER_ADMIN_ROLE() view returns (bytes32)
etherFiDataProvider
viewfunction etherFiDataProvider() view returns (address)
getCurrentIndex
viewfunction getCurrentIndex(address borrowToken) view returns (uint256)
HUNDRED_PERCENT
viewfunction HUNDRED_PERCENT() view returns (uint256)
isBorrowToken
viewfunction isBorrowToken(address token) view returns (bool)
isCollateralToken
viewfunction isCollateralToken(address token) view returns (bool)
MAX_BORROW_APY
viewfunction MAX_BORROW_APY() view returns (uint64)
paused
viewfunction paused() view returns (bool)
PRECISION
viewfunction PRECISION() view returns (uint256)
proxiableUUID
viewfunction proxiableUUID() view returns (bytes32)
roleRegistry
viewfunction roleRegistry() view returns (address)
SIX_DECIMALS
viewfunction SIX_DECIMALS() view returns (uint256)
totalBorrowingAmount
viewfunction totalBorrowingAmount(address borrowToken) view returns (uint256)
UPGRADE_INTERFACE_VERSION
viewfunction UPGRADE_INTERFACE_VERSION() view returns (string)
pause
nonpayablefunction pause()
setBorrowApy
nonpayablefunction setBorrowApy(address token, uint64 apy)
setCollateralTokenConfig
nonpayablefunction setCollateralTokenConfig(address __collateralToken, tuple __config)
setMinBorrowTokenShares
nonpayablefunction setMinBorrowTokenShares(address token, uint128 shares)
supportBorrowToken
nonpayablefunction supportBorrowToken(address token, uint64 borrowApy, uint128 minShares)
supportCollateralToken
nonpayablefunction supportCollateralToken(address token, tuple config)
unpause
nonpayablefunction unpause()
unsupportBorrowToken
nonpayablefunction unsupportBorrowToken(address token)
unsupportCollateralToken
nonpayablefunction unsupportCollateralToken(address token)
upgradeToAndCall
payablefunction upgradeToAndCall(address newImplementation, bytes data) payable
events
BorrowApySet
event BorrowApySet(address indexed token, uint256 oldApy, uint256 newApy)
Borrowed
event Borrowed(address indexed user, address indexed token, uint256 amount)
BorrowTokenAdded
event BorrowTokenAdded(address token)
BorrowTokenConfigSet
event BorrowTokenConfigSet(address indexed token, (uint256 interestIndexSnapshot, uint256 totalNormalizedBorrowingAmount, uint256 totalSharesOfBorrowTokens, uint64 lastUpdateTimestamp, uint64 borrowApy, uint128 minShares) config)
BorrowTokenRemoved
event BorrowTokenRemoved(address token)
CollateralTokenAdded
event CollateralTokenAdded(address token)
CollateralTokenConfigSet
event CollateralTokenConfigSet(address indexed collateralToken, (uint80 ltv, uint80 liquidationThreshold, uint96 liquidationBonus) oldConfig, (uint80 ltv, uint80 liquidationThreshold, uint96 liquidationBonus) newConfig)
CollateralTokenRemoved
event CollateralTokenRemoved(address token)
Initialized
event Initialized(uint64 version)
InterestIndexUpdated
event InterestIndexUpdated(address indexed borrowToken, uint256 oldIndex, uint256 newIndex)
Liquidated
event Liquidated(address indexed liquidator, address indexed user, address indexed debtTokenToLiquidate, (address token, uint256 amount, uint256 liquidationBonus)[] userCollateralLiquidated, uint256 beforeDebtAmount, uint256 debtAmountLiquidated)
LiquidationThresholdUpdated
event LiquidationThresholdUpdated(uint256 oldThreshold, uint256 newThreshold)
MinSharesOfBorrowTokenSet
event MinSharesOfBorrowTokenSet(address indexed token, uint128 oldMinShares, uint128 newMinShares)
Paused
event Paused(address account)
Repaid
event Repaid(address indexed user, address indexed payer, address indexed token, uint256 amount)
Supplied
event Supplied(address indexed sender, address indexed user, address indexed token, uint256 amount)
TotalBorrowingUpdated
event TotalBorrowingUpdated(address indexed borrowToken, uint256 totalBorrowingAmtBeforeInterest, uint256 totalBorrowingAmtAfterInterest)
Unpaused
event Unpaused(address account)
Upgraded
event Upgraded(address indexed implementation)
UserInterestAdded
event UserInterestAdded(address indexed user, uint256 borrowingAmtBeforeInterest, uint256 borrowingAmtAfterInterest)
WithdrawBorrowToken
event WithdrawBorrowToken(address indexed withdrawer, address indexed borrowToken, uint256 amount)
errors
AccountUnhealthy
error AccountUnhealthy()
AddressEmptyCode
error AddressEmptyCode(address target)
AlreadyBorrowToken
error AlreadyBorrowToken()
AlreadyCollateralToken
error AlreadyCollateralToken()
ArrayLengthMismatch
error ArrayLengthMismatch()
BorrowAmountZero
error BorrowAmountZero()
BorrowTokenCannotBeRemovedFromCollateral
error BorrowTokenCannotBeRemovedFromCollateral()
BorrowTokenConfigAlreadySet
error BorrowTokenConfigAlreadySet()
BorrowTokenStillInTheSystem
error BorrowTokenStillInTheSystem()
CannotLiquidateYet
error CannotLiquidateYet()
CollateralPreferenceIsEmpty
error CollateralPreferenceIsEmpty()
EnforcedPause
error EnforcedPause()
ERC1967InvalidImplementation
error ERC1967InvalidImplementation(address implementation)
ERC1967NonPayable
error ERC1967NonPayable()
EtherFiSafeCannotSupplyDebtTokens
error EtherFiSafeCannotSupplyDebtTokens()
ExpectedPause
error ExpectedPause()
FailedCall
error FailedCall()
IndexOutOfBounds
error IndexOutOfBounds()
InsufficientBorrowShares
error InsufficientBorrowShares()
InsufficientCollateral
error InsufficientCollateral()
InsufficientCollateralToRepay
error InsufficientCollateralToRepay()
InsufficientLiquidity
error InsufficientLiquidity()
InsufficientLiquidityPleaseTryAgainLater
error InsufficientLiquidityPleaseTryAgainLater()
InvalidInitialization
error InvalidInitialization()
InvalidValue
error InvalidValue()
LiquidAmountLesserThanRequired
error LiquidAmountLesserThanRequired()
LiquidatableAmountIsZero
error LiquidatableAmountIsZero()
LtvCannotBeGreaterThanLiquidationThreshold
error LtvCannotBeGreaterThanLiquidationThreshold()
NoBorrowTokenLeft
error NoBorrowTokenLeft()
NoCollateralTokenLeft
error NoCollateralTokenLeft()
NotABorrowToken
error NotABorrowToken()
NotACollateralToken
error NotACollateralToken()
NotAEtherFiSafe
error NotAEtherFiSafe()
NotInitializing
error NotInitializing()
OnlyEtherFiSafe
error OnlyEtherFiSafe()
OnlyRoleRegistryOwner
error OnlyRoleRegistryOwner()
OnlyUserCanRepayWithCollateral
error OnlyUserCanRepayWithCollateral()
OraclePriceZero
error OraclePriceZero()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
RepaymentAmountIsZero
error RepaymentAmountIsZero()
SharesCannotBeLessThanMinShares
error SharesCannotBeLessThanMinShares()
SharesCannotBeZero
error SharesCannotBeZero()
SupplyCapBreached
error SupplyCapBreached()
TotalBorrowingsForUserNotZero
error TotalBorrowingsForUserNotZero()
TotalCollateralAmountNotZero
error TotalCollateralAmountNotZero()
Unauthorized
error Unauthorized()
UnsupportedBorrowToken
error UnsupportedBorrowToken()
UnsupportedCollateralToken
error UnsupportedCollateralToken()
UnsupportedRepayToken
error UnsupportedRepayToken()
UserStillLiquidatable
error UserStillLiquidatable()
UUPSUnauthorizedCallContext
error UUPSUnauthorizedCallContext()
UUPSUnsupportedProxiableUUID
error UUPSUnsupportedProxiableUUID(bytes32 slot)
ZeroCollateralValue
error ZeroCollateralValue()
ZeroTotalBorrowTokens
error ZeroTotalBorrowTokens()
creation bytecode
0x60c060405230608052348015610013575f5ffd5b50604051612e83380380612e8383398101604081905261003291610101565b6001600160a01b03811660a0528061004861004f565b505061012e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161561009f5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100fe5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610111575f5ffd5b81516001600160a01b0381168114610127575f5ffd5b9392505050565b60805160a051612d1861016b5f395f818161050801528181610ca0015261202601525f8181611982015281816119ab0152611b640152612d185ff3fe608060405260043610610195575f3560e01c806364752eec116100e7578063afe6ab0011610087578063c94f8d4211610062578063c94f8d421461049a578063cca644c3146104b9578063e5dbbeeb146104d8578063f9fba81b146104f7575f5ffd5b8063afe6ab001461043d578063b7fe2f281461045c578063c0de42e51461047b575f5ffd5b80638456cb59116100c25780638456cb59146103b257806392f1079a146103c6578063aaf5eb68146103e5578063ad3cb1cc14610400575f5ffd5b806364752eec146103465780636ed93dd014610365578063711eb22b14610381575f5ffd5b80633b155e41116101525780634766162c1161012d5780634766162c146102cd5780634f1ef286146102fc57806352d1902d1461030f5780635c975abb14610323575f5ffd5b80633b155e411461027b5780633f4ba83a1461029a5780634142152e146102ae575f5ffd5b806308c7325914610199578063186c66cc146101ca5780631f300d0e146101f757806324d86a1b146102185780632b180bcf1461024657806336394bd11461025c575b5f5ffd5b3480156101a4575f5ffd5b506101ad61052a565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101d5575f5ffd5b506101e96101e4366004612655565b610558565b6040516101c1929190612670565b348015610202575f5ffd5b50610216610211366004612655565b61068b565b005b348015610223575f5ffd5b506102385f516020612c8c5f395f51905f5281565b6040519081526020016101c1565b348015610251575f5ffd5b50610238620f424081565b348015610267575f5ffd5b50610216610276366004612702565b61082f565b348015610286575f5ffd5b50610216610295366004612744565b610910565b3480156102a5575f5ffd5b506102166109c0565b3480156102b9575f5ffd5b506102386102c8366004612777565b610a27565b3480156102d8575f5ffd5b506102ec6102e7366004612655565b610a98565b60405190151581526020016101c1565b61021661030a3660046127f2565b610ab0565b34801561031a575f5ffd5b50610238610acf565b34801561032e575f5ffd5b505f516020612cec5f395f51905f525460ff166102ec565b348015610351575f5ffd5b50610238610360366004612655565b610aea565b348015610370575f5ffd5b5061023868056bc75e2d6310000081565b34801561038c575f5ffd5b5061039a650171268b5ad481565b6040516001600160401b0390911681526020016101c1565b3480156103bd575f5ffd5b50610216610be7565b3480156103d1575f5ffd5b506102ec6103e0366004612655565b610c4c565b3480156103f0575f5ffd5b50610238670de0b6b3a764000081565b34801561040b575f5ffd5b50610430604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101c19190612897565b348015610448575f5ffd5b506102386104573660046128cc565b610c77565b348015610467575f5ffd5b50610216610476366004612986565b610db7565b348015610486575f5ffd5b50610216610495366004612655565b610e62565b3480156104a5575f5ffd5b506102386104b4366004612655565b610fe6565b3480156104c4575f5ffd5b506102166104d33660046129b1565b611086565b3480156104e3575f5ffd5b506102166104f23660046129db565b611131565b348015610502575f5ffd5b506101ad7f000000000000000000000000000000000000000000000000000000000000000081565b7fa5586bb7fe6c4d1a576fc53fefe6d5915940638d338769f6905020734977f500546001600160a01b031690565b60605f5f516020612cac5f395f51905f52816105937f607698a05bce028f7bdc9529d6ab4a3ba381baf9d53007699c53d9e5dd543c016111f3565b90505f816001600160401b038111156105ae576105ae6127ae565b6040519080825280602002602001820160405280156105f257816020015b604080518082019091525f80825260208201528152602001906001900390816105cc5790505b5090505f80805b8481101561067c575f61060f6001880183611244565b90505f61061c8b83610a27565b905080156106725761062e8186612a2d565b94506040518060400160405280836001600160a01b031681526020018281525086858151811061066057610660612a40565b60200260200101819052508360010193505b50506001016105f9565b50825290969095509350505050565b5f516020612c8c5f395f51905f526106a161052a565b604051632474521560e21b8152600481018390523360248201526001600160a01b0391909116906391d1485490604401602060405180830381865afa1580156106ec573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107109190612a54565b61072c576040516282b42960e81b815260040160405180910390fd5b5f516020612cac5f395f51905f5261074383610c4c565b61076057604051634211ebcf60e01b815260040160405180910390fd5b6107698361129d565b156107865760405162cd86e760e41b815260040160405180910390fd5b5f610793826001016111f3565b9050806001036107b657604051630755511f60e41b815260040160405180910390fd5b6107c3600183018561131c565b506001600160a01b0384165f81815260028481016020908152604080842084815560018101859055928301849055600390920192909255519182527f4b8ac63c38f57c8602118d0c39a3bb0a9607e924c7bf802d8f6be9a850f81db5910160405180910390a150505050565b5f516020612c8c5f395f51905f5261084561052a565b604051632474521560e21b8152600481018390523360248201526001600160a01b0391909116906391d1485490604401602060405180830381865afa158015610890573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b49190612a54565b6108d0576040516282b42960e81b815260040160405180910390fd5b6108d984610a98565b6108f6576040516375e72ed760e11b815260040160405180910390fd5b6108ff84611451565b61090a8484846114fb565b50505050565b5f516020612c8c5f395f51905f5261092661052a565b604051632474521560e21b8152600481018390523360248201526001600160a01b0391909116906391d1485490604401602060405180830381865afa158015610971573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109959190612a54565b6109b1576040516282b42960e81b815260040160405180910390fd5b6109bb838361171f565b505050565b6109c861052a565b6040516317bf301f60e21b81523360048201526001600160a01b039190911690635efcc07c906024015f6040518083038186803b158015610a07575f5ffd5b505afa158015610a19573d5f5f3e3d5ffd5b50505050610a2561185a565b565b6001600160a01b038281165f9081527f607698a05bce028f7bdc9529d6ab4a3ba381baf9d53007699c53d9e5dd543c04602090815260408083209385168352929052908120545f516020612cac5f395f51905f5290610a8e90610a8985610aea565b6118b9565b9150505b92915050565b5f610a925f516020612cac5f395f51905f52836118ce565b610ab8611977565b610ac182611a1b565b610acb8282611a98565b5050565b5f610ad8611b59565b505f516020612ccc5f395f51905f5290565b6001600160a01b0381165f9081527f607698a05bce028f7bdc9529d6ab4a3ba381baf9d53007699c53d9e5dd543c0260209081526040808320815160c08101835281548152600182015493810193909352600281015491830191909152600301546001600160401b0380821660608401819052600160401b83049091166080840152600160801b9091046001600160801b031660a08301528290610b8e9042612a73565b9050805f03610b9f57505192915050565b5f610bce8284608001516001600160401b0316610bbc9190612a86565b84519068056bc75e2d63100000611ba2565b8351909150610bde908290612a2d565b95945050505050565b610bef61052a565b604051632fd0067b60e21b81523360048201526001600160a01b03919091169063bf4019ec906024015f6040518083038186803b158015610c2e575f5ffd5b505afa158015610c40573d5f5f3e3d5ffd5b50505050610a25611c58565b5f610a927f607698a05bce028f7bdc9529d6ab4a3ba381baf9d53007699c53d9e5dd543c01836118ce565b5f610c8183610a98565b610c9e5760405163eece95c360e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630a065fb66040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cfa573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d1e9190612a9d565b6040516315d5220f60e31b81526001600160a01b038581166004830152919091169063aea9107890602401602060405180830381865afa158015610d64573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d889190612ab8565b610d9184611ca0565b610d9c90600a612bb2565b610da69084612a86565b610db09190612bd4565b9392505050565b5f516020612c8c5f395f51905f52610dcd61052a565b604051632474521560e21b8152600481018390523360248201526001600160a01b0391909116906391d1485490604401602060405180830381865afa158015610e18573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e3c9190612a54565b610e58576040516282b42960e81b815260040160405180910390fd5b6109bb8383611d01565b5f516020612c8c5f395f51905f52610e7861052a565b604051632474521560e21b8152600481018390523360248201526001600160a01b0391909116906391d1485490604401602060405180830381865afa158015610ec3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ee79190612a54565b610f03576040516282b42960e81b815260040160405180910390fd5b5f516020612cac5f395f51905f526001600160a01b038316610f3857604051632a9ffab760e21b815260040160405180910390fd5b610f4183610c4c565b15610f5f576040516328655f9960e11b815260040160405180910390fd5b610f6883610a98565b610f85576040516375e72ed760e11b815260040160405180910390fd5b610f8f818461131c565b506001600160a01b0383165f81815260038301602090815260408083209290925590519182527f066186f1dd144b0baa72e90264076813d8f2dfce7c39704ea68d159cee4305b791015b60405180910390a1505050565b6001600160a01b0381165f9081527f607698a05bce028f7bdc9529d6ab4a3ba381baf9d53007699c53d9e5dd543c0260209081526040808320815160c081018352815481526001820154938101849052600282015492810192909252600301546001600160401b038082166060840152600160401b8204166080830152600160801b90046001600160801b031660a082015290610db090610a8985610aea565b5f516020612c8c5f395f51905f5261109c61052a565b604051632474521560e21b8152600481018390523360248201526001600160a01b0391909116906391d1485490604401602060405180830381865afa1580156110e7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061110b9190612a54565b611127576040516282b42960e81b815260040160405180910390fd5b6109bb8383611eb8565b5f516020612c8c5f395f51905f5261114761052a565b604051632474521560e21b8152600481018390523360248201526001600160a01b0391909116906391d1485490604401602060405180830381865afa158015611192573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111b69190612a54565b6111d2576040516282b42960e81b815260040160405180910390fd5b6111db83611fc7565b6109bb836111ee36859003850185612be7565b611d01565b63978aab926004525f8181526024812080548060a01b60a01c8060011c9350808260601c151761123c5760019350838301541561123c5760029350838301541561123c57600393505b505050919050565b63978aab926004525f828152602481208281015460601c915068fbb67fda52d4bfb8bf82141582029150611277846111f3565b831061129657604051634e23d03560e01b815260040160405180910390fd5b5092915050565b6040516370a0823160e01b81523060048201525f906001600160a01b038316906370a0823190602401602060405180830381865afa1580156112e1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113059190612ab8565b6113128361045785610fe6565b610a929190612a2d565b63978aab926004525f828152602481206001600160a01b03929092169168fbb67fda52d4bfb8be1983016113575763f5a267f15f526004601cfd5b826113695768fbb67fda52d4bfb8bf92505b80546001600160601b038116806113e35760019350848260601c036113a15760018301805484556002840180549091555f9055611448565b84600184015460601c036113c25760028301805460018501555f9055611448565b84600284015460601c036113db575f6002840155611448565b5f9350611448565b82602052845f5260405f208054806113fc575050611448565b60018360011c03925082600182031461142c578285015460601c8060601b60018303870155805f52508060405f20555b5060018260011b17845460601c60601b1784555f815550600193505b50505092915050565b6001600160a01b03811661147857604051632a9ffab760e21b815260040160405180910390fd5b5f516020612cac5f395f51905f5261148f82610c4c565b156114ad5760405163609a144d60e11b815260040160405180910390fd5b6114ba6001820183612174565b506040516001600160a01b03831681527fb7c3f684da24b5ce3721043b9671e1a95e871a22a3cf23861c550833ceb52f8c9060200160405180910390a15050565b6001600160401b038216158061151f5750650171268b5ad46001600160401b038316115b8061153157506001600160801b038116155b1561154f57604051632a9ffab760e21b815260040160405180910390fd5b5f5f516020612cac5f395f51905f5290505f6040518060c00160405280670de0b6b3a764000081526020015f81526020015f8152602001426001600160401b03168152602001856001600160401b03168152602001846001600160801b0316815250905080826002015f876001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015560208201518160010155604082015181600201556060820151816003015f6101000a8154816001600160401b0302191690836001600160401b0316021790555060808201518160030160086101000a8154816001600160401b0302191690836001600160401b0316021790555060a08201518160030160106101000a8154816001600160801b0302191690836001600160801b03160217905550905050846001600160a01b03167f1ad7ec344404069a779d110ce8e12ead2a2d263f4ea2728ac643e52913ac39048260405161171091905f60c0820190508251825260208301516020830152604083015160408301526001600160401b0360608401511660608301526001600160401b0360808401511660808301526001600160801b0360a08401511660a083015292915050565b60405180910390a25050505050565b6001600160401b03811615806117435750650171268b5ad46001600160401b038216115b1561176157604051632a9ffab760e21b815260040160405180910390fd5b61176a82610c4c565b6117875760405163454467e960e11b815260040160405180910390fd5b5f516020612cac5f395f51905f5261179e836122cf565b506001600160a01b0383165f818152600283016020908152604091829020600301548251600160401b9091046001600160401b0390811682528616918101919091527f0a79a2c3945fa1460b7ce0aa563cc1cd6424a51a3f0d888754e797ebb54baf66910160405180910390a26001600160a01b039092165f9081526002909201602052604090912060030180546001600160401b03909216600160401b026fffffffffffffffff000000000000000019909216919091179055565b61186261239b565b5f516020612cec5f395f51905f52805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b5f610db08383670de0b6b3a7640000846123ca565b63978aab926004525f828152602481206001600160a01b03929092169168fbb67fda52d4bfb8be1983016119095763f5a267f15f526004601cfd5b8261191b5768fbb67fda52d4bfb8bf92505b80546001600160601b03811661195e5760019250838160601c031561196f57600182015460601c841461196f57600282015460601c841461196f575f925061196f565b81602052835f5260405f2054151592505b505092915050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806119fd57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166119f15f516020612ccc5f395f51905f52546001600160a01b031690565b6001600160a01b031614155b15610a255760405163703e46dd60e11b815260040160405180910390fd5b5f7fa5586bb7fe6c4d1a576fc53fefe6d5915940638d338769f6905020734977f5008054604051634766d28760e01b81523360048201529192506001600160a01b031690634766d287906024015f6040518083038186803b158015611a7e575f5ffd5b505afa158015611a90573d5f5f3e3d5ffd5b505050505050565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611af2575060408051601f3d908101601f19168201909252611aef91810190612ab8565b60015b611b1f57604051634c9c8ce360e01b81526001600160a01b03831660048201526024015b60405180910390fd5b5f516020612ccc5f395f51905f528114611b4f57604051632a87526960e21b815260048101829052602401611b16565b6109bb838361240c565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a255760405163703e46dd60e11b815260040160405180910390fd5b5f838302815f1985870982811083820303915050805f03611bd657838281611bcc57611bcc612bc0565b0492505050610db0565b808411611bed57611bed6003851502601118612461565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b611c60612472565b5f516020612cec5f395f51905f52805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2583361189b565b5f816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cdd573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a929190612c01565b80602001516001600160501b0316815f01516001600160501b03161115611d3b576040516310cbf98b60e31b815260040160405180910390fd5b68056bc75e2d63100000816040015182602001516001600160501b0316611d629190612c21565b6001600160601b03161115611d8a57604051632a9ffab760e21b815260040160405180910390fd5b6001600160a01b0382165f8181527f607698a05bce028f7bdc9529d6ab4a3ba381baf9d53007699c53d9e5dd543c036020908152604091829020825190546001600160501b038082168352605082901c81168385015260a091821c83860152865181166060840152928601519092166080820152848301516001600160601b03169181019190915290515f516020612cac5f395f51905f5292917f011128805ea0277047e3f7163c2d734358e71e614d3c0487497ef1813a2ea110919081900360c00190a26001600160a01b039283165f90815260039091016020908152604091829020835181549285015193909401516001600160601b0316600160a01b026001600160501b03938416600160501b026001600160a01b0319909316939094169290921717909216179055565b806001600160801b03165f03611ee157604051632a9ffab760e21b815260040160405180910390fd5b611eea82610c4c565b611f075760405163454467e960e11b815260040160405180910390fd5b5f516020612cac5f395f51905f52611f1e836122cf565b506001600160a01b0383165f818152600283016020908152604091829020600301548251600160801b9091046001600160801b0390811682528616918101919091527f78da2ff1f01b52fe1edeea7326ccef6bc345f0807196b4723b841dd62a30958a910160405180910390a26001600160a01b039092165f9081526002909201602052604090912060030180546001600160801b03928316600160801b029216919091179055565b6001600160a01b038116611fee57604051632a9ffab760e21b815260040160405180910390fd5b5f516020612cac5f395f51905f5261200582610a98565b156120235760405163fb2db6f160e01b815260040160405180910390fd5b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630a065fb66040518163ffffffff1660e01b8152600401602060405180830381865afa158015612080573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120a49190612a9d565b6040516315d5220f60e31b81526001600160a01b038581166004830152919091169063aea9107890602401602060405180830381865afa1580156120ea573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061210e9190612ab8565b9050805f03612130576040516315e5656b60e21b815260040160405180910390fd5b61213a8284612174565b506040516001600160a01b03841681527fd61bc477a25fa080e2c32ed9e4417ba4861d11b873216136586ddedadcff2f0290602001610fd9565b63978aab926004525f828152602481206001600160a01b03929092169168fbb67fda52d4bfb8be1983016121af5763f5a267f15f526004601cfd5b826121c15768fbb67fda52d4bfb8bf92505b80546001600160601b0381168260205280612283578160601c806121ef578560601b84556001945050611448565b8581036121fc5750611448565b600184015460601c8061221d578660601b6001860155600195505050611448565b86810361222b575050611448565b600285015460601c8061224d578760601b600287015560019650505050611448565b87810361225c57505050611448565b5f928352604080842060019055918352818320600290558252902060039055506007908117905b845f5260405f2080546122c557600191821c8083018255919450816122b1578560601b600317845550611448565b8560601b8285015582600201845550611448565b5050505092915050565b6001600160a01b0381165f9081527f607698a05bce028f7bdc9529d6ab4a3ba381baf9d53007699c53d9e5dd543c02602052604081206003810154426001600160401b0390911603612322575492915050565b805461232d84610aea565b80835560038301805467ffffffffffffffff1916426001600160401b03161790556040805183815260208101929092526001600160a01b038616917fc6ecd996cf998cfeedb2b1379b047e8579d888439dacbc60641c6dfd07f1f802910160405180910390a2505492915050565b5f516020612cec5f395f51905f525460ff16610a2557604051638dfc202b60e01b815260040160405180910390fd5b5f6123f76123d7836124a2565b80156123f257505f84806123ed576123ed612bc0565b868809115b151590565b612402868686611ba2565b610bde9190612a2d565b612415826124ce565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115612459576109bb8282612531565b610acb61259a565b634e487b715f52806020526024601cfd5b5f516020612cec5f395f51905f525460ff1615610a255760405163d93c066560e01b815260040160405180910390fd5b5f60028260038111156124b7576124b7612c40565b6124c19190612c54565b60ff166001149050919050565b806001600160a01b03163b5f0361250357604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611b16565b5f516020612ccc5f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f846001600160a01b03168460405161254d9190612c75565b5f60405180830381855af49150503d805f8114612585576040519150601f19603f3d011682016040523d82523d5f602084013e61258a565b606091505b5091509150610bde8583836125b9565b3415610a255760405163b398979f60e01b815260040160405180910390fd5b6060826125ce576125c982612615565b610db0565b81511580156125e557506001600160a01b0384163b155b1561260e57604051639996b31560e01b81526001600160a01b0385166004820152602401611b16565b5080610db0565b8051156126255780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b50565b6001600160a01b038116811461263e575f5ffd5b5f60208284031215612665575f5ffd5b8135610db081612641565b604080825283519082018190525f9060208501906060840190835b818110156126be57835180516001600160a01b03168452602090810151818501529093019260409092019160010161268b565b5050602093909301939093525092915050565b80356001600160401b03811681146126e7575f5ffd5b919050565b80356001600160801b03811681146126e7575f5ffd5b5f5f5f60608486031215612714575f5ffd5b833561271f81612641565b925061272d602085016126d1565b915061273b604085016126ec565b90509250925092565b5f5f60408385031215612755575f5ffd5b823561276081612641565b915061276e602084016126d1565b90509250929050565b5f5f60408385031215612788575f5ffd5b823561279381612641565b915060208301356127a381612641565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b03811182821017156127ea576127ea6127ae565b604052919050565b5f5f60408385031215612803575f5ffd5b823561280e81612641565b915060208301356001600160401b03811115612828575f5ffd5b8301601f81018513612838575f5ffd5b80356001600160401b03811115612851576128516127ae565b612864601f8201601f19166020016127c2565b818152866020838501011115612878575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f604083850312156128dd575f5ffd5b82356128e881612641565b946020939093013593505050565b80356001600160501b03811681146126e7575f5ffd5b5f6060828403121561291c575f5ffd5b604051606081016001600160401b038111828210171561293e5761293e6127ae565b60405290508061294d836128f6565b815261295b602084016128f6565b602082015260408301356001600160601b0381168114612979575f5ffd5b6040919091015292915050565b5f5f60808385031215612997575f5ffd5b82356129a281612641565b915061276e846020850161290c565b5f5f604083850312156129c2575f5ffd5b82356129cd81612641565b915061276e602084016126ec565b5f5f82840360808112156129ed575f5ffd5b83356129f881612641565b92506060601f1982011215612a0b575f5ffd5b506020830190509250929050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610a9257610a92612a19565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612a64575f5ffd5b81518015158114610db0575f5ffd5b81810381811115610a9257610a92612a19565b8082028115828204841417610a9257610a92612a19565b5f60208284031215612aad575f5ffd5b8151610db081612641565b5f60208284031215612ac8575f5ffd5b5051919050565b6001815b6001841115612b0a57808504811115612aee57612aee612a19565b6001841615612afc57908102905b60019390931c928002612ad3565b935093915050565b5f82612b2057506001610a92565b81612b2c57505f610a92565b8160018114612b425760028114612b4c57612b68565b6001915050610a92565b60ff841115612b5d57612b5d612a19565b50506001821b610a92565b5060208310610133831016604e8410600b8410161715612b8b575081810a610a92565b612b975f198484612acf565b805f1904821115612baa57612baa612a19565b029392505050565b5f610db060ff841683612b12565b634e487b7160e01b5f52601260045260245ffd5b5f82612be257612be2612bc0565b500490565b5f60608284031215612bf7575f5ffd5b610db0838361290c565b5f60208284031215612c11575f5ffd5b815160ff81168114610db0575f5ffd5b6001600160601b038181168382160190811115610a9257610a92612a19565b634e487b7160e01b5f52602160045260245ffd5b5f60ff831680612c6657612c66612bc0565b8060ff84160691505092915050565b5f82518060208501845e5f92019182525091905056fecda823d74cf986ec31c71a83e1e23c851af1104972cb36530a474c8f1f53eb5a607698a05bce028f7bdc9529d6ab4a3ba381baf9d53007699c53d9e5dd543c00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbccd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300a164736f6c634300081c000a0000000000000000000000004a9c44c97bbf6079db37c4769aebe425bbcdd09a