62.1k txs
115.4k calls
constructor
constructor(address uniV4, address controller)
functions
eip712Domain
viewfunction eip712Domain() view returns (bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions)
extsload
viewfunction extsload(uint256 slot) view returns (uint256)
afterSwap
nonpayablefunction afterSwap(address, tuple key, tuple params, int256 swap_delta, bytes) returns (bytes4, int128)
batchUpdatePools
nonpayablefunction batchUpdatePools(address expected_store, tuple[] updates)
beforeAddLiquidity
nonpayablefunction beforeAddLiquidity(address sender, tuple key, tuple params, bytes) returns (bytes4)
beforeRemoveLiquidity
nonpayablefunction beforeRemoveLiquidity(address sender, tuple key, tuple params, bytes) returns (bytes4)
beforeSwap
nonpayablefunction beforeSwap(address, tuple key, tuple, bytes optionalUnlockData) returns (bytes4 response, int256, uint24 swapFee)
collect_unlock_swap_fees
nonpayablefunction collect_unlock_swap_fees(address to, bytes packed_assets)
compose
nonpayablefunction compose(address from, bytes payload) returns (uint32)
configurePool
nonpayablefunction configurePool(address asset0, address asset1, uint16 tickSpacing, uint24 bundleFee, uint24 unlockedFee, uint24 protocolUnlockedFee)
deposit
nonpayablefunction deposit(address asset, address to, uint256 amount)
deposit
nonpayablefunction deposit(address asset, uint256 amount)
execute
nonpayablefunction execute(bytes encoded)
initializePool
nonpayablefunction initializePool(address assetA, address assetB, uint256 storeIndex, uint160 sqrtPriceX96)
invalidateNonce
nonpayablefunction invalidateNonce(uint64 nonce)
pullFee
nonpayablefunction pullFee(address asset, uint256 amount)
removePool
nonpayablefunction removePool(bytes27 key, address expected_store, uint256 store_index)
setController
nonpayablefunction setController(address newController)
toggleNodes
nonpayablefunction toggleNodes(address[] nodes)
unlockCallback
nonpayablefunction unlockCallback(bytes data) returns (bytes)
unlockWithEmptyAttestation
nonpayablefunction unlockWithEmptyAttestation(address node, bytes signature)
withdraw
nonpayablefunction withdraw(address asset, address to, uint256 amount)
withdraw
nonpayablefunction withdraw(address asset, uint256 amount)
events
No events.
errors
AssetAccessOutOfBounds
error AssetAccessOutOfBounds(uint256 index, uint256 length)
AssetsOutOfOrderOrNotUnique
error AssetsOutOfOrderOrNotUnique()
AssetsUnordered
error AssetsUnordered()
BundlDeltaUnresolved
error BundlDeltaUnresolved(address asset)
CannotSwapWhileLocked
error CannotSwapWhileLocked()
EntryKeyMismatch
error EntryKeyMismatch()
Expired
error Expired()
FailedToDeployNewStore
error FailedToDeployNewStore()
FeeAboveMax
error FeeAboveMax()
FillingTooLittle
error FillingTooLittle()
FillingTooMuch
error FillingTooMuch()
GasAboveMax
error GasAboveMax()
IndexMayHaveChanged
error IndexMayHaveChanged()
InsufficientCapacity
error InsufficientCapacity()
InvalidHookPermissions
error InvalidHookPermissions()
InvalidPermitType
error InvalidPermitType(uint8)
InvalidSignature
error InvalidSignature()
InvalidSignature
error InvalidSignature()
InvalidTickSpacing
error InvalidTickSpacing()
JustInTimeLiquidityChange
error JustInTimeLiquidityChange()
LimitViolated
error LimitViolated()
NoEntry
error NoEntry()
NonceReuse
error NonceReuse()
NotController
error NotController()
NotNode
error NotNode()
NotUniswap
error NotUniswap()
OnlyOncePerBlock
error OnlyOncePerBlock()
OrderAlreadyExecuted
error OrderAlreadyExecuted()
OutOfOrderOrDuplicatePairs
error OutOfOrderOrDuplicatePairs()
Overflow
error Overflow()
PairAccessOutOfBounds
error PairAccessOutOfBounds(uint256 index, uint256 length)
ReaderNotAtEnd
error ReaderNotAtEnd()
ToBGasUsedAboveMax
error ToBGasUsedAboveMax()
UnlockDataTooShort
error UnlockDataTooShort()
UnlockedFeeNotSet
error UnlockedFeeNotSet(bytes27 key)
UnlockFeeAboveMax
error UnlockFeeAboveMax()
WrongEndLiquidity
error WrongEndLiquidity(uint128 endLiquidity, uint128 actualCurrentLiquidity)
creation bytecode
0x610160604052348015610010575f80fd5b50604051616a82380380616a8283398101604081905261002f9161040f565b306080524660a052808260608061007a6040805180820182526008815267416e677374726f6d60c01b60208083019190915282518084019093526002835261763160f01b9083015291565b815160209283012081519183019190912060c082905260e0819052604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8152938401929092528282015246606083015230608083015260a0909120610100526001600160a01b039384166101208190525f80546001600160a01b0319169587169590951790945551610111925090506103eb565b6001600160a01b039091168152602001604051809103905ff08015801561013a573d5f803e3d5ffd5b506001600160a01b03166101405250610151610158565b5050610447565b61016130610180565b61017e5760405163cb13e96160e01b815260040160405180910390fd5b565b5f816101976001600160a01b0382166130006102a1565b6101a357505f92915050565b6101b86001600160a01b0382166108006102a1565b6101c457505f92915050565b6101d96001600160a01b0382166104006102a1565b156101e657505f92915050565b6101fb6001600160a01b0382166102006102a1565b61020757505f92915050565b61021c6001600160a01b0382166101006102a1565b1561022957505f92915050565b61023d6001600160a01b03821660806102a1565b61024957505f92915050565b61025d6001600160a01b03821660406102a1565b801561027857506102786001600160a01b03821660046102a1565b61028457505f92915050565b61029a6001600160a01b038216628000006102b6565b9392505050565b6001600160a01b038282161615155b92915050565b5f6102cb6001600160a01b03841660806102a1565b1580156102e757506102e76001600160a01b03841660086102a1565b156102f357505f6102b0565b6103076001600160a01b03841660406102a1565b15801561032357506103236001600160a01b03841660046102a1565b1561032f57505f6102b0565b6103446001600160a01b0384166104006102a1565b15801561036057506103606001600160a01b03841660026102a1565b1561036c57505f6102b0565b6103816001600160a01b0384166101006102a1565b15801561039d575061039d6001600160a01b03841660016102a1565b156103a957505f6102b0565b6001600160a01b038316156103da57613fff83161515806103d557506280000062ffffff83161461029a565b61029a565b5062ffffff16628000001415919050565b6108e48061619e83390190565b6001600160a01b038116811461040c575f80fd5b50565b5f8060408385031215610420575f80fd5b825161042b816103f8565b602084015190925061043c816103f8565b809150509250929050565b60805160a05160c05160e051610100516101205161014051615c1161058d5f395f8181610f940152611beb01525f818161046f01528181610955015281816109cd01528181610a2a01528181610acd01528181610b4701528181610c1c01528181610d0c01528181610e92015281816113f00152818161189201528181611bc201528181611d0301528181611d310152818161260501528181612f970152818161303901528181613060015281816134cc015281816135de0152818161361a0152818161364e01528181613692015281816136d101528181613e590152818161402701528181614a2501528181614a9401528181614b660152614bd501525f81816123dd015261413b01525f818161249701526141f501525f818161247101526141cf01525f8181612421015261417f01525f81816123fe015261415c0152615c115ff3fe608060405234801561000f575f80fd5b5060043610610184575f3560e01c80637cf98081116100dd578063b47b2fb111610088578063d9e17f9811610063578063d9e17f98146103f2578063dd4d4cf614610405578063f3fef3a314610418575f80fd5b8063b47b2fb11461037e578063d6cffd1e146103cc578063d9caed12146103df575f80fd5b80638587f450116100b85780638587f4501461033857806391dd73461461034b57806392eefe9b1461036b575f80fd5b80637cf98081146102e95780638340f5491461030a57806384b0196e1461031d575f80fd5b8063259982e51161013d57806353b41c551161011857806353b41c5514610258578063575e24b41461026b5780637407905c146102c1575f80fd5b8063259982e51461021f57806333830e481461023257806347e7ef2414610245575f80fd5b8063138714651161016d57806313871465146101b05780631828e0e7146101c357806321d0ee70146101d6575f80fd5b806309c5eabe14610188578063116a55501461019d575b5f80fd5b61019b610196366004614fe4565b61042b565b005b61019b6101ab366004615023565b61050b565b61019b6101be366004615075565b610518565b61019b6101d13660046150f1565b61076b565b6101e96101e4366004615158565b6108cc565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b6101e961022d366004615158565b610be8565b61019b6102403660046150f1565b610f5c565b61019b6102533660046151f7565b610fff565b61019b610266366004615221565b61104f565b61027e6102793660046152b4565b611280565b604080517fffffffff000000000000000000000000000000000000000000000000000000009094168452602084019290925262ffffff1690820152606001610216565b6102d46102cf3660046150f1565b611454565b60405163ffffffff9091168152602001610216565b6102fc6102f736600461530e565b611730565b604051908152602001610216565b61019b610318366004615325565b61173a565b61032561178f565b60405161021697969594939291906153af565b61019b610346366004615461565b611837565b61035e610359366004614fe4565b6119bf565b60405161021691906154b1565b61019b6103793660046154c3565b611a53565b61039161038c3660046154de565b611a94565b604080517fffffffff000000000000000000000000000000000000000000000000000000009093168352600f9190910b602083015201610216565b61019b6103da36600461555f565b611db2565b61019b6103ed366004615325565b611e3e565b61019b6104003660046151f7565b611e8a565b61019b6104133660046155ff565b611eaa565b61019b6104263660046151f7565b611fe0565b61043361202c565b5f81900361043f575050565b6040517f48c894910000000000000000000000000000000000000000000000000000000081526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906348c89491906104a69085908590600401615661565b5f604051808303815f875af11580156104c1573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261050691908101906156a1565b505050565b61051533826120ff565b50565b61052061213a565b846001600160a01b0316866001600160a01b03161061056b576040517f32b4bc9300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f86815260208690526040812060281b6003549091505f906105a3906801000000000000000090046001600160a01b0316600161217f565b8051519091505f905b80821015610654575f835f015183815181106105ca576105ca615791565b602002602001015190506105e46105de8290565b866121f3565b15610648576106228861061c8b875f0151878151811061060657610606615791565b602002602001015161222290919063ffffffff16565b9061224c565b845180518590811061063657610636615791565b60200260200101818152505050610654565b506001909101906105ac565b80820361067057610670610669858a8a612267565b84906122b2565b6106798361232d565b600380546001600160a01b039290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff90921691909117905560408051808201825262ffffff808916825287811660208084018281527fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000008a165f908152600290925294902092518354945183166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000009095169216919091179290921790556107519061239c565b61075f8662ffffff1661239c565b50505050505050505050565b61078060035467ffffffffffffffff16431490565b156107b7576040517fd8a6b89b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383165f9081526001602052604090205460ff16610808576040517f5cd26b6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f3f25e551746414ff93f076a7dd83828ff53735b39366c74015637e004fcb02235f90815243602052604081209061083f826123db565b905061084d858286866124f1565b610883576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61088c436125dd565b600380547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff929092169190911790555050505050565b5f6108d56125fa565b5f6108df8661265c565b90505f8061093f838a6108f560208b018b6157cc565b61090560408c0160208d016157cc565b60069081526003919091525f91825260608b01356026908152603a600c209083905292825260209081526040808320848452909152902091565b90925090505f61098461097b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686612670565b60a01c60020b90565b90505f6109bd8261099860208c018c6157cc565b6109a860408d0160208e016157cc565b5f898152600760205260409020929190612690565b90505f6109f46001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168786612712565b90505f610a18865f01548403836fffffffffffffffffffffffffffffffff1661276d565b90508015610bb6576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a5841194610a5c60208f018f6154c3565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526024015f604051808303815f87803b158015610ab2575f80fd5b505af1158015610ac4573d5f803e3d5ffd5b50505050610b0f7f0000000000000000000000000000000000000000000000000000000000000000828e5f016020810190610aff91906154c3565b6001600160a01b031691906127e2565b6040517f3dd45adb0000000000000000000000000000000000000000000000000000000081526001600160a01b038e811660048301527f00000000000000000000000000000000000000000000000000000000000000001690633dd45adb906024016020604051808303815f875af1158015610b8d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb191906157e7565b508286555b507f21d0ee70000000000000000000000000000000000000000000000000000000009c9b505050505050505050505050565b5f610bf16125fa565b5f610bfb8661265c565b5f81815260076020526040812091925080610c4261097b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686612670565b90505f83610c5360208b018b6157cc565b62ffffff1663010000008110610c6b57610c6b615791565b015490505f84610c8160408c0160208d016157cc565b62ffffff1663010000008110610c9957610c99615791565b01549050610caa60208b018b6157cc565b60020b8360020b1215610cc1578082039350610e1c565b600283900b610cd660408c0160208d016157cc565b60020b13610dc457610d3486610cef60208d018d6157cc565b8d6060016020810190610d0291906157cc565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016929190612835565b610d6c57630100000085015491508185610d5160208d018d6157cc565b62ffffff1663010000008110610d6957610d69615791565b01555b610d8086610cef60408d0160208e016157cc565b610dba575063010000008401548085610d9f60408d0160208e016157cc565b62ffffff1663010000008110610db757610db7615791565b01555b8181039350610e1c565b610dd586610cef60208d018d6157cc565b610e0d57630100000085015491508185610df260208d018d6157cc565b62ffffff1663010000008110610e0a57610e0a615791565b01555b80828663010000000154030393505b505f9150819050610e7f858c610e3560208d018d6157cc565b610e4560408e0160208f016157cc565b60069081526003919091525f91825260608d01356026908152603a600c209083905292825260209081526040808320848452909152902091565b90925090505f610eb96001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168784612712565b905060408a01355f610ecb828461582b565b9050826fffffffffffffffffffffffffffffffff165f03610eee57858555610f29565b5f610f23865f01548803856fffffffffffffffffffffffffffffffff16846fffffffffffffffffffffffffffffffff1661288b565b87038655505b507f259982e5000000000000000000000000000000000000000000000000000000009d9c50505050505050505050505050565b610f6461213a565b6040517f877415d20000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063877415d290610fcd90869086908690600401615853565b5f604051808303815f87803b158015610fe4575f80fd5b505af1158015610ff6573d5f803e3d5ffd5b50505050505050565b6110146001600160a01b038316333084612938565b6001600160a01b0382165f90815260056020908152604080832033845290915281208054839290611046908490615875565b90915550505050565b61105761213a565b6003546001600160a01b0368010000000000000000909104811690841681146110ac576040517ff21fd99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003545f906110d0906801000000000000000090046001600160a01b03168261217f565b90505f5b8381101561124957368585838181106110ef576110ef615791565b905060a00201905061112981604001602081019061110d9190615888565b61061c61112060408501602086016158a1565b8690853561299a565b83518051833590811061113e5761113e615791565b602090810291909101015261116661115c6080830160608401615888565b62ffffff1661239c565b61117961115c60a0830160808401615888565b60408051808201909152806111946080840160608501615888565b62ffffff1681526020016111ae60a0840160808501615888565b62ffffff16905260025f6111c860408501602086016158a1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000001681526020808201929092526040015f2082518154939092015162ffffff9081166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000909416921691909117919091179055506001016110d4565b506112538161232d565b600360086101000a8154816001600160a01b0302191690836001600160a01b031602179055505050505050565b5f805f61128b6125fa565b6112a060035467ffffffffffffffff16431490565b611357576014841015611319575f8490036112e7576040517f1e8107a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f4926898b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61132760148287896158ba565b611330916158e1565b60601c9050365f611344876014818b6158ba565b9150915061135383838361076b565b5050505b5f61139261136e61136b60208b018b6154c3565b90565b61138161136b60408c0160208d016154c3565b5f9182526020526040902060281b90565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000081165f9081526002602052604081205462ffffff16624000001793509091506113db8961265c565b905061142161141661097b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001684612670565b60089060020b612a27565b507f575e24b40000000000000000000000000000000000000000000000000000000093505f925050955095509592505050565b5f600183018335821a8061155157604080517fd505accf0000000000000000000000000000000000000000000000000000000081526001600160a01b03881660048201523360248201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6044820152601484013560d81c6064820181905260198501355f90811a60848401819052601a87013560a48501819052603a88013560c486018190529551605a8901983560601c969495929491939192879263d505accf9260e48084019382900301818387803b158015611531575f80fd5b505af1158015611543573d5f803e3d5ffd5b505050505050505050611714565b60018160ff160361162c576040517fd505accf0000000000000000000000000000000000000000000000000000000081526001600160a01b038716600482015233602482810191909152601484013560801c604483018190529084013560d81c6064830181905260298501355f1a60848401819052602a86013560a48501819052604a87013560c48601819052606a8801973560601c95869063d505accf9060e4015b5f604051808303815f87803b15801561160b575f80fd5b505af115801561161d573d5f803e3d5ffd5b50505050505050505050611714565b60028160ff16036116d8576040517f8fcbaf0c0000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152336024820152601483013560e01c60448201819052601884013560d81c6064830181905260016084840152601d8501355f1a60a48401819052601e86013560c48501819052603e87013560e48601819052605e8801973560601c958690638fcbaf0c90610104016115f4565b6040517f6f1d150900000000000000000000000000000000000000000000000000000000815260ff821660048201526024015b60405180910390fd5b61171f828686612a2e565b6324a2e44b925050505b9392505050565b5f81545f5260205ff35b61174f6001600160a01b038416333084612938565b6001600160a01b038084165f90815260056020908152604080832093861683529290529081208054839290611785908490615875565b9091555050505050565b7f0f000000000000000000000000000000000000000000000000000000000000006060805f808083611825604080518082018252600881527f416e677374726f6d0000000000000000000000000000000000000000000000006020808301919091528251808401909352600283527f76310000000000000000000000000000000000000000000000000000000000009083015291565b97989097965046955030945091925090565b826001600160a01b0316846001600160a01b03161115611855579192915b5f84815260208490526040812060281b6003549091505f9061188d906801000000000000000090046001600160a01b03168386612a4b565b5090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636276cbbe6040518060a001604052806118d18a90565b6001600160a01b03168152602001886001600160a01b03908116825262800000602080840191909152600287810b6040808601919091523060609586015280517fffffffff0000000000000000000000000000000000000000000000000000000060e089901b168152865185166004820152928601518416602484015285015162ffffff1660448301529284015190920b60648301526080909201518216608482015290861660a482015260c4016020604051808303815f875af115801561199b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff69190615947565b60606119c96125fa565b825f6119d482612ab5565b60035491935091505f90611a0090849084906801000000000000000090046001600160a01b0316612b6c565b9093509050611a0e82612ce1565b611a188382612d0c565b9250611a248382612d98565b9250611a308382612e4b565b9250611a3d838787612a2e565b611a4682612eea565b60205f525f60205260405ff35b611a5b61213a565b5f80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f80611a9e6125fa565b5f80611ac6611ab361136b60208c018c6154c3565b61138161136b60408d0160208e016154c3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000081165f908152600260209081526040822054929350630100000090920462ffffff16918a01803582139190611b1c908c615962565b151582151503611b3557611b308a600f0b90565b611b3f565b611b3f8a60801d90565b90505f8082600f0b12611b525781611b5b565b611b5b82615981565b905082611b995780611b7085620f42406159bd565b60020b611b80620f4240846159fe565b611b8a9190615a4a565b611b949190615abd565b611bb5565b620f4240611bab600286900b836159fe565b611bb59190615a4a565b9550506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016905063156e29f67f0000000000000000000000000000000000000000000000000000000000000000611c5a611c1a60208f018f615962565b151585151503611c3c578e6020016020810190611c3791906154c3565b611c4e565b8e5f016020810190611c4e91906154c3565b6001600160a01b031690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526fffffffffffffffffffffffffffffffff871660448201526064015f604051808303815f87803b158015611ccd575f80fd5b505af1158015611cdf573d5f803e3d5ffd5b505050505050505f611cf08961265c565b90505f611d2961097b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001684612670565b9050611d7e827f000000000000000000000000000000000000000000000000000000000000000060085c848e6060016020810190611d6791906157cc565b5f8881526007602052604090209493929190613112565b507fb47b2fb1000000000000000000000000000000000000000000000000000000009350909150505b965096945050505050565b611dba61213a565b5f5b81811015610506575f838383818110611dd757611dd7615791565b9050602002016020810190611dec91906154c3565b6001600160a01b03165f90815260016020819052604090912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055919091019050611dbc565b6001600160a01b0383165f90815260056020908152604080832033845290915281208054839290611e70908490615b0b565b9091555061050690506001600160a01b03841683836127e2565b611e9261213a565b611ea66001600160a01b03831633836127e2565b5050565b611eb261213a565b6003546001600160a01b036801000000000000000090910481169083168114611f07576040517ff21fd99f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003545f90611f2a906801000000000000000090046001600160a01b031661319b565b9050611f378186856131c2565b611f408161232d565b600380546001600160a01b039290921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff909216919091179055505050507fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000165f90815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000169055565b6001600160a01b0382165f90815260056020908152604080832033845290915281208054839290612012908490615b0b565b90915550611ea690506001600160a01b03831633836127e2565b6003544367ffffffffffffffff90911603612073576040517fd8a6b89b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f9081526001602052604090205460ff166120bb576040517f5cd26b6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120c4436125dd565b600380547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055565b80600c5263daa050e9600452815f52601f600c20600160ff83161b8082541881811661213257638cb888725f526004601cfd5b909155505050565b5f546001600160a01b0316331461217d576040517f23019e6700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60408051808201909152606081525f60208201525f6121a6846001600160a01b03166132ae565b90505f6121b38483615875565b602084810182905260408051838302810183019091525f81528086529192508381029081906001908401893c506121ea8484612301565b50505092915050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000828116908216145b92915050565b5f61222c826132c4565b5065ffffff00000061ffff918216601884811c939093161890911b161890565b5f61225682613313565b5062ffffff80831691909118161890565b5f612271836132c4565b61227a82613313565b6122aa8261061c7fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000871686612222565b949350505050565b815151602083015181036122f2576040517f5cef583a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61230683612301836001615875565b905152565b81835f0151828151811061231c5761231c615791565b602002602001018181525050505050565b805180516b600b380380600b5f395ff30082525f9190600c60208202016014830184f081835292506001600160a01b038316612395576040517f5670258700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050919050565b620f424062ffffff82161115610515576105157f140021130000000000000000000000000000000000000000000000000000000062ffffff8316613355565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f00000000000000000000000000000000000000000000000000000000000000004614166124ce5750604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f00000000000000000000000000000000000000000000000000000000000000009181019190915246606082015230608082015260a090205b6719010000000000005f5280601a5281603a52604260182090505f603a52919050565b5f6001600160a01b038516156122aa57604051853b61259a578260408114612521576041811461256157506125d4565b60208581013560ff81901c601b0190915285356040527f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16606052612572565b60408501355f1a6020526040856040375b50845f526020600160805f60015afa5180871860601b3d119250505f606052806040526125d4565b631626ba7e60e01b80825285600483015260248201604081528460448401528486606485013760208160648701858b5afa90519091141691505b50949350505050565b5f6801000000000000000082106125f6576125f661336a565b5090565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461217d576040517ff832861400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040515f9060a083823760a0902092915050565b5f8181526006602052604081206122aa6001600160a01b03851682613377565b5f808562ffffff8516630100000081106126ac576126ac615791565b015490505f8662ffffff8516630100000081106126cb576126cb615791565b015490508460020b8660020b12156126e657900390506122aa565b8560020b8460020b136126fb570390506122aa565b630100000087015491909103039050949350505050565b5f6006602052825f52600660405f2001602052815f5260405f20602052631e2eaeaf5f5260205f6024601c875afa6127515763535cf94b5f526004601cfd5b50505f516fffffffffffffffffffffffffffffffff1692915050565b81810281838204148315176127d9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8284098181108201900370010000000000000000000000000000000081106127cc5763c56a01595f526004601cfd5b608091821c911b0161221c565b60801c92915050565b81601452806034526fa9059cbb0000000000000000000000005f5260205f604460105f875af18060015f51141661282b57803d853b15171061282b576390b8ec185f526004601cfd5b505f603452505050565b5f80806128538486078213858705035b600881901d9160ff90911690565b9092509050612880816128706001600160a01b038a1689866133a7565b90600160ff919091161b16151590565b979650505050505050565b82820281838583041485151702612931577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8385098181108201900382848609835f0384168285116128e45763ae47f7025f526004601cfd5b93849004938382119092035f839003839004600101029203041760026003830281188084028203028084028203028084028203028084028203028084028203028084029091030202611729565b0492915050565b60405181606052826040528360601b602c526f23b872dd000000000000000000000000600c5260205f6064601c5f895af18060015f51141661298c57803d873b15171061298c57637939f4245f526004601cfd5b505f60605260405250505050565b5f835f015182815181106129b0576129b0615791565b602002602001015190506129f06129c48290565b847fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009081169116141590565b15611729576040517f23f69dc200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80825d5050565b808201808414612a45576301842f8c5f526004601cfd5b50505050565b5f8080612a626001600160a01b03871686866133de565b905080612a9b576040517f2f659e4400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff601882901c169662ffffff90911695509350505050565b6003818101915f918291803560e81c0101816044612ad38684615b0b565b612add9190615b1e565b905080602086901b1792505f805b82811015612b60575f612b09602087901c60448402015b3560601c90565b9050826001600160a01b0316816001600160a01b031611612b56576040517f80f11acf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9150600101612aeb565b50829450505050915091565b6003838101935f91829182918291803560e81c0101816026612b8e8a84615b0b565b612b989190615b1e565b905060405193508060c0028401925082604052808460201b179450505f5b82841015612cd45760048901983560e081901c905f90612bde90612b02908c9060f01c61341c565b90505f612bf2612b028c61ffff861661341c565b90508363ffffffff168363ffffffff16111580612c215750806001600160a01b0316826001600160a01b031610155b15612c58576040517ff35f939900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b90865260208601526040852060028b019a91925060281b903560f01c5f80612c8a6001600160a01b038c168585612a4b565b60408a0191909152606089015250505060208a01993590505f760a70c3c40a64e6c51999090b65f67d924000000000000082900460808701525060a085015260c090930192612bb6565b5093505050935093915050565b63ffffffff81165f5b8181101561050657612d04602084901c604483020161347a565b600101612cea565b60408051610160810182525f602082018190529181018290526080810182905260c0810182905260e081018290526101008101829052610140810182905263f3cd914c81526280000060608201523060a082015261012080820152600384810194803560e81c0101905b818514612d8f57612d8885828661353e565b9450612d76565b50929392505050565b6003828101925f91813560e81c9091010181612db2613747565b60408051610120810182525f60208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101919091527f0af19d5479e90f25845cea6db89a524bb4e8da3a698213efb1b85e10a5e8be9c815267ffffffffffffffff43166101008201529091505b828614612e4157612e3a86828488613791565b9550612e27565b5093949350505050565b5f80612e55613747565b604080516101a0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101829052610140810182905261016081018290526101808101919091526003868101969293509091803560e81c01015b808614612e4157612ee386838588613975565b9550612ed0565b6040805163ffffffff8316602481028201909252805f5b838110156130ff5760448102602086901c01803560601c6014820135608090811c906034840135901c5f612f4284612f398486615875565b60049190613b49565b90508015612f87576040517fcc67af530000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161170b565b81156130e1576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a5841194856040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526024015f604051808303815f87803b158015613013575f80fd5b505af1158015613025573d5f803e3d5ffd5b5061305e925050506001600160a01b0385167f0000000000000000000000000000000000000000000000000000000000000000846127e2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166311da60b46040518163ffffffff1660e01b81526004016020604051808303815f875af11580156130bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130df91906157e7565b505b6130eb8588613b7f565b505050602493909301925050600101612f01565b506024830282205f5260205fa050505050565b8260020b8260020b1315613156578260020b61313a828460020b613b8890919063ffffffff16565b60020b131561315157613151868587868686613b99565b613193565b8260020b8260020b1215613193575f600284900b828107919091129082900503810260020b8260020b121561319357613193868587868686613c18565b505050505050565b60408051808201909152606081525f602082015261221c6001600160a01b0383165f61217f565b6132146131e8845f015183815181106131dd576131dd615791565b602002602001015190565b837fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009081169116141590565b1561324b576040517f23f69dc200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8251515f9061325c90600190615b0b565b9050808210156132a457835180518290811061327a5761327a615791565b6020026020010151845f0151838151811061329757613297615791565b6020026020010181815250505b612a458482905152565b5f61221c60206001600160a01b0384163b615b1e565b600161ffff821610806132dc5750617fff61ffff8216115b15610515576040517f270815a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62030d4062ffffff82161115610515576040517f76a3f95d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b815f526001600160a01b03811660045260245ffd5b6335278d125f526004601cfd5b5f81602052631e2eaeaf5f5260205f6024601c865afa61339e5763535cf94b5f526004601cfd5b50505f51919050565b5f82815260066020908152604080832084845260050190915281206133d56001600160a01b03861682613377565b95945050505050565b5f6020826020026001015f863c50505f517fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000081169190911402919050565b5f8163ffffffff84161161346b576040517fffc31e710000000000000000000000000000000000000000000000000000000081526004810183905263ffffffff8416602482015260440161170b565b602083901c6044830201611729565b602481013560801c8015611ea657604080517f0b0d9c09000000000000000000000000000000000000000000000000000000008152833560601c600482018190523060248301526044820184905291517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691630b0d9c09916064808301925f92919082900301818387803b158015613519575f80fd5b505af115801561352b573d5f803e3d5ffd5b5061050692506004915083905084613ca3565b6001838101935f919035821a9061355a90859083161515613ccf565b60028501943560f01c6135816135708583613d13565b805160208201516040909201519092565b60020b60808801526001600160a01b039081166040880152166020860190815260a090205f60108801883560801c9098506fffffffffffffffffffffffffffffffff1690505f81156136c1575f61360461097b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686612670565b905061360f83613d73565b60e08a015261363e897f0000000000000000000000000000000000000000000000000000000000000000613dd4565b61367461097b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686612670565b60808a01515f8681526007602052604090209193506136bb919086907f00000000000000000000000000000000000000000000000000000000000000009085908790613112565b506136fa565b6136f761097b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001685612670565b90505b5f6137216002871615155f86815260076020526040902060808c01518d9190889087613df1565b60208b0151919b5091506137389060049083613b49565b50989998505050505050505050565b5f61378c613753614139565b60408051604281019091527f19010000000000000000000000000000000000000000000000000000000000008152600281019190915290565b905090565b83355f90811a6001818116151560808781019190915290870135811c60208701526011870135811c60408701526021870135811c6060870181905260418801976031013590911c90811115613812576040517f2bae6c5200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002878101973560f01c90613841908416151561382f8784613d13565b9060051b602081188201519101519091565b6001600160a01b0390811660c08a01521660a0880152506004821661386757865f613871565b60148701873560601c5b6001600160a01b031660e088015296505f61389d61389188610120902090565b60228801526042872090565b90505f600884166138b7576138b2898361422e565b6138c1565b6138c18983614298565b90995090506138d082826142dc565b60e08801518015820217600285161561390f57836fffffffffffffffffffffffffffffffff16896020018181516139079190615875565b905250613937565b836fffffffffffffffffffffffffffffffff16896040018181516139339190615b0b565b9052505b61394f828a60a001518b602001518c60800151614304565b613967818a60c001518b604001518c60800151614374565b509798975050505050505050565b5f8061398185876143d2565b60028201975091505f9081903560f01c6139aa6008851615156139a48884613d13565b906144b2565b6001600160a01b039182166101008c0152911660e08a01529250505060208701873560a08801819052909750811015613a0f576040517f8e1edfa400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028216613a1e57865f613a28565b60148701873560601c5b6001600160a01b031661012088015296505f613a488860048516156144f4565b6101408a01529098509050613a5e8789856145d6565b97505f80613a6e898b878761461e565b919b50925090505f613a8f613a838b88614828565b60228b015260428a2090565b90505f60808716613aa957613aa48c8361422e565b613ab3565b613ab38c83614298565b909c5090506010871615613aea57613ad68b610180015164ffffffffff16614848565b613ae5818c61016001516120ff565b613af4565b613af482826142dc565b5f8b610120015190508082821502179050613b1a818d6101000151868f60c00151614374565b613b248683614882565b613b38828d60e00151878f60c00151614304565b509a9b9a5050505050505050505050565b6001600160a01b0382165f908152602084905260408120613b77613b6e825c856148ca565b92508183612a27565b509392505050565b60248282375050565b5f8183071291819005919091030290565b63010000008601545b5f613bb86001600160a01b0388168787866148e2565b95509050600285810b9085900b1215613bd15750610ff6565b8015613c12578762ffffff861663010000008110613bf157613bf1615791565b015482038862ffffff871663010000008110613c0f57613c0f615791565b01555b50613ba2565b5f613c2e6001600160a01b03871686868561493c565b94509050600283810b9085900b13613c465750613193565b8015613c90578662ffffff851663010000008110613c6657613c66615791565b0154876301000000015403875f018562ffffff1663010000008110613c8d57613c8d615791565b01555b83613c9a81615b31565b94505050613c18565b6001600160a01b0382165f908152602084905260409020612a45613cc8825c84614974565b8290612a27565b80151560c083015280613cf65773fffd8963efd1fc6a506488495d951d5263988d25613cfd565b6401000276a45b6001600160a01b03166101009092019190915250565b5f8163ffffffff841611613d62576040517ff6601b500000000000000000000000000000000000000000000000000000000081526004810183905263ffffffff8416602482015260440161170b565b5060c08102602083901c0192915050565b5f7f8000000000000000000000000000000000000000000000000000000000000000821115613dce576040517f35278d1200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505f0390565b5f80610144601c85015f855af180610506576040513d5f823e3d81fd5b5f808715613f235760208701968035608090811c9160100135901c811580613e2957506fffffffffffffffffffffffffffffffff8116155b15613e4b57508792506fffffffffffffffffffffffffffffffff169050611da7565b5f613e7f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168961498c565b9050806fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff1614613ede576040517fbecb195c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6fffffffffffffffffffffffffffffffff8116608084901b0463010000008a018054909101905550889350506fffffffffffffffffffffffffffffffff169050611da7565b5f808060038a018a3560e81d909a5090505f60108b018b3560801c909b5090505f806003808e01908e3560e81c8f0101604080516080810182528e815260028e810b60208301528d810b9282018390525f606083018190529496509294508f939290919088900b1315613fa257613f9d83888789856149b0565b613faf565b613faf8388878985614af1565b6fffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffffffffffff000000000000000000000000000000008535908116919091049092019c509a5060109092019650925060801c6140098184615875565b92506140158686614c33565b81515f9061404d906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169061498c565b9050806fffffffffffffffffffffffffffffffff168a6fffffffffffffffffffffffffffffffff16146140c8576040517f6429cfd20000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff808c1660048301528216602482015260440161170b565b606083810151601489019835821c911c8114614110576040517fbecb195c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050630100000090920180549098019097555090965093945050505050965096945050505050565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141661136b5750604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f00000000000000000000000000000000000000000000000000000000000000009181019190915246606082015230608082015260a0902090565b6017601483013560e81c8084018201935f92813560601c9291019061425583868484614c6c565b61428b576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85935050505b9250929050565b5f806040518381525f6020820152604185603f8301376041850194506020600160808360015afa519150503d6142d557638baa579f5f526004601cfd5b9293915050565b80601452815f5260345f20805c156142fb57638a2ef1165f526004601cfd5b6001815d505050565b8161431160048583613ca3565b8115614358576001600160a01b038085165f9081526005602090815260408083209389168352929052908120805483929061434d908490615b0b565b9091555061436d9050565b61436d6001600160a01b038516863084612938565b5050505050565b8161438160048583613b49565b5081156143be576001600160a01b038085165f9081526005602090815260408083209389168352929052908120805483929061434d908490615875565b61436d6001600160a01b03851686836127e2565b60018101905f9035811a600483603c86013760049290920191602081161561444b5760108116614422577f6ee89dee573705c024a086e19a128ee0a5ee0547e3283adfa72fbe336a4c4b6c614444565b7f6be5f22bdcd037f6f35250c32e478fad62195ac2bbab1e2932f8c97af926b4915b845261449e565b60108116614479577f022e170cdf338f45bc718f58d29bfafbf3956c2f9ea8d19ccc9b72e42dbbb7b061449b565b7fb0617b84f694c245e54fb8032ebdc9f56eb26ea2c1b65a46c58f50dbd516e2865b84525b60018116151560c094909401939093525091565b600581901b6020811883015190830180516080909101516060850151620f4240908103906144e08284615b8d565b6144ea9190615b1e565b9150509250925092565b5f807fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470836145cc57843560e81c60038601955060405160146064038101828101604052828882378290206050828101517f7407905c0000000000000000000000000000000000000000000000000000000084526040602485018190527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec860160448601529985019960c09490941b77ffffffffffffffffffffffffffffffffffffffff000000009190941c1693019290921717925090505b8492509250925092565b5f6010821615614604576008836101788601376008929092019160058361019b860137600583019250614616565b67ffffffffffffffff43166101608501525b509092915050565b5f80808060208616156146d057508535608090811c604089018190526010880135821c60608a0181905260308901986020013590921c918183101561468f576040517fc4daf00300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808311156146c9576040517f4418233100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50506146fb565b5060108601953560801c604086166146e8575f6146eb565b60015b60ff166040890152606088018190525b60208701966010810135608090811c9135901c80821115614748576040517f668fef1b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6fffffffffffffffffffffffffffffffff1660808a015260088716156147c3576fffffffffffffffffffffffffffffffff811660608816156147a25782945061479b6147948683614cb1565b8890614cbc565b93506147bd565b91925082916147ba6147b48885614cc7565b82614cd2565b94505b5061481a565b6fffffffffffffffffffffffffffffffff811660608816156147fe5791935083916147f76147f18885614cbc565b82614cb1565b9350614818565b82935061481561480e8583614cd2565b8890614cc7565b94505b505b509597919650945092505050565b5f806010831661483a5761018061483e565b6101a05b9093209392505050565b80421115610515576040517f203d82d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8115611ea65763ffffffff82168260c01c8260048201528360201c60205f84845f855af1925050506324a2e44b5f5114601f3d111681166105065763f959fdae5f526004601cfd5b8082038281131561221c5763c9654ed45f526004601cfd5b5f8080806148fc6128458688078313878905036001615ba4565b909250905061491f816149196001600160a01b038b168a866133a7565b90614cdd565b909450905061492f828287614d9f565b9250505094509492505050565b5f808080614951858707821386880503612845565b909250905061491f8161496e6001600160a01b038b168a866133a7565b90614dc9565b8181018281121561221c5763c9654ed45f526004601cfd5b5f8181526006602052604081205f6133d56001600160a01b03861660038401613377565b5f80808060018180805b8315614a7f5760108b019a3560801c6149d38185615875565b93506fffffffffffffffffffffffffffffffff8b16608082901b0483019250828e8e62ffffff1663010000008110614a0d57614a0d615791565b015f82825401925050819055505f614a5c8b5f01518f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316614e919092919063ffffffff16565b915050614a698c82614ef6565b9b508d6013528b601052825f5260335f20925050505b885160208a0151614abc916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016918f90614f10565b809d508195505050886040015160020b8c60020b136149ba5760609890980197909752979a9799509497509495945050505050565b5f80808060018180805b8315614bc05760108b019a3560801c614b148185615875565b93506fffffffffffffffffffffffffffffffff8b16608082901b0483019250828e8e62ffffff1663010000008110614b4e57614b4e615791565b015f82825401925050819055505f614b9d8b5f01518f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316614e919092919063ffffffff16565b915050614baa8c82614f2a565b9b508d6013528b601052825f5260335f20925050505b885160208a0151614bfd916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016918f906148e2565b809d508195505050886040015160020b8c60020b1315614afb5760609890980197909752979a9799509497509495945050505050565b808214611ea6576040517f01842f8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f604051631626ba7e60e01b80825285600483015260248201604081528460448401528486606485013760208160648701858b5afa9051909114169695505050505050565b5f6117298284615b0b565b5f6117298284614f44565b5f6117298284614f66565b5f6117298284615875565b5f805f614d788460ff1686901c7e1f0d1e100c1d070f090b19131c1706010e11080a1a141802121b150316040581196001019091166101e07f804040554300526644320000502061067405302602000010750620017611707760fc7fb6db6db6ddddddddd34d34d349249249210842108c6318c639ce739cffffffff840260f81c161b60f71c1690811c63d76453e004601f169190911a1790565b9050806101001415925082614d8e5760ff614d95565b8360ff1681015b9150509250929050565b5f8160ff8416614db5600187900b610100615be5565b614dbf9190615ba4565b6122aa9190615be5565b5f805f8360ff0390505f614e6a8260ff1687901b7f0706060506020504060203020504030106050205030304010505030400000000601f6f8421084210842108cc6318c6db6d54be831560081b6fffffffffffffffffffffffffffffffff851160071b1784811c67ffffffffffffffff1060061b1784811c63ffffffff1060051b1784811c61ffff1060041b1784811c60ff1060031b1793841c1c161a1790565b9050806101001415935083614e7f575f614e86565b8160ff1681035b925050509250929050565b5f806006602052835f52600460405f2001602052825f5260405f20602052631e2eaeaf5f5260205f6024601c885afa614ed15763535cf94b5f526004601cfd5b50505f516fffffffffffffffffffffffffffffffff81169460809190911d9350915050565b808203608081901c1561221c5763c9654ed45f526004601cfd5b5f80808061495161284560018789078413888a05036159bd565b818101608081901c1561221c5763c9654ed45f526004601cfd5b5f6b033b2e3c9fd0803ce8000000614f5c8385615b8d565b6117299190615b1e565b5f611729836b033b2e3c9fd0803ce80000008482820283158482048414178202614f975763ad251c275f526004601cfd5b81810615159190040192915050565b5f8083601f840112614fb6575f80fd5b50813567ffffffffffffffff811115614fcd575f80fd5b602083019150836020828501011115614291575f80fd5b5f8060208385031215614ff5575f80fd5b823567ffffffffffffffff81111561500b575f80fd5b61501785828601614fa6565b90969095509350505050565b5f60208284031215615033575f80fd5b813567ffffffffffffffff81168114611729575f80fd5b6001600160a01b0381168114610515575f80fd5b803562ffffff81168114615070575f80fd5b919050565b5f805f805f8060c0878903121561508a575f80fd5b86356150958161504a565b955060208701356150a58161504a565b9450604087013561ffff811681146150bb575f80fd5b93506150c96060880161505e565b92506150d76080880161505e565b91506150e560a0880161505e565b90509295509295509295565b5f805f60408486031215615103575f80fd5b833561510e8161504a565b9250602084013567ffffffffffffffff811115615129575f80fd5b61513586828701614fa6565b9497909650939450505050565b5f60a08284031215615152575f80fd5b50919050565b5f805f805f85870361016081121561516e575f80fd5b86356151798161504a565b95506151888860208901615142565b945060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff40820112156151b9575f80fd5b5060c08601925061014086013567ffffffffffffffff8111156151da575f80fd5b6151e688828901614fa6565b969995985093965092949392505050565b5f8060408385031215615208575f80fd5b82356152138161504a565b946020939093013593505050565b5f805f60408486031215615233575f80fd5b833561523e8161504a565b9250602084013567ffffffffffffffff811115615259575f80fd5b8401601f81018613615269575f80fd5b803567ffffffffffffffff81111561527f575f80fd5b86602060a083028401011115615293575f80fd5b939660209190910195509293505050565b5f60608284031215615152575f80fd5b5f805f805f61014086880312156152c9575f80fd5b85356152d48161504a565b94506152e38760208801615142565b93506152f28760c088016152a4565b925061012086013567ffffffffffffffff8111156151da575f80fd5b5f6020828403121561531e575f80fd5b5035919050565b5f805f60608486031215615337575f80fd5b83356153428161504a565b925060208401356153528161504a565b929592945050506040919091013590565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b7fff000000000000000000000000000000000000000000000000000000000000008816815260e060208201525f6153e960e0830189615363565b82810360408401526153fb8189615363565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015615450578351835260209384019390920191600101615432565b50909b9a5050505050505050505050565b5f805f8060808587031215615474575f80fd5b843561547f8161504a565b9350602085013561548f8161504a565b92506040850135915060608501356154a68161504a565b939692955090935050565b602081525f6117296020830184615363565b5f602082840312156154d3575f80fd5b81356117298161504a565b5f805f805f8061016087890312156154f4575f80fd5b86356154ff8161504a565b955061550e8860208901615142565b945061551d8860c089016152a4565b9350610120870135925061014087013567ffffffffffffffff811115615541575f80fd5b61554d89828a01614fa6565b979a9699509497509295939492505050565b5f8060208385031215615570575f80fd5b823567ffffffffffffffff811115615586575f80fd5b8301601f81018513615596575f80fd5b803567ffffffffffffffff8111156155ac575f80fd5b8560208260051b84010111156155c0575f80fd5b6020919091019590945092505050565b80357fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000081168114615070575f80fd5b5f805f60608486031215615611575f80fd5b615342846155d0565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b602081525f6122aa60208301848661561a565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f602082840312156156b1575f80fd5b815167ffffffffffffffff8111156156c7575f80fd5b8201601f810184136156d7575f80fd5b805167ffffffffffffffff8111156156f1576156f1615674565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561575d5761575d615674565b604052818152828201602001861015615774575f80fd5b8160208401602083015e5f91810160200191909152949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8060020b8114610515575f80fd5b5f602082840312156157dc575f80fd5b8135611729816157be565b5f602082840312156157f7575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6fffffffffffffffffffffffffffffffff818116838216019081111561221c5761221c6157fe565b6001600160a01b0384168152604060208201525f6133d560408301848661561a565b8082018082111561221c5761221c6157fe565b5f60208284031215615898575f80fd5b6117298261505e565b5f602082840312156158b1575f80fd5b611729826155d0565b5f80858511156158c8575f80fd5b838611156158d4575f80fd5b5050820193919092039150565b80357fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008116906014841015615940577fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808560140360031b1b82161691505b5092915050565b5f60208284031215615957575f80fd5b8151611729816157be565b5f60208284031215615972575f80fd5b81358015158114611729575f80fd5b5f81600f0b7fffffffffffffffffffffffffffffffff8000000000000000000000000000000081036159b5576159b56157fe565b5f0392915050565b600282810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008112627fffff8213171561221c5761221c6157fe565b5f82600f0b82600f0b0280600f0b9150808214615940576159406157fe565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f81600f0b83600f0b80615a6057615a60615a1d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffff8000000000000000000000000000000083141615615ab457615ab46157fe565b90059392505050565b600f82810b9082900b037fffffffffffffffffffffffffffffffff8000000000000000000000000000000081126f7fffffffffffffffffffffffffffffff8213171561221c5761221c6157fe565b8181038181111561221c5761221c6157fe565b5f82615b2c57615b2c615a1d565b500490565b5f8160020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008103615b6557615b656157fe565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b808202811582820484141761221c5761221c6157fe565b600281810b9083900b01627fffff81137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008212171561221c5761221c6157fe565b5f8260020b8260020b028060020b9150808214615940576159406157fe56fea164736f6c634300081a000a60c0604052348015600e575f80fd5b506040516108e43803806108e4833981016040819052602b91603f565b336080526001600160a01b031660a052606a565b5f60208284031215604e575f80fd5b81516001600160a01b03811681146063575f80fd5b9392505050565b60805160a05161083f6100a55f395f818160e7015281816101e4015281816102c201528181610394015261043f01525f608e015261083f5ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c8063877415d21461003857806391dd73461461004d575b5f80fd5b61004b610046366004610503565b610076565b005b61006061005b36600461056c565b6101ca565b60405161006d91906105ab565b60405180910390f35b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146100e5576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166348c894918460601b8484604051602001610139939291906105fe565b6040516020818303038152906040526040518263ffffffff1660e01b815260040161016491906105ab565b5f604051808303815f875af115801561017f573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526101c49190810190610666565b50505050565b60603373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461023b576040517ff832861400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6102496014828587610756565b6102529161077d565b60601c90506102648360148187610756565b90945092505f6102756014856107e3565b90505f5b818110156104a6576040517efdd58e0000000000000000000000000000000000000000000000000000000081523060048201526014820287013560601c60248201819052905f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169062fdd58e90604401602060405180830381865afa15801561031b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061033f919061081b565b6040517ff5298aca00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8481166024830152604482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063f5298aca906064015f604051808303815f87803b1580156103d7575f80fd5b505af11580156103e9573d5f803e3d5ffd5b50506040517f0b0d9c0900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528881166024830152604482018590527f0000000000000000000000000000000000000000000000000000000000000000169250630b0d9c0991506064015f604051808303815f87803b158015610482575f80fd5b505af1158015610494573d5f803e3d5ffd5b50506001909401935061027992505050565b505060408051602081019091525f8152949350505050565b5f8083601f8401126104ce575f80fd5b50813567ffffffffffffffff8111156104e5575f80fd5b6020830191508360208285010111156104fc575f80fd5b9250929050565b5f805f60408486031215610515575f80fd5b833573ffffffffffffffffffffffffffffffffffffffff81168114610538575f80fd5b9250602084013567ffffffffffffffff811115610553575f80fd5b61055f868287016104be565b9497909650939450505050565b5f806020838503121561057d575f80fd5b823567ffffffffffffffff811115610593575f80fd5b61059f858286016104be565b90969095509350505050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000084168152818360148301375f910160140190815292915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215610676575f80fd5b815167ffffffffffffffff81111561068c575f80fd5b8201601f8101841361069c575f80fd5b805167ffffffffffffffff8111156106b6576106b6610639565b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160116810181811067ffffffffffffffff8211171561072257610722610639565b604052818152828201602001861015610739575f80fd5b8160208401602083015e5f91810160200191909152949350505050565b5f8085851115610764575f80fd5b83861115610770575f80fd5b5050820193919092039150565b80357fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169060148410156107dc577fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808560140360031b1b82161691505b5092915050565b5f82610816577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b5f6020828403121561082b575f80fd5b505191905056fea164736f6c634300081a000a000000000000000000000000000000000004444c5dc75cb358380d2e3de08a900000000000000000000000001746484ea5e11c75e009252c102c8c33e0315fd4