3 txs
2.6k calls
constructor
constructor(address tokenMessenger, address cctpMessageTransmitterProxy, address token, address[] allowlist, address rmnProxy, address router, address previousPool)
functions
getAllowList
viewfunction getAllowList() view returns (address[])
getAllowListEnabled
viewfunction getAllowListEnabled() view returns (bool)
getCurrentInboundRateLimiterState
viewfunction getCurrentInboundRateLimiterState(uint64 remoteChainSelector) view returns (tuple)
getCurrentOutboundRateLimiterState
viewfunction getCurrentOutboundRateLimiterState(uint64 remoteChainSelector) view returns (tuple)
getCurrentProposedCCTPChainMigration
viewfunction getCurrentProposedCCTPChainMigration() view returns (uint64)
getDomain
viewfunction getDomain(uint64 chainSelector) view returns (tuple)
getExcludedTokensByChain
viewfunction getExcludedTokensByChain(uint64 remoteChainSelector) view returns (uint256)
getLiquidityProvider
viewfunction getLiquidityProvider(uint64 remoteChainSelector) view returns (address)
getLockedTokensForChain
viewfunction getLockedTokensForChain(uint64 remoteChainSelector) view returns (uint256)
getRateLimitAdmin
viewfunction getRateLimitAdmin() view returns (address)
getRemotePools
viewfunction getRemotePools(uint64 remoteChainSelector) view returns (bytes[])
getRemoteToken
viewfunction getRemoteToken(uint64 remoteChainSelector) view returns (bytes)
getRmnProxy
viewfunction getRmnProxy() view returns (address rmnProxy)
getRouter
viewfunction getRouter() view returns (address router)
getSupportedChains
viewfunction getSupportedChains() view returns (uint64[])
getToken
viewfunction getToken() view returns (address token)
getTokenDecimals
viewfunction getTokenDecimals() view returns (uint8 decimals)
i_localDomainIdentifier
viewfunction i_localDomainIdentifier() view returns (uint32)
i_messageTransmitterProxy
viewfunction i_messageTransmitterProxy() view returns (address)
i_previousPool
viewfunction i_previousPool() view returns (address)
i_tokenMessenger
viewfunction i_tokenMessenger() view returns (address)
isRemotePool
viewfunction isRemotePool(uint64 remoteChainSelector, bytes remotePoolAddress) view returns (bool)
isSupportedChain
viewfunction isSupportedChain(uint64 remoteChainSelector) view returns (bool)
isSupportedToken
viewfunction isSupportedToken(address token) view returns (bool)
owner
viewfunction owner() view returns (address)
shouldUseLockRelease
viewfunction shouldUseLockRelease(uint64 remoteChainSelector) view returns (bool)
SUPPORTED_USDC_VERSION
viewfunction SUPPORTED_USDC_VERSION() view returns (uint32)
supportsInterface
purefunction supportsInterface(bytes4 interfaceId) pure returns (bool)
typeAndVersion
viewfunction typeAndVersion() view returns (string)
acceptOwnership
nonpayablefunction acceptOwnership()
addRemotePool
nonpayablefunction addRemotePool(uint64 remoteChainSelector, bytes remotePoolAddress)
applyAllowListUpdates
nonpayablefunction applyAllowListUpdates(address[] removes, address[] adds)
applyChainUpdates
nonpayablefunction applyChainUpdates(uint64[] remoteChainSelectorsToRemove, tuple[] chainsToAdd)
burnLockedUSDC
nonpayablefunction burnLockedUSDC()
cancelExistingCCTPMigrationProposal
nonpayablefunction cancelExistingCCTPMigrationProposal()
excludeTokensFromBurn
nonpayablefunction excludeTokensFromBurn(uint64 remoteChainSelector, uint256 amount)
lockOrBurn
nonpayablefunction lockOrBurn(tuple lockOrBurnIn) returns (tuple)
proposeCCTPMigration
nonpayablefunction proposeCCTPMigration(uint64 remoteChainSelector)
provideLiquidity
nonpayablefunction provideLiquidity(uint64 remoteChainSelector, uint256 amount)
releaseOrMint
nonpayablefunction releaseOrMint(tuple releaseOrMintIn) returns (tuple)
removeRemotePool
nonpayablefunction removeRemotePool(uint64 remoteChainSelector, bytes remotePoolAddress)
setChainRateLimiterConfig
nonpayablefunction setChainRateLimiterConfig(uint64 remoteChainSelector, tuple outboundConfig, tuple inboundConfig)
setChainRateLimiterConfigs
nonpayablefunction setChainRateLimiterConfigs(uint64[] remoteChainSelectors, tuple[] outboundConfigs, tuple[] inboundConfigs)
setCircleMigratorAddress
nonpayablefunction setCircleMigratorAddress(address migrator)
setDomains
nonpayablefunction setDomains(tuple[] domains)
setLiquidityProvider
nonpayablefunction setLiquidityProvider(uint64 remoteChainSelector, address liquidityProvider)
setRateLimitAdmin
nonpayablefunction setRateLimitAdmin(address rateLimitAdmin)
setRouter
nonpayablefunction setRouter(address newRouter)
transferOwnership
nonpayablefunction transferOwnership(address to)
updateChainSelectorMechanisms
nonpayablefunction updateChainSelectorMechanisms(uint64[] removes, uint64[] adds)
withdrawLiquidity
nonpayablefunction withdrawLiquidity(uint64 remoteChainSelector, uint256 amount)
events
AllowListAdd
event AllowListAdd(address sender)
AllowListRemove
event AllowListRemove(address sender)
CCTPMigrationCancelled
event CCTPMigrationCancelled(uint64 existingProposalSelector)
CCTPMigrationExecuted
event CCTPMigrationExecuted(uint64 remoteChainSelector, uint256 USDCBurned)
CCTPMigrationProposed
event CCTPMigrationProposed(uint64 remoteChainSelector)
ChainAdded
event ChainAdded(uint64 remoteChainSelector, bytes remoteToken, (bool isEnabled, uint128 capacity, uint128 rate) outboundRateLimiterConfig, (bool isEnabled, uint128 capacity, uint128 rate) inboundRateLimiterConfig)
ChainConfigured
event ChainConfigured(uint64 remoteChainSelector, (bool isEnabled, uint128 capacity, uint128 rate) outboundRateLimiterConfig, (bool isEnabled, uint128 capacity, uint128 rate) inboundRateLimiterConfig)
ChainRemoved
event ChainRemoved(uint64 remoteChainSelector)
CircleMigratorAddressSet
event CircleMigratorAddressSet(address migratorAddress)
ConfigChanged
event ConfigChanged((bool isEnabled, uint128 capacity, uint128 rate) config)
ConfigSet
event ConfigSet(address tokenMessenger)
DomainsSet
event DomainsSet((bytes32 allowedCaller, bytes32 mintRecipient, uint32 domainIdentifier, uint64 destChainSelector, bool enabled)[])
InboundRateLimitConsumed
event InboundRateLimitConsumed(uint64 indexed remoteChainSelector, address token, uint256 amount)
LiquidityAdded
event LiquidityAdded(address indexed provider, uint256 indexed amount)
LiquidityProviderSet
event LiquidityProviderSet(address indexed oldProvider, address indexed newProvider, uint64 indexed remoteChainSelector)
LiquidityRemoved
event LiquidityRemoved(address indexed provider, uint256 indexed amount)
LiquidityTransferred
event LiquidityTransferred(address indexed from, uint64 indexed remoteChainSelector, uint256 amount)
LockedOrBurned
event LockedOrBurned(uint64 indexed remoteChainSelector, address token, address sender, uint256 amount)
LockReleaseDisabled
event LockReleaseDisabled(uint64 indexed remoteChainSelector)
LockReleaseEnabled
event LockReleaseEnabled(uint64 indexed remoteChainSelector)
OutboundRateLimitConsumed
event OutboundRateLimitConsumed(uint64 indexed remoteChainSelector, address token, uint256 amount)
OwnershipTransferred
event OwnershipTransferred(address indexed from, address indexed to)
OwnershipTransferRequested
event OwnershipTransferRequested(address indexed from, address indexed to)
RateLimitAdminSet
event RateLimitAdminSet(address rateLimitAdmin)
ReleasedOrMinted
event ReleasedOrMinted(uint64 indexed remoteChainSelector, address token, address sender, address recipient, uint256 amount)
RemotePoolAdded
event RemotePoolAdded(uint64 indexed remoteChainSelector, bytes remotePoolAddress)
RemotePoolRemoved
event RemotePoolRemoved(uint64 indexed remoteChainSelector, bytes remotePoolAddress)
RouterUpdated
event RouterUpdated(address oldRouter, address newRouter)
TokensExcludedFromBurn
event TokensExcludedFromBurn(uint64 indexed remoteChainSelector, uint256 amount, uint256 burnableAmountAfterExclusion)
errors
AllowListNotEnabled
error AllowListNotEnabled()
BucketOverfilled
error BucketOverfilled()
CallerIsNotARampOnRouter
error CallerIsNotARampOnRouter(address caller)
CannotTransferToSelf
error CannotTransferToSelf()
ChainAlreadyExists
error ChainAlreadyExists(uint64 chainSelector)
ChainNotAllowed
error ChainNotAllowed(uint64 remoteChainSelector)
CursedByRMN
error CursedByRMN()
DisabledNonZeroRateLimit
error DisabledNonZeroRateLimit((bool isEnabled, uint128 capacity, uint128 rate) config)
ExistingMigrationProposal
error ExistingMigrationProposal()
InvalidChainSelector
error InvalidChainSelector()
InvalidConfig
error InvalidConfig()
InvalidDecimalArgs
error InvalidDecimalArgs(uint8 expected, uint8 actual)
InvalidDestinationDomain
error InvalidDestinationDomain(uint32 expected, uint32 got)
InvalidDomain
error InvalidDomain((bytes32 allowedCaller, bytes32 mintRecipient, uint32 domainIdentifier, uint64 destChainSelector, bool enabled) domain)
InvalidMessageLength
error InvalidMessageLength(uint256 length)
InvalidMessageVersion
error InvalidMessageVersion(uint32 version)
InvalidNonce
error InvalidNonce(uint64 expected, uint64 got)
InvalidPreviousPool
error InvalidPreviousPool()
InvalidRateLimitRate
error InvalidRateLimitRate((bool isEnabled, uint128 capacity, uint128 rate) rateLimiterConfig)
InvalidReceiver
error InvalidReceiver(bytes receiver)
InvalidRemoteChainDecimals
error InvalidRemoteChainDecimals(bytes sourcePoolData)
InvalidRemotePoolForChain
error InvalidRemotePoolForChain(uint64 remoteChainSelector, bytes remotePoolAddress)
InvalidSourceDomain
error InvalidSourceDomain(uint32 expected, uint32 got)
InvalidSourcePoolAddress
error InvalidSourcePoolAddress(bytes sourcePoolAddress)
InvalidToken
error InvalidToken(address token)
InvalidTokenMessengerVersion
error InvalidTokenMessengerVersion(uint32 version)
InvalidTransmitterInProxy
error InvalidTransmitterInProxy()
LanePausedForCCTPMigration
error LanePausedForCCTPMigration(uint64 remoteChainSelector)
MismatchedArrayLengths
error MismatchedArrayLengths()
MustBeProposedOwner
error MustBeProposedOwner()
NoMigrationProposalPending
error NoMigrationProposalPending()
NonExistentChain
error NonExistentChain(uint64 remoteChainSelector)
OnlyCallableByOwner
error OnlyCallableByOwner()
onlyCircle
error onlyCircle()
OverflowDetected
error OverflowDetected(uint8 remoteDecimals, uint8 localDecimals, uint256 remoteAmount)
OwnerCannotBeZero
error OwnerCannotBeZero()
PoolAlreadyAdded
error PoolAlreadyAdded(uint64 remoteChainSelector, bytes remotePoolAddress)
SenderNotAllowed
error SenderNotAllowed(address sender)
TokenLockingNotAllowedAfterMigration
error TokenLockingNotAllowedAfterMigration(uint64 remoteChainSelector)
TokenMaxCapacityExceeded
error TokenMaxCapacityExceeded(uint256 capacity, uint256 requested, address tokenAddress)
TokenRateLimitReached
error TokenRateLimitReached(uint256 minWaitInSeconds, uint256 available, address tokenAddress)
Unauthorized
error Unauthorized(address caller)
UnknownDomain
error UnknownDomain(uint64 domain)
UnlockingUSDCFailed
error UnlockingUSDCFailed()
ZeroAddressNotAllowed
error ZeroAddressNotAllowed()
creation bytecode
0x6101a0806040523461063c57616533803803809161001d828561097d565b833981019060e08183031261063c5780516001600160a01b0381169081810361063c576020830151906001600160a01b03821680830361063c576040850151956001600160a01b0387169586880361063c5760608101516001600160401b03811161063c5781019180601f8401121561063c578251926001600160401b0384116105d9578360051b9060208201946100b8604051968761097d565b855260208086019282010192831161063c57602001905b828210610965575050506100e5608082016109a0565b6100fd60c06100f660a085016109a0565b93016109a0565b98331561095457600180546001600160a01b0319163317905588158015610943575b8015610932575b6109215760805260c05260405163313ce56760e01b81526020816004818b5afa80916000916108e5575b50906108c1575b50600660a052600480546001600160a01b0319166001600160a01b03929092169190911790558051151560e0819052610794575b50831561078357604051632c12192160e01b8152602081600481885afa90811561064957600091610749575b5060405163054fd4d560e41b81526001600160a01b03919091169190602081600481865afa80156106495763ffffffff9160009161072a575b5016806107165750604051639cdbb18160e01b8152602081600481895afa80156106495763ffffffff916000916106f7575b5016806106e357506020600491604051928380926367e0ed8360e11b82525afa8015610649578291600091610695575b506001600160a01b0316036106845760049260209261010052610120526040519283809263234d8e3d60e21b82525afa90811561064957600091610655575b506101405260805161010051604051636eb1769f60e11b81523060048201526001600160a01b0391821660248201819052959290911690602081604481855afa90811561064957600091610612575b5060001981018091116105fc5760405190602082019663095ea7b360e01b8852602483015260448201526044815261031960648261097d565b60008060409788519361032c8a8661097d565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020860152519082865af13d156105ef573d906001600160401b0382116105d957875161039d94909261038e601f8201601f19166020018561097d565b83523d6000602085013e610b72565b80519081610565575b50506001600160a01b0381163081146104dc5780151590816104ed575b506104dc577f2e902d38f15b233cbb63711add0fca4545334d3a169d60c0a616494d7eea954491602091610160528451908152a161018052516158f09081610c43823960805181818161051c015281816108270152818161089401528181611cfb01528181612b4f01528181612e9101528181613f3a0152818161434f015281816153cb01526155bf015260a051816108de015260c051818181612195015281816147aa0152614eb6015260e051818181610d7d01528181612382015261542a015261010051818181610f170152612f250152610120518181816117df0152613ebb01526101405181818161103801528181612ff101526149520152610160518181816109aa0152613e39015261018051816114e60152f35b632d4d3c3d60e21b60005260046000fd5b85516301ffc9a760e01b8152630e64dd2960e01b60048201529150602090829060249082905afa90811561055a5760009161052b575b5015386103c3565b61054d915060203d602011610553575b610545818361097d565b8101906109d0565b38610523565b503d61053b565b85513d6000823e3d90fd5b6020806105769383010191016109d0565b156105825738806103a6565b835162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b634e487b7160e01b600052604160045260246000fd5b9161039d92606091610b72565b634e487b7160e01b600052601160045260246000fd5b90506020813d602011610641575b8161062d6020938361097d565b8101031261063c5751386102e0565b600080fd5b3d9150610620565b6040513d6000823e3d90fd5b610677915060203d60201161067d575b61066f818361097d565b8101906109b4565b38610291565b503d610665565b632a32133b60e11b60005260046000fd5b9091506020813d6020116106db575b816106b16020938361097d565b810103126106d75751906001600160a01b03821682036106d45750819038610252565b80fd5b5080fd5b3d91506106a4565b6316ba39c560e31b60005260045260246000fd5b610710915060203d60201161067d5761066f818361097d565b38610222565b6334697c6b60e11b60005260045260246000fd5b610743915060203d60201161067d5761066f818361097d565b386101f0565b90506020813d60201161077b575b816107646020938361097d565b8101031261063c57610775906109a0565b386101b7565b3d9150610757565b6306b7c75960e31b60005260046000fd5b909194602094604051946107a8878761097d565b60008652600036813760e051156108b05760005b8651811015610823576001906001600160a01b036107da828a6109e8565b5116896107e682610a2a565b6107f3575b5050016107bc565b7f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a138896107eb565b509193969092945060005b85518110156108a2576001906001600160a01b0361084c82896109e8565b5116801561089c578861085e82610b12565b61086c575b50505b0161082e565b7f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a13888610863565b50610866565b50929591945092503861018b565b6335f4a7b360e01b60005260046000fd5b60ff1660068114610157576332ad3e0760e11b600052600660045260245260446000fd5b6020813d602011610919575b816108fe6020938361097d565b810103126106d757519060ff821682036106d4575038610150565b3d91506108f1565b6342bcdf7f60e11b60005260046000fd5b506001600160a01b03821615610126565b506001600160a01b0383161561011f565b639b15e16f60e01b60005260046000fd5b60208091610972846109a0565b8152019101906100cf565b601f909101601f19168101906001600160401b038211908210176105d957604052565b51906001600160a01b038216820361063c57565b9081602091031261063c575163ffffffff8116810361063c5790565b9081602091031261063c5751801515810361063c5790565b80518210156109fc5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b80548210156109fc5760005260206000200190600090565b6000818152600360205260409020548015610b0b5760001981018181116105fc576002546000198101919082116105fc57818103610aba575b5050506002548015610aa45760001901610a7e816002610a12565b8154906000199060031b1b19169055600255600052600360205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b610af3610acb610adc936002610a12565b90549060031b1c9283926002610a12565b819391549060031b91821b91600019901b19161790565b90556000526003602052604060002055388080610a63565b5050600090565b80600052600360205260406000205415600014610b6c57600254680100000000000000008110156105d957610b53610adc8260018594016002556002610a12565b9055600254906000526003602052604060002055600190565b50600090565b91929015610bd45750815115610b86575090565b3b15610b8f5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015610be75750805190602001fd5b6040519062461bcd60e51b8252602060048301528181519182602483015260005b838110610c2a5750508160006044809484010152601f80199101168101030190fd5b60208282018101516044878401015285935001610c0856fe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a7146103475780631101dbd414610342578063181f5a771461033d57806321df0da714610338578063240028e81461033357806324f65ee71461032e5780632cfbb1191461032957806339077537146103245780633e591f2c1461031f5780634ad01f0b1461031a5780634c5ef0ed146103155780634c93ef841461031057806350d1a35a1461030b57806354c8a4f3146103065780636155cda01461030157806362ddd3c4146102fc5780636b716b0d146102f75780636b795423146102f25780636d3d1a58146102ed578063714bf907146102e857806379ba5097146102e35780637d54534e146102de5780638926f54f146102d95780638a5e52bb146102d45780638da5cb5b146102cf578063962d4020146102ca57806398db9643146102c55780639a4575b9146102c05780639fdf13ff146102bb578063a42a7b8b146102b6578063a7cd63b7146102b1578063acfecf91146102ac578063af58d59f146102a7578063b0f479a1146102a2578063b79465801461029d578063bb5eced314610298578063c0d7865514610293578063c4bffe2b1461028e578063c75eea9c14610289578063c781d0e314610284578063cd306a6c1461027f578063cf7401f31461027a578063dc0bd97114610275578063de814c5714610270578063dfadfa351461026b578063e0351e1314610266578063e8a1da1714610261578063e94ae6d01461025c578063f2fde38b14610257578063f65a8886146102525763fd6768551461024d57600080fd5b6128ab565b61286c565b6127b0565b612768565b6123a7565b61236a565b6122a1565b6121b9565b612175565b6120a3565b611f99565b611f3c565b611ef1565b611e7c565b611d74565b611c97565b611c5b565b611c34565b611b91565b611a5d565b6119f6565b611912565b611878565b611803565b6117bf565b611671565b611619565b6113fb565b6113bc565b611338565b611287565b611203565b6111dc565b61105c565b61101b565b610f98565b610ef7565b610d4b565b610b82565b610b42565b610af9565b6109ce565b61098a565b610941565b610902565b6108c4565b610867565b610807565b6107a4565b61043d565b34610419576020600319360112610419576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361041957807faff2afbf00000000000000000000000000000000000000000000000000000000602092149081156103ef575b81156103c5575b506040519015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014386103ba565b7f0e64dd2900000000000000000000000000000000000000000000000000000000811491506103b3565b600080fd5b67ffffffffffffffff81160361041957565b359061043b8261041e565b565b346104195760406003193601126104195760043561045a8161041e565b6024359061048c61047f8267ffffffffffffffff166000526011602052604060002090565b546001600160a01b031690565b6001600160a01b03339116036105db5767ffffffffffffffff81166104be816000526010602052604060002054151590565b6105a357600b546104e49060a01c67ffffffffffffffff165b67ffffffffffffffff1690565b14610568576105079067ffffffffffffffff16600052600c602052604060002090565b610512828254612985565b90556105408130337f0000000000000000000000000000000000000000000000000000000000000000613b08565b337fc17cea59c2955cb181b03393209566960365771dbba9dc3d510180e7cb312088600080a3005b7fd0da86c40000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff1660045260246000fd5b6000fd5b7f646972460000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff821660045260246000fd5b7f8e4a23d6000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b600091031261041957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff82111761065f57604052565b610614565b6080810190811067ffffffffffffffff82111761065f57604052565b6020810190811067ffffffffffffffff82111761065f57604052565b6040810190811067ffffffffffffffff82111761065f57604052565b60a0810190811067ffffffffffffffff82111761065f57604052565b90601f601f19910116810190811067ffffffffffffffff82111761065f57604052565b6040519061043b60a0836106d4565b6040519061043b6020836106d4565b6040519061043b6040836106d4565b6040519061043b6080836106d4565b67ffffffffffffffff811161065f57601f01601f191660200190565b919082519283825260005b84811061077b575050601f19601f8460006020809697860101520116010190565b8060208092840101518282860101520161075a565b9060206107a192818152019061074f565b90565b346104195760006003193601126104195761080360408051906107c781836106d4565b601382527f55534443546f6b656e506f6f6c20312e362e320000000000000000000000000060208301525191829160208352602083019061074f565b0390f35b346104195760006003193601126104195760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b6001600160a01b0381160361041957565b359061043b8261084b565b346104195760206003193601126104195760206108ba6004356108898161084b565b6001600160a01b03807f00000000000000000000000000000000000000000000000000000000000000001691161490565b6040519015158152f35b3461041957600060031936011261041957602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346104195760206003193601126104195767ffffffffffffffff6004356109288161041e565b16600052600c6020526020604060002054604051908152f35b346104195760206003193601126104195760043567ffffffffffffffff8111610419576101006003198236030112610419576109816020916004016129f6565b60405190518152f35b346104195760006003193601126104195760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610419576000600319360112610419576109e7614073565b600b5467ffffffffffffffff8160a01c168015610a7d577fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff7f375f1ad1194a2bec317c5efec05cc63ffa06ddd0c4b276619f6fd47298eda5189216600b556000610a658267ffffffffffffffff16600052600d602052604060002090565b5560405167ffffffffffffffff9091168152602090a1005b7fa94cb9880000000000000000000000000000000000000000000000000000000060005260046000fd5b929192610ab382610733565b91610ac160405193846106d4565b829481845281830111610419578281602093846000960137010152565b9080601f83011215610419578160206107a193359101610aa7565b3461041957604060031936011261041957600435610b168161041e565b60243567ffffffffffffffff811161041957602091610b3c6108ba923690600401610ade565b90612c29565b346104195760206003193601126104195760206108ba600435610b648161041e565b67ffffffffffffffff16600052600e60205260ff6040600020541690565b3461041957602060031936011261041957600435610b9f8161041e565b610ba7614073565b67ffffffffffffffff600b5460a01c16610c9e5767ffffffffffffffff81166000908152600e602052604090205460ff1615610c7457610c6f81610c547f20331f191af84dbff48b162aa5a5985e7891ae646297b0a2ac80487f9109ef49937fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff7bffffffffffffffff0000000000000000000000000000000000000000600b549260a01b16911617600b55565b60405167ffffffffffffffff90911681529081906020820190565b0390a1005b7f656535ce0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f692bc1310000000000000000000000000000000000000000000000000000000060005260046000fd5b9181601f840112156104195782359167ffffffffffffffff8311610419576020808501948460051b01011161041957565b60406003198201126104195760043567ffffffffffffffff81116104195781610d2491600401610cc8565b929092916024359067ffffffffffffffff821161041957610d4791600401610cc8565b9091565b3461041957610d73610d7b610d5f36610cf9565b9491610d6c939193614073565b3691612c7e565b923691612c7e565b7f000000000000000000000000000000000000000000000000000000000000000015610ecd5760005b8251811015610e355780610dca610dbd6001938661317a565b516001600160a01b031690565b610dec610de76001600160a01b0383165b6001600160a01b031690565b61507a565b610df8575b5001610da4565b6040516001600160a01b039190911681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756690602090a138610df1565b5060005b8151811015610ecb5780610e52610dbd6001938561317a565b6001600160a01b03811615610ec557610e7b610e766001600160a01b038316610ddb565b614ad7565b610e88575b505b01610e39565b6040516001600160a01b039190911681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d890602090a183610e80565b50610e82565b005b7f35f4a7b30000000000000000000000000000000000000000000000000000000060005260046000fd5b346104195760006003193601126104195760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b604060031982011261041957600435610f538161041e565b9160243567ffffffffffffffff811161041957826023820112156104195780600401359267ffffffffffffffff84116104195760248483010111610419576024019190565b3461041957610fa636610f3b565b610fb1929192614073565b67ffffffffffffffff8216610fd3816000526006602052604060002054151590565b15610fee5750610ecb92610fe8913691610aa7565b906140d2565b7f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b3461041957600060031936011261041957602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346104195761106a36610cf9565b929091611075614073565b60005b81811061117f5750505060005b82811061108e57005b6110ba6110a76104d76110a2848787612d03565b612d18565b6000526010602052604060002054151590565b61113857806110fc6110ef6110d56110a26001958888612d03565b67ffffffffffffffff16600052600e602052604060002090565b600160ff19825416179055565b61110d6104d76110a2838787612d03565b7f5e3985e51df58346365017cae614e59d723143b71c9a2ce4a156687f1f2c3f5a600080a201611085565b6110a29061059f9361114993612d03565b7f646972460000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff16600452602490565b806111a06111966110d56110a26001958789612d03565b60ff198154169055565b6111b16104d76110a2838688612d03565b7fddc5afbc5e53c63a556964db0eef76a1c2d9305e0811abd7410d2a6f4799490e600080a201611078565b346104195760006003193601126104195760206001600160a01b0360095416604051908152f35b34610419576020600319360112610419577f084e6f0e9791c2e56153bd49e6ec6dd63ba9a72c258d71558d74c63fc75b716860206001600160a01b0360043561124b8161084b565b611253614073565b16807fffffffffffffffffffffffff0000000000000000000000000000000000000000600b541617600b55604051908152a1005b34610419576000600319360112610419576000546001600160a01b038116330361130e577fffffffffffffffffffffffff0000000000000000000000000000000000000000600154913382841617600155166000556001600160a01b033391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b34610419576020600319360112610419577f44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d0917460206001600160a01b036004356113808161084b565b611388614073565b16807fffffffffffffffffffffffff00000000000000000000000000000000000000006009541617600955604051908152a1005b346104195760206003193601126104195760206108ba67ffffffffffffffff6004356113e78161041e565b166000526006602052604060002054151590565b3461041957600060031936011261041957600b546114216001600160a01b038216610ddb565b33036115ef5760a01c67ffffffffffffffff1667ffffffffffffffff8116908115610a7d5761148d6114678267ffffffffffffffff16600052600c602052604060002090565b546114868367ffffffffffffffff16600052600d602052604060002090565b5490612d52565b9060006114ae8267ffffffffffffffff16600052600c602052604060002090565b556114dc7fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff600b5416600b55565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692833b1561041957600060405180957f42966c6800000000000000000000000000000000000000000000000000000000825281838161154d89600483019190602083019252565b03925af19081156115ea577fdea60ddd4c7ebdab804f5694c70350cca7893ece3efeecb142312eacac5c73e4946115aa926115cf575b506115a56111968467ffffffffffffffff16600052600e602052604060002090565b614b4a565b506040805167ffffffffffffffff909216825260208201929092529081908101610c6f565b806115de60006115e4936106d4565b80610609565b38611583565b612d5f565b7f438a7a050000000000000000000000000000000000000000000000000000000060005260046000fd5b346104195760006003193601126104195760206001600160a01b0360015416604051908152f35b9181601f840112156104195782359167ffffffffffffffff8311610419576020808501946060850201011161041957565b346104195760606003193601126104195760043567ffffffffffffffff8111610419576116a2903690600401610cc8565b9060243567ffffffffffffffff8111610419576116c3903690600401611640565b9060443567ffffffffffffffff8111610419576116e4903690600401611640565b6116f9610ddb6009546001600160a01b031690565b331415806117a1575b6105db57838614801590611797575b61176d5760005b86811061172157005b806117676117356110a26001948b8b612d03565b611740838989612d6b565b61176161175961175186898b612d6b565b92369061205a565b91369061205a565b91614197565b01611718565b7f568efce20000000000000000000000000000000000000000000000000000000060005260046000fd5b5080861415611711565b506117b7610ddb6001546001600160a01b031690565b331415611702565b346104195760006003193601126104195760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b346104195760206003193601126104195760043567ffffffffffffffff81116104195760a060031982360301126104195761184361080391600401612d94565b6040519182916020835260206118648251604083870152606086019061074f565b910151601f1984830301604085015261074f565b3461041957600060031936011261041957602060405160008152f35b602081016020825282518091526040820191602060408360051b8301019401926000915b8383106118c757505050505090565b9091929394602080611903837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08660019603018752895161074f565b970193019301919392906118b8565b346104195760206003193601126104195767ffffffffffffffff6004356119388161041e565b1660005260076020526119516005604060002001614fd8565b805190601f1961197961196384612c66565b9361197160405195866106d4565b808552612c66565b0160005b8181106119e557505060005b81518110156119d757806119bb6119b66119a56001948661317a565b516000526008602052604060002090565b6131e1565b6119c5828661317a565b526119d0818561317a565b5001611989565b604051806108038582611894565b80606060208093870101520161197d565b3461041957600060031936011261041957611a0f614f42565b60405180916020820160208352815180915260206040840192019060005b818110611a3b575050500390f35b82516001600160a01b0316845285945060209384019390920191600101611a2d565b3461041957611a6b36610f3b565b611a76929192614073565b67ffffffffffffffff821691611aa0611a9c846000526006602052604060002054151590565b1590565b611b5a57611ae3611a9c6005611aca8467ffffffffffffffff166000526007602052604060002090565b01611ad6368689610aa7565b60208151910120906151a6565b611b1f57507f52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d769192611b1a604051928392836132c5565b0390a2005b611b5684926040519384937f74f23c7c000000000000000000000000000000000000000000000000000000008552600485016132a4565b0390fd5b7f1e670e4b0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff1660045260246000fd5b346104195760206003193601126104195767ffffffffffffffff600435611bb78161041e565b611bbf6132d6565b50166000526007602052610803611be4611bdf6002604060002001613301565b6143ca565b6040519182918291909160806001600160801b038160a084019582815116855263ffffffff6020820151166020860152604081015115156040860152826060820151166060860152015116910152565b346104195760006003193601126104195760206001600160a01b0360045416604051908152f35b3461041957602060031936011261041957610803611c83600435611c7e8161041e565b613352565b60405191829160208352602083019061074f565b3461041957604060031936011261041957600435611cb48161041e565b60243590611cc0614073565b67ffffffffffffffff80600b5460a01c169116908114611d4757600052600c6020526040600020611cf2828254612d52565b9055611d1f81337f0000000000000000000000000000000000000000000000000000000000000000614448565b337fc2c3f06e49b9f15e7b4af9055e183b0d73362e033ad82a07dec9bf9840171719600080a3005b7fd0da86c40000000000000000000000000000000000000000000000000000000060005260045260246000fd5b34610419576020600319360112610419576001600160a01b03600435611d998161084b565b611da1614073565b168015611e0e5760407f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f16849160045490807fffffffffffffffffffffffff00000000000000000000000000000000000000008316176004556001600160a01b038351921682526020820152a1005b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b602060408183019282815284518094520192019060005b818110611e5c5750505090565b825167ffffffffffffffff16845260209384019390920191600101611e4f565b3461041957600060031936011261041957611e95614f8d565b805190601f19611ea761196384612c66565b0136602084013760005b8151811015611ee3578067ffffffffffffffff611ed06001938561317a565b5116611edc828661317a565b5201611eb1565b604051806108038582611e38565b346104195760206003193601126104195767ffffffffffffffff600435611f178161041e565b611f1f6132d6565b50166000526007602052610803611be4611bdf6040600020613301565b346104195760206003193601126104195760043567ffffffffffffffff8111610419573660238201121561041957806004013567ffffffffffffffff81116104195736602460a0830284010111610419576024610ecb9201613374565b3461041957600060031936011261041957602067ffffffffffffffff600b5460a01c16604051908152f35b8015150361041957565b35906001600160801b038216820361041957565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c6060910112610419576040519061201982610643565b8160843561202681611fc4565b815260a4356001600160801b038116810361041957602082015260c435906001600160801b03821682036104195760400152565b91908260609103126104195760405161207281610643565b604061209e818395803561208581611fc4565b855261209360208201611fce565b602086015201611fce565b910152565b346104195760e0600319360112610419576004356120c08161041e565b60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc360112610419576040516120f681610643565b60243561210281611fc4565b81526044356001600160801b03811681036104195760208201526064356001600160801b038116810361041957604082015261213d36611fe2565b906001600160a01b036009541633141580612160575b6105db57610ecb92614197565b506001600160a01b0360015416331415612153565b346104195760006003193601126104195760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610419576040600319360112610419576004356121d68161041e565b602435906121e2614073565b67ffffffffffffffff600b5460a01c169167ffffffffffffffff8216809303610a7d5782600052600d602052604060002080549282840180941161229c577fe1e6c22ce6b566f66cdb457ec2e7910ff1f9a9e5654ed75303476fa8704682209361228492556114866122688267ffffffffffffffff16600052600c602052604060002090565b549167ffffffffffffffff16600052600d602052604060002090565b60408051928352602083019190915281908101611b1a565b612956565b346104195760206003193601126104195767ffffffffffffffff6004356122c78161041e565b600060606040516122d781610664565b828152826020820152826040820152015216600052600a602052610803604060002060ff60026040519261230a84610664565b8054845260018101546020850152015463ffffffff8116604084015260201c1615156060820152604051918291829190916060806080830194805184526020810151602085015263ffffffff604082015116604085015201511515910152565b346104195760006003193601126104195760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b34610419576123b536610cf9565b9190926123c0614073565b6000915b80831061262f5750505060009163ffffffff4216925b8281106123e357005b6123f66123f1828585613776565b613835565b906060820161240581516144cc565b608083019361241485516144cc565b604084019081515115611e0e57612441611a9c61243c6104d7885167ffffffffffffffff1690565b614ba0565b6125e45761254461247a612460879a999a5167ffffffffffffffff1690565b67ffffffffffffffff166000526007602052604060002090565b6125108961250a87516124fa61249a60408301516001600160801b031690565b916124ea6124bc6124b560208401516001600160801b031690565b9251151590565b6124e16124c76106f7565b6001600160801b03851681529763ffffffff166020890152565b15156040870152565b6001600160801b03166060850152565b6001600160801b03166080830152565b826138c4565b612539896125308a516124fa61249a60408301516001600160801b031690565b600283016138c4565b6004845191016139b8565b602085019660005b88518051821015612587579061258160019261257a836125748c5167ffffffffffffffff1690565b9261317a565b51906140d2565b0161254c565b505097965094906125db7f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c293926125c86001975167ffffffffffffffff1690565b9251935190519060405194859485613a85565b0390a1016123da565b61059f6125f9865167ffffffffffffffff1690565b7f1d5ad3c50000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff16600452602490565b9091926126406110a2858486612d03565b94612657611a9c67ffffffffffffffff881661511b565b61273057612684600561267e8867ffffffffffffffff166000526007602052604060002090565b01614fd8565b9360005b85518110156126d0576001906126c960056126b78b67ffffffffffffffff166000526007602052604060002090565b016126c2838a61317a565b51906151a6565b5001612688565b509350937f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991661272260019397610c5461271d8267ffffffffffffffff166000526007602052604060002090565b6136e5565b0390a10191909392936123c4565b7f1e670e4b0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff861660045260246000fd5b346104195760206003193601126104195767ffffffffffffffff60043561278e8161041e565b16600052601160205260206001600160a01b0360406000205416604051908152f35b34610419576020600319360112610419576001600160a01b036004356127d58161084b565b6127dd614073565b1633811461284257807fffffffffffffffffffffffff000000000000000000000000000000000000000060005416176000556001600160a01b03600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b346104195760206003193601126104195767ffffffffffffffff6004356128928161041e565b16600052600d6020526020604060002054604051908152f35b34610419576040600319360112610419576004356128c88161041e565b67ffffffffffffffff602435916128de8361084b565b6128e6614073565b16600081815260116020526040812080546001600160a01b039485167fffffffffffffffffffffffff0000000000000000000000000000000000000000821681179092559293909216907fc82aa48e67c70b1ad1494533456f52504bb4d62d11bbdafaeb98cfccd1ed817e9080a4005b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9190820180921161229c57565b6040519061299f82610680565b60008252565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610419570180359067ffffffffffffffff82116104195760200191813603831361041957565b604051612a0281610680565b600090527ffa7c07de000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000612a5560c08401846129a5565b90358281169160048110612bf6575b50501603612bed57612a74612992565b50606081013590612a858282614708565b600b5460a01c67ffffffffffffffff166020820190612aa66104d783612d18565b67ffffffffffffffff821614610568575067ffffffffffffffff81612b08612aee7ffc5e3a5bddc11d92c2dc20fae6f7d5eb989f056be35239f7de7e86150609abc094612d18565b67ffffffffffffffff16600052600c602052604060002090565b54612bcf57612b33612b1982612d18565b67ffffffffffffffff16600052600d602052604060002090565b612b3e868254612d52565b90555b612bbe85612b8a612b8460407f00000000000000000000000000000000000000000000000000000000000000009801946110a284612b7e88613db9565b8b614448565b93613db9565b604080516001600160a01b039889168152336020820152919097169681019690965260608601529116929081906080820190565b0390a2612bc9610706565b90815290565b612bdb612aee82612d18565b612be6868254612d52565b9055612b41565b6107a190613dc3565b839250829060040360031b1b16163880612a64565b91612c25918354906000199060031b92831b921b19161790565b9055565b9067ffffffffffffffff6107a192166000526007602052600560406000200190602081519101209060019160005201602052604060002054151590565b67ffffffffffffffff811161065f5760051b60200190565b929190612c8a81612c66565b93612c9860405195866106d4565b602085838152019160051b810192831161041957905b828210612cba57505050565b602080918335612cc98161084b565b815201910190612cae565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190811015612d135760051b0190565b612cd4565b356107a18161041e565b67ffffffffffffffff6107a191166000526006602052604060002054151590565b90600019820191821161229c57565b9190820391821161229c57565b6040513d6000823e3d90fd5b9190811015612d13576060020190565b60405190612d888261069c565b60606020838281520152565b612d9c612d7b565b5060208101612daf8135610b648161041e565b15612df157612dd76104d7612dd1600b5467ffffffffffffffff9060a01c1690565b92612d18565b67ffffffffffffffff82161461056857506107a1906142d9565b612dfc929192612d7b565b50612e0683614e79565b612e34612e2f612e1583612d18565b67ffffffffffffffff16600052600a602052604060002090565b61364b565b612e44611a9c6060830151151590565b613138576020612e5485806129a5565b9050036130f85760208101519293612f179380156130d8576060602091925b013591612e87604085015163ffffffff1690565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169687955160405198899485947ff856ddb60000000000000000000000000000000000000000000000000000000086528860048701919360809363ffffffff6001600160a01b039398979660a0860199865216602085015260408401521660608201520152565b038160006001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af19384156115ea57600094613067575b50611c7e83613054937ff33bc26b4413b0e7f19f1ea739fdf99098c0061f1f87d954b11f5293fad9ae1067ffffffffffffffff612fce95612fc6612f9c6130469a612d18565b604080516001600160a01b0390971687523360208801528601929092529116929081906060820190565b0390a2612d18565b92612fea612fda610715565b67ffffffffffffffff9092168252565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000000016602082015260405192839160208301919091602063ffffffff81604084019567ffffffffffffffff8151168552015116910152565b03601f1981018352826106d4565b61305c610715565b918252602082015290565b612fce91945061304693613054937ff33bc26b4413b0e7f19f1ea739fdf99098c0061f1f87d954b11f5293fad9ae1067ffffffffffffffff6130c3611c7e9560203d6020116130d1575b6130bb81836106d4565b8101906142c4565b989550505093509350612f56565b503d6130b1565b50602060606130f26130ea84806129a5565b8101906142b5565b92612e73565b61310284806129a5565b90611b566040519283927fa3c8cf09000000000000000000000000000000000000000000000000000000008452600484016132c5565b61059f61314483612d18565b7fd201c48a0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff16600452602490565b8051821015612d135760209160051b010190565b90600182811c921680156131d7575b60208310146131a857565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161319d565b90604051918260008254926131f58461318e565b8084529360018116908115613261575060011461321a575b5061043b925003836106d4565b90506000929192526020600020906000915b81831061324557505090602061043b928201013861320d565b602091935080600191548385890101520191019091849261322c565b6020935061043b95925060ff1991501682840152151560051b8201013861320d565b601f8260209493601f19938186528686013760008582860101520116010190565b60409067ffffffffffffffff6107a195931681528160208201520191613283565b9160206107a1938181520191613283565b604051906132e3826106b8565b60006080838281528260208201528260408201528260608201520152565b9060405161330e816106b8565b60806001600160801b036001839560ff8154848116875263ffffffff81871c16602088015260a01c1615156040860152015481808216166060850152821c16910152565b67ffffffffffffffff1660005260076020526107a160046040600020016131e1565b61337c614073565b60005b8281106133be5750907fe6d14ea297366c7bc1265d289d924bfd8b9afb148eb972b481f70da41c842cf5916133b9604051928392836135c2565b0390a1565b6133d16133cc828585613543565b613564565b805115801561351d575b6134b057906134aa82613450612e1560606133ff6040600198015163ffffffff1690565b93613441602082015161343983519761341b6080860151151590565b92613424610724565b998a5260208a015263ffffffff166040890152565b151586840152565b015167ffffffffffffffff1690565b6002908251815560208301516001820155019063ffffffff6040820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000064ff0000000060608554940151151560201b16921617179055565b0161337f565b604080517fa606c63500000000000000000000000000000000000000000000000000000000815282516004820152602083015160248201529082015163ffffffff166044820152606082015167ffffffffffffffff1660648201526080909101511515608482015260a490fd5b5067ffffffffffffffff61353c606083015167ffffffffffffffff1690565b16156133db565b9190811015612d135760a0020190565b359063ffffffff8216820361041957565b60a0813603126104195760806040519161357d836106b8565b803583526020810135602084015261359760408201613553565b604084015260608101356135aa8161041e565b606084015201356135ba81611fc4565b608082015290565b602080825281018390526040019160005b8181106135e05750505090565b90919260a080600192863581526020870135602082015263ffffffff61360860408901613553565b16604082015267ffffffffffffffff60608801356136258161041e565b166060820152608087013561363981611fc4565b151560808201520194019291016135d3565b9060405161365881610664565b606060ff600283958054855260018101546020860152015463ffffffff8116604085015260201c161515910152565b818110613692575050565b60008155600101613687565b8181029291811591840414171561229c57565b80549060008155816136c1575050565b6000526020600020908101905b8181106136d9575050565b600081556001016136ce565b600561043b916000815560006001820155600060028201556000600382015560048101613712815461318e565b9081613721575b5050016136b1565b81601f600093116001146137395750555b3880613719565b8183526020832061375491601f01861c810190600101613687565b808252602082209081548360011b906000198560031b1c191617905555613732565b9190811015612d135760051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee181360301821215610419570190565b9080601f830112156104195781356137cd81612c66565b926137db60405194856106d4565b81845260208085019260051b820101918383116104195760208201905b83821061380757505050505090565b813567ffffffffffffffff81116104195760209161382a87848094880101610ade565b8152019101906137f8565b61012081360312610419576040519061384d826106b8565b61385681610430565b8252602081013567ffffffffffffffff81116104195761387990369083016137b6565b602083015260408101359067ffffffffffffffff8211610419576138a36135ba9236908301610ade565b60408401526138b5366060830161205a565b606084015260c036910161205a565b8151815460208401516040850151608091821b73ffffffff00000000000000000000000000000000166001600160801b039485167fffffffffffffffffffffff000000000000000000000000000000000000000000909416939093179290921791151560a01b74ff000000000000000000000000000000000000000016919091178355606084015193810151901b6fffffffffffffffffffffffffffffffff1916921691909117600190910155565b9190601f811161398257505050565b61043b926000526020600020906020601f840160051c830193106139ae575b601f0160051c0190613687565b90915081906139a1565b919091825167ffffffffffffffff811161065f576139e0816139da845461318e565b84613973565b6020601f8211600114613a1c578190612c25939495600092613a11575b50506000198260011b9260031b1c19161790565b0151905038806139fd565b601f19821690613a3184600052602060002090565b9160005b818110613a6d57509583600195969710613a54575b505050811b019055565b015160001960f88460031b161c19169055388080613a4a565b9192602060018192868b015181550194019201613a35565b613ae0613ab461043b9597969467ffffffffffffffff60a095168452610100602085015261010084019061074f565b9660408301906001600160801b0360408092805115158552826020820151166020860152015116910152565b01906001600160801b0360408092805115158552826020820151166020860152015116910152565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000060208201526001600160a01b039283166024820152929091166044830152606482019290925261043b91613b6d82608481015b03601f1981018452836106d4565b614659565b9081604091031261041957613ba2602060405192613b8f8461069c565b8035613b9a8161041e565b845201613553565b602082015290565b6020818303126104195780359067ffffffffffffffff821161041957016040818303126104195760405191613bde8361069c565b813567ffffffffffffffff81116104195781613bfb918401610ade565b8352602082013567ffffffffffffffff811161041957613ba29201610ade565b908160209103126104195760405190613c3382610680565b51815290565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561041957016020813591019167ffffffffffffffff821161041957813603831361041957565b906107a19160208152613d6c613d61613d42613cbb613ca88680613c39565b6101006020880152610120870191613283565b613cdb613cca60208801610430565b67ffffffffffffffff166040870152565b613cfa613cea6040880161085c565b6001600160a01b03166060870152565b60608601356080860152613d23613d136080880161085c565b6001600160a01b031660a0870152565b613d3060a0870187613c39565b90601f198784030160c0880152613283565b613d4f60c0860186613c39565b90601f198684030160e0870152613283565b9260e0810190613c39565b91610100601f1982860301910152613283565b9081602091031261041957516107a181611fc4565b9091613dab6107a19360408452604084019061074f565b91602081840391015261074f565b356107a18161084b565b613dcb612992565b50606081013590613ddc8282614708565b613df4613dec60c08301836129a5565b810190613b72565b613e17613e0f613e0760e08501856129a5565b810190613baa565b9182516148fc565b613e2f610ddb6074835101516001600160a01b031690565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690818015159182614060575b5050613fe0575060208181613ead93519101519060405193849283927f57ecfd2800000000000000000000000000000000000000000000000000000000845260048401613d94565b038160006001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af19081156115ea57600091613fb1575b5015613f87577ffc5e3a5bddc11d92c2dc20fae6f7d5eb989f056be35239f7de7e86150609abc067ffffffffffffffff613f346040613f2d60208601612d18565b9401613db9565b604080517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03908116825233602083015290921690820152606081018590529216918060808101612bbe565b7fbf969f220000000000000000000000000000000000000000000000000000000060005260046000fd5b613fd3915060203d602011613fd9575b613fcb81836106d4565b810190613d7f565b38613eec565b503d613fc1565b6000935061402191506020926040519485809481937f3907753700000000000000000000000000000000000000000000000000000000835260048301613c89565b03925af19081156115ea57600091614037575090565b6107a1915060203d602011614059575b61405181836106d4565b810190613c1b565b503d614047565b6001600160a01b03161490508138613e65565b6001600160a01b0360015416330361408757565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b60409067ffffffffffffffff6107a19493168152816020820152019061074f565b90805115611e0e578051602082012067ffffffffffffffff831692836000526007602052614107826005604060002001614bf6565b1561416057508161414f7f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea9361414a61415b946000526008602052604060002090565b6139b8565b60405191829182610790565b0390a2565b9050611b566040519283927f393b8ad2000000000000000000000000000000000000000000000000000000008452600484016140b1565b67ffffffffffffffff166000818152600660205260409020549092919015614287579161428460e092614259856141ee7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b976144cc565b846000526007602052614205816040600020614c52565b61420e836144cc565b846000526007602052614228836002604060002001614c52565b60405194855260208501906001600160801b0360408092805115158552826020820151166020860152015116910152565b60808301906001600160801b0360408092805115158552826020820151166020860152015116910152565ba1565b827f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90816020910312610419573590565b9081602091031261041957516107a18161041e565b611c7e614392916142e8612d7b565b506142f281614e79565b6020810190606001356143098235612aee8161041e565b614314828254612985565b90557ff33bc26b4413b0e7f19f1ea739fdf99098c0061f1f87d954b11f5293fad9ae1067ffffffffffffffff61434984612d18565b604080517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681523360208201529081019490945216918060608101612fc6565b6040516130548161304660208201907ffa7c07de00000000000000000000000000000000000000000000000000000000602083019252565b6143d26132d6565b506001600160801b036060820151166001600160801b0382511690602083019163ffffffff835116420342811161229c5761441b906001600160801b036080870151169061369e565b810180911161229c576144386001600160801b0392918392615416565b161682524263ffffffff16905290565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000060208201526001600160a01b039092166024830152604482019290925261043b91613b6d8260648101613b5f565b61043b9092919260608101936001600160801b0360408092805115158552826020820151166020860152015116910152565b80511561454c5760408101516001600160801b03166001600160801b0361450c61450060208501516001600160801b031690565b6001600160801b031690565b9116116145165750565b611b56906040519182917f8020d1240000000000000000000000000000000000000000000000000000000083526004830161449a565b6001600160801b0361456860408301516001600160801b031690565b16158015906145af575b6145795750565b611b56906040519182917fd68af9cc0000000000000000000000000000000000000000000000000000000083526004830161449a565b506145c761450060208301516001600160801b031690565b1515614572565b156145d557565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b906001600160a01b036146da921660409060008083519461467a85876106d4565b602086527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564602087015260208151910182855af1903d156146ff573d6146cb6146c282610733565b945194856106d4565b83523d6000602085013e61581f565b8051806146e5575050565b816020806146fa9361043b9501019101613d7f565b6145ce565b6060925061581f565b6080810161471b611a9c61088983613db9565b6148bb5750602081019061479e60206147526147396104d786612d18565b60801b6fffffffffffffffffffffffffffffffff191690565b6040517f2cbc26bb0000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff19909116600482015291829081906024820190565b03816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa9081156115ea5760009161489c575b50614872576147f16147ec83612d18565b615268565b6147fa82612d18565b9061481a611a9c60a0830193610b3c61481386866129a5565b3691610aa7565b6148325750509061482d61043b92612d18565b61537f565b61483c92506129a5565b90611b566040519283927f24eb47e5000000000000000000000000000000000000000000000000000000008452600484016132c5565b7f53ad11d80000000000000000000000000000000000000000000000000000000060005260046000fd5b6148b5915060203d602011613fd957613fcb81836106d4565b386147db565b6148c761059f91613db9565b7f961c9a4f000000000000000000000000000000000000000000000000000000006000526001600160a01b0316600452602490565b90815160748110614a925750600482015163ffffffff8116614a5f57506008820151916014600c8201519101519261493b602084015163ffffffff1690565b63ffffffff811663ffffffff831603614a265750507f000000000000000000000000000000000000000000000000000000000000000063ffffffff811663ffffffff8316036149ed5750505167ffffffffffffffff1667ffffffffffffffff811667ffffffffffffffff8316036149b0575050565b7ff917ffea0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff9081166004521660245260446000fd5b7f77e480260000000000000000000000000000000000000000000000000000000060005263ffffffff9081166004521660245260446000fd5b7fe366a1170000000000000000000000000000000000000000000000000000000060005263ffffffff9081166004521660245260446000fd5b7f68d2f8d60000000000000000000000000000000000000000000000000000000060005263ffffffff1660045260246000fd5b7f758b22cc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b8054821015612d135760005260206000200190600090565b600081815260036020526040902054614b44576002546801000000000000000081101561065f57614b2b614b148260018594016002556002614abf565b81939154906000199060031b92831b921b19161790565b9055600254906000526003602052604060002055600190565b50600090565b600081815260106020526040902054614b4457600f546801000000000000000081101561065f57614b87614b14826001859401600f55600f614abf565b9055600f54906000526010602052604060002055600190565b600081815260066020526040902054614b44576005546801000000000000000081101561065f57614bdd614b148260018594016005556005614abf565b9055600554906000526006602052604060002055600190565b6000828152600182016020526040902054614c4b578054906801000000000000000082101561065f5782614c34614b14846001809601855584614abf565b905580549260005201602052604060002055600190565b5050600090565b7f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1991614dc56133b9928054614ca3614c9d614c948363ffffffff9060801c1690565b63ffffffff1690565b42612d52565b9081614dd1575b5050614d976001614cc560208601516001600160801b031690565b92614d1d614cf86145006001600160801b03614ce885546001600160801b031690565b166001600160801b038816615416565b82906001600160801b03166fffffffffffffffffffffffffffffffff19825416179055565b614d70614d2a8751151590565b82547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff000000000000000000000000000000000000000016178255565b019182906001600160801b03166fffffffffffffffffffffffffffffffff19825416179055565b604083015181546001600160801b031660809190911b6fffffffffffffffffffffffffffffffff1916179055565b6040519182918261449a565b614500614cf8916001600160801b03614e2a614e319582614e2360018a01549282614e1c614e15614e08876001600160801b031690565b996001600160801b031690565b9560801c90565b169061369e565b9116612985565b9116615416565b80547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff00000000000000000000000000000000161781553880614caa565b60808101614e8c611a9c61088983613db9565b6148bb57506020810190614eaa60206147526147396104d786612d18565b03816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa9081156115ea57600091614f23575b50614872576060614f1a61043b93614f09614f0460408601613db9565b615428565b6110a2614f1582612d18565b6154b2565b91013590615576565b614f3c915060203d602011613fd957613fcb81836106d4565b38614ee7565b604051906002548083528260208101600260005260206000209260005b818110614f7457505061043b925003836106d4565b8454835260019485019487945060209093019201614f5f565b604051906005548083528260208101600560005260206000209260005b818110614fbf57505061043b925003836106d4565b8454835260019485019487945060209093019201614faa565b906040519182815491828252602082019060005260206000209260005b81811061500a57505061043b925003836106d4565b8454835260019485019487945060209093019201614ff5565b8054801561504b57600019019061503a8282614abf565b60001982549160031b1b1916905555565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081815260036020526040902054908115614c4b5760001982019082821161229c5760025492600019840193841161229c5783836000956150da95036150e0575b5050506150c96002615023565b600390600052602052604060002090565b55600190565b6150c961510c916151026150f8615112956002614abf565b90549060031b1c90565b9283916002614abf565b90612c0b565b553880806150bc565b600081815260066020526040902054908115614c4b5760001982019082821161229c5760055492600019840193841161229c5783836000956150da950361517b575b50505061516a6005615023565b600690600052602052604060002090565b61516a61510c916151936150f861519d956005614abf565b9283916005614abf565b5538808061515d565b600181019180600052826020526040600020549283151560001461524257600019840184811161229c57835493600019850194851161229c5760009585836150da976151fa9503615209575b505050615023565b90600052602052604060002090565b61522961510c916152206150f86152399588614abf565b92839187614abf565b8590600052602052604060002090565b553880806151f2565b50505050600090565b92615256919261369e565b810180911161229c576107a191615416565b615274611a9c82612d22565b6153485760206152e091615293610ddb6004546001600160a01b031690565b6040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90921660048301523360248301529092839190829081906044820190565b03915afa9081156115ea57600091615329575b50156152fb57565b7f728fe07b000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b615342915060203d602011613fd957613fcb81836106d4565b386152f3565b7fa9902c7e0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff1660045260246000fd5b67ffffffffffffffff7f50f6fbee3ceedce6b7fd7eaef18244487867e6718aec7208187efb6b7908c14c911691826000526007602052806153f360026040600020016001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016928391615620565b604080516001600160a01b0390921682526020820192909252908190810161415b565b9080821015615423575090565b905090565b7f00000000000000000000000000000000000000000000000000000000000000006154505750565b6001600160a01b0316806000526003602052604060002054156154705750565b7fd0d259760000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9081602091031261041957516107a18161084b565b6154be611a9c82612d22565b615348576020615522916154dd610ddb6004546001600160a01b031690565b60405180809581947fa8d87a3b0000000000000000000000000000000000000000000000000000000083526004830191909167ffffffffffffffff6020820193169052565b03915afa80156115ea576001600160a01b0391600091615547575b501633036152fb57565b615569915060203d60201161556f575b61556181836106d4565b81019061549d565b3861553d565b503d615557565b67ffffffffffffffff7fff0133389f9bb82d5b9385826160eaf2328039f6fa950eeb8cf0836da8178944911691826000526007602052806153f360406000206001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016928391615620565b81156155f1570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b8054939290919060ff60a086901c16158015615817575b6158105761564d6001600160801b038616614500565b906001840195865461567e614c9d614c94615671614500856001600160801b031690565b9460801c63ffffffff1690565b8061577c575b505083811061573e57508282106156cc575061043b9394506156a99161450091612d52565b6001600160801b03166fffffffffffffffffffffffffffffffff19825416179055565b9061570361059f936156fe6156ef846156e96145008c5460801c90565b93612d52565b6156f883612d43565b90612985565b6155e7565b7fd0c8d23a000000000000000000000000000000000000000000000000000000006000526004526024526001600160a01b0316604452606490565b7f1a76572a0000000000000000000000000000000000000000000000000000000060005260045260248390526001600160a01b031660445260646000fd5b8285929395116157e65761579661450061579d9460801c90565b918561524b565b84547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff0000000000000000000000000000000016178555913880615684565b7f9725942a0000000000000000000000000000000000000000000000000000000060005260046000fd5b5050509050565b508115615637565b9192901561589a5750815115615833575090565b3b1561583c5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156158ad5750805190602001fd5b611b56906040519182917f08c379a00000000000000000000000000000000000000000000000000000000083526004830161079056fea164736f6c634300081a000a000000000000000000000000bd3fa81b58ba92a82136038b25adec7066af31550000000000000000000000008d8aab1ef7047c1bbc6d17202cb39eca43263cfc000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4800000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000411de17f12d1a34ecc7f45f49844626267c75e8100000000000000000000000080226fc0ee2b096224eeac085bb9a8cba1146f7d000000000000000000000000c2e3a3c18ccb634622b57ff119a1c8c7f12e8c0c0000000000000000000000000000000000000000000000000000000000000000