0 txs
1.8k calls
constructor
constructor()
functions
BaseMiddleware_VERSION
viewfunction BaseMiddleware_VERSION() view returns (uint64)
CACHE_DATA_COMMAND
viewfunction CACHE_DATA_COMMAND() view returns (uint8)
checkUpkeep
viewfunction checkUpkeep(bytes) view returns (bool upkeepNeeded, bytes performData)
collateralToOracle
viewfunction collateralToOracle(address collateral) view returns (address)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
DEFAULT_DECIMALS
viewfunction DEFAULT_DECIMALS() view returns (uint8)
EpochCapture_VERSION
viewfunction EpochCapture_VERSION() view returns (uint64)
getCaptureTimestamp
viewfunction getCaptureTimestamp() view returns (uint48 timestamp)
getCurrentEpoch
viewfunction getCurrentEpoch() view returns (uint48)
getEpochCacheIndex
viewfunction getEpochCacheIndex(uint48 epoch) view returns (uint256)
getEpochDuration
viewfunction getEpochDuration() view returns (uint48)
getEpochStart
viewfunction getEpochStart(uint48 epoch) view returns (uint48)
getForwarderAddress
viewfunction getForwarderAddress() view returns (address)
getGateway
viewfunction getGateway() view returns (address)
getInterval
viewfunction getInterval() view returns (uint256)
getLastTimestamp
viewfunction getLastTimestamp() view returns (uint256)
getOperatorRewardsAddress
viewfunction getOperatorRewardsAddress() view returns (address)
getOperatorToPowerCached
viewfunction getOperatorToPowerCached(uint48 epoch, bytes32 operatorKey) view returns (uint256)
getRole
viewfunction getRole(bytes4 selector) view returns (bytes32)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
getStakerRewardsFactoryAddress
viewfunction getStakerRewardsFactoryAddress() view returns (address)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
KeyManager256_VERSION
viewfunction KeyManager256_VERSION() view returns (uint64)
keyWasActiveAt
viewfunction keyWasActiveAt(uint48 timestamp, bytes key_) view returns (bool)
MAX_ACTIVE_VAULTS
viewfunction MAX_ACTIVE_VAULTS() view returns (uint256)
MAX_OPERATORS_TO_PROCESS
viewfunction MAX_OPERATORS_TO_PROCESS() view returns (uint256)
MAX_OPERATORS_TO_SEND
viewfunction MAX_OPERATORS_TO_SEND() view returns (uint256)
MIN_INTERVAL_TO_SEND_OPERATOR_KEYS
viewfunction MIN_INTERVAL_TO_SEND_OPERATOR_KEYS() view returns (uint256)
operatorByKey
viewfunction operatorByKey(bytes key) view returns (address)
operatorKey
viewfunction operatorKey(address operator) view returns (bytes)
Operators_VERSION
viewfunction Operators_VERSION() view returns (uint64)
OzAccessControl_VERSION
viewfunction OzAccessControl_VERSION() view returns (uint64)
PARTS_PER_BILLION
viewfunction PARTS_PER_BILLION() view returns (uint256)
proxiableUUID
viewfunction proxiableUUID() view returns (bytes32)
SEND_DATA_COMMAND
viewfunction SEND_DATA_COMMAND() view returns (uint8)
SharedVaults_VERSION
viewfunction SharedVaults_VERSION() view returns (uint64)
stakeToPower
viewfunction stakeToPower(address vault, uint256 stake) view returns (uint256 power)
UPGRADE_INTERFACE_VERSION
viewfunction UPGRADE_INTERFACE_VERSION() view returns (string)
vaultToCollateral
viewfunction vaultToCollateral(address vault) view returns (address)
vaultToOracle
viewfunction vaultToOracle(address vault) view returns (address)
VERSION
viewfunction VERSION() view returns (uint256)
distributeRewards
nonpayablefunction distributeRewards(uint256 epoch, uint256 eraIndex, uint256 totalPoints, uint256 tokenAmount, bytes32 rewardsRoot, address tokenAddress)
executeSlash
nonpayablefunction executeSlash(address vault, uint256 slashIndex, bytes hints) returns (uint256 slashedAmount)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
initialize
nonpayablefunction initialize(tuple params)
pauseOperator
nonpayablefunction pauseOperator(address operator)
pauseOperatorVault
nonpayablefunction pauseOperatorVault(address operator, address vault)
pauseSharedVault
nonpayablefunction pauseSharedVault(address sharedVault)
performUpkeep
nonpayablefunction performUpkeep(bytes performData)
registerOperator
nonpayablefunction registerOperator(address operator, bytes key, address vault)
registerOperatorVault
nonpayablefunction registerOperatorVault(address operator, address vault)
registerSharedVault
nonpayablefunction registerSharedVault(address sharedVault, tuple stakerRewardsParams)
reinitializeRewards
nonpayablefunction reinitializeRewards(address operatorRewards, address stakerRewardsFactory)
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
sendCurrentOperatorsKeys
nonpayablefunction sendCurrentOperatorsKeys() returns (bytes32[] sortedKeys)
setCollateralToOracle
nonpayablefunction setCollateralToOracle(address collateral, address oracle)
setForwarder
nonpayablefunction setForwarder(address forwarder)
setGateway
nonpayablefunction setGateway(address newGateway)
setInterval
nonpayablefunction setInterval(uint256 interval)
setOperatorShareOnOperatorRewards
nonpayablefunction setOperatorShareOnOperatorRewards(uint48 operatorShare)
setReader
nonpayablefunction setReader(address reader)
slash
nonpayablefunction slash(uint48 epoch, bytes32 operatorKey, uint256 percentage)
unpauseOperator
nonpayablefunction unpauseOperator(address operator)
unpauseOperatorVault
nonpayablefunction unpauseOperatorVault(address operator, address vault)
unpauseSharedVault
nonpayablefunction unpauseSharedVault(address sharedVault)
unregisterOperator
nonpayablefunction unregisterOperator(address operator)
unregisterOperatorVault
nonpayablefunction unregisterOperatorVault(address operator, address vault)
unregisterSharedVault
nonpayablefunction unregisterSharedVault(address sharedVault)
updateOperatorKey
nonpayablefunction updateOperatorKey(address operator, bytes key)
upgradeToAndCall
payablefunction upgradeToAndCall(address newImplementation, bytes data) payable
events
CollateralToOracleSet
event CollateralToOracleSet(address indexed collateral, address indexed oracle)
ForwarderSet
event ForwarderSet(address indexed forwarder)
GatewaySet
event GatewaySet(address indexed gateway)
Initialized
event Initialized(uint64 version)
InstantSlash
event InstantSlash(address vault, bytes32 subnetwork, uint256 amount)
IntervalSet
event IntervalSet(uint256 indexed interval)
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)
SelectorRoleSet
event SelectorRoleSet(bytes4 indexed selector, bytes32 indexed role)
Upgraded
event Upgraded(address indexed implementation)
VetoSlash
event VetoSlash(address vault, bytes32 subnetwork, uint256 index)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 role)
AddressEmptyCode
error AddressEmptyCode(address target)
AlreadyEnabled
error AlreadyEnabled()
AlreadyRegistered
error AlreadyRegistered()
DuplicateKey
error DuplicateKey()
Enabled
error Enabled()
ERC1967InvalidImplementation
error ERC1967InvalidImplementation(address implementation)
ERC1967NonPayable
error ERC1967NonPayable()
FailedCall
error FailedCall()
ImmutablePeriodNotPassed
error ImmutablePeriodNotPassed()
InactiveVaultSlash
error InactiveVaultSlash()
InvalidInitialization
error InvalidInitialization()
Middleware__AlreadyCached
error Middleware__AlreadyCached()
Middleware__AlreadySet
error Middleware__AlreadySet()
Middleware__GatewayNotSet
error Middleware__GatewayNotSet()
Middleware__InsufficientBalance
error Middleware__InsufficientBalance()
Middleware__InvalidAddress
error Middleware__InvalidAddress()
Middleware__InvalidCommand
error Middleware__InvalidCommand(uint8 command)
Middleware__InvalidEpoch
error Middleware__InvalidEpoch()
Middleware__InvalidEpochDuration
error Middleware__InvalidEpochDuration()
Middleware__InvalidInterval
error Middleware__InvalidInterval()
Middleware__InvalidKey
error Middleware__InvalidKey()
Middleware__NoPerformData
error Middleware__NoPerformData()
Middleware__OperatorNotFound
error Middleware__OperatorNotFound(bytes32 operatorKey, uint48 epoch)
Middleware__SlashingWindowTooShort
error Middleware__SlashingWindowTooShort()
Middleware__SlashPercentageTooBig
error Middleware__SlashPercentageTooBig(uint48 epoch, address operator, uint256 percentage)
Middleware__TooManyActiveVaults
error Middleware__TooManyActiveVaults()
Middleware__TooOldEpoch
error Middleware__TooOldEpoch()
NonVetoSlasher
error NonVetoSlasher()
NoSlasher
error NoSlasher()
NotEnabled
error NotEnabled()
NotInitializing
error NotInitializing()
NotOperator
error NotOperator()
NotOperatorSpecificVault
error NotOperatorSpecificVault()
NotOperatorVault
error NotOperatorVault()
NotRegistered
error NotRegistered()
NotVault
error NotVault()
OperatorNotOptedIn
error OperatorNotOptedIn()
OperatorNotRegistered
error OperatorNotRegistered()
PreviousKeySlashable
error PreviousKeySlashable()
SafeCastOverflowedUintDowncast
error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value)
TooOldTimestampSlash
error TooOldTimestampSlash()
UnknownSlasherType
error UnknownSlasherType()
UUPSUnauthorizedCallContext
error UUPSUnauthorizedCallContext()
UUPSUnsupportedProxiableUUID
error UUPSUnsupportedProxiableUUID(bytes32 slot)
VaultAlreadyRegistered
error VaultAlreadyRegistered()
VaultEpochTooShort
error VaultEpochTooShort()
VaultNotInitialized
error VaultNotInitialized()
creation bytecode
0x60a0806040523460c857306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a009081549060ff8260401c1660b957506001600160401b036002600160401b0319828216016075575b604051615e1690816100cd823960805181818161150301526117ff0152f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f80806056565b63f92ee8a960e01b8152600490fd5b5f80fdfe60806040526004361015610019575b34156136c9575b5f80fd5b5f3560e01c806308e809f0146104665780630a0530ea1461032b578063181d5cd6146104615780631e0f2e1f1461045c57806322a9008214610457578063246e158f14610452578063248a9ca31461044d5780632e5aaf33146104485780632f2ff15d146104435780633136c5d71461043e578063329685571461032b5780633441856f1461043957806336568abe14610434578063378997701461042f5780633e1ad83f1461042a578063409637fa1461032b57806342bf3cc1146104255780634376d201146104205780634585e33b1461041b57806345f8ec241461041657806347449640146104115780634f1ef2861461040c5780635266ee3f1461040757806352d1902d1461040257806356581273146103fd5780635aa59c4f146103f85780635d3ea8f1146103f35780635ff82a7c146103ee57806364f084d51461032b5780636561ed7f146103e9578063697abb92146103e45780636d3b8b83146103df5780636e04ff0d146103da57806372f9adab146103d55780637a3c3372146103d05780637bb5f7f4146103cb5780637bf20602146103c65780637fd1f34c146103c157806384af6324146103bc5780638c3e28cf146103b757806390646b4a146103b257806391ad27b4146103ad57806391d14854146103a85780639598da7f146103a357806396115bc21461039e5780639ff33c0114610399578063a217fddf14610394578063a846156d1461038f578063aa7578a91461038a578063ad3cb1cc14610385578063b1630faa14610380578063b18125be1461037b578063b1a69fa214610376578063b41fd91214610371578063b97dd9e21461036c578063b9998a2414610367578063c1656d4014610362578063c5008f461461035d578063c52a66971461032b578063c55041cf14610358578063cab18f6d14610353578063cb87ef6e1461034e578063cbf7302c14610349578063ce08391114610344578063ce489d271461033f578063d547741f1461033a578063d9e717831461032b578063db3adf1214610335578063e6989de71461032b578063f8e29206146103305763ffa1ad740361000e575b610645565b612b2c565b612adc565b612a6b565b612a26565b6129cc565b612941565b6128c6565b612828565b6127b1565b612796565b612549565b612499565b61247f565b612464565b6123f0565b6123b4565b612325565b6122c8565b6122ad565b612243565b612229565b6120ab565b612046565b611ff4565b611f95565b611f59565b611ea9565b611e64565b611dd6565b611d6a565b611d0a565b611c83565b611c19565b611b83565b611ab2565b611a5a565b611a3f565b611a21565b611976565b61192f565b61186a565b61184f565b6117e5565b611655565b6114ed565b6114a7565b6112b0565b610f55565b610e65565b610e20565b610dd9565b610d9d565b610d52565b610d0d565b610ada565b610a4a565b61097a565b610941565b61090a565b610872565b6107f6565b6107ad565b6104cc565b6001600160a01b0381160361001557565b600435906104898261046b565b565b602435906104898261046b565b604435906104898261046b565b606435906104898261046b565b608435906104898261046b565b60e435906104898261046b565b34610015576020366003190112610015576004356104e98161046b565b6104f161373b565b6104fa426148c8565b905f80516020615d818339815191525490610545816001600160a01b03165f527f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db0460205260405f2090565b541561062957610585906001600160a01b03165f527f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db0460205260405f2090565b545f1981019081116106245761059c600191614528565b500190815465ffffffffffff9182821661061257826105be9260301c16612b7e565b838216911611610600576105e96105fe92829065ffffffffffff1665ffffffffffff19825416179055565b80546bffffffffffff00000000000019169055565b005b604051631ba9803b60e11b8152600490fd5b604051637952fbad60e11b8152600490fd5b612b6a565b60405163aba4733960e01b8152600490fd5b5f91031261001557565b34610015575f36600319011261001557602060405160018152f35b634e487b7160e01b5f52604160045260245ffd5b67ffffffffffffffff811161068857604052565b610660565b60a0810190811067ffffffffffffffff82111761068857604052565b610100810190811067ffffffffffffffff82111761068857604052565b6040810190811067ffffffffffffffff82111761068857604052565b90601f8019910116810190811067ffffffffffffffff82111761068857604052565b67ffffffffffffffff811161068857601f01601f191660200190565b92919261072c82610704565b9161073a60405193846106e2565b829481845281830111610015578281602093845f960137010152565b9080601f830112156100155781602061077193359101610720565b90565b9060406003198301126100155760043561078d8161046b565b916024359067ffffffffffffffff82116100155761077191600401610756565b34610015576105fe6107be36610774565b906107c761373b565b614656565b65ffffffffffff81160361001557565b60a43590610489826107cc565b60c43590610489826107cc565b3461001557604036600319011261001557600435610813816107cc565b60243567ffffffffffffffff81116100155760209161084a61083c610868933690600401610756565b848082518301019101612b5b565b5f525f80516020615dc18339815191528352600160405f200161380a565b6040519015158152f35b346100155760203660031901126100155760043561088e61373b565b80156108f8577fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce9102805482146108e6578190557f32d3f90d4bf9e8a916b2cdb89bb358728af4f0b4c2c58dffc15f9737126a1e7e5f80a2005b604051632a35f51f60e21b8152600490fd5b60405163e2da002760e01b8152600490fd5b3461001557602036600319011261001557602061093160043561092c816107cc565b612b98565b65ffffffffffff60405191168152f35b34610015576020366003190112610015576004355f525f80516020615da18339815191526020526020600160405f200154604051908152f35b34610015576020366003190112610015576004356109978161046b565b61099f61373b565b6109a8426148c8565b905f80516020615d8183398151915254906109f3816001600160a01b03165f527f3b2b549db680c436ebf9aa3c8eeee850852f16da5cdb5137dbc0299ebb219e0360205260405f2090565b541561062957610a33906001600160a01b03165f527f3b2b549db680c436ebf9aa3c8eeee850852f16da5cdb5137dbc0299ebb219e0360205260405f2090565b545f1981019081116106245761059c60019161457e565b3461001557604036600319011261001557600435602435610a6a8161046b565b815f525f80516020615da1833981519152602052600160405f20015491825f5260ff610aaa3360405f20906001600160a01b03165f5260205260405f2090565b541615610abb576105fe9250613a51565b60405163e2517d3f60e01b815233600482015260248101849052604490fd5b34610015576060366003190112610015576004803590610af9826107cc565b60243560443591610b0861373b565b60409283519163246e158f60e01b835260208380610b378985830191909165ffffffffffff6020820193169052565b0381305afa928315610d08575f93610cd7575b50845160208101859052610b7490610b6f81604081015b03601f1981018352826106e2565b612c64565b93610b8d5f80516020615d818339815191525485612b7e565b610ba4610b99426148c8565b65ffffffffffff1690565b65ffffffffffff80921610610cc857610bbf610b99426148c8565b90851611610cb9576001600160a01b03851615610c905750633b9aca008211610c555750610c1b939450610c1183610bf5612c02565b65ffffffffffff85168152968701906001600160a01b03169052565b6060850152613ab8565b8051905f5b828110610c2957005b80610c4f85610c4a610c3d60019587612c4b565b516001600160a01b031690565b613c96565b01610c20565b8451639de2b86360e01b815265ffffffffffff87169181019182526001600160a01b0385166020830152604082019290925281906060010390fd5b855163715e1a5f60e11b815291820190815265ffffffffffff8716602082015281906040010390fd5b5084516303b5f06b60e61b8152fd5b865162b8c2bf60e81b81528390fd5b610cfa91935060203d602011610d01575b610cf281836106e2565b810190612be2565b915f610b4a565b503d610ce8565b612bf7565b34610015575f3660031901126100155760206001600160a01b037fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce91035416604051908152f35b3461001557604036600319011261001557602435610d6f8161046b565b336001600160a01b03821603610d8b576105fe90600435613f2f565b60405163334bd91960e11b8152600490fd5b34610015575f3660031901126100155760207fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce910154604051908152f35b346100155760203660031901126100155760043567ffffffffffffffff811161001557610e0f610b6f6020923690600401610756565b6001600160a01b0360405191168152f35b34610015575f3660031901126100155760206001600160a01b037fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce91005416604051908152f35b3461001557602036600319011261001557600435610e82816107cc565b610e8a61373b565b6001600160a01b037fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce9107541690813b156100155765ffffffffffff60245f928360405195869485936373646c3d60e11b85521660048401525af18015610d0857610eef57005b6105fe90610674565b9181601f840112156100155782359167ffffffffffffffff8311610015576020838186019501011161001557565b6020600319820112610015576004359067ffffffffffffffff821161001557610f5191600401610ef8565b9091565b3461001557610f6336610f26565b610f6b61373b565b801561129e576001600160a01b03610faa7fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce9100546001600160a01b031690565b1691821561128c57602090610fbd6131a8565b9265ffffffffffff808516816020850135160361127a576110397f3b2b549db680c436ebf9aa3c8eeee850852f16da5cdb5137dbc0299ebb219e02546110328765ffffffffffff165f527f93540b1a1dc30969947272428a8d0331ac0b23f753e3edd38c70f80cf083510060205260405f2090565b5490612ca9565b15611188575061104e92939450810190612d99565b905060019391600160ff82160361116b57508051925f5b8481106110b3575050506110aa91925065ffffffffffff165f527f93540b1a1dc30969947272428a8d0331ac0b23f753e3edd38c70f80cf083510060205260405f2090565b80549091019055005b6110bd8184612c4b565b51908282015161110d816111008865ffffffffffff165f527f93540b1a1dc30969947272428a8d0331ac0b23f753e3edd38c70f80cf083510160205260405f2090565b905f5260205260405f2090565b5461115957611152889351916111008865ffffffffffff165f527f93540b1a1dc30969947272428a8d0331ac0b23f753e3edd38c70f80cf083510160205260405f2090565b5501611065565b6040516366394e8360e11b8152600490fd5b604051637d376de360e11b815260ff919091166004820152602490fd5b92506111c1611196426148c8565b7fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce91015494169384612ca9565b7fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce910254106111ea57005b61121561121d937fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce910155565b810190612cdc565b92919050600260ff82160361116b5750823b1561001557611257925f9283604051809681958294639acd53ef60e01b845260048401612d73565b03925af18015610d085761126757005b806112746105fe92610674565b8061063b565b6040516303b5f06b60e61b8152600490fd5b604051639446908760e01b8152600490fd5b604051637efe5d4160e11b8152600490fd5b346100155760c03660031901126100155760643560a4356112d08161046b565b6112d861373b565b6040516370a0823160e01b81523060048201526020906001600160a01b038316908281602481855afa8015610d085785915f9161147a575b5010611468576113829082857fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce91079261134f84546001600160a01b031690565b5f60405180978195829463095ea7b360e01b845260048401602090939291936001600160a01b0360408201951681520152565b03925af1908115610d08576113b9936113ad936113ad9361143a575b5050546001600160a01b031690565b6001600160a01b031690565b9065ffffffffffff91803b156100155760405163fb6a74c960e01b815265ffffffffffff6004803586168216908301526024803590951616938101939093526044808401949094529235606483015260848035908301526001600160a01b031660a4820152905f90829081838160c4810103925af18015610d085761126757005b8161145992903d10611461575b61145181836106e2565b810190612e63565b505f8061139e565b503d611447565b6040516324ac897760e11b8152600490fd5b61149a9150843d86116114a0575b61149281836106e2565b810190612b5b565b5f611310565b503d611488565b34610015576020366003190112610015576105fe6004356114c78161046b565b6114cf61373b565b6114d8426148c8565b5f80516020615d818339815191525490614d91565b6114f636610774565b906001600160a01b0391827f000000000000000000000000000000000000000000000000000000000000000016803014908115611602575b506115f057602060049361154061373b565b6040516352d1902d60e01b8152948591829086165afa5f93816115cf575b5061158457604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b907f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc83036115b6576105fe925061512c565b604051632a87526960e21b815260048101849052602490fd5b6115e991945060203d6020116114a05761149281836106e2565b925f61155e565b60405163703e46dd60e11b8152600490fd5b9050837f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541614155f61152e565b6040906003190112610015576004356116488161046b565b906024356107718161046b565b346100155761166336611630565b907ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460ff8160401c1680156117d0575b6117be5767ffffffffffffffff191660031790557ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468ff00000000000000001916600160401b1790556116e981613f64565b6116f282613f64565b6001600160a01b036001600160a01b031991817fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce91079116838254161790557fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce910892169082541617905561178f7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0068ff0000000000000000198154169055565b604051600381527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b60405163f92ee8a960e01b8152600490fd5b50600367ffffffffffffffff82161015611695565b34610015575f366003190112610015576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036115f05760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b34610015575f36600319011261001557602060405160148152f35b34610015576118bb61187b36611630565b919061188561373b565b6001600160a01b03165f527f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db0560205260405f2090565b906118c5426148c8565b915f80516020615d81833981519152549160018201906118f68183906001600160a01b03165f5260205260405f2090565b54156106295761191691906001600160a01b03165f5260205260405f2090565b545f198101919082116106245760019161059c9161462a565b34610015575f36600319011261001557602065ffffffffffff7f4e241e104e7ef4df0fc8eb6aad7b0f201c6126c722652f1bd1305b6b75c86d005460301c16604051908152f35b346100155761198436611630565b61198c61373b565b61199582613f64565b6119ee816119d3846001600160a01b03165f527fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce910460205260405f2090565b906001600160a01b03166001600160a01b0319825416179055565b6001600160a01b0380911691167f33a90f167c79bc982fe4f042913d870cd8f63ab6e979710f62dd6da856f0e40a5f80a3005b34610015575f366003190112610015576020604051633b9aca008152f35b34610015575f36600319011261001557602060405160028152f35b34610015575f36600319011261001557602060405160508152f35b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b6040906107719392151581528160208201520190611a75565b3461001557611ac036610f26565b50506040516302f8d0d560e11b81525f81600481305afa908115610d08575f905f92611afb575b50611af760405192839283611a99565b0390f35b9150503d805f833e611b0d81836106e2565b81019060408183031261001557611b2381612e56565b9060208101519067ffffffffffffffff8211610015570182601f8201121561001557805190611b5182610704565b93611b5f60405195866106e2565b8285526020838301011161001557815f9260208093018387015e840101525f611ae7565b3461001557602036600319011261001557600435611ba08161046b565b611ba861373b565b6001600160a01b03611bb9426148c8565b9116805f527f3b2b549db680c436ebf9aa3c8eeee850852f16da5cdb5137dbc0299ebb219e03908160205260405f205415610629575f5260205260405f2054905f198201918211610624576001611c126105fe9361457e565b5001615995565b346100155760203660031901126100155760206001600160a01b03611c79600435611c438161046b565b6001600160a01b03165f527fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce910560205260405f2090565b5416604051908152f35b346100155760c036600319011261001557600435611ca08161046b565b60a0366023190112610015576040516105fe91611cbc8261068d565b6024358252604435611ccd8161046b565b6020830152606435611cde8161046b565b6040830152608435611cef8161046b565b606083015260a435611d008161046b565b6080830152612e77565b346100155760203660031901126100155760206001600160a01b03611c79600435611d348161046b565b6001600160a01b03165f527fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce910460205260405f2090565b3461001557604036600319011261001557611dbf600435611d8a816107cc565b65ffffffffffff165f527f93540b1a1dc30969947272428a8d0331ac0b23f753e3edd38c70f80cf083510160205260405f2090565b6024355f52602052602060405f2054604051908152f35b3461001557604036600319011261001557611e296020600435611df88161046b565b60405163a3b9626f60e01b81526001600160a01b039091166004820152602480359082015291829081906044820190565b0381305afa8015610d08576020915f91611e47575b50604051908152f35b611e5e9150823d84116114a05761149281836106e2565b5f611e3e565b34610015575f3660031901126100155760206001600160a01b037fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce91085416604051908152f35b3461001557602036600319011261001557600435611ec68161046b565b611ece61373b565b611ed781613f64565b7fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce910080546001600160a01b0380841693919081168481146108e657611f3293856001600160a01b0319611f2c9416179055613de7565b5061384d565b507f5317fa585931182194fed99f2ea5f2efd38af9cff9724273704c8501c521e34b5f80a2005b34610015575f3660031901126100155760207fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce910254604051908152f35b3461001557604036600319011261001557602060ff611fe8602435611fb98161046b565b6004355f525f80516020615da1833981519152845260405f20906001600160a01b03165f5260205260405f2090565b54166040519015158152f35b34610015576020366003190112610015576004356120118161046b565b61201961373b565b61202281613f64565b7ffd87879bc98f37af7578af722aecfbe5843e5ad354da2d1e70cb5157c4ec880055005b34610015576020366003190112610015576105fe6004356120668161046b565b61206e61373b565b61208d6040515f602082015260208152612087816106c6565b82614656565b612096426148c8565b5f80516020615d818339815191525490614ef4565b346100155760603660031901126100155760048035906120ca8261046b565b67ffffffffffffffff604435818111610015576120ed6120f49136908501610ef8565b3691610720565b916001600160a01b0380946040519063b134427160e01b82528184816020998a94165afa908115610d08575f916121fc575b50604051635d927f4560e11b815291169285828481875afa8015610d08576001925f916121cf575b5016036121c05791839161217b935f604051809681958294635ca61c3760e11b8452602435908401613fa6565b03925af1908115610d0857611af7925f926121a3575b50506040519081529081906020820190565b6121b99250803d106114a05761149281836106e2565b5f80612191565b6040516332ef35b960e21b8152fd5b6121ef9150873d89116121f5575b6121e781836106e2565b810190613f86565b5f61214e565b503d6121dd565b61221c9150863d8811612222575b61221481836106e2565b810190613c26565b5f612126565b503d61220a565b34610015575f3660031901126100155760206040515f8152f35b34610015576020366003190112610015576004356001600160e01b031981168103610015576122a460209163ffffffff60e01b165f527fbe09a78a256419d2b885312b60a13e8082d8ab3c36c463fff4fbb086f1e96f0160205260405f2090565b54604051908152f35b34610015575f36600319011261001557602060405160328152f35b34610015575f36600319011261001557611af76040516122e7816106c6565b600581527f352e302e300000000000000000000000000000000000000000000000000000006020820152604051918291602083526020830190611a75565b34610015576020366003190112610015576004356123428161046b565b61234a61373b565b6001600160a01b0361235b426148c8565b9116805f527f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db04908160205260405f205415610629575f5260205260405f2054905f198201918211610624576001611c126105fe93614528565b3461001557602036600319011261001557611af76123dc6004356123d78161046b565b613045565b604051918291602083526020830190611a75565b34610015576123fe36611630565b61240661373b565b6001600160a01b0382165f527f3b2b549db680c436ebf9aa3c8eeee850852f16da5cdb5137dbc0299ebb219e0360205260405f205415612452576105fe9161244d8261570c565b615771565b6040516325ec6c1f60e01b8152600490fd5b34610015575f366003190112610015576020604051603a8152f35b34610015575f3660031901126100155760206109316131a8565b34610015576020366003190112610015576004356124b68161046b565b6124be61373b565b6124c781613f64565b7fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce910380546001600160a01b0380841693919081168481146108e65761252293856001600160a01b031961251c9416179055613ec0565b5061392a565b507f01e06e871b32b0b127105fbd5dbecd24273b7e1191a8940de24f4ea249e355d65f80a2005b346100155760603660031901126100155760048035906125688261046b565b60243567ffffffffffffffff8111610015576125879036908301610756565b90604435916125958361046b565b61259d61373b565b6125a684613f64565b805191602092838082149182159261277e575b505061276f577f3b2b549db680c436ebf9aa3c8eeee850852f16da5cdb5137dbc0299ebb219e00546001600160a01b0393906125f69085166113ad565b8160405180926302910f8b60e31b825281806126248c8983019190916001600160a01b036020820193169052565b03915afa908115610d08575f91612752575b5015612742576126cb816126766113ad877f3b2b549db680c436ebf9aa3c8eeee850852f16da5cdb5137dbc0299ebb219e0154166001600160a01b031690565b7f933223a21808ea6583da836861e2265bfa3c7e3b9070740cd75dc9ff6fb4170054604080516308834cb560e21b81526001600160a01b03808d16898301908152931660208401529485939284928392910190565b03915afa918215610d08575f92612725575b5050156127165750612701906126fb856126f6426148c8565b615513565b84614656565b811661270957005b6105fe9161244d8261570c565b604051634d1cc09f60e11b8152fd5b61273b9250803d106114615761145181836106e2565b5f806126dd565b50604051631f0853c160e21b8152fd5b6127699150823d84116114615761145181836106e2565b5f612636565b604051630b8dda1d60e31b8152fd5b61278e9250840101848401612b5b565b15835f6125b9565b34610015575f36600319011261001557602060405160128152f35b34610015576127c261187b36611630565b906127cc426148c8565b9060018301906127ed8183906001600160a01b03165f5260205260405f2090565b54156106295761280d91906001600160a01b03165f5260205260405f2090565b545f19810190811161062457611c126001916105fe9461462a565b3461001557602036600319011261001557602061288e611c7960043561284d8161046b565b6001600160a01b039283916001600160a01b03165f527fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce910560205260405f2090565b54166001600160a01b03165f527fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce910460205260405f2090565b34610015576105fe6001600160a01b036128f061290e6128e536611630565b92839161188561373b565b6128f9426148c8565b5f80516020615d818339815191525491615039565b16805f527f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db086020525f6040812055615c7e565b3461001557610100366003190112610015576105fe604051612962816106a9565b61296a61047c565b815261297461048b565b6020820152612981610498565b604082015261298e6104a5565b606082015261299b6104b2565b60808201526129a86107dc565b60a08201526129b56107e9565b60c08201526129c26104bf565b60e0820152613233565b346100155760203660031901126100155765ffffffffffff6004356129f0816107cc565b165f527f93540b1a1dc30969947272428a8d0331ac0b23f753e3edd38c70f80cf0835100602052602060405f2054604051908152f35b34610015575f3660031901126100155760206001600160a01b037fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce91075416604051908152f35b3461001557604036600319011261001557600435602435612a8b8161046b565b815f525f80516020615da1833981519152602052600160405f20015491825f5260ff612acb3360405f20906001600160a01b03165f5260205260405f2090565b541615610abb576105fe9250613f2f565b34610015575f36600319011261001557602061093161092c6131a8565b9081518082526020808093019301915f5b828110612b18575050505090565b835185529381019392810192600101612b0a565b34610015575f36600319011261001557611af7612b47613558565b604051918291602083526020830190612af9565b90816020910312610015575190565b634e487b7160e01b5f52601160045260245ffd5b91909165ffffffffffff8080941691160191821161062457565b7f4e241e104e7ef4df0fc8eb6aad7b0f201c6126c722652f1bd1305b6b75c86d00549065ffffffffffff9081808460301c1691160290808216918203610624576107719216612b7e565b908160209103126100155751610771816107cc565b6040513d5f823e3d90fd5b604051906080820182811067ffffffffffffffff821117610688576040525f6060838281528260208201528260408201520152565b634e487b7160e01b5f52603260045260245ffd5b8051821015612c5f5760209160051b010190565b612c37565b612c779060208082518301019101612b5b565b5f525f80516020615dc18339815191526020526001600160a01b0360405f20541690565b5f1981019190821161062457565b9190820391821161062457565b359060ff8216820361001557565b67ffffffffffffffff81116106885760051b60200190565b909160608284031261001557612cf182612cb6565b92602080840135612d01816107cc565b9360408101359067ffffffffffffffff821161001557019180601f84011215610015578235612d2f81612cc4565b93612d3d60405195866106e2565b818552838086019260051b820101928311610015578301905b828210612d64575050505090565b81358152908301908301612d56565b9065ffffffffffff612d92602092959495604085526040850190612af9565b9416910152565b909160608284031261001557612dae82612cb6565b9260209283810135612dbf816107cc565b9360409160408101359067ffffffffffffffff821161001557019083601f83011215610015578135612df081612cc4565b94612dfe60405196876106e2565b818652828087019260061b85010193818511610015578301915b848310612e285750505050505090565b8583830312610015578386918251612e3f816106c6565b853581528286013583820152815201920191612e18565b5190811515820361001557565b908160209103126100155761077190612e56565b612e7f61373b565b612e88816151df565b612e9a81612e95426148c8565b6155f2565b60507f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db03541015613033576020612f665f93612f026113ad6113ad7fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce9108546001600160a01b031690565b6040805163b15a758f60e01b81526001600160a01b0380881660048301528451602483015260208501518116604483015291840151821660648201526060840151821660848201526080909301511660a483015290948592839190829060c4820190565b03925af1918215610d08575f92613012575b50612fb06113ad6113ad7fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce9107546001600160a01b031690565b803b1561001557604051631c40a74560e11b81526001600160a01b03938416600482015292821660248401525f908390604490829084905af1918215610d085761048992612fff575b5061570c565b8061127461300c92610674565b5f612ff9565b61302c91925060203d6020116122225761221481836106e2565b905f612f78565b60405163570fc49160e11b8152600490fd5b61305061092c6131a8565b9061308b816001600160a01b03165f527f3da47716e6090d5a5545e03387f4dac112d37cd069a5573bb81de8579bd9dc0060205260405f2090565b5480151580613166575b61314857506130d4906001600160a01b03165f527f3da47716e6090d5a5545e03387f4dac112d37cd069a5573bb81de8579bd9dc0160205260405f2090565b54908115159081613117575b506130fe575060405161077181610b6160208201905f602083019252565b6040805160208101929092526107719082908101610b61565b6131429150600161313c845f525f80516020615dc183398151915260205260405f2090565b0161380a565b5f6130e0565b610b6192506107719150604051928391602083019190602083019252565b5061318b83600161313c845f525f80516020615dc183398151915260205260405f2090565b613095565b65ffffffffffff918216908216039190821161062457565b6131b1426148c8565b7f4e241e104e7ef4df0fc8eb6aad7b0f201c6126c722652f1bd1305b6b75c86d00549065ffffffffffff90818316908216811461322c57816131fd5f19926131f8426148c8565b613190565b1601918183116106245760301c811691821561321857160490565b634e487b7160e01b5f52601260045260245ffd5b5050505f90565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0080549160ff8360401c16159267ffffffffffffffff811680159081613364575b600114908161335a575b159081613351575b506117be5767ffffffffffffffff19166001179091556132aa90826133155761336c565b6132b057565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468ff000000000000000019169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29080602081015b0390a1565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468ff00000000000000001916600160401b17905561336c565b9050155f613286565b303b15915061327e565b859150613274565b61349761349c9161337c81613fbd565b6133af61338b610b99426148c8565b7fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce910155565b61348f61348a608060a08401936133f66133d2610b99875165ffffffffffff1690565b7fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce910255565b61346361340a82516001600160a01b031690565b60c083015165ffffffffffff1660408401516001600160a01b031660208501516001600160a01b03169061344860608701516001600160a01b031690565b9261345d60e08801516001600160a01b031690565b946140b6565b019261347e61347985516001600160a01b031690565b6142dd565b5165ffffffffffff1690565b6142ec565b610c3d615900565b613999565b506134a5614351565b6134ad6143ee565b61048961448b565b906032820180921161062457565b906001820180921161062457565b9190820180921161062457565b60209081818403126100155780519067ffffffffffffffff821161001557019180601f8401121561001557825161351481612cc4565b9361352260405195866106e2565b818552838086019260051b820101928311610015578301905b828210613549575050505090565b8151815290830190830161353b565b6135827fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce9106546134b5565b431061369a576001600160a01b036135c17fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce9100546001600160a01b031690565b1690811561128c576135f1437fca64b196a0d05040904d062f739ed1d1e1d3cc5de78f7001fb9039595fce910655565b6135f96131a8565b6040516333e9fa3760e11b815265ffffffffffff821660048201529092905f81602481305afa908115610d08575f91613678575b508093823b156100155761365a925f9283604051809681958294639acd53ef60e01b845260048401612d73565b03925af18015610d085761366b5750565b8061127461048992610674565b61369491503d805f833e61368c81836106e2565b8101906134de565b5f61362d565b606090565b3d1561369a573d906136b082610704565b916136be60405193846106e2565b82523d5f602084013e565b5f807ffd87879bc98f37af7578af722aecfbe5843e5ad354da2d1e70cb5157c4ec8800546040516020810190368483376137196034823681013060601b60208201520360148101845201826106e2565b51915af461372561369f565b901561373357602081519101f35b602081519101fd5b5f80356001600160e01b0319168082527fbe09a78a256419d2b885312b60a13e8082d8ab3c36c463fff4fbb086f1e96f016020526040909120545f525f80516020615da183398151915260205260ff6137a83360405f20906001600160a01b03165f5260205260405f2090565b5416156137b25750565b6001600160e01b0319165f9081527fbe09a78a256419d2b885312b60a13e8082d8ab3c36c463fff4fbb086f1e96f0160205260409081902054905163e2517d3f60e01b81523360048201526024810191909152604490fd5b549065ffffffffffff8091169081818416109283613829575b50505090565b60301c16801592508215613842575b50505f8080613823565b101590505f80613838565b6001600160a01b0381165f9081527f65790e8d0bb6f359900b01cbf560e976e9c35917c44fb5e0bd0bad22fdf83b0b602052604090207fb90e9995c6170fff8ea03e9ad6919878e483770c237f1a6f330ceaa7112b344a905f80516020615da18339815191529060ff905b5416156138c6575050505f90565b815f526020526138ea8260405f20906001600160a01b03165f5260205260405f2090565b805460ff1916600117905533916001600160a01b0316907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b6001600160a01b0381165f9081527f4b5e773988e6dd856895ef41cb035a6e16ed204a592a8414aeb7f9d55ca52b51602052604090207f3fb90a982568460bdf5505b984928e3c942db3525e60c25e39051cacec08b60f905f80516020615da18339815191529060ff906138b8565b6001600160a01b0381165f9081527ff2fe6b5e557999bc60d5eba037d79a45648a7185f0244db09a55888ed6367a2e60205260409020545f80516020615da18339815191529060ff16156139ed5750505f90565b5f8052602052613a118160405f20906001600160a01b03165f5260205260405f2090565b805460ff1916600117905533906001600160a01b03165f7f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8180a4600190565b805f525f80516020615da18339815191528060205260ff6138b88460405f20906001600160a01b03165f5260205260405f2090565b90613a9082612cc4565b613a9d60405191826106e2565b8281528092613aae601f1991612cc4565b0190602036910137565b91907f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db035492613ae684613a86565b915f945f5b818110613bcc575050613b3690839495613b3b94526001600160a01b03165f527f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db0560205260405f2090565b6148fa565b815181519182820180831161062457613b5390613a86565b935f5b838110613ba95750505f5b838110613b6f575050505090565b80613ba3613b82610c3d60019486612c4b565b613b95613b8f84886134d1565b89612c4b565b906001600160a01b03169052565b01613b61565b80613bc6613bbc610c3d60019486612c4b565b613b95838a612c4b565b01613b56565b613bd581614528565b5090613be585600180940161380a565b613bf4575b6001915001613aeb565b6001600160a01b03613c0582614528565b505416885f19811461062457600193613c2091019988612c4b565b52613bea565b9081602091031261001557516107718161046b565b6040516020810181811067ffffffffffffffff821117610688576040525f8152905f368137565b9061077194936001600160a01b0360809465ffffffffffff9385521660208401521660408201528160608201520190611a75565b7f933223a21808ea6583da836861e2265bfa3c7e3b9070740cd75dc9ff6fb417005490919060601b6bffffffffffffffffffffffff1916604051630ce9b79360e41b81526020936001600160a01b03929185816004818588165afa938415610d085786915f95613dc2575b5090613d56916040870195613d1d87516001600160a01b031690565b91613d2e895165ffffffffffff1690565b90613d37613c3b565b60405163e02f693760e01b815296879586948593918c60048601613c62565b0392165afa908115610d0857613d84613d9f92613d9192610489995f92613da5575b50506060880151614977565b955165ffffffffffff1690565b93516001600160a01b031690565b92614a2f565b613dbb9250803d106114a05761149281836106e2565b5f80613d78565b82919550613ddf90613d56933d84116122225761221481836106e2565b949091613d01565b6001600160a01b0381165f9081527f65790e8d0bb6f359900b01cbf560e976e9c35917c44fb5e0bd0bad22fdf83b0b602052604090207fb90e9995c6170fff8ea03e9ad6919878e483770c237f1a6f330ceaa7112b344a905f80516020615da18339815191529060ff905b5416613e5f575050505f90565b815f52602052613e838260405f20906001600160a01b03165f5260205260405f2090565b805460ff1916905533916001600160a01b0316907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b6001600160a01b0381165f9081527f4b5e773988e6dd856895ef41cb035a6e16ed204a592a8414aeb7f9d55ca52b51602052604090207f3fb90a982568460bdf5505b984928e3c942db3525e60c25e39051cacec08b60f905f80516020615da18339815191529060ff90613e52565b805f525f80516020615da18339815191528060205260ff613e528460405f20906001600160a01b03165f5260205260405f2090565b6001600160a01b031615613f7457565b604051634274a2ed60e01b8152600490fd5b90816020910312610015575167ffffffffffffffff811681036100155790565b604090610771939281528160208201520190611a75565b61401b6001600160a01b03613fd481845116613f64565b613fe381602085015116613f64565b613ff281604085015116613f64565b61400181606085015116613f64565b61401081608085015116613f64565b60e083015116613f64565b60a081019065ffffffffffff9081614039845165ffffffffffff1690565b16158015614099575b61408757610b9961405f60c061406c93015165ffffffffffff1690565b935165ffffffffffff1690565b91161061407557565b6040516314acefe160e31b8152600490fd5b60405163d0fc679160e01b8152600490fd5b506140b0610b9960c083015165ffffffffffff1690565b15614042565b939291936140c2615900565b6140ca615900565b7f933223a21808ea6583da836861e2265bfa3c7e3b9070740cd75dc9ff6fb41700556140f4615900565b5f80516020615d818339815191525561410b615900565b6001600160a01b03926001600160a01b031990847f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db00911682825416179055614152426148c8565b935f80527f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db0260205260405f20546142cb577f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db018054600160401b811015610688576142a7966105e960016141cc84826141ef960187556145d4565b508781541681550191829065ffffffffffff1665ffffffffffff19825416179055565b545f80527f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db026020527ff33118966d55186e5f0454db8d43327a081a2efbfdd10ab86c75e9fab477a8de55614241615900565b7f3b2b549db680c436ebf9aa3c8eeee850852f16da5cdb5137dbc0299ebb219e009216908254161790556001600160a01b037f3b2b549db680c436ebf9aa3c8eeee850852f16da5cdb5137dbc0299ebb219e0191166001600160a01b0319825416179055565b7ffd87879bc98f37af7578af722aecfbe5843e5ad354da2d1e70cb5157c4ec880055565b604051630ea075bf60e21b8152600490fd5b6142e990613497615900565b50565b6142f4615900565b7f4e241e104e7ef4df0fc8eb6aad7b0f201c6126c722652f1bd1305b6b75c86d009081546bffffffffffff00000000000065ffffffffffff614335426148c8565b169260301b16906bffffffffffffffffffffffff191617179055565b63117e3b0960e21b5f8181527fbe09a78a256419d2b885312b60a13e8082d8ab3c36c463fff4fbb086f1e96f016020527fb90e9995c6170fff8ea03e9ad6919878e483770c237f1a6f330ceaa7112b344a7f81a40d7b7f4167def655218a0cb832c379b1e970e78941889559ba4664c6ea9b81905591907fb579d5e7e95ac8795a9c9ecce0ee2e2d189dce9827bac2e35ebbd3a68be7d4239080a3565b633136c5d760e01b5f8181527fbe09a78a256419d2b885312b60a13e8082d8ab3c36c463fff4fbb086f1e96f016020527fb90e9995c6170fff8ea03e9ad6919878e483770c237f1a6f330ceaa7112b344a7fcc346fe35fafdfec8c79f1a86b9b1109dd3b4f5ee27004a2f896b686f7f262df81905591907fb579d5e7e95ac8795a9c9ecce0ee2e2d189dce9827bac2e35ebbd3a68be7d4239080a3565b634585e33b60e01b5f8181527fbe09a78a256419d2b885312b60a13e8082d8ab3c36c463fff4fbb086f1e96f016020527f3fb90a982568460bdf5505b984928e3c942db3525e60c25e39051cacec08b60f7f1df2be375326dbf27255fc44a3ff90f43a75d4e1104db78020a03c01d814719581905591907fb579d5e7e95ac8795a9c9ecce0ee2e2d189dce9827bac2e35ebbd3a68be7d4239080a3565b7f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db038054821015612c5f575f5260011b7fecfc319653c6064eab193aeb17a7bbf6b64b6bf8d270efa19a55b3048c09153501905f90565b7f3b2b549db680c436ebf9aa3c8eeee850852f16da5cdb5137dbc0299ebb219e028054821015612c5f575f5260011b7f705ef947cc8cdcca82faf0a2f100ebf54645b0dc75e0679e805afd7f7a48052601905f90565b7f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db018054821015612c5f575f5260011b7f30d22b6608408cca7b6879775b63a63e629084831f1881ca9c28b95bbb984a5101905f90565b8054821015612c5f575f5260205f209060011b01905f90565b634e487b7160e01b5f525f60045260245ffd5b9061466a9060208082518301019101612b5b565b614673426148c8565b906001600160a01b036146aa61469d835f525f80516020615dc183398151915260205260405f2090565b546001600160a01b031690565b166148b6576146e9836001600160a01b03165f527f3da47716e6090d5a5545e03387f4dac112d37cd069a5573bb81de8579bd9dc0160205260405f2090565b548061482d575b5061472b836001600160a01b03165f527f3da47716e6090d5a5545e03387f4dac112d37cd069a5573bb81de8579bd9dc0060205260405f2090565b54806147fe575b61476c846001600160a01b03165f527f3da47716e6090d5a5545e03387f4dac112d37cd069a5573bb81de8579bd9dc0160205260405f2090565b55806147a8846001600160a01b03165f527f3da47716e6090d5a5545e03387f4dac112d37cd069a5573bb81de8579bd9dc0060205260405f2090565b55806147b357505050565b6147f8816147de610489956119d36001955f525f80516020615dc183398151915260205260405f2090565b5f525f80516020615dc183398151915260205260405f2090565b016159e5565b614828836001614822845f525f80516020615dc183398151915260205260405f2090565b01615995565b614732565b61486e61486a6001614853845f525f80516020615dc183398151915260205260405f2090565b01855f80516020615d818339815191525491615941565b1590565b6148a45761489361489e915f525f80516020615dc183398151915260205260405f2090565b60015f918281550155565b5f6146f0565b60405163c0e3782160e01b8152600490fd5b6040516325aff6d160e21b8152600490fd5b65ffffffffffff908181116148db571690565b604490604051906306dfcc6560e41b8252603060048301526024820152fd5b80549161490683613a86565b925f925f5b82811061491b5750505050815290565b614925818361462a565b509061493585600180940161380a565b614944575b600191500161490b565b6001600160a01b03614956828561462a565b505416865f1981146106245760019361497191019789612c4b565b5261493a565b90808202905f19818409908280831092039180830392146149e857633b9aca0090828211156149d6577f88f2cfb83100cb4e69e7c79c58b316e597157d372fb9787e8e47ce423a2e9c6d940990828211900360f71b910360091c170290565b634e487b715f5260116020526024601cfd5b5050633b9aca0091500490565b919360a0936001600160a01b03610771979665ffffffffffff94865216602085015260408401521660608201528160808201520190611a75565b6040805163b134427160e01b815291959394929360209391926001600160a01b03908581600481858b165afa908115610d08575f91614c2b575b501680158015614c23575b614c19578351635d927f4560e11b8152928584600481855afa938415610d0857869467ffffffffffffffff915f91614bfc575b501680614b5557505f88614ad8614abc613c3b565b885163010d40ab60e11b81529c8d9788968795600487016149f5565b03925af1908115610d08577fa455bb45e23ed02807f6ef41727a47f3fcc85c9df0baa3570fd388f95b09b4da95613310935f93614b36575b505051938493846040919493926001600160a01b03606083019616825260208201520152565b614b4d929350803d106114a05761149281836106e2565b905f80614b10565b9293509091600103614beb57908492915f88614b8e614b72613c3b565b885163545ce38960e01b81529c8d9788968795600487016149f5565b03925af1908115610d08577f4df99d47392012b66d459ea8fe495a8ce499b8faee622119c4cf353023b582fe95613310935f93614b3657505051938493846040919493926001600160a01b03606083019616825260208201520152565b835163539cea7160e11b8152600490fd5b614c139150863d88116121f5576121e781836106e2565b5f614aa7565b5050505050505050565b508115614a74565b614c429150863d88116122225761221481836106e2565b5f614a69565b634e487b7160e01b5f52603160045260245ffd5b7f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db0380548015614ca7575f190190614c9282614528565b614ca2576001815f809355015555565b614643565b614c48565b7f3b2b549db680c436ebf9aa3c8eeee850852f16da5cdb5137dbc0299ebb219e0280548015614ca7575f190190614c928261457e565b80548015614ca7575f190190614c92828261462a565b90614ca257818103614d08575050565b60018091614d366001600160a01b0385541682906001600160a01b03166001600160a01b0319825416179055565b01910190818103614d45575050565b8154815465ffffffffffff191665ffffffffffff918216178255610489925460301c166bffffffffffff00000000000082549160301b16906bffffffffffff0000000000001916179055565b91906001600160a01b0382165f527f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db0460205260405f205490811561062957614de9915f1901936001614de286614528565b5001615a04565b7f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db038054614e15846134c3565b1015614ead575f91614e45614e35614e30614e839454612c9b565b614528565b50614e3f86614528565b90614cf8565b614e4d614c5c565b6001600160a01b03165f527f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db0460205260405f2090565b55614eaa614e4d614e9c614e96846134c3565b93614528565b50546001600160a01b031690565b55565b505f9150614eeb906001600160a01b03165f527f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db0460205260405f2090565b55610489614c5c565b91906001600160a01b0382165f527f3b2b549db680c436ebf9aa3c8eeee850852f16da5cdb5137dbc0299ebb219e0360205260405f205490811561062957614f45915f1901936001614de28661457e565b7f3b2b549db680c436ebf9aa3c8eeee850852f16da5cdb5137dbc0299ebb219e028054614f71846134c3565b1015614ff2575f91614f9b614f91614f8c614fd99454612c9b565b61457e565b50614e3f8661457e565b614fa3614cac565b6001600160a01b03165f527f3b2b549db680c436ebf9aa3c8eeee850852f16da5cdb5137dbc0299ebb219e0360205260405f2090565b55614eaa614fa3614e9c614fec846134c3565b9361457e565b505f9150615030906001600160a01b03165f527f3b2b549db680c436ebf9aa3c8eeee850852f16da5cdb5137dbc0299ebb219e0360205260405f2090565b55610489614cac565b9190600183019161505b8584906001600160a01b03165f5260205260405f2090565b5490811561062957615077915f1901926001614de2858861462a565b8254615082826134c3565b1015615106576150ee6001600160a01b03915f6150de86976150be6150b36150ad614eaa9a54612c9b565b8b61462a565b50614e3f868c61462a565b6150c789614ce2565b86906001600160a01b03165f5260205260405f2090565b556150e8816134c3565b9561462a565b5054166001600160a01b03165f5260205260405f2090565b50615126610489935f92906001600160a01b03165f5260205260405f2090565b55614ce2565b90813b156151be576001600160a01b0382167f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc816001600160a01b03198254161790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a28051156151a3576142e991615a59565b5050346151ac57565b60405163b398979f60e01b8152600490fd5b604051634c9c8ce360e01b81526001600160a01b0383166004820152602490fd5b7f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db00546001600160a01b0391906152169083166113ad565b916040918251916302910f8b60e31b83526020928381600497818061524d888c83019190916001600160a01b036020820193169052565b03915afa908115610d08575f916154f6575b50156154e657835163392e53cd60e01b8152828216929084818881875afa908115610d08575f916154c9575b50156154b9576152c5835f527f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db0760205260405f2054151590565b908115615475575b506154655783516327f843b560e11b81529083828781865afa918215610d08575f92615446575b508584839487519283809263b134427160e01b82525afa908115610d08575f91615429575b501680615361575b5050905065ffffffffffff6153495f80516020615d818339815191525465ffffffffffff1690565b911610615354575050565b5163121f507960e11b8152fd5b8451635d927f4560e11b81529284848881855afa938415610d0857879467ffffffffffffffff915f9161540c575b5016600181036153ef575050839085519384809263e054e08b60e01b82525afa918215610d08576153c8935f936153d0575b5050613190565b805f80615321565b6153e7929350803d10610d0157610cf281836106e2565b905f806153c1565b92509350506001915011156153c857505163539cea7160e11b8152fd5b6154239150873d89116121f5576121e781836106e2565b5f61538f565b6154409150853d87116122225761221481836106e2565b5f615319565b61545e919250843d8611610d0157610cf281836106e2565b905f6152f4565b505050516324ec133760e11b8152fd5b6154b091506001600160a01b03165f527f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db0460205260405f2090565b5415155f6152cd565b8451639a09fd8760e01b81528690fd5b6154e09150853d87116114615761145181836106e2565b5f61528b565b505050516362df054560e01b8152fd5b61550d9150843d86116114615761145181836106e2565b5f61525f565b6001600160a01b03821691825f527f3b2b549db680c436ebf9aa3c8eeee850852f16da5cdb5137dbc0299ebb219e03918260205260405f20546142cb577f3b2b549db680c436ebf9aa3c8eeee850852f16da5cdb5137dbc0299ebb219e02918254600160401b811015610688576155d1916155b5615597836001809501885561457e565b509182906001600160a01b03166001600160a01b0319825416179055565b0191829065ffffffffffff1665ffffffffffff19825416179055565b6bffffffffffff00000000000019815416905554915f5260205260405f2055565b6001600160a01b03821691825f527f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db04918260205260405f20546142cb577f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db03918254600160401b811015610688576155d1916155b56155978360018095018855614528565b9160018301926156978285906001600160a01b03165f5260205260405f2090565b546142cb57805492600160401b841015610688576156e160016156c28682614eaa980186558561462a565b5080546001600160a01b0319166001600160a01b0387161781556155b5565b6bffffffffffff0000000000001981541690555492906001600160a01b03165f5260205260405f2090565b60405163d8dfeb4560e01b8152906020826004816001600160a01b0385165afa908115610d0857610489925f9261574c575b506119d390611c4383613f64565b6119d391925061576a9060203d6020116122225761221481836106e2565b919061573e565b61577a826151df565b604051630ce9b79360e41b81526001600160a01b039060209081816004818887165afa8015610d085783915f916158e3575b501691604051635d927f4560e11b81528281600481875afa8015610d085767ffffffffffffffff915f916158c6575b501692600284141593846158ba575b508315615861575b50505061584f578161584a6142e99361583b846001600160a01b03165f527f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db0560205260405f2090565b615844426148c8565b90615676565b615a76565b604051634e4f76bb60e11b8152600490fd5b82935091600491926040519283809263570ca73560e01b82525afa928315610d08575f9361589b575b5050808316911614155f80806157f2565b6158b2929350803d106122225761221481836106e2565b905f8061588a565b6003141593505f6157ea565b6158dd9150843d86116121f5576121e781836106e2565b5f6157db565b6158fa9150833d85116122225761221481836106e2565b5f6157ac565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c161561592f57565b604051631afcd79f60e31b8152600490fd5b549165ffffffffffff90818416159384615985575b84615963575b5050505090565b8280949550615976929160301c16612b7e565b9216911611155f80808061595c565b9350818460301c16151593615956565b9081549165ffffffffffff8360301c166159d3576bffffffffffffffffffffffff1990921660309190911b6bffffffffffff00000000000016179055565b604051633f54562b60e11b8152600490fd5b906105e990829065ffffffffffff1665ffffffffffff19825416179055565b54909165ffffffffffff9182811615801590615a4c575b615a3a57829182615a2f9260301c16612b7e565b921691161161060057565b60405163c0f9610560e01b8152600490fd5b50828160301c1615615a1b565b5f8061077193602081519101845af4615a7061369f565b91615ab9565b90610771916001600160a01b0380911691825f527f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db086020521660405f2055615b6f565b90615ae05750805115615ace57805190602001fd5b60405163d6bda27560e01b8152600490fd5b81511580615b13575b615af1575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b15615ae9565b7f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db068054821015612c5f575f527ff4b9cbf3619e32580a6489035e19d8ac6906abf09f144261111f9f8ad6ab704901905f90565b805f527f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db078060205260405f2054155f14615c16577f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db068054600160401b8110156106885760018101808355811015612c5f5783907ff4b9cbf3619e32580a6489035e19d8ac6906abf09f144261111f9f8ad6ab7049015554915f5260205260405f2055600190565b50505f90565b7f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db068054908115614ca7575f1982019180831015612c5f577ff4b9cbf3619e32580a6489035e19d8ac6906abf09f144261111f9f8ad6ab70485f91838352015555565b5f8181527f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db0760205260409020548015615c16575f199181830191808311610624577f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db06549384019384116106245783835f95615d319503615d37575b505050615d04615c1c565b5f527f485f0695561726d087d0cb5cf546efed37ef61dfced21455f1ba7eb5e5b3db0760205260405f2090565b55600190565b615d04615d5f91615d57615d4d615d7795615b1c565b90549060031b1c90565b928391615b1c565b90919082549060031b91821b915f19901b1916179055565b555f8080615cf956fe937e0d2984afc3afaa413d74098ba180cc0c6aae6527cc2713827ed6bc72f200be09a78a256419d2b885312b60a13e8082d8ab3c36c463fff4fbb086f1e96f003da47716e6090d5a5545e03387f4dac112d37cd069a5573bb81de8579bd9dc02a2646970667358221220a3d503011938dfc91809d4e67b57375a05da1fa6873616eb44ddcec5b68b670764736f6c63430008190033