1 tx
309 calls
constructor
constructor(address oldContractAdr)
functions
correctPriceDirection
purefunction correctPriceDirection(address base, address quote, uint160 sqrtPriceX96) pure returns (uint160 sqrtPriceX96Corrected)
factory
viewfunction factory() view returns (address)
getAmountsForLiquidity
purefunction getAmountsForLiquidity(uint160 sqrtRatioX96, uint160 sqrtRatioAX96, uint160 sqrtRatioBX96, uint128 liquidity) pure returns (uint256 amount0, uint256 amount1)
getPreferredPoolFor
viewfunction getPreferredPoolFor(address a, address b) view returns (address pool)
getPriceFromSqrtPriceX96
purefunction getPriceFromSqrtPriceX96(int8 decimalDiff, uint160 sqrtPriceX96) pure returns (uint80 price_12Decimals)
getSqrtPriceX96FromPrice
purefunction getSqrtPriceX96FromPrice(int8 decimalDiff, uint80 price_12Decimals) pure returns (uint160 sqrtPriceX96)
getTwapPriceP12
viewfunction getTwapPriceP12(int8 decimalDiff, address base, address quote, uint32 duration) view returns (uint80 price12)
getTwapPricePX96
viewfunction getTwapPricePX96(address poolAddress, address base, address quote, uint32 duration) view returns (uint256 priceX96)
liquidityDiffHelper
viewfunction liquidityDiffHelper(uint256 positionId, address base, address quote, uint256 baseBal, uint256 quoteBal, uint256 newBaseBal, uint256 newQuoteBal) view returns (int128 liquidityDiff, uint256 baseTmp, uint256 quoteTmp)
mulDiv
purefunction mulDiv(uint256 a, uint256 b, uint256 denominator) pure returns (uint256 result)
preSwapHelper
viewfunction preSwapHelper(address from, address to, uint256 maxIn, uint256 maxOut, uint24 slippageE6) view returns (address pool, uint256 amountIn, uint256 outMinimum)
safeGetPrice12Of
viewfunction safeGetPrice12Of(address base, address quote) view returns (uint80 price12)
safeGetPriceUSDC12Of
viewfunction safeGetPriceUSDC12Of(address token) view returns (uint80 price12)
sqrt
purefunction sqrt(uint256 x) pure returns (uint128)
swapRouter
viewfunction swapRouter() view returns (address)
uniswapV3ETHPoolByToken
viewfunction uniswapV3ETHPoolByToken(address) view returns (address)
uniswapV3USDCPoolByToken
viewfunction uniswapV3USDCPoolByToken(address) view returns (address)
v4PoolManager
viewfunction v4PoolManager() view returns (address)
v4PositionInfoHelper
viewfunction v4PositionInfoHelper(uint256 positionId, address base, address quote) view returns (uint128 liquidity, uint256 quotePos, uint256 basePos)
v4PositionManager
viewfunction v4PositionManager() view returns (address)
value12OfTokensAgainst
viewfunction value12OfTokensAgainst(address token, address quote, uint256 quantity) view returns (uint128 value12)
findV3PoolFor
nonpayablefunction findV3PoolFor(address base, address quote, uint128 minValueUSDC12) returns (address bestPool)
rescueTokens
nonpayablefunction rescueTokens(address token)
events
No events.
errors
No errors.
creation bytecode
0x60e060405273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4860805273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260a0527388e6a0c2ddd26feeb64f039a2c41296fcb3f564060c052348015610057575f80fd5b50604051613b3d380380613b3d83398101604081905261007691610101565b60c0515f60208181527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb580546001600160a01b039485166001600160a01b0319918216811790925560a051851684526040808520805483168417905560805186168552600190935291909220805482169092179091556002805493909216921691909117905561012e565b5f60208284031215610111575f80fd5b81516001600160a01b0381168114610127575f80fd5b9392505050565b60805160a05160c0516139556101e85f395f50505f8181610b1b01528181610c4101528181610ca301528181610dfe01528181610e410152818161150e015281816115e601528181611c2701528181611da10152818161236c015281816123c1015261241901525f8181610baf01528181610c1101528181610d4b01528181610d7b0152818161149601528181611ad901528181611cfb0152818161216c015281816121c10152818161221801526128de01526139555ff3fe608060405234801561000f575f80fd5b5060043610610183575f3560e01c80637afd0a86116100dd578063c31c9c0711610088578063d0280b6f11610063578063d0280b6f14610465578063e2f4dd4314610478578063ea4bc51c14610493575f80fd5b8063c31c9c0714610407578063c45a015514610422578063c72e160b1461043d575f80fd5b8063b3a57943116100b8578063b3a57943146103cb578063bc501ee7146103de578063c0c8eca6146103f1575f80fd5b80637afd0a86146103845780639ac1f6fe14610397578063aa9a0912146103b8575f80fd5b80632b0697831161013d57806365a5e8d21161011857806365a5e8d21461032a578063677342ce1461035e5780637a3dfdad14610371575f80fd5b80632b069783146102825780632dc516ba146102b057806364aa79a3146102e5575f80fd5b806315cbcf861161016d57806315cbcf86146101d45780631fba9eda1461022e57806321b2f14614610241575f80fd5b8062ae3bf814610187578063080085221461019c575b5f80fd5b61019a610195366004612e2b565b6104a6565b005b6101af6101aa366004612e46565b6105d1565b60408051600f9490940b84526020840192909252908201526060015b60405180910390f35b6102096101e2366004612e2b565b60016020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101cb565b61020961023c366004612eb6565b610880565b61025461024f366004612ef9565b6108e9565b604080516fffffffffffffffffffffffffffffffff90941684526020840192909252908201526060016101cb565b610295610290366004612f38565b610afd565b60405169ffffffffffffffffffff90911681526020016101cb565b6102096102be366004612e2b565b5f6020819052908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6102f86102f3366004612f74565b610dde565b6040805173ffffffffffffffffffffffffffffffffffffffff90941684526020840192909252908201526060016101cb565b61033d610338366004612fcf565b611123565b6040516fffffffffffffffffffffffffffffffff90911681526020016101cb565b61033d61036c36600461300d565b611237565b61029561037f366004613024565b6113b8565b61020961039236600461305b565b611493565b6103aa6103a53660046130ab565b611e54565b6040519081526020016101cb565b6103aa6103c6366004613102565b612024565b6102096103d936600461312b565b6120ed565b6102096103ec366004612f38565b612169565b6102096e04444c5dc75cb358380d2e3de08a9081565b61020973e592427a0aece92de3edee1f18e0157c0586156481565b610209731f98431c8ad98523631ae4a59f267346ea31f98481565b61045061044b366004613158565b6125f8565b604080519283526020830191909152016101cb565b6102956104733660046131b1565b6126a9565b61020973bd216513d74c8cf14cf4747e6aaa6420ff64ee9e81565b6102956104a1366004612e2b565b612863565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff82169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015610518573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061053c91906131cd565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303815f875af11580156105a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105cd91906131f3565b5050565b5f805f805f806105e28d8d8d6108e9565b9250925092505f6105f38d8d612169565b73ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa15801561063b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061065f919061323e565b50505050505090506106728d8d836120ed565b90505f6106b273ffffffffffffffffffffffffffffffffffffffff8316808e02907801000000000000000000000000000000000000000000000000612024565b8b0190505f6106f473ffffffffffffffffffffffffffffffffffffffff8416808602907801000000000000000000000000000000000000000000000000612024565b850190505f61073673ffffffffffffffffffffffffffffffffffffffff8516808e02907801000000000000000000000000000000000000000000000000612024565b8b019050828111156107ae5782810361076a6fffffffffffffffffffffffffffffffff89166103f783026103e88602612024565b5f039a50876fffffffffffffffffffffffffffffffff168b5f036fffffffffffffffffffffffffffffffff1611156107a257875f039a505b5f99505f98505061086c565b8260640281606602101561086c578083036107e46fffffffffffffffffffffffffffffffff89166103d983026103e88602612024565b9a506064606382020490505f61081e73ffffffffffffffffffffffffffffffffffffffff8716806c01000000000000000000000000612024565b905061084b8783026c01000000000000000000000000836c01000000000000000000000000018b02612024565b9a506108658b826c01000000000000000000000000612024565b8203995050505b505050505050509750975097945050505050565b5f806108c269ffffffffffffffffffff841678010000000000000000000000000000000000000000000000006108b787600c61331b565b6103c690600a61347a565b90506108cd81611237565b6fffffffffffffffffffffffffffffffff169150505b92915050565b5f805f805f73bd216513d74c8cf14cf4747e6aaa6420ff64ee9e73ffffffffffffffffffffffffffffffffffffffff16637ba03aad896040518263ffffffff1660e01b815260040161093d91815260200190565b60c060405180830381865afa158015610958573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061097c9190613504565b915091505f6109a561098f8460a0902090565b6e04444c5dc75cb358380d2e3de08a9090612904565b50506040517f1efeed33000000000000000000000000000000000000000000000000000000008152600481018c905291925073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e91631efeed339150602401602060405180830381865afa158015610a12573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a3691906135b1565b95505f80610a6983610a53610a4e8760081c60020b90565b6129e9565b610a63610a4e8860201c60020b90565b8b6125f8565b91509150846020015173ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614610aaa5781610aac565b805b9650846020015173ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614610aeb5781610aed565b805b9550505050505093509350939050565b5f73ffffffffffffffffffffffffffffffffffffffff8216610b3d577f000000000000000000000000000000000000000000000000000000000000000091505b5f8373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b87573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bab91906135cc565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c3f57610c37610c0e6006836135e5565b857f000000000000000000000000000000000000000000000000000000000000000060786126a9565b9150506108e3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cc957610c37610ca06012836135e5565b857f000000000000000000000000000000000000000000000000000000000000000060786126a9565b5f6006820390505f60068573ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d4091906135cc565b0390505f610d7183887f000000000000000000000000000000000000000000000000000000000000000060786126a9565b90505f610da183887f000000000000000000000000000000000000000000000000000000000000000060786126a9565b90508069ffffffffffffffffffff168269ffffffffffffffffffff1664e8d4a510000281610dd157610dd16132c1565b0498975050505050505050565b5f808073ffffffffffffffffffffffffffffffffffffffff8816610e24577f00000000000000000000000000000000000000000000000000000000000000009750610e63565b73ffffffffffffffffffffffffffffffffffffffff8716610e63577f000000000000000000000000000000000000000000000000000000000000000096505b610e6d8888612169565b92505f8373ffffffffffffffffffffffffffffffffffffffff1663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eb9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610edd9190613623565b610eea90620f424061363e565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8603610f1b578692506110be565b5f8473ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa158015610f65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f89919061323e565b50505050505090505f60608273ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1602901c90508573ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611010573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110349190613659565b73ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1603611090578262ffffff168102606089901b620f42400281611085576110856132c1565b0460010194506110af565b6110a98189620f42400260608662ffffff16901b612024565b60010194505b50878411156110bc578793505b505b62ffffff851615611113575f6110d7858b8b6078611e54565b905061110b846110e7888561363e565b6110f69062ffffff1684613674565b6e0f4240000000000000000000000000612024565b925050611117565b5f91505b50955095509592505050565b5f8073ffffffffffffffffffffffffffffffffffffffff8516156111b3578473ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561118a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ae91906135cc565b6111b6565b60125b90505f8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461120b57836111f78787610afd565b69ffffffffffffffffffff16029050611215565b5064e8d4a5100083025b8160ff16600a0a818161122a5761122a6132c1565b04925050505b9392505050565b5f815f0361124657505f919050565b816001700100000000000000000000000000000000821061126c5760809190911c9060401b5b6801000000000000000082106112875760409190911c9060201b5b640100000000821061129e5760209190911c9060101b5b6201000082106112b35760109190911c9060081b5b61010082106112c75760089190911c9060041b5b601082106112da5760049190911c9060021b5b600882106112e65760011b5b60018185816112f7576112f76132c1565b048201901c9050600181858161130f5761130f6132c1565b048201901c90506001818581611327576113276132c1565b048201901c9050600181858161133f5761133f6132c1565b048201901c90506001818581611357576113576132c1565b048201901c9050600181858161136f5761136f6132c1565b048201901c90506001818581611387576113876132c1565b0491909101901c5f611399828661368b565b90508082106113a857806113aa565b815b95945050505050565b919050565b5f80835f0b12611438576114316113e973ffffffffffffffffffffffffffffffffffffffff8416630e8d4a51613674565b6113f485600a61347a565b6114149073ffffffffffffffffffffffffffffffffffffffff8616613674565b761000000000000000000000000000000000000000000000612024565b90506108e3565b61143161145f73ffffffffffffffffffffffffffffffffffffffff8416630e8d4a51613674565b73ffffffffffffffffffffffffffffffffffffffff841660b4611481876136c3565b61148c90600a61347a565b901b612024565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611505575073ffffffffffffffffffffffffffffffffffffffff831615155b801561155d57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b156115c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f556e737570706f7274656400000000000000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8316611608577f000000000000000000000000000000000000000000000000000000000000000092505b60408051608081018252606481526101f46020820152610bb89181019190915261271060608201525f80805b60048160ff161015611976575f8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff16101561175057731f98431c8ad98523631ae4a59f267346ea31f984631698ee828a8a8860ff8716600481106116a6576116a66136fe565b60200201516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff938416600482015292909116602483015262ffffff166044820152606401602060405180830381865afa158015611725573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117499190613659565b9050611827565b731f98431c8ad98523631ae4a59f267346ea31f984631698ee82898b8860ff871660048110611781576117816136fe565b60200201516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff938416600482015292909116602483015262ffffff166044820152606401602060405180830381865afa158015611800573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118249190613659565b90505b73ffffffffffffffffffffffffffffffffffffffff81166118485750611964565b5f8173ffffffffffffffffffffffffffffffffffffffff16631a6865026040518163ffffffff1660e01b8152600401602060405180830381865afa158015611892573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118b691906135b1565b9050846fffffffffffffffffffffffffffffffff16816fffffffffffffffffffffffffffffffff161115611961578094508196508173ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa158015611933573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611957919061323e565b5094985050505050505b50505b8061196e8161372b565b915050611634565b5073ffffffffffffffffffffffffffffffffffffffff84166119f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f20706f6f6c7320666f756e6400000000000000000000000000000000000060448201526064016115c0565b5f612710611a1a73ffffffffffffffffffffffffffffffffffffffff8416612729613674565b611a24919061368b565b90505f612710611a4c73ffffffffffffffffffffffffffffffffffffffff85166126f7613674565b611a56919061368b565b90505f611a64828487612ce6565b90505f808a73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ab1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ad591906135cc565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1603611ba5578b73ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff161015611b6b5782620f4240029150611c6b565b611b7860068203876113b8565b69ffffffffffffffffffff16915060ff8116600a0a83830281611b9d57611b9d6132c1565b049150611c6b565b5f8c73ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff161015611be65750620f42408304611c1c565b611bf360128303886113b8565b69ffffffffffffffffffff1690508160ff16600a0a81850281611c1857611c186132c1565b0490505b64e8d4a51000611c4b7f0000000000000000000000000000000000000000000000000000000000000000612863565b69ffffffffffffffffffff16820281611c6657611c666132c1565b049250505b896fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff161015611cf9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f496e6164657175617465206c697175696469747900000000000000000000000060448201526064016115c0565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1603611d9f5773ffffffffffffffffffffffffffffffffffffffff8c81165f90815260208190526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016918b169190911790555b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1603611e455773ffffffffffffffffffffffffffffffffffffffff8c81165f90815260016020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016918b169190911790555b50505050505050509392505050565b6040805160028082526060820183525f928392919060208301908036833701905050905082815f81518110611e8b57611e8b6136fe565b602002602001019063ffffffff16908163ffffffff16815250505f81600181518110611eb957611eb96136fe565b63ffffffff909216602092830291909101909101526040517f883bdbfd0000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff88169063883bdbfd90611f22908590600401613749565b5f60405180830381865afa158015611f3c573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611f819190810190613827565b5090505f8463ffffffff1660060b825f81518110611fa157611fa16136fe565b602002602001015183600181518110611fbc57611fbc6136fe565b60200260200101510360060b81611fd557611fd56132c1565b0590505f611fe788886103d9856129e9565b905061201773ffffffffffffffffffffffffffffffffffffffff8216806c01000000000000000000000000612024565b9998505050505050505050565b5f80807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709858702925082811083820303915050805f03612077575f841161206c575f80fd5b508290049050611230565b808411612082575f80fd5b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b5f8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161015612129575080611230565b61216273ffffffffffffffffffffffffffffffffffffffff8316780100000000000000000000000000000000000000000000000061368b565b9050611230565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061220f57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b1561229d575f807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461226f5783612271565b845b73ffffffffffffffffffffffffffffffffffffffff908116825260208201929092526040015f20541690505b73ffffffffffffffffffffffffffffffffffffffff81161580156122f3575073ffffffffffffffffffffffffffffffffffffffff831615806122f3575073ffffffffffffffffffffffffffffffffffffffff8216155b1561234b5760015f73ffffffffffffffffffffffffffffffffffffffff84161561231d578361231f565b845b73ffffffffffffffffffffffffffffffffffffffff908116825260208201929092526040015f20541690505b73ffffffffffffffffffffffffffffffffffffffff811615801561240f57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061240f57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b1561249e5760015f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146124705783612472565b845b73ffffffffffffffffffffffffffffffffffffffff908116825260208201929092526040015f20541690505b73ffffffffffffffffffffffffffffffffffffffff81161580156124d9575060025473ffffffffffffffffffffffffffffffffffffffff1615155b1561257b576002546040517fbc501ee700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015284811660248301529091169063bc501ee790604401602060405180830381865afa158015612554573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125789190613659565b90505b73ffffffffffffffffffffffffffffffffffffffff81166108e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e6b6e6f776e2070616972000000000000000000000000000000000000000060448201526064016115c0565b5f808473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161161263f57612638858585612ce6565b91506126a0565b8373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1610156126925761267e868585612ce6565b915061268b858785612d72565b90506126a0565b61269d858585612d72565b90505b94509492505050565b5f806126b58585612169565b6040805160028082526060820183529293505f92909160208301908036833701905050905083815f815181106126ed576126ed6136fe565b602002602001019063ffffffff16908163ffffffff16815250505f8160018151811061271b5761271b6136fe565b63ffffffff909216602092830291909101909101526040517f883bdbfd0000000000000000000000000000000000000000000000000000000081525f9073ffffffffffffffffffffffffffffffffffffffff84169063883bdbfd90612784908590600401613749565b5f60405180830381865afa15801561279e573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526127e39190810190613827565b5090505f8563ffffffff1660060b825f81518110612803576128036136fe565b60200260200101518360018151811061281e5761281e6136fe565b60200260200101510360060b81612837576128376132c1565b0590505f61284989896103d9856129e9565b90506128558a826113b8565b9a9950505050505050505050565b5f8060068373ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128d491906135cc565b03905061123081847f000000000000000000000000000000000000000000000000000000000000000060786126a9565b5f805f805f61291286612dbc565b6040517f1e2eaeaf000000000000000000000000000000000000000000000000000000008152600481018290529091505f9073ffffffffffffffffffffffffffffffffffffffff891690631e2eaeaf90602401602060405180830381865afa158015612980573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129a491906131cd565b905073ffffffffffffffffffffffffffffffffffffffff811695508060a01c60020b945062ffffff8160b81c16935062ffffff8160d01c169250505092959194509250565b60020b5f60ff82901d80830118620d89e8811115612a2b57612a2b7f8b86327a0000000000000000000000000000000000000000000000000000000084612df8565b7001fffcb933bd6fad37aa2d162d1a5940016001821602700100000000000000000000000000000000186002821615612a74576ffff97272373d413259a46990580e213a0260801c5b6004821615612a93576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612ab2576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612ad1576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612af0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612b0f576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612b2e576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612b4e576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612b6e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612b8e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612bae576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612bce576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612bee576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612c0e576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612c2e576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612c4f576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612c6f576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612c8e576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612cab576b048a170391f7dc42444e8fa20260801c5b5f841315612cd6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff045b63ffffffff0160201c9392505050565b5f73ffffffffffffffffffffffffffffffffffffffff8416612d607bffffffffffffffffffffffffffffffff000000000000000000000000606085901b16612d2e87876138f3565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16612024565b612d6a919061368b565b949350505050565b5f612d6a6fffffffffffffffffffffffffffffffff8316612d9386866138f3565b73ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000612024565b6040515f90612ddb908390600690602001918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b815f528060020b60045260245ffd5b73ffffffffffffffffffffffffffffffffffffffff81168114612e28575f80fd5b50565b5f60208284031215612e3b575f80fd5b813561123081612e07565b5f805f805f805f60e0888a031215612e5c575f80fd5b873596506020880135612e6e81612e07565b95506040880135612e7e81612e07565b969995985095966060810135965060808101359560a0820135955060c0909101359350915050565b80355f81900b81146113b3575f80fd5b5f8060408385031215612ec7575f80fd5b612ed083612ea6565b9150602083013569ffffffffffffffffffff81168114612eee575f80fd5b809150509250929050565b5f805f60608486031215612f0b575f80fd5b833592506020840135612f1d81612e07565b91506040840135612f2d81612e07565b809150509250925092565b5f8060408385031215612f49575f80fd5b8235612f5481612e07565b91506020830135612eee81612e07565b62ffffff81168114612e28575f80fd5b5f805f805f60a08688031215612f88575f80fd5b8535612f9381612e07565b94506020860135612fa381612e07565b935060408601359250606086013591506080860135612fc181612f64565b809150509295509295909350565b5f805f60608486031215612fe1575f80fd5b8335612fec81612e07565b92506020840135612ffc81612e07565b929592945050506040919091013590565b5f6020828403121561301d575f80fd5b5035919050565b5f8060408385031215613035575f80fd5b612f5483612ea6565b6fffffffffffffffffffffffffffffffff81168114612e28575f80fd5b5f805f6060848603121561306d575f80fd5b833561307881612e07565b9250602084013561308881612e07565b91506040840135612f2d8161303e565b803563ffffffff811681146113b3575f80fd5b5f805f80608085870312156130be575f80fd5b84356130c981612e07565b935060208501356130d981612e07565b925060408501356130e981612e07565b91506130f760608601613098565b905092959194509250565b5f805f60608486031215613114575f80fd5b505081359360208301359350604090920135919050565b5f805f6060848603121561313d575f80fd5b833561314881612e07565b92506020840135612f1d81612e07565b5f805f806080858703121561316b575f80fd5b843561317681612e07565b9350602085013561318681612e07565b9250604085013561319681612e07565b915060608501356131a68161303e565b939692955090935050565b5f805f80608085870312156131c4575f80fd5b6130c985612ea6565b5f602082840312156131dd575f80fd5b5051919050565b805180151581146113b3575f80fd5b5f60208284031215613203575f80fd5b611230826131e4565b8051600281900b81146113b3575f80fd5b805161ffff811681146113b3575f80fd5b805160ff811681146113b3575f80fd5b5f805f805f805f60e0888a031215613254575f80fd5b875161325f81612e07565b965061326d6020890161320c565b955061327b6040890161321d565b94506132896060890161321d565b93506132976080890161321d565b92506132a560a0890161322e565b91506132b360c089016131e4565b905092959891949750929550565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f81810b9083900b01607f81137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80821217156108e3576108e36132ee565b6001815b600184111561339457808504811115613378576133786132ee565b600184161561338657908102905b60019390931c92800261335d565b935093915050565b5f826133aa575060016108e3565b816133b657505f6108e3565b81600181146133cc57600281146133d6576133f2565b60019150506108e3565b60ff8411156133e7576133e76132ee565b50506001821b6108e3565b5060208310610133831016604e8410600b8410161715613415575081810a6108e3565b6134407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613359565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115613472576134726132ee565b029392505050565b5f61123060ff84168361339c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156134fc576134fc613488565b604052919050565b5f8082840360c0811215613516575f80fd5b60a0811215613523575f80fd5b5060405160a0810167ffffffffffffffff8111828210171561354757613547613488565b604052835161355581612e07565b8152602084015161356581612e07565b6020820152604084015161357881612f64565b60408201526135896060850161320c565b6060820152608084015161359c81612e07565b608082015260a0939093015192949293505050565b5f602082840312156135c1575f80fd5b81516112308161303e565b5f602082840312156135dc575f80fd5b6112308261322e565b5f82810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808112607f821317156108e3576108e36132ee565b5f60208284031215613633575f80fd5b815161123081612f64565b62ffffff82811682821603908111156108e3576108e36132ee565b5f60208284031215613669575f80fd5b815161123081612e07565b80820281158282048414176108e3576108e36132ee565b5f826136be577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b5f815f0b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8081036136f6576136f66132ee565b5f0392915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60ff821660ff8103613740576137406132ee565b60010192915050565b602080825282518282018190525f918401906040840190835b8181101561378657835163ffffffff16835260209384019390920191600101613762565b509095945050505050565b5f67ffffffffffffffff8211156137aa576137aa613488565b5060051b60200190565b5f82601f8301126137c3575f80fd5b81516137d66137d182613791565b6134b5565b8082825260208201915060208360051b8601019250858311156137f7575f80fd5b602085015b8381101561381d57805161380f81612e07565b8352602092830192016137fc565b5095945050505050565b5f8060408385031215613838575f80fd5b825167ffffffffffffffff81111561384e575f80fd5b8301601f8101851361385e575f80fd5b805161386c6137d182613791565b8082825260208201915060208360051b85010192508783111561388d575f80fd5b6020840193505b828410156138bd5783518060060b81146138ac575f80fd5b825260209384019390910190613894565b80955050505050602083015167ffffffffffffffff8111156138dd575f80fd5b6138e9858286016137b4565b9150509250929050565b73ffffffffffffffffffffffffffffffffffffffff82811682821603908111156108e3576108e36132ee56fea2646970667358221220e4823d9dcaff07e31db344e2c1d4dc4b03a5a9a4847b7426cd5241aa814c411b64736f6c634300081a0033000000000000000000000000b365d5783ed4b3bd1fb39ef7afa05a096b6eaf99