0 txs
48 calls
constructor
constructor(address _fxUSD, address _counterparty, address _configuration)
functions
accumulatedPoolCloseFees
viewfunction accumulatedPoolCloseFees(address) view returns (uint256)
accumulatedPoolMiscFees
viewfunction accumulatedPoolMiscFees(address) view returns (uint256)
accumulatedPoolOpenFees
viewfunction accumulatedPoolOpenFees(address) view returns (uint256)
allocations
viewfunction allocations(address) view returns (address strategy, uint96 capacity)
ASSET_MANAGER_ROLE
viewfunction ASSET_MANAGER_ROLE() view returns (bytes32)
closeRevenuePool
viewfunction closeRevenuePool() view returns (address)
configuration
viewfunction configuration() view returns (address)
counterparty
viewfunction counterparty() view returns (address)
DEBT_REDUCER_ROLE
viewfunction DEBT_REDUCER_ROLE() view returns (bytes32)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
EMERGENCY_ROLE
viewfunction EMERGENCY_ROLE() view returns (bytes32)
flashFee
viewfunction flashFee(address, uint256 amount) view returns (uint256)
fxUSD
viewfunction fxUSD() view returns (address)
getFlashLoanFeeRatio
viewfunction getFlashLoanFeeRatio() view returns (uint256)
getFundingExpenseRatio
viewfunction getFundingExpenseRatio() view returns (uint256)
getHarvesterRatio
viewfunction getHarvesterRatio() view returns (uint256)
getLiquidationExpenseRatio
viewfunction getLiquidationExpenseRatio() view returns (uint256)
getMinRawDebt
viewfunction getMinRawDebt(address pool) view returns (uint256 minRawDebt)
getPoolInfo
viewfunction getPoolInfo(address pool) view returns (uint256 collateralCapacity, uint256 collateralBalance, uint256 rawDebtCapacity, uint256 rawDebtBalance)
getRedeemFeeRatio
viewfunction getRedeemFeeRatio() view returns (uint256)
getRewardsExpenseRatio
viewfunction getRewardsExpenseRatio() view returns (uint256)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
HARVESTER_ROLE
viewfunction HARVESTER_ROLE() view returns (bytes32)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
maxFlashLoan
viewfunction maxFlashLoan(address token) view returns (uint256)
miscRevenuePool
viewfunction miscRevenuePool() view returns (address)
openRevenuePool
viewfunction openRevenuePool() view returns (address)
paused
viewfunction paused() view returns (bool)
POOL_KILLER_ROLE
viewfunction POOL_KILLER_ROLE() view returns (bytes32)
redeem
purefunction redeem(address, uint256, uint256) pure returns (uint256, uint256)
reservePool
viewfunction reservePool() view returns (address)
rewardSplitter
viewfunction rewardSplitter(address) view returns (address)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
tokenRates
viewfunction tokenRates(address) view returns (uint96 scalar, address rateProvider)
treasury
viewfunction treasury() view returns (address)
alloc
nonpayablefunction alloc(address asset, address strategy, uint96 capacity)
flashLoan
nonpayablefunction flashLoan(address receiver, address token, uint256 amount, bytes data) returns (bool)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
harvest
nonpayablefunction harvest(address pool) returns (uint256 amountRewards, uint256 amountFunding)
initialize
nonpayablefunction initialize(address admin, uint256 _expenseRatio, uint256 _harvesterRatio, uint256 _flashLoanFeeRatio, address _treasury, address _revenuePool, address _reservePool)
kill
nonpayablefunction kill(address asset)
killPool
nonpayablefunction killPool(address pool)
liquidate
nonpayablefunction liquidate(address pool, address receiver, uint256 maxRawDebts) returns (uint256 colls, uint256 debts)
manage
nonpayablefunction manage(address asset, uint256 amount)
operate
nonpayablefunction operate(address pool, uint256 positionId, int256 newColl, int256 newDebt) returns (uint256)
rebalance
nonpayablefunction rebalance(address pool, address receiver, int16 tick, uint256 maxRawDebts) returns (uint256 colls, uint256 debts)
rebalance
nonpayablefunction rebalance(address pool, address receiver, uint256 maxRawDebts) returns (uint256 colls, uint256 debts)
redeemByCreditNote
nonpayablefunction redeemByCreditNote(address pool, uint256 debts, uint256 minColls) returns (uint256 colls)
reduceDebt
nonpayablefunction reduceDebt(address pool, uint256 amount)
registerPool
nonpayablefunction registerPool(address pool, address splitter, uint96 collateralCapacity, uint96 debtCapacity, uint64 minDebt)
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
setPause
nonpayablefunction setPause(bool status)
updateCloseRevenuePool
nonpayablefunction updateCloseRevenuePool(address _newPool)
updateExpenseRatio
nonpayablefunction updateExpenseRatio(uint32 newRewardsRatio, uint32 newFundingRatio, uint32 newLiquidationRatio)
updateFlashLoanFeeRatio
nonpayablefunction updateFlashLoanFeeRatio(uint32 newRatio)
updateHarvesterRatio
nonpayablefunction updateHarvesterRatio(uint32 newRatio)
updateMiscRevenuePool
nonpayablefunction updateMiscRevenuePool(address _newPool)
updateOpenRevenuePool
nonpayablefunction updateOpenRevenuePool(address _newPool)
updatePoolCapacity
nonpayablefunction updatePoolCapacity(address pool, uint96 collateralCapacity, uint96 debtCapacity)
updatePoolMinDebt
nonpayablefunction updatePoolMinDebt(address pool, uint64 minDebt)
updateRateProvider
nonpayablefunction updateRateProvider(address token, address provider)
updateRedeemFeeRatio
nonpayablefunction updateRedeemFeeRatio(uint32 newRatio)
updateReservePool
nonpayablefunction updateReservePool(address _newReservePool)
updateRewardSplitter
nonpayablefunction updateRewardSplitter(address pool, address newSplitter)
updateTreasury
nonpayablefunction updateTreasury(address _newTreasury)
withdrawAccumulatedPoolFee
nonpayablefunction withdrawAccumulatedPoolFee(address[] pools)
events
Harvest
event Harvest(address indexed caller, address indexed pool, uint256 amountRewards, uint256 amountFunding, uint256 performanceFee, uint256 harvestBounty)
Initialized
event Initialized(uint64 version)
KillPool
event KillPool(address indexed pool, uint256 rawColls, uint256 rawDebts, uint256 shortfall)
Liquidate
event Liquidate(address indexed pool, uint256 colls, uint256 debts)
Operate
event Operate(address indexed pool, uint256 indexed position, int256 deltaColls, int256 deltaDebts, uint256 protocolFees)
Paused
event Paused(address account)
Rebalance
event Rebalance(address indexed pool, uint256 colls, uint256 debts)
RebalanceTick
event RebalanceTick(address indexed pool, int16 indexed tick, uint256 colls, uint256 debts)
Redeem
event Redeem(address indexed pool, uint256 colls, uint256 debts, uint256 protocolFees)
RedeemByCreditNote
event RedeemByCreditNote(address indexed pool, uint256 colls, uint256 debts, uint256 protocolFees)
ReduceDebt
event ReduceDebt(address indexed pool, uint256 amount)
RegisterPool
event RegisterPool(address indexed pool)
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)
Unpaused
event Unpaused(address account)
UpdateCloseRevenuePool
event UpdateCloseRevenuePool(address indexed oldPool, address indexed newPool)
UpdateFlashLoanFeeRatio
event UpdateFlashLoanFeeRatio(uint256 oldRatio, uint256 newRatio)
UpdateFundingExpenseRatio
event UpdateFundingExpenseRatio(uint256 oldRatio, uint256 newRatio)
UpdateHarvesterRatio
event UpdateHarvesterRatio(uint256 oldRatio, uint256 newRatio)
UpdateLiquidationExpenseRatio
event UpdateLiquidationExpenseRatio(uint256 oldRatio, uint256 newRatio)
UpdateMiscRevenuePool
event UpdateMiscRevenuePool(address indexed oldPool, address indexed newPool)
UpdateOpenRevenuePool
event UpdateOpenRevenuePool(address indexed oldPool, address indexed newPool)
UpdatePoolCapacity
event UpdatePoolCapacity(address indexed pool, uint256 collateralCapacity, uint256 debtCapacity)
UpdateRedeemFeeRatio
event UpdateRedeemFeeRatio(uint256 oldRatio, uint256 newRatio)
UpdateReservePool
event UpdateReservePool(address indexed oldReservePool, address indexed newReservePool)
UpdateRewardsExpenseRatio
event UpdateRewardsExpenseRatio(uint256 oldRatio, uint256 newRatio)
UpdateRewardSplitter
event UpdateRewardSplitter(address indexed pool, address indexed oldSplitter, address indexed newSplitter)
UpdateTokenRate
event UpdateTokenRate(address indexed token, uint256 scalar, address provider)
UpdateTreasury
event UpdateTreasury(address indexed oldTreasury, address indexed newTreasury)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
AddressEmptyCode
error AddressEmptyCode(address target)
AddressInsufficientBalance
error AddressInsufficientBalance(address account)
EnforcedPause
error EnforcedPause()
ErrorCollateralExceedCapacity
error ErrorCollateralExceedCapacity()
ErrorDebtExceedCapacity
error ErrorDebtExceedCapacity()
ErrorDebtsTooSmall
error ErrorDebtsTooSmall()
ErrorERC3156CallbackFailed
error ErrorERC3156CallbackFailed()
ErrorInsufficientFlashLoanReturn
error ErrorInsufficientFlashLoanReturn()
ErrorInsufficientRedeemedCollateral
error ErrorInsufficientRedeemedCollateral()
ErrorInvalidPool
error ErrorInvalidPool()
ErrorPoolNotRegistered
error ErrorPoolNotRegistered()
ErrorPoolNotUnderCollateral
error ErrorPoolNotUnderCollateral()
ErrorRedeemExceedTotalDebt
error ErrorRedeemExceedTotalDebt()
ErrorUnderCollateral
error ErrorUnderCollateral()
ErrorValueTooLarge
error ErrorValueTooLarge()
ErrorZeroAddress
error ErrorZeroAddress()
ExpectedPause
error ExpectedPause()
FailedInnerCall
error FailedInnerCall()
InvalidInitialization
error InvalidInitialization()
NotInitializing
error NotInitializing()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
creation bytecode
0x60e060405234801561000f575f80fd5b506040516150c93803806150c983398101604081905261002e91610066565b6001600160a01b0392831660805290821660a0521660c0526100a6565b80516001600160a01b0381168114610061575f80fd5b919050565b5f805f60608486031215610078575f80fd5b6100818461004b565b925061008f6020850161004b565b915061009d6040850161004b565b90509250925092565b60805160a05160c051614f826101475f395f818161074101526128f001525f818161095f01528181610bed015281816117710152818161205201528181612366015281816136ea01528181613e0c0152613f7601525f818161076801528181610f0901528181610f4d01528181610f98015281816111d001528181611317015281816117490152818161381401528181613d370152613de20152614f825ff3fe608060405234801561000f575f80fd5b50600436106103e0575f3560e01c806371bffd331161020b578063b754d58d1161011f578063d2001124116100b4578063eedfb05f11610084578063eedfb05f14610a1a578063f03577fa14610a2d578063f46bef2014610a40578063f899980a14610a53578063f9260a8d14610a5b575f80fd5b8063d2001124146109ce578063d547741f146109e1578063d890cba9146109f4578063d9d98ce414610a07575f80fd5b8063c3df6546116100ef578063c3df65461461095a578063c52d087b14610981578063cbf0b0c014610994578063cf0a5a9a146109a7575f80fd5b8063b754d58d1461090e578063bedb86fb14610921578063bf6f5b0014610934578063c1c8f15b14610947575f80fd5b806391d14854116101a0578063a217fddf11610170578063a217fddf146108bd578063a4b32de8146108c4578063a69f4935146108eb578063acdd515a146108f3578063b3f865f7146108fb575f80fd5b806391d148541461087057806393014f4614610883578063996a0aa9146108a25780639bd3bd38146108b5575f80fd5b8063807d3f1d116101db578063807d3f1d146107d657806385184db7146107e957806386403125146107fc5780638e57338d1461085d575f80fd5b806371bffd331461078a57806372838c911461079d57806372f6988b146107b05780637f51bb1f146107c3575f80fd5b80632b83cccd1161030257806352a9039c11610297578063613255ab11610267578063613255ab146106ef57806361d027b31461070257806363a560ec146107155780636c70bee91461073c5780636dbe4bb914610763575f80fd5b806352a9039c1461065c5780635c975abb146106bd5780635cb3ccaa146106d45780635cffe9de146106dc575f80fd5b806336568abe116102d257806336568abe146105fb5780633eb9c6941461060e57806349bc779b146106215780634ac6f0e014610634575f80fd5b80632b83cccd146105af5780632e11c849146105c25780632f2ff15d146105d55780633016a581146105e8575f80fd5b8063153f7cd0116103785780632354d83f116103485780632354d83f14610562578063248a9ca31461056a57806326c013031461057d578063285ab4c314610590575f80fd5b8063153f7cd0146105025780631ace9a7c1461051557806320df43591461052857806322e7d89e1461054f575f80fd5b80630877e854116103b35780630877e8541461049f5780630b0eee30146104b45780630c932dc8146104c75780630e5c011e146104da575f80fd5b806301ffc9a7146103e45780630266f0441461040c57806303018c111461043757806306bfa9381461046c575b5f80fd5b6103f76103f23660046144e7565b610a7a565b60405190151581526020015b60405180910390f35b60035461041f906001600160a01b031681565b6040516001600160a01b039091168152602001610403565b61045e7f1be5d1ebf823e636f9019a4a28b5fb56a6c9c490fea63cb140cde243b9045b5381565b604051908152602001610403565b61047f61047a366004614522565b610ab0565b604080519485526020850193909352918301526060820152608001610403565b6104b26104ad36600461456f565b610b2e565b005b6104b26104c23660046145d4565b610c3c565b6104b26104d5366004614522565b610d9a565b6104ed6104e8366004614522565b610db1565b60408051928352602083019190915201610403565b6104b2610510366004614522565b611036565b60055461041f906001600160a01b031681565b61045e7fbf233dd2aafeb4d50879c4aa5c81e96d92f6e6945c906a58f9f2d1c1631b4b2681565b6104b261055d366004614611565b611049565b61045e611086565b61045e610578366004614651565b61109b565b6104ed61058b366004614668565b6110bb565b61045e61059e366004614522565b60046020525f908152604090205481565b6104ed6105bd3660046146a6565b6113f4565b6104b26105d03660046146d8565b611437565b6104b26105e336600461470f565b611474565b61045e6105f63660046146a6565b611490565b6104b261060936600461470f565b6118ba565b6104b261061c366004614732565b6118f2565b6104b261062f36600461476b565b611937565b61041f610642366004614522565b60996020525f90815260409020546001600160a01b031681565b61069661066a366004614522565b60646020525f90815260409020546001600160a01b03811690600160a01b90046001600160601b031682565b604080516001600160a01b0390931683526001600160601b03909116602083015201610403565b5f80516020614f0d8339815191525460ff166103f7565b61045e611a7b565b6103f76106ea3660046147e1565b611a8b565b61045e6106fd366004614522565b611cc2565b60015461041f906001600160a01b031681565b61045e7f3fc733b4d20d27a28452ddf0e9351aced28242fe03389a653cdb783955316b9b81565b61041f7f000000000000000000000000000000000000000000000000000000000000000081565b61041f7f000000000000000000000000000000000000000000000000000000000000000081565b6104ed61079836600461487a565b611d2a565b6104b26107ab3660046148ce565b611e9b565b6104b26107be366004614522565b611eb4565b6104b26107d1366004614522565b612201565b6104b26107e43660046145d4565b612214565b6104b26107f73660046146d8565b61249c565b61083661080a366004614522565b609a6020525f90815260409020546001600160601b03811690600160601b90046001600160a01b031682565b604080516001600160601b0390931683526001600160a01b03909116602083015201610403565b6104b261086b36600461492c565b6125ab565b6103f761087e36600461470f565b6125e0565b61045e610891366004614522565b60086020525f908152604090205481565b6104b26108b03660046149e0565b612616565b61045e612653565b61045e5f81565b61045e7fb1fadd3142ab2ad7f1337ea4d97112bcc8337fc11ce5b20cb04ad038adf9981981565b61045e612663565b61045e612672565b6104ed610909366004614668565b612681565b60025461041f906001600160a01b031681565b6104b261092f366004614a20565b6127bd565b6104b26109423660046148ce565b6127fd565b61045e610955366004614a3b565b612816565b61041f7f000000000000000000000000000000000000000000000000000000000000000081565b60075461041f906001600160a01b031681565b6104b26109a2366004614522565b612b57565b61045e7ffd96ca7a6c7f01e5a66091060058768505cfa54b5c8d0a65e34a4850c346656881565b6104b26109dc366004614522565b612c3d565b6104b26109ef36600461470f565b612c50565b6104b2610a02366004614a73565b612c6c565b61045e610a153660046145d4565b612d14565b6104b2610a283660046148ce565b612d3d565b6104b2610a3b366004614522565b612d56565b61045e610a4e366004614522565b612d69565b61045e612d73565b61045e610a69366004614522565b60066020525f908152604090205481565b5f6001600160e01b03198216637965db0b60e01b1480610aaa57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6001600160a01b0381165f90815260986020526040812054819081908190610ada81836060612d7f565b9450610ae881606080612d7f565b6001600160a01b0387165f90815260986020526040812060010154919550909150610b169082906060612d7f565b9250610b2481606080612d7f565b9150509193509193565b5f610b3881612d8d565b610b43609687612d9a565b15610c34576040516001600160a01b038716907fdfc596fabc6581c887262c97695176a79e3c8fc6ab7aaf14700820f3436b8fb9905f90a25f866001600160a01b031663f8d898986040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bdc9190614aa0565b9050610c136001600160a01b0382167f00000000000000000000000000000000000000000000000000000000000000005f19612dae565b610c1d8787612e6b565b610c28878686612ece565b610c328784612fa5565b505b505050505050565b7fb1fadd3142ab2ad7f1337ea4d97112bcc8337fc11ce5b20cb04ad038adf99819610c6681612d8d565b6001600160a01b038381165f908152606460209081526040808320815180830183529054948516808252600160a01b9095046001600160601b03168184015281516318160ddd60e01b815291519094926318160ddd92600480820193918290030181865afa158015610cda573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cfe9190614abb565b60208301519091506001600160601b0316610d198583614ae6565b1115610d23575f80fd5b8151610d3a906001600160a01b0387169086612ffc565b815160405163b6b55f2560e01b8152600481018690526001600160a01b039091169063b6b55f25906024015b5f604051808303815f87803b158015610d7d575f80fd5b505af1158015610d8f573d5f803e3d5ffd5b505050505050505050565b5f610da481612d8d565b610dad8261302d565b5050565b5f8082610dbf609682613087565b610ddc5760405163aaaf1ba760e01b815260040160405180910390fd5b7f3fc733b4d20d27a28452ddf0e9351aced28242fe03389a653cdb783955316b9b610e0681612d8d565b610e0e6130a8565b6001600160a01b0385165f90815260986020526040812054610e3281606080612d7f565b9150505f805f80896001600160a01b031663ee65a03c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e999190614abb565b905080851115610efa578085039750610eb48a895f036130df565b633b9aca0088610ec2611086565b0281610ed057610ed0614af9565b049350633b9aca0088610ee1612663565b0281610eef57610eef614af9565b049250838389030391505b8315610f3957600154610f39907f00000000000000000000000000000000000000000000000000000000000000009086906001600160a01b0316613170565b610f428a6132c6565b8215610f7357610f737f00000000000000000000000000000000000000000000000000000000000000008433613170565b8115610fc0576001600160a01b03808b165f90815260996020526040902054610fc0917f000000000000000000000000000000000000000000000000000000000000000091859116613170565b604080518a8152602081018a90528082018690526060810185905290516001600160a01b038c169133917fb97aa24214e8edbddacca4eccaa3910b760a7aa10a284e8b782d12f1137a75619181900360800190a3505050505061102f60015f80516020614f2d83398151915255565b5050915091565b5f61104081612d8d565b610dad82613421565b5f61105381612d8d565b6110628463ffffffff1661347b565b6110718363ffffffff166134d7565b6110808263ffffffff1661352c565b50505050565b5f8054611096906078601e612d7f565b905090565b5f9081525f80516020614eed833981519152602052604090206001015490565b5f80846110c9609682613087565b6110e65760405163aaaf1ba760e01b815260040160405180910390fd5b6110ee6130a8565b6110f6613581565b61110086856135b3565b5f866001600160a01b031663cdc6c7cc6040518163ffffffff1660e01b815260040160408051808303815f875af115801561113d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111619190614b0d565b509050801561118357604051635cbe463960e01b815260040160405180910390fd5b5f61118d886135e0565b90506111b660405180608001604052805f81526020015f81526020015f81526020015f81525090565b60035460405163f8b2cb4f60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301525f92169063f8b2cb4f90602401602060405180830381865afa15801561121e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112429190614abb565b60405163d296d1f160e01b8152600481018a9052602481018290529091506001600160a01b038b169063d296d1f1906044016080604051808303815f875af1158015611290573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112b49190614b39565b604081015181519193506112c791614ae6565b60408085019190915282015160608085019190915260208301516080850152820151801561137a57600354604051632b2b2cf560e11b81526001600160a01b039091169063565659ea90611343907f00000000000000000000000000000000000000000000000000000000000000009030908690600401614b9c565b5f604051808303815f87803b15801561135a575f80fd5b505af115801561136c573d5f803e3d5ffd5b5050505061137a8b826130df565b505050611388888289613696565b60408051838152602081018390529297509095506001600160a01b038a16917f3c4b1d42b9c7fa283f6fe657533f6a5a8a7ad1d36f9ef1d9d89ad04485e10d2c91015b60405180910390a250506113eb60015f80516020614f2d83398151915255565b50935093915050565b60405162461bcd60e51b815260206004820152600f60248201526e1b9bdd081a5b5c1b195b595b9d1959608a1b60448201525f9081906064015b60405180910390fd5b5f61144181612d8d565b8261144d609682613087565b61146a5760405163aaaf1ba760e01b815260040160405180910390fd5b6110808484612e6b565b61147d8261109b565b61148681612d8d565b611080838361383a565b5f8361149d609682613087565b6114ba5760405163aaaf1ba760e01b815260040160405180910390fd5b6114c26130a8565b6114ca613581565b5f856001600160a01b031663ecf1a3a66040518163ffffffff1660e01b8152600401602060405180830381865afa158015611507573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152b9190614aa0565b90506115426001600160a01b0382163330886138db565b5f866001600160a01b031663f8d898986040518163ffffffff1660e01b8152600401602060405180830381865afa15801561157f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115a39190614aa0565b90505f6115af82613903565b90505f6115bc88836139cc565b9050886001600160a01b031663f9d45fd26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115fa573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161e9190614abb565b81111561163e57604051630bdef9df60e41b815260040160405180910390fd5b61164889826135b3565b604051636230bdb760e11b8152600481018290526001600160a01b038a169063c4617b6e906024016020604051808303815f875af115801561168c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116b09190614abb565b95506116c4896116bf88614bc0565b6130df565b6116d6896116d183614bc0565b6139e0565b5f633b9aca006116e4611a7b565b6116ee9089614bda565b6116f89190614bf1565b6001600160a01b038b165f90815260086020526040902080548201905590506117218188614c04565b96508787101561174457604051630f29910b60e31b815260040160405180910390fd5b61176f7f00000000000000000000000000000000000000000000000000000000000000008833613170565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663269ef7938b6001600160a01b031663c3df65466040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117fe9190614aa0565b8c8c6040518463ffffffff1660e01b815260040161181e93929190614b9c565b5f604051808303815f87803b158015611835575f80fd5b505af1158015611847573d5f803e3d5ffd5b5050604080518a8152602081018d90529081018490526001600160a01b038d1692507f1636a7b61c31940ef7c54692ea1c56d6c47321574f8693e2ef4538e1560f9120915060600160405180910390a250505050506118b260015f80516020614f2d83398151915255565b509392505050565b6001600160a01b03811633146118e35760405163334bd91960e11b815260040160405180910390fd5b6118ed8282613a77565b505050565b5f6118fc81612d8d565b83611908609682613087565b6119255760405163aaaf1ba760e01b815260040160405180910390fd5b611930858585612ece565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f8115801561197c5750825b90505f8267ffffffffffffffff1660011480156119985750303b155b9050811580156119a6575080155b156119c45760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156119ee57845460ff60401b1916600160401b1785555b6119f6613af0565b6119fe613af0565b611a06613af0565b611a105f8d61383a565b50611a1f8b8b8b8b8b8b613af8565b611a27613af0565b8315611a6d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b5f805461109690605a601e612d7f565b5f611a946130a8565b611a9c613581565b5f611aa78686612d14565b9050611abd6001600160a01b0387168887612ffc565b6040516370a0823160e01b81523060048201525f906001600160a01b038816906370a0823190602401602060405180830381865afa158015611b01573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b259190614abb565b90507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd96001600160a01b0389166323e30c8b338a8a878b8b6040518763ffffffff1660e01b8152600401611b7e96959493929190614c17565b6020604051808303815f875af1158015611b9a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bbe9190614abb565b14611bdc57604051634cb150b560e11b815260040160405180910390fd5b6040516370a0823160e01b81523060048201525f9082906001600160a01b038a16906370a0823190602401602060405180830381865afa158015611c22573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c469190614abb565b611c509190614c04565b9050611c5c8388614ae6565b811015611c7c57604051634680cba960e11b815260040160405180910390fd5b8215611c9c57600154611c9c906001600160a01b038a8116911685612ffc565b60019350505050611cb960015f80516020614f2d83398151915255565b95945050505050565b6040516370a0823160e01b81523060048201525f906001600160a01b038316906370a0823190602401602060405180830381865afa158015611d06573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aaa9190614abb565b5f8085611d38609682613087565b611d555760405163aaaf1ba760e01b815260040160405180910390fd5b611d5d6130a8565b611d65613581565b611d6f87856135b3565b5f611d79886135e0565b604051630723d57160e01b8152600188900b6004820152602481018790529091505f906001600160a01b038a1690630723d571906044016060604051808303815f875af1158015611dcc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611df09190614c6f565b60408101518151919250611e0391614ae6565b604080840191909152810151606083015260208101516080830152611e2989838a613696565b6040805183815260208101839052929750909550600189900b916001600160a01b038c16917f0fb7c112e2248b21d15aa2d7f59f29499d35a70a8cf45cea0c90fa784ee4b40a910160405180910390a35050611e9160015f80516020614f2d83398151915255565b5094509492505050565b5f611ea581612d8d565b610dad8263ffffffff16613b5a565b80611ec0609682613087565b611edd5760405163aaaf1ba760e01b815260040160405180910390fd5b7ffd96ca7a6c7f01e5a66091060058768505cfa54b5c8d0a65e34a4850c3466568611f0781612d8d565b5f836001600160a01b031663cdc6c7cc6040518163ffffffff1660e01b815260040160408051808303815f875af1158015611f44573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f689190614b0d565b50905080611f895760405163ec8fb16b60e01b815260040160405180910390fd5b5f846001600160a01b031663f9d45fd26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fc6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fea9190614abb565b90505f856001600160a01b031663ee65a03c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612029573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061204d9190614abb565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663421ff462886001600160a01b031663c3df65466040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120df9190614aa0565b6040516001600160e01b031960e084901b1681526001600160a01b039182166004820152908a16602482015260448101859052606481018690526084016020604051808303815f875af1158015612138573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061215c9190614abb565b9050866001600160a01b03166341c0e1b56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612196575f80fd5b505af11580156121a8573d5f803e3d5ffd5b505060408051858152602081018790529081018490526001600160a01b038a1692507f33eb3f55fe001dc572c105d36fe8d625dd2b32e6edce7cfe4a69e06ee2af1cc3915060600160405180910390a250505050505050565b5f61220b81612d8d565b610dad82613baf565b7f1be5d1ebf823e636f9019a4a28b5fb56a6c9c490fea63cb140cde243b9045b5361223e81612d8d565b8261224a609682613087565b6122675760405163aaaf1ba760e01b815260040160405180910390fd5b61226f6130a8565b5f846001600160a01b031663f8d898986040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122ac573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122d09190614aa0565b90506122e76001600160a01b0382163330876138db565b5f6122f182613903565b90505f6122fe86836139cc565b60405163193cefdd60e31b8152600481018290529091506001600160a01b0388169063c9e77ee8906024015f604051808303815f87803b158015612340575f80fd5b505af1158015612352573d5f803e3d5ffd5b5050505061236487826116d190614bc0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631da649cf886001600160a01b031663c3df65466040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123f39190614aa0565b89896040518463ffffffff1660e01b815260040161241393929190614b9c565b5f604051808303815f87803b15801561242a575f80fd5b505af115801561243c573d5f803e3d5ffd5b50505050866001600160a01b03167f243d60a280579accabafa82109d7f67f7ce230d575b0ff7a301e8dabf3a3f5058760405161247b91815260200190565b60405180910390a250505061108060015f80516020614f2d83398151915255565b5f6124a681612d8d565b5f836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124e3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125079190614cc8565b612512906012614ce8565b61251d90600a614de4565b6040805180820182526001600160601b0383811682526001600160a01b0387811660208085018281528b84165f818152609a845288902096519151909416600160601b02941693909317909355835185815291820192909252929350917f5eae3446f897bd3bbec9c0c4bfa76e39caf18a7b1a0ed8e89de3aea8a297acae910160405180910390a250505050565b5f5b8151811015610dad576125d88282815181106125cb576125cb614df2565b60200260200101516132c6565b6001016125ad565b5f9182525f80516020614eed833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b5f61262081612d8d565b8261262c609682613087565b6126495760405163aaaf1ba760e01b815260040160405180910390fd5b6110808484612fa5565b5f8054611096906096601e612d7f565b5f805461109690601e80612d7f565b5f80546110969082601e612d7f565b5f808461268f609682613087565b6126ac5760405163aaaf1ba760e01b815260040160405180910390fd5b6126b46130a8565b6126bc613581565b6126c686856135b3565b5f6126d0876135e0565b604051631e93260360e31b8152600481018790529091505f906001600160a01b0389169063f4993018906024016060604051808303815f875af1158015612719573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061273d9190614c6f565b6040810151815191925061275091614ae6565b604080840191909152810151606083015260208101516080830152612776888389613696565b60408051838152602081018390529297509095506001600160a01b038a16917fd033303d155e6e089abe5ff3f071407e115def6bfd93964db36d85299107572c91016113cb565b7fbf233dd2aafeb4d50879c4aa5c81e96d92f6e6945c906a58f9f2d1c1631b4b266127e781612d8d565b81156127f557610dad613c09565b610dad613c6b565b5f61280781612d8d565b610dad8263ffffffff16613cb0565b5f84612823609682613087565b6128405760405163aaaf1ba760e01b815260040160405180910390fd5b6128486130a8565b612850613581565b61287760405180608001604052805f81526020015f81526020015f81526020015f81525090565b5f876001600160a01b031663f8d898986040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128d89190614aa0565b90505f6128e482613903565b90506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016631a4a400f8a336040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401608060405180830381865afa158015612960573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129849190614e06565b60608701526040860152602085015283525f8713156129ae576129ab8988855f0151613d04565b96505b85600160ff1b81146129c7576129c48183613d71565b90505b6001600160a01b038a1663032d22768a8a84336040516001600160e01b031960e087901b1681526004810194909452602484019290925260448301526001600160a01b031660648201526084016080604051808303815f875af1158015612a30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a549190614e06565b50919a5098509050612a668183613d8f565b9650612a728a826139e0565b5f881315612a8957612a848a896130df565b612aa8565b5f881215612aa857612aa88a612a9e8a614bc0565b8660200151613da3565b5f871315612ac557612ac08a84898760400151613e0a565b612ae5565b5f871215612ae557612ae58a84612adb8a614bc0565b8760600151613f35565b60408051898152602081018990525f8183015290518a916001600160a01b038d16917f9a243f0f02273a4b80be965697988a178f95cd11863de2122e69f811445dff449181900360600190a388955050505050612b4e60015f80516020614f2d83398151915255565b50949350505050565b5f612b6181612d8d565b6001600160a01b038281165f90815260646020908152604091829020825180840190935254928316808352600160a01b9093046001600160601b03169082015290156118ed57805f01516001600160a01b03166341c0e1b56040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612be2575f80fd5b505af1158015612bf4573d5f803e3d5ffd5b50505f80845260208085018281526001600160a01b03888116845260649092526040909220855192516001600160601b0316600160a01b02929091169190911790555050505050565b5f612c4781612d8d565b610dad82614023565b612c598261109b565b612c6281612d8d565b6110808383613a77565b5f612c7681612d8d565b6001600160a01b038481165f90815260646020908152604091829020825180840190935254928316808352600160a01b9093046001600160601b0316908201529015612cc557612cc585612b57565b50506040805180820182526001600160a01b0393841681526001600160601b0392831660208083019182529585165f90815260649096529190942093519051909116600160a01b029116179055565b5f633b9aca00612d22612d73565b612d2c9084614bda565b612d369190614bf1565b9392505050565b5f612d4781612d8d565b610dad8263ffffffff1661407d565b5f612d6081612d8d565b610dad826140d2565b5f610aaa8261412c565b5f805461109690603c601e5b6001901b5f190191901c1690565b612d978133614154565b50565b5f612d36836001600160a01b03841661418d565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612dff84826141d9565b611080576040516001600160a01b0384811660248301525f6044830152612e6191869182169063095ea7b3906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614276565b6110808482614276565b6001600160a01b038083165f8181526099602052604080822080548686166001600160a01b0319821681179092559151919094169392849290917f10b3b443f661bc4dbef89b2198e49efc73d0c1d2a3eeb5a42ec55fe981611ca89190a4505050565b6001600160a01b0383165f90815260986020526040812054612efc916001600160601b0385169060606142d7565b6001600160a01b0384165f908152609860205260408120918255600190910154612f32916001600160601b0384169060606142d7565b6001600160a01b0384165f81815260986020526040908190206001019290925590517fe02c6e99b21daa3ddf5404c5d54ac9c919fe91ab12e1e72665dc1fd8bc86546790612f9890859085906001600160601b0392831681529116602082015260400190565b60405180910390a2505050565b6001600160a01b0382165f908152609860205260409081902060010154612fda9167ffffffffffffffff84169060c0906142d7565b6001600160a01b039092165f9081526098602052604090206001019190915550565b6040516001600160a01b038381166024830152604482018390526118ed91859182169063a9059cbb90606401612e2f565b613036816142eb565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fe5110bb0e516861a91fc6865f2b0c0540cceff8cec2bfaaa5b032979e13c7e41905f90a35050565b6001600160a01b0381165f9081526001830160205260408120541515612d36565b5f80516020614f2d8339815191528054600119016130d957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b6001600160a01b0382165f908152609860205260408120549061310482826060612d7f565b90505f8361311484606080612d7f565b61311e9190614e39565b9050818111156131415760405163f646f2f960e01b815260040160405180910390fd5b61314e83826060806142d7565b6001600160a01b039095165f9081526098602052604090209490945550505050565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa1580156131b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131d89190614abb565b90508281106131fa576131f56001600160a01b0385168385612ffc565b611080565b8015613214576132146001600160a01b0385168383612ffc565b6001600160a01b038481165f90815260646020908152604091829020825180840190935254928316808352600160a01b9093046001600160601b03169082015282850391613260575f80fd5b8051604051627b8a6760e11b8152600481018490526001600160a01b0386811660248301529091169062f714ce906044015f604051808303815f87803b1580156132a8575f80fd5b505af11580156132ba573d5f803e3d5ffd5b50505050505050505050565b5f816001600160a01b031663b2016bd46040518163ffffffff1660e01b8152600401602060405180830381865afa158015613303573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133279190614aa0565b6001600160a01b0383165f90815260046020526040902054909150801561337b57600254613362906001600160a01b03848116911683612ffc565b6001600160a01b0383165f908152600460205260408120555b506001600160a01b0382165f9081526006602052604090205480156133cd576005546133b4906001600160a01b03848116911683612ffc565b6001600160a01b0383165f908152600660205260408120555b506001600160a01b0382165f9081526008602052604090205480156118ed57600754613406906001600160a01b03848116911683612ffc565b50506001600160a01b03165f90815260086020526040812055565b61342a816142eb565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f3ed91ef70e6e7c6a805523d1a95ddc27851b8f620524b5def16053d07bc33c32905f90a35050565b61348981631dcd6500614312565b5f613496825f601e614333565b60408051828152602081018590529192507f77cf0faf60882cf7bf063a7308f5b2f7acc4c4cf6118126dc6f45a3fc19a05d191015b60405180910390a15050565b6134e581631dcd6500614312565b5f6134f3826078601e614333565b60408051828152602081018590529192507f38a939f96f90bf373822856f3ca5959e9f2fa4d92dfd22cc236d692ac15c80ff91016134cb565b61353a81631dcd6500614312565b5f613548826096601e614333565b60408051828152602081018590529192507fc47c244bb9022fbfd61c1961e43c3f6100aba94a7196cca3e6743b6ec04f7d0991016134cb565b5f80516020614f0d8339815191525460ff16156135b15760405163d93c066560e01b815260040160405180910390fd5b565b5f6135bd8361412c565b9050808210156118ed5760405163901541d360e01b815260040160405180910390fd5b6136166040518060a001604052805f81526020015f6001600160a01b031681526020015f81526020015f81526020015f81525090565b816001600160a01b031663f8d898986040518163ffffffff1660e01b8152600401602060405180830381865afa158015613652573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136769190614aa0565b6001600160a01b03166020820181905261368f90613903565b8152919050565b6040820151608083015183515f916136ad91614359565b90506136bc856116bf84614bc0565b6136ce8585608001516116d190614bc0565b6136e83360208601516001600160a01b03169030846138db565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631da649cf866001600160a01b031663c3df65466040518163ffffffff1660e01b8152600401602060405180830381865afa158015613753573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137779190614aa0565b87846040518463ffffffff1660e01b815260040161379793929190614b9c565b5f604051808303815f87803b1580156137ae575f80fd5b505af11580156137c0573d5f803e3d5ffd5b505050505f633b9aca006137d2612653565b86606001516137e19190614bda565b6137eb9190614bf1565b6001600160a01b0387165f908152600860205260409020805482019055905080830392506113eb7f00000000000000000000000000000000000000000000000000000000000000008486613170565b5f5f80516020614eed83398151915261385384846125e0565b6138d2575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556138883390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610aaa565b5f915050610aaa565b61108084856001600160a01b03166323b872dd868686604051602401612e2f93929190614b9c565b6001600160a01b038082165f908152609a60209081526040918290208251808401909352546001600160601b038116808452600160601b909104909316908201819052156139b85780602001516001600160a01b031663679aefce6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561398b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139af9190614abb565b820291506139c6565b670de0b6b3a7640000820291505b50919050565b5f670de0b6b3a7640000612d2c8385614bda565b6001600160a01b0382165f9081526098602052604081206001015490613a0882826060612d7f565b90505f83613a1884606080612d7f565b613a229190614e39565b905081811115613a4557604051631b2f832360e21b815260040160405180910390fd5b613a5283826060806142d7565b6001600160a01b039095165f9081526098602052604090206001019490945550505050565b5f5f80516020614eed833981519152613a9084846125e0565b156138d2575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610aaa565b6135b161436d565b613b0061436d565b613b09866134d7565b613b128661347b565b613b1b8661352c565b613b2485613cb0565b613b2d84613b5a565b613b3683613baf565b613b3f826140d2565b613b488261302d565b613b5182614023565b610c3481613421565b613b68816305f5e100614312565b5f613b7682603c601e614333565b60408051828152602081018590529192507f6435b9a85963bf02d1ea1c96162e6e48e3cf1112e4b029810eba42e10532e5a991016134cb565b613bb8816142eb565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fd101a15f9e9364a1c0a7c4cc8eb4cd9220094e83353915b0c74e09f72ec73edb905f90a35050565b613c11613581565b5f80516020614f0d833981519152805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b03909116815260200160405180910390a150565b613c736143b6565b5f80516020614f0d833981519152805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33613c4d565b613cbe81630bebc200614312565b5f613ccb82601e80614333565b60408051828152602081018590529192507f2c3b971a5011a057ee9b96ea2aa1504d93d268e5c9cfdee7581d31435b24435e91016134cb565b5f633b9aca00828402048015613d32576001600160a01b0385165f9081526004602052604090208054820190555b613d677f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163330876138db565b9092039392505050565b5f670de0b6b3a7640000613d858385614e60565b612d369190614e8f565b5f81613d85670de0b6b3a764000085614e60565b613db0836116bf84614bc0565b633b9aca00818302048015613ddd576001600160a01b0384165f9081526006602052604090208054820190555b6110807f000000000000000000000000000000000000000000000000000000000000000082850333613170565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635224372c856001600160a01b031663c3df65466040518163ffffffff1660e01b8152600401602060405180830381865afa158015613e75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e999190614aa0565b86856040518463ffffffff1660e01b8152600401613eb993929190614b9c565b5f604051808303815f87803b158015613ed0575f80fd5b505af1158015613ee2573d5f803e3d5ffd5b505050505f633b9aca0082840281613efc57613efc614af9565b0490508015613f1f57600254613f1f906001600160a01b03868116911683612ffc565b6119306001600160a01b03851633838603612ffc565b633b9aca00818302048015613f5f57613f5f336005546001600160a01b03878116929116846138db565b613f746001600160a01b0385163330866138db565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631da649cf866001600160a01b031663c3df65466040518163ffffffff1660e01b8152600401602060405180830381865afa158015613fdf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140039190614aa0565b87866040518463ffffffff1660e01b8152600401610d6693929190614b9c565b61402c816142eb565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907fbcfa1f4a44edd726cc4f3c7dca57d46a5a8e8adb14b1eaae01bc3576059ddd42905f90a35050565b61408b816305f5e100614312565b5f61409982605a601e614333565b60408051828152602081018590529192507fbf5383b9e422a4efef091bed41e294217b4a7c7adfbed0dc4d48588bac69afa891016134cb565b6140db816142eb565b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f731b9ea4fb17ff346b10938712cc430bfa7ba2198f0d2d66a9594804ddf56bc2905f90a35050565b6001600160a01b0381165f9081526098602052604080822060010154610aaa9160c090612d7f565b61415e82826125e0565b610dad5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161142e565b5f8181526001830160205260408120546141d257508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610aaa565b505f610aaa565b5f805f846001600160a01b0316846040516141f49190614ebb565b5f604051808303815f865af19150503d805f811461422d576040519150601f19603f3d011682016040523d82523d5f602084013e614232565b606091505b509150915081801561425c57508051158061425c57508080602001905181019061425c9190614ed1565b8015611cb95750505050506001600160a01b03163b151590565b5f61428a6001600160a01b038416836143e5565b905080515f141580156142ae5750808060200190518101906142ac9190614ed1565b155b156118ed57604051635274afe760e01b81526001600160a01b038416600482015260240161142e565b6001901b5f1901811b1992909216911b1790565b6001600160a01b038116612d975760405163a7f9319d60e01b815260040160405180910390fd5b80821115610dad57604051634df52d2560e11b815260040160405180910390fd5b5f8054614341818585612d7f565b915061434f818686866142d7565b5f55509392505050565b5f81612d2c670de0b6b3a764000085614bda565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166135b157604051631afcd79f60e31b815260040160405180910390fd5b5f80516020614f0d8339815191525460ff166135b157604051638dfc202b60e01b815260040160405180910390fd5b6060612d3683835f845f80856001600160a01b031684866040516144099190614ebb565b5f6040518083038185875af1925050503d805f8114614443576040519150601f19603f3d011682016040523d82523d5f602084013e614448565b606091505b5091509150614458868383614462565b9695505050505050565b60608261447757614472826144be565b612d36565b815115801561448e57506001600160a01b0384163b155b156144b757604051639996b31560e01b81526001600160a01b038516600482015260240161142e565b5080612d36565b8051156144ce5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f602082840312156144f7575f80fd5b81356001600160e01b031981168114612d36575f80fd5b6001600160a01b0381168114612d97575f80fd5b5f60208284031215614532575f80fd5b8135612d368161450e565b80356001600160601b0381168114614553575f80fd5b919050565b803567ffffffffffffffff81168114614553575f80fd5b5f805f805f60a08688031215614583575f80fd5b853561458e8161450e565b9450602086013561459e8161450e565b93506145ac6040870161453d565b92506145ba6060870161453d565b91506145c860808701614558565b90509295509295909350565b5f80604083850312156145e5575f80fd5b82356145f08161450e565b946020939093013593505050565b803563ffffffff81168114614553575f80fd5b5f805f60608486031215614623575f80fd5b61462c846145fe565b925061463a602085016145fe565b9150614648604085016145fe565b90509250925092565b5f60208284031215614661575f80fd5b5035919050565b5f805f6060848603121561467a575f80fd5b83356146858161450e565b925060208401356146958161450e565b929592945050506040919091013590565b5f805f606084860312156146b8575f80fd5b83356146c38161450e565b95602085013595506040909401359392505050565b5f80604083850312156146e9575f80fd5b82356146f48161450e565b915060208301356147048161450e565b809150509250929050565b5f8060408385031215614720575f80fd5b8235915060208301356147048161450e565b5f805f60608486031215614744575f80fd5b833561474f8161450e565b925061475d6020850161453d565b91506146486040850161453d565b5f805f805f805f60e0888a031215614781575f80fd5b873561478c8161450e565b965060208801359550604088013594506060880135935060808801356147b18161450e565b925060a08801356147c18161450e565b915060c08801356147d18161450e565b8091505092959891949750929550565b5f805f805f608086880312156147f5575f80fd5b85356148008161450e565b945060208601356148108161450e565b935060408601359250606086013567ffffffffffffffff811115614832575f80fd5b8601601f81018813614842575f80fd5b803567ffffffffffffffff811115614858575f80fd5b886020828401011115614869575f80fd5b959894975092955050506020019190565b5f805f806080858703121561488d575f80fd5b84356148988161450e565b935060208501356148a88161450e565b92506040850135600181900b81146148be575f80fd5b9396929550929360600135925050565b5f602082840312156148de575f80fd5b612d36826145fe565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614924576149246148e7565b604052919050565b5f6020828403121561493c575f80fd5b813567ffffffffffffffff811115614952575f80fd5b8201601f81018413614962575f80fd5b803567ffffffffffffffff81111561497c5761497c6148e7565b8060051b61498c602082016148fb565b918252602081840181019290810190878411156149a7575f80fd5b6020850194505b838510156149d557843592506149c38361450e565b828252602094850194909101906149ae565b979650505050505050565b5f80604083850312156149f1575f80fd5b82356149fc8161450e565b9150614a0a60208401614558565b90509250929050565b8015158114612d97575f80fd5b5f60208284031215614a30575f80fd5b8135612d3681614a13565b5f805f8060808587031215614a4e575f80fd5b8435614a598161450e565b966020860135965060408601359560600135945092505050565b5f805f60608486031215614a85575f80fd5b8335614a908161450e565b9250602084013561475d8161450e565b5f60208284031215614ab0575f80fd5b8151612d368161450e565b5f60208284031215614acb575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610aaa57610aaa614ad2565b634e487b7160e01b5f52601260045260245ffd5b5f8060408385031215614b1e575f80fd5b8251614b2981614a13565b6020939093015192949293505050565b5f6080828403128015614b4a575f80fd5b506040516080810167ffffffffffffffff81118282101715614b6e57614b6e6148e7565b6040908152835182526020808501519083015283810151908201526060928301519281019290925250919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b5f600160ff1b8201614bd457614bd4614ad2565b505f0390565b8082028115828204841417610aaa57610aaa614ad2565b5f82614bff57614bff614af9565b500490565b81810381811115610aaa57610aaa614ad2565b6001600160a01b03878116825286166020820152604081018590526060810184905260a0608082018190528101829052818360c08301375f81830160c090810191909152601f909201601f1916010195945050505050565b5f6060828403128015614c80575f80fd5b506040516060810167ffffffffffffffff81118282101715614ca457614ca46148e7565b60409081528351825260208085015190830152928301519281019290925250919050565b5f60208284031215614cd8575f80fd5b815160ff81168114612d36575f80fd5b60ff8281168282160390811115610aaa57610aaa614ad2565b6001815b6001841115614d3c57808504811115614d2057614d20614ad2565b6001841615614d2e57908102905b60019390931c928002614d05565b935093915050565b5f82614d5257506001610aaa565b81614d5e57505f610aaa565b8160018114614d745760028114614d7e57614d9a565b6001915050610aaa565b60ff841115614d8f57614d8f614ad2565b50506001821b610aaa565b5060208310610133831016604e8410600b8410161715614dbd575081810a610aaa565b614dc95f198484614d01565b805f1904821115614ddc57614ddc614ad2565b029392505050565b5f612d3660ff841683614d44565b634e487b7160e01b5f52603260045260245ffd5b5f805f8060808587031215614e19575f80fd5b505082516020840151604085015160609095015191969095509092509050565b8082018281125f831280158216821582161715614e5857614e58614ad2565b505092915050565b8082025f8212600160ff1b84141615614e7b57614e7b614ad2565b8181058314821517610aaa57610aaa614ad2565b5f82614e9d57614e9d614af9565b600160ff1b82145f1984141615614eb657614eb6614ad2565b500590565b5f82518060208501845e5f920191825250919050565b5f60208284031215614ee1575f80fd5b8151612d3681614a1356fe02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800cd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a264697066735822122044be7c760cddd53558edffe2757ce2730d734e5df416e2e218358f6470c6cb1464736f6c634300081a0033000000000000000000000000085780639cc2cacd35e474e71f4d000e2405d8f6000000000000000000000000250893ca4ba5d05626c785e8da758026928fcd2400000000000000000000000016b334f2644cc00b85db1a1eff0c2c395e00c28d