7 txs
8 calls
constructor
constructor()
functions
controller
viewfunction controller() view returns (address)
correctPriceDirection
purefunction correctPriceDirection(address base, address quote, uint160 sqrtPriceX96) pure returns (uint160 sqrtPriceX96Corrected)
factory
viewfunction factory() view returns (address)
funder
viewfunction funder() view returns (address)
getController
viewfunction getController() view returns (address _controller)
getFunder
viewfunction getFunder() view returns (address _funder)
getSqrtPriceX96FromPrice
purefunction getSqrtPriceX96FromPrice(int8 decimalDiff, uint80 price_12Decimals) pure returns (uint160 sqrtPriceX96)
getTotalValueEth12
viewfunction getTotalValueEth12() view returns (uint128 valueEth12)
getTotalValueUsd12
viewfunction getTotalValueUsd12() view returns (uint128 valueUsd12)
getUsd12ValueIn
viewfunction getUsd12ValueIn(address token) view returns (uint128 valueUsd12)
indexFromPositionId
viewfunction indexFromPositionId(uint256) view returns (uint8)
indexFromTokenAddress
viewfunction indexFromTokenAddress(address) view returns (uint8)
liquidityPositions
viewfunction liquidityPositions(uint256) view returns (uint256)
nLiquidityPositions
viewfunction nLiquidityPositions() view returns (uint8)
nTokensHeld
viewfunction nTokensHeld() view returns (uint8)
numLiquidityPositionsByToken
viewfunction numLiquidityPositionsByToken(address) view returns (uint16)
owner
viewfunction owner() view returns (address)
sqrt
purefunction sqrt(uint256 x) pure returns (uint128)
swapRouter
viewfunction swapRouter() view returns (address)
tokensHeld
viewfunction tokensHeld(uint256) view returns (address)
utils
viewfunction utils() view returns (address)
v4PoolManager
viewfunction v4PoolManager() view returns (address)
v4PositionIdToBase
viewfunction v4PositionIdToBase(uint256) view returns (address)
v4PositionIdToQuote
viewfunction v4PositionIdToQuote(uint256) view returns (address)
v4PositionManager
viewfunction v4PositionManager() view returns (address)
validEmergencyTokens
viewfunction validEmergencyTokens(address) view returns (bool)
addEmergencyTokens
nonpayablefunction addEmergencyTokens(address[] tokens)
collectFees
nonpayablefunction collectFees(uint256 positionId)
createPosition
nonpayablefunction createPosition(tuple key, address quote, uint80 lowPrice12, uint80 highPrice12, uint256 toAdd) returns (uint256 positionId)
depositEth
payablefunction depositEth() payable
depositToken
nonpayablefunction depositToken(address token, uint256 amount)
destroyPosition
nonpayablefunction destroyPosition(uint256 positionId)
emergencyCircuitBreaker
nonpayablefunction emergencyCircuitBreaker(address storeOfValueToken)
lockEmergencyTokens
nonpayablefunction lockEmergencyTokens()
modifyLiquidity
nonpayablefunction modifyLiquidity(uint256 positionId, uint256 newBaseBal, uint256 newQuoteBal)
obtainTokens
nonpayablefunction obtainTokens(address token0, address token1, uint256 amount0, uint256 amount1)
renounceOwnership
nonpayablefunction renounceOwnership()
rescueTokens
nonpayablefunction rescueTokens(address token)
setController
nonpayablefunction setController(address newController)
setFunder
nonpayablefunction setFunder(address newFunder)
setUtils
nonpayablefunction setUtils(address utilsAdr)
swapTokensInto
nonpayablefunction swapTokensInto(address tokenFrom, address tokenTo, uint256 maxIn, uint256 maxOut) returns (uint256 tokensIn, uint256 tokensOut)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
withdrawEth
nonpayablefunction withdrawEth(address destination, uint256 amount)
withdrawToken
nonpayablefunction withdrawToken(address token, address destination, uint256 amount)
events
ControllerSet
event ControllerSet(address newController, address oldController)
Deposited
event Deposited(address token, uint256 amount)
EmergencyCircuitBreakerFlipped
event EmergencyCircuitBreakerFlipped(address storeOfValueToken)
FunderSet
event FunderSet(address newController, address oldController)
LiquidityFeesCollected
event LiquidityFeesCollected(uint256 poolPosition, address base, address quote, uint256 baseTaken, uint256 quoteTaken)
LiquidityModified
event LiquidityModified(uint256 poolPosition, address base, address quote, int128 liquidityChange)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
PositionBurned
event PositionBurned(uint256 poolPosition, address base, address quote, uint256 baseTaken, uint256 quoteTaken)
PositionMinted
event PositionMinted(uint256 poolPosition, address base, address quote, uint80 minPrice, uint80 maxPrice, uint256 toAdd)
TokensSwapped
event TokensSwapped(address from, address to, uint256 fromAmt, uint256 toAmt)
Withdrawn
event Withdrawn(address token, uint256 amount)
errors
No errors.
creation bytecode
0x60e060405273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4860805273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260a0527388e6a0c2ddd26feeb64f039a2c41296fcb3f564060c052600e805460ff199081169091556018805482169055601c80549091169055348015610075575f80fd5b5061007f33610202565b6080516001600160a01b039081165f908152600160208190526040808320805460ff19908116841790915560a05190941680845281842080548616841790559280527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb498054909416909117909255905163095ea7b360e01b815273e592427a0aece92de3edee1f18e0157c0586156460048201525f19602482015263095ea7b3906044016020604051808303815f875af115801561013f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101639190610377565b5060805160405163095ea7b360e01b815273e592427a0aece92de3edee1f18e0157c0586156460048201525f1960248201526001600160a01b039091169063095ea7b3906044016020604051808303815f875af11580156101c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ea9190610377565b506101f433610251565b6101fd336102b8565b61039d565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610259610318565b600280546001600160a01b038381166001600160a01b03198316811790935560408051938452911660208301819052917e7582b62407f53d49cfc72e7ddab574c06ef3b8aced104b54b7bed4681ee54a91015b60405180910390a15050565b6102c0610318565b600380546001600160a01b038381166001600160a01b03198316811790935560408051938452911660208301819052917f9fb5233a5c1113ee4f5aafa72ecf995c4c5bc0c057ecbcad707ea04ebc829c6691016102ac565b5f546001600160a01b031633146103755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b565b5f60208284031215610387575f80fd5b81518015158114610396575f80fd5b9392505050565b60805160a05160c05161599c6104735f395f50505f8181610fda0152818161153f01528181611b6e01528181611c2c01528181611f0801528181611f3b015281816122d801528181612ee801528181612f300152818161350a015281816135a7015281816135f60152818161379501528181613c3d0152613cb201525f8181610fa80152818161160b01528181611b4c015281816122780152818161237d0152818161262d0152818161266001528181612f96015281816131840152818161395101528181613b3a0152613baf015261599c5ff3fe6080604052600436106102e1575f3560e01c80638172047911610186578063bc329198116100dc578063df2a558b11610087578063f2fde38b11610062578063f2fde38b146108bf578063f60b36e3146108de578063f77c4791146108fd575f80fd5b8063df2a558b14610836578063e2f4dd4314610864578063ed4ab0f81461088b575f80fd5b8063c31c9c07116100b7578063c31c9c07146107c9578063c45a0155146107f0578063c4b19b5414610817575f80fd5b8063bc3291981461074c578063bf0e622b14610765578063c0c8eca6146107a7575f80fd5b80639ba692491161013c578063b17acdcd11610117578063b17acdcd146106ef578063b1df47d81461070e578063b3a579431461072d575f80fd5b80639ba6924914610670578063a9e88b8f14610684578063ac75886f146106c2575f80fd5b80638da5cb5b1161016c5780638da5cb5b1461061657806392eefe9b146106325780639a7fe3a114610651575f80fd5b806381720479146105c55780638abb9845146105f9575f80fd5b806339040ed11161023b5780634a2539c3116101f1578063677342ce116101cc578063677342ce146105735780636995350114610592578063715018a6146105b1575f80fd5b80634a2539c3146105005780635a29638d1461051f57806363011d1a1461053e575f80fd5b8063439370b111610221578063439370b1146104ba578063483e0cd7146104c2578063495915d3146104e1575f80fd5b806339040ed11461046157806342d9843e1461048c575f80fd5b806319cc33571161029b5780633018205f116102765780633018205f1461040657806332c4171d14610423578063338b5dea14610442575f80fd5b806319cc3357146103b45780631b9a91a4146103c85780631fba9eda146103e7575f80fd5b806302c512ca116102cb57806302c512ca14610325578063041ae880146103765780630acc8cd114610395575f80fd5b8062ae3bf8146102e557806301e3366714610306575b5f80fd5b3480156102f0575f80fd5b506103046102ff366004614f44565b61091c565b005b348015610311575f80fd5b50610304610320366004614f5f565b610a9a565b348015610330575f80fd5b5061035961033f366004614f9d565b601a6020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610381575f80fd5b50600354610359906001600160a01b031681565b3480156103a0575f80fd5b506103046103af366004614f44565b610c4d565b3480156103bf575f80fd5b50610304610ccd565b3480156103d3575f80fd5b506103046103e2366004614fb4565b610d02565b3480156103f2575f80fd5b50610359610401366004614ff5565b610de0565b348015610411575f80fd5b506002546001600160a01b0316610359565b34801561042e575f80fd5b5061030461043d366004615030565b610e42565b34801561044d575f80fd5b5061030461045c366004614fb4565b611095565b34801561046c575f80fd5b50600e5461047a9060ff1681565b60405160ff909116815260200161036d565b348015610497575f80fd5b5061047a6104a6366004614f9d565b60196020525f908152604090205460ff1681565b610304611244565b3480156104cd575f80fd5b506103046104dc366004615073565b61127e565b3480156104ec575f80fd5b506103046104fb36600461509c565b611404565b34801561050b575f80fd5b5061030461051a366004614f9d565b61169f565b34801561052a575f80fd5b50600454610359906001600160a01b031681565b348015610549575f80fd5b50610552611b09565b6040516fffffffffffffffffffffffffffffffff909116815260200161036d565b34801561057e575f80fd5b5061055261058d366004614f9d565b611f7a565b34801561059d575f80fd5b506103046105ac366004614f44565b6120fb565b3480156105bc575f80fd5b5061030461213d565b3480156105d0575f80fd5b506105e46105df366004615030565b612150565b6040805192835260208301919091520161036d565b348015610604575f80fd5b506003546001600160a01b0316610359565b348015610621575f80fd5b505f546001600160a01b0316610359565b34801561063d575f80fd5b5061030461064c366004614f44565b6121ee565b34801561065c575f80fd5b5061055261066b366004614f44565b612265565b34801561067b575f80fd5b506105526122a4565b34801561068f575f80fd5b506106b261069e366004614f44565b60016020525f908152604090205460ff1681565b604051901515815260200161036d565b3480156106cd575f80fd5b506106e16106dc366004614f9d565b61269b565b60405190815260200161036d565b3480156106fa575f80fd5b50610304610709366004614f9d565b6126b1565b348015610719575f80fd5b506106e161072836600461510d565b6126be565b348015610738575f80fd5b50610359610747366004615174565b612bbc565b348015610757575f80fd5b5060185461047a9060ff1681565b348015610770575f80fd5b5061079461077f366004614f44565b60056020525f908152604090205461ffff1681565b60405161ffff909116815260200161036d565b3480156107b2575f80fd5b506103596e04444c5dc75cb358380d2e3de08a9081565b3480156107d4575f80fd5b5061035973e592427a0aece92de3edee1f18e0157c0586156481565b3480156107fb575f80fd5b50610359731f98431c8ad98523631ae4a59f267346ea31f98481565b348015610822575f80fd5b50610359610831366004614f9d565b612c12565b348015610841575f80fd5b5061047a610850366004614f44565b600f6020525f908152604090205460ff1681565b34801561086f575f80fd5b5061035973bd216513d74c8cf14cf4747e6aaa6420ff64ee9e81565b348015610896575f80fd5b506103596108a5366004614f9d565b601b6020525f90815260409020546001600160a01b031681565b3480156108ca575f80fd5b506103046108d9366004614f44565b612c31565b3480156108e9575f80fd5b506103046108f8366004614f44565b612cd8565b348015610908575f80fd5b50600254610359906001600160a01b031681565b610924613074565b6001600160a01b0381165f908152600f6020526040902054600e5460ff91821691168110158061097d5750816001600160a01b031660068260ff166008811061096f5761096f6151bc565b01546001600160a01b031614155b6109e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f43616e6e6f74202772657363756527206465706f73697473000000000000000060448201526064015b60405180910390fd5b816001600160a01b031663a9059cbb610a085f546001600160a01b031690565b610a11856130e7565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015610a71573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9591906151e9565b505050565b6003546001600160a01b03163314610b0e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a6564000000000000000000000000000000000000000060448201526064016109df565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015610b73573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b9791906151e9565b610bfd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5472616e73666572206661696c6564000000000000000000000000000000000060448201526064016109df565b610c0683613182565b604080516001600160a01b0385168152602081018390527f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5910160405180910390a1505050565b610c55613074565b600380546001600160a01b038381167fffffffffffffffffffffffff00000000000000000000000000000000000000008316811790935560408051938452911660208301819052917f9fb5233a5c1113ee4f5aafa72ecf995c4c5bc0c057ecbcad707ea04ebc829c6691015b60405180910390a15050565b610cd5613074565b601c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6003546001600160a01b03163314610d76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a6564000000000000000000000000000000000000000060448201526064016109df565b6040516001600160a01b0383169082156108fc029083905f818181858888f19350505050158015610da9573d5f803e3d5ffd5b50604080515f8152602081018390527f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59101610cc1565b5f80610e1b8369ffffffffffffffffffff16780100000000000000000000000000000000000000000000000086600c0160ff16600a0a613378565b9050610e2681611f7a565b6fffffffffffffffffffffffffffffffff169150505b92915050565b6002546001600160a01b0316331480610e5a57503330145b610ec0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a6564000000000000000000000000000000000000000060448201526064016109df565b5f610eca856130e7565b90505f610ed6856130e7565b9050838210158015610ee85750828110155b15610ef457505061108f565b5f805f848710610f0657848703610f08565b5f5b9150838610610f1957838603610f1b565b5f5b90508685108015610f2b57508584115b15610f615785840392505f610f45898b8686613a98613441565b915050808310610f5757808303610f59565b5f5b925050610fa1565b8584108015610f6f57508685115b15610fa15786850392505f610f898a8a8685613a98613441565b915050808210610f9b57808203610f9d565b5f5b9250505b610fce89897f00000000000000000000000000000000000000000000000000000000000000008585613861565b909250905061100089897f00000000000000000000000000000000000000000000000000000000000000008585613861565b909250905061101289895f8585613861565b909250905081158015611023575080155b611089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f556e64657266756e64656400000000000000000000000000000000000000000060448201526064016109df565b50505050505b50505050565b6003546001600160a01b03163314611109576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a6564000000000000000000000000000000000000000060448201526064016109df565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018290526001600160a01b038316906323b872dd906064016020604051808303815f875af1158015611172573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061119691906151e9565b6111fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5472616e73666572206661696c6564000000000000000000000000000000000060448201526064016109df565b6112058261393c565b604080516001600160a01b0384168152602081018390527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c49101610cc1565b604080515f81523460208201527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4910160405180910390a1565b6002546001600160a01b031633146112f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a6564000000000000000000000000000000000000000060448201526064016109df565b5f838152601a6020908152604080832054601b9092528220546001600160a01b0391821692911690611323836130e7565b90505f61132f836130e7565b600480546040517f080085220000000000000000000000000000000000000000000000000000000081529182018a90526001600160a01b0387811660248401528681166044840152606483018690526084830184905260a483018a905260c483018990529293505f92169063080085229060e401602060405180830381865afa1580156113be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e29190615208565b90506113ee8882613dfa565b6113fa85858989610e42565b5050505050505050565b61140c613074565b601c5460ff1615611479576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f6c6f636b6564000000000000000000000000000000000000000000000000000060448201526064016109df565b5f6114826122a4565b600802666a94d74f4300000190505f5b60ff811683111561108f575f84848360ff168181106114b3576114b36151bc565b90506020020160208101906114c89190614f44565b6001600160a01b038181165f8181526001602081905260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690911790556004805491517f7afd0a86000000000000000000000000000000000000000000000000000000008152908101929092527f0000000000000000000000000000000000000000000000000000000000000000831660248301526fffffffffffffffffffffffffffffffff87166044830152929350911690637afd0a86906064016020604051808303815f875af11580156115a8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115cc9190615228565b50600480546040517f7afd0a860000000000000000000000000000000000000000000000000000000081526001600160a01b03848116938201939093527f0000000000000000000000000000000000000000000000000000000000000000831660248201526fffffffffffffffffffffffffffffffff86166044820152911690637afd0a86906064016020604051808303815f875af1158015611671573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116959190615228565b5050600101611492565b6002546001600160a01b03163314611713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a6564000000000000000000000000000000000000000060448201526064016109df565b5f818152601a6020908152604080832054601b9092528220546001600160a01b0391821692911690611744836130e7565b90505f611750836130e7565b90505f60036011604051602001611771929190918252602082015260400190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815260028084526060840190925292505f9190816020015b60608152602001906001900390816117b25790505060408051602081018a90525f9181018290526060810182905260808082015260a081019190915290915060c001604051602081830303815290604052815f81518110611815576118156151bc565b602090810291909101810191909152604080516001600160a01b03808a1693820193909352918716908201523060608201526080016040516020818303038152906040528160018151811061186c5761186c6151bc565b602002602001018190525073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e6001600160a01b031663dd46508f83836040516020016118ad92919061528f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526118e642603c61534f565b6040518363ffffffff1660e01b8152600401611903929190615362565b5f604051808303815f87803b15801561191a575f80fd5b505af115801561192c573d5f803e3d5ffd5b505050505f8461193b886130e7565b6119459190615383565b90505f84611952886130e7565b61195c9190615383565b6001600160a01b0389165f908152600560205260408120805492935061ffff909216919061198983615396565b82546101009290920a61ffff8181021990931691831602179091556001600160a01b0389165f908152600560205260408120805490921692506119cb83615396565b825461ffff9182166101009390930a9283029190920219909116179055506018805460ff16905f6119fb836153d1565b82546101009290920a60ff81810219909316918316021790915560185416159050611aa7575f8981526019602052604090205460185460ff918216916010911660088110611a4b57611a4b6151bc565b015460108260ff1660088110611a6357611a636151bc565b01558060195f601060ff841660088110611a7f57611a7f6151bc565b015481526020019081526020015f205f6101000a81548160ff021916908360ff160217905550505b604080518a81526001600160a01b038a81166020830152891681830152606081018490526080810183905290517f5501b833962ceaf131361ff8d59683c382ab00f523035d0fc4c2ffc19bef3a459181900360a00190a1505050505050505050565b5f611b17620f424047615410565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152909150611be7907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b038316906370a08231906024015b602060405180830381865afa158015611bbe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611be29190615448565b6140af565b611bf1908261545f565b90505f5b600e5460ff9081169082161015611cb557611ca960068260ff1660088110611c1f57611c1f6151bc565b01546001600160a01b03167f0000000000000000000000000000000000000000000000000000000000000000600660ff851660088110611c6157611c616151bc565b01546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03909116906370a0823190602401611ba3565b90910190600101611bf5565b505f5b60185460ff9081169082161015611f76575f73bd216513d74c8cf14cf4747e6aaa6420ff64ee9e631efeed33601060ff851660088110611cfa57611cfa6151bc565b01546040518263ffffffff1660e01b8152600401611d1a91815260200190565b602060405180830381865afa158015611d35573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d599190615487565b90505f8073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e637ba03aad601060ff871660088110611d8d57611d8d6151bc565b01546040518263ffffffff1660e01b8152600401611dad91815260200190565b60c060405180830381865afa158015611dc8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dec9190615522565b915091505f611e15611dff8460a0902090565b6e04444c5dc75cb358380d2e3de08a9090614214565b50506004549192505f918291506001600160a01b031663c72e160b84611e46611e418860081c60020b90565b6142df565b611e56611e418960201c60020b90565b60405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039384166004820152918316602483015290911660448201526fffffffffffffffffffffffffffffffff891660648201526084016040805180830381865afa158015611ed7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611efb91906155b3565b91509150611f2d855f01517f0000000000000000000000000000000000000000000000000000000000000000846140af565b88019750611f6085602001517f0000000000000000000000000000000000000000000000000000000000000000836140af565b90970196505060019094019350611cb892505050565b5090565b5f815f03611f8957505f919050565b8160017001000000000000000000000000000000008210611faf5760809190911c9060401b5b680100000000000000008210611fca5760409190911c9060201b5b6401000000008210611fe15760209190911c9060101b5b620100008210611ff65760109190911c9060081b5b610100821061200a5760089190911c9060041b5b6010821061201d5760049190911c9060021b5b600882106120295760011b5b600181858161203a5761203a6153e3565b048201901c90506001818581612052576120526153e3565b048201901c9050600181858161206a5761206a6153e3565b048201901c90506001818581612082576120826153e3565b048201901c9050600181858161209a5761209a6153e3565b048201901c905060018185816120b2576120b26153e3565b048201901c905060018185816120ca576120ca6153e3565b0491909101901c5f6120dc8286615410565b90508082106120eb57806120ed565b815b95945050505050565b919050565b612103613074565b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b612145613074565b61214e5f6145dc565b565b6002545f9081906001600160a01b031633148061216c57503330145b6121d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a6564000000000000000000000000000000000000000060448201526064016109df565b6121e186868686613a98613441565b9150915094509492505050565b6121f6613074565b600280546001600160a01b038381167fffffffffffffffffffffffff00000000000000000000000000000000000000008316811790935560408051938452911660208301819052917e7582b62407f53d49cfc72e7ddab574c06ef3b8aced104b54b7bed4681ee54a9101610cc1565b5f80612270836130e7565b905061229d837f0000000000000000000000000000000000000000000000000000000000000000836140af565b9392505050565b600480546040517fea4bc51c0000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116938201939093525f92670de0b6b3a764000092169063ea4bc51c90602401602060405180830381865afa158015612332573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061235691906155d5565b61236c9069ffffffffffffffffffff16476155f0565b6123769190615410565b90506123a17f0000000000000000000000000000000000000000000000000000000000000000612265565b6123ab908261545f565b90505f5b600e5460ff90811690821610156123f5576123e960068260ff16600881106123d9576123d96151bc565b01546001600160a01b0316612265565b909101906001016123af565b505f5b60185460ff9081169082161015611f76575f73bd216513d74c8cf14cf4747e6aaa6420ff64ee9e631efeed33601060ff85166008811061243a5761243a6151bc565b01546040518263ffffffff1660e01b815260040161245a91815260200190565b602060405180830381865afa158015612475573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124999190615487565b90505f8073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e637ba03aad601060ff8716600881106124cd576124cd6151bc565b01546040518263ffffffff1660e01b81526004016124ed91815260200190565b60c060405180830381865afa158015612508573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061252c9190615522565b915091505f61253f611dff8460a0902090565b50506004549192505f918291506001600160a01b031663c72e160b8461256b611e418860081c60020b90565b61257b611e418960201c60020b90565b60405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039384166004820152918316602483015290911660448201526fffffffffffffffffffffffffffffffff891660648201526084016040805180830381865afa1580156125fc573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061262091906155b3565b91509150612652855f01517f0000000000000000000000000000000000000000000000000000000000000000846140af565b8801975061268585602001517f0000000000000000000000000000000000000000000000000000000000000000836140af565b909701965050600190940193506123f892505050565b601081600881106126aa575f80fd5b0154905081565b6126bb815f613dfa565b50565b6002545f906001600160a01b03163314612734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a6564000000000000000000000000000000000000000060448201526064016109df565b601854600860ff909116106127a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f7574206f66206d656d6f72790000000000000000000000000000000000000060448201526064016109df565b73bd216513d74c8cf14cf4747e6aaa6420ff64ee9e6001600160a01b03166375794a3c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127f5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128199190615448565b90505f6001600160a01b0386166128336020890189614f44565b6001600160a01b0316146128535761284e6020880188614f44565b612863565b6128636040880160208901614f44565b90505f866001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128c69190615607565b826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612902573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129269190615607565b6129309190615627565b90505f6129428389610747858b610de0565b90505f612954848a610747868b610de0565b90505f612973611dff61296c368e90038e018e615665565b60a0902090565b5050509050816001600160a01b0316836001600160a01b03161115612996579091905b5f6129a284848a614643565b90506129b18c838686856146ad565b85601a5f8981526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a601b5f8981526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060055f876001600160a01b03166001600160a01b031681526020019081526020015f205f81819054906101000a900461ffff1680929190612a5b906156df565b82546101009290920a61ffff8181021990931691831602179091556001600160a01b038d165f90815260056020526040812080549092169250612a9d836156df565b825461ffff9182166101009390930a928302919092021990911617905550601854879060109060ff1660088110612ad657612ad66151bc565b0155601880545f89815260196020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff93841617905582549091169190612b25836156ff565b82546101009290920a60ff81810219909316919092169190910217905550604080518881526001600160a01b0388811660208301528d168183015269ffffffffffffffffffff8c811660608301528b16608082015260a081018a905290517f29cd472535c058e9f744cc9cead6f8c38cbe5ea230674d825060f275884bdd729181900360c00190a150505050505095945050505050565b5f826001600160a01b0316846001600160a01b03161015612bde57508061229d565b612c0a6001600160a01b0383167801000000000000000000000000000000000000000000000000615410565b949350505050565b60068160088110612c21575f80fd5b01546001600160a01b0316905081565b612c39613074565b6001600160a01b038116612ccf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109df565b6126bb816145dc565b6002546001600160a01b0316331480612cfa57505f546001600160a01b031633145b612d60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4163636573732064656e6965640000000000000000000000000000000000000060448201526064016109df565b6001600160a01b0381165f9081526001602052604090205460ff16612de1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c696420746f6b656e0000000000000000000000000000000000000060448201526064016109df565b60185460ff165b60ff811615612e81577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0130634a2539c3601060ff841660088110612e2f57612e2f6151bc565b01546040518263ffffffff1660e01b8152600401612e4f91815260200190565b5f604051808303815f87803b158015612e66575f80fd5b505af1158015612e78573d5f803e3d5ffd5b50505050612de8565b50600e5460ff165b60ff811615612f2a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015f600660ff831660088110612ecb57612ecb6151bc565b01546001600160a01b03908116915083168114612f2457612f21817f0000000000000000000000000000000000000000000000000000000000000000612f10846130e7565b6001600160a01b03620124f8613441565b50505b50612e89565b50612f627f000000000000000000000000000000000000000000000000000000000000000082476001600160a01b03620124f8613441565b50506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015261300b907f00000000000000000000000000000000000000000000000000000000000000009083906001600160a01b038316906370a0823190602401602060405180830381865afa158015612fe7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f109190615448565b5050600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556040516001600160a01b03821681527f2cc79b200fc7fdf7af6be005fc77813bfacedb82066816356eed5b7df46194709060200160405180910390a150565b5f546001600160a01b0316331461214e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109df565b5f6001600160a01b0382161561317b576040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015613152573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131769190615448565b610e3c565b4792915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614806131c957506001600160a01b038116155b156131d15750565b6001600160a01b0381165f908152600f6020526040902054600e5460ff9182169116811080156132295750816001600160a01b031660068260ff166008811061321c5761321c6151bc565b01546001600160a01b0316145b801561323d5750606461323b836130e7565b105b801561326257506001600160a01b0382165f9081526005602052604090205461ffff16155b1561337457600e805460ff16905f613279836153d1565b82546101009290920a60ff818102199093169183160217909155600e541615905061337457600e5460069060ff16600881106132b7576132b76151bc565b01546001600160a01b0316600660ff8316600881106132d8576132d86151bc565b0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905580600f5f600660ff841660088110613329576133296151bc565b01546001600160a01b0316815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff929092169190911790555b5050565b5f80807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709858702925082811083820303915050805f036133cb575f84116133c0575f80fd5b50829004905061229d565b8084116133d6575f80fd5b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600480546040517f64aa79a30000000000000000000000000000000000000000000000000000000081526001600160a01b03888116938201939093528683166024820152604481018690526064810185905262ffffff841660848201525f92839283928392909116906364aa79a39060a401606060405180830381865afa1580156134ce573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134f29190615714565b90955090925090506001600160a01b038916613579577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004015f604051808303818588803b158015613561575f80fd5b505af1158015613573573d5f803e3d5ffd5b50505050505b5f6040518061010001604052805f6001600160a01b03168c6001600160a01b0316146135a5578b6135c7565b7f00000000000000000000000000000000000000000000000000000000000000005b6001600160a01b031681526020015f6001600160a01b03168b6001600160a01b0316146135f4578a613616565b7f00000000000000000000000000000000000000000000000000000000000000005b6001600160a01b03168152602001846001600160a01b031663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa158015613660573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136849190615748565b62ffffff168152602001306001600160a01b031681526020014281526020018681526020018381526020015f6001600160a01b0316815250905073e592427a0aece92de3edee1f18e0157c058615646001600160a01b031663414bf389826040518263ffffffff1660e01b81526004016136fe9190615763565b6020604051808303815f875af115801561371a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061373e9190615448565b93506001600160a01b038a1615613758576137588a613182565b6001600160a01b0389166137f9576040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d906024015f604051808303815f87803b1580156137de575f80fd5b505af11580156137f0573d5f803e3d5ffd5b50505050613802565b6138028961393c565b604080516001600160a01b03808d1682528b166020820152908101869052606081018590527f25f1d03755df23c30e25db2dbd3891e31ce084bdfbfc46f9fe5e446ee5f9b2d49060800160405180910390a15050509550959350505050565b5f80846001600160a01b0316876001600160a01b0316141580156138975750846001600160a01b0316866001600160a01b031614155b15613930575f6138a6866130e7565b9050620f424081101580156138ba57505f85115b156138ef575f806138d0888b858a613a98613441565b9150915081830392508681116138e8578087036138ea565b5f5b965050505b620f4240811015801561390157505f84115b1561392e575f61391687898488613a98613441565b9150508481116139285780850361392a565b5f5b9450505b505b50919590945092505050565b6001600160a01b0381161580159061398657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614155b156126bb576040517f095ea7b300000000000000000000000000000000000000000000000000000000815273e592427a0aece92de3edee1f18e0157c0586156460048201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60248201526001600160a01b0382169063095ea7b3906044016020604051808303815f875af1158015613a21573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a4591906151e9565b506001600160a01b0381165f818152600f602052604090205460069060ff1660088110613a7457613a746151bc565b01546001600160a01b0316141580613aac5750600e546001600160a01b0382165f908152600f602052604090205460ff918216911610155b156126bb57600e54600860ff90911610613b22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f7574206f66206d656d6f72790000000000000000000000000000000000000060448201526064016109df565b5f613b2b6122a4565b613b369060046157f4565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614613c3b57600480546040517f7afd0a860000000000000000000000000000000000000000000000000000000081526001600160a01b03858116938201939093527f0000000000000000000000000000000000000000000000000000000000000000831660248201526fffffffffffffffffffffffffffffffff84166044820152911690637afd0a86906064016020604051808303815f875af1158015613c15573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c399190615228565b505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614613d3e57600480546040517f7afd0a860000000000000000000000000000000000000000000000000000000081526001600160a01b03858116938201939093527f0000000000000000000000000000000000000000000000000000000000000000831660248201526fffffffffffffffffffffffffffffffff84166044820152911690637afd0a86906064016020604051808303815f875af1158015613d18573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d3c9190615228565b505b600e54829060069060ff1660088110613d5957613d596151bc565b0180546001600160a01b039283167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055600e80549184165f908152600f6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff948516179055815490921691613ddd836156ff565b91906101000a81548160ff021916908360ff160217905550505050565b5f8082600f0b12613e0b575f613e0e565b60015b5f83600f0b12613e1f57600d613e22565b60115b604080516020810193909352820152606001604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815260028084526060840190925292505f9190816020015b6060815260200190600190039081613e75579050509050835f84600f0b12613e9d5783613ea6565b613ea68461581f565b6040805160208101939093526fffffffffffffffffffffffffffffffff909116908201525f606082018190526080820181905260a08083015260c082015260e001604051602081830303815290604052815f81518110613f0857613f086151bc565b6020908102919091018101919091525f858152601a8252604080822054601b8452918190205481516001600160a01b0393841694810194909452919091169082015230606082015260800160405160208183030381529060405281600181518110613f7557613f756151bc565b602002602001018190525073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e6001600160a01b031663dd46508f8383604051602001613fb692919061528f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052613fef42603c61534f565b6040518363ffffffff1660e01b815260040161400c929190615362565b5f604051808303815f87803b158015614023575f80fd5b505af1158015614035573d5f803e3d5ffd5b5050505f858152601a6020908152604080832054601b8352928190205481518981526001600160a01b03948516938101939093529290921681830152600f86900b606082015290517f1172e6c2fa5b068f7396efd2ed20f26bf1ce7899860acd635416a62a99bb975c92509081900360800190a150505050565b5f806001600160a01b0385161561412557846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156140fc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141209190615607565b614128565b60125b90505f846001600160a01b0316866001600160a01b0316146141ea57600480546040517f2b0697830000000000000000000000000000000000000000000000000000000081526001600160a01b03898116938201939093528783166024820152869290911690632b06978390604401602060405180830381865afa1580156141b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141d691906155d5565b69ffffffffffffffffffff160290506141f4565b5064e8d4a5100083025b8160ff16600a0a8181614209576142096153e3565b049695505050505050565b5f805f805f61422286614aa4565b6040517f1e2eaeaf000000000000000000000000000000000000000000000000000000008152600481018290529091505f906001600160a01b03891690631e2eaeaf90602401602060405180830381865afa158015614283573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142a79190615448565b90506001600160a01b03811695508060a01c60020b945062ffffff8160b81c16935062ffffff8160d01c169250505092959194509250565b60020b5f60ff82901d80830118620d89e8811115614321576143217f8b86327a0000000000000000000000000000000000000000000000000000000084614ae0565b7001fffcb933bd6fad37aa2d162d1a594001600182160270010000000000000000000000000000000018600282161561436a576ffff97272373d413259a46990580e213a0260801c5b6004821615614389576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b60088216156143a8576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b60108216156143c7576fffcb9843d60f6159c9db58835c9266440260801c5b60208216156143e6576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615614405576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615614424576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615614444576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615614464576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615614484576ff3392b0822b70005940c7a398e4b70f30260801c5b6108008216156144a4576fe7159475a2c29b7443b29c7fa6e889d90260801c5b6110008216156144c4576fd097f3bdfd2022b8845ad8f792aa58250260801c5b6120008216156144e4576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615614504576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615614524576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615614545576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615614565576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615614584576d2216e584f5fa1ea926041bedfe980260801c5b620800008216156145a1576b048a170391f7dc42444e8fa20260801c5b5f8413156145cc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff045b63ffffffff0160201c9392505050565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f826001600160a01b0316846001600160a01b03161115614662579192915b5f61468d856001600160a01b0316856001600160a01b03166c01000000000000000000000000614aef565b90506120ed6146a884838888036001600160a01b0316614aef565b614b3f565b600480546040517fc72e160b0000000000000000000000000000000000000000000000000000000081526001600160a01b0387811693820193909352858316602482015284831660448201526fffffffffffffffffffffffffffffffff841660648201525f928392169063c72e160b906084016040805180830381865afa15801561473a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061475e91906155b3565b909250905061478a6147736020890189614f44565b61478360408a0160208b01614f44565b8484610e42565b6040517f020000000000000000000000000000000000000000000000000000000000000060208201527f0d0000000000000000000000000000000000000000000000000000000000000060218201525f90602201604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815260028084526060840190925292505f9190816020015b606081526020019060019003908161481f57905050905088614847608082016060830161585b565b61485760808c0160608d0161585b565b60020b6148638a614b82565b60020b81614873576148736153e3565b050261488560808c0160608d0161585b565b61489560808d0160608e0161585b565b60020b6148a18a614b82565b60020b816148b1576148b16153e3565b0502600a886103ff026fffffffffffffffffffffffffffffffff16901c878730306040516020016148f191906001600160a01b0391909116815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526149339897969594939291602001615876565b604051602081830303815290604052815f81518110614954576149546151bc565b6020026020010181905250885f0160208101906149719190614f44565b61498160408b0160208c01614f44565b604080516001600160a01b0393841660208201529290911690820152606001604051602081830303815290604052816001815181106149c2576149c26151bc565b60200260200101819052505f42603c0190505f6149f78b5f0160208101906149ea9190614f44565b6001600160a01b03161590565b614a01575f614a03565b855b905073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e6001600160a01b031663dd46508f828686604051602001614a3c92919061528f565b604051602081830303815290604052856040518463ffffffff1660e01b8152600401614a69929190615362565b5f604051808303818588803b158015614a80575f80fd5b505af1158015614a92573d5f803e3d5ffd5b50505050505050505050505050505050565b6040515f90614ac3908390600690602001918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b815f528060020b60045260245ffd5b5f838302817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870982811083820303915050808411614b2d575f80fd5b805f036133d65750829004905061229d565b806fffffffffffffffffffffffffffffffff811681146120f6576120f67f93dafdf100000000000000000000000000000000000000000000000000000000614e7f565b5f73fffd8963efd1fc6a506488495d951d51639616827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffd895d83016001600160a01b03161115614bf457614bf47f614875240000000000000000000000000000000000000000000000000000000083614e87565b77ffffffffffffffffffffffffffffffffffffffff00000000602083901b16805f614c1e82614e9c565b60ff16905060808110614c3957607f810383901c9150614c43565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c670100000000000000161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581027ffffffffffffffffffffffffffffffffffd709b7e5480fba5a50fed5e62ffc5568101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b14614e7057886001600160a01b0316614e55826142df565b6001600160a01b03161115614e6a5781614e72565b80614e72565b815b9998505050505050505050565b805f5260045ffd5b815f526001600160a01b03811660045260245ffd5b5f808211614ea8575f80fd5b507f0706060506020500060203020504000106050205030304010505030400000000601f6f8421084210842108cc6318c6db6d54be6fffffffffffffffffffffffffffffffff841160071b84811c67ffffffffffffffff1060061b1784811c63ffffffff1060051b1784811c61ffff1060041b1784811c60ff1060031b1793841c1c161a1790565b6001600160a01b03811681146126bb575f80fd5b5f60208284031215614f54575f80fd5b813561229d81614f30565b5f805f60608486031215614f71575f80fd5b8335614f7c81614f30565b92506020840135614f8c81614f30565b929592945050506040919091013590565b5f60208284031215614fad575f80fd5b5035919050565b5f8060408385031215614fc5575f80fd5b8235614fd081614f30565b946020939093013593505050565b69ffffffffffffffffffff811681146126bb575f80fd5b5f8060408385031215615006575f80fd5b8235805f0b8114615015575f80fd5b9150602083013561502581614fde565b809150509250929050565b5f805f8060808587031215615043575f80fd5b843561504e81614f30565b9350602085013561505e81614f30565b93969395505050506040820135916060013590565b5f805f60608486031215615085575f80fd5b505081359360208301359350604090920135919050565b5f80602083850312156150ad575f80fd5b823567ffffffffffffffff8111156150c3575f80fd5b8301601f810185136150d3575f80fd5b803567ffffffffffffffff8111156150e9575f80fd5b8560208260051b84010111156150fd575f80fd5b6020919091019590945092505050565b5f805f805f858703610120811215615123575f80fd5b60a0811215615130575f80fd5b5085945060a086013561514281614f30565b935060c086013561515281614fde565b925060e086013561516281614fde565b94979396509194610100013592915050565b5f805f60608486031215615186575f80fd5b833561519181614f30565b925060208401356151a181614f30565b915060408401356151b181614f30565b809150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156151f9575f80fd5b8151801515811461229d575f80fd5b5f60208284031215615218575f80fd5b815180600f0b811461229d575f80fd5b5f60208284031215615238575f80fd5b815161229d81614f30565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b604081525f6152a16040830185615243565b828103602084015280845180835260208301915060208160051b840101602087015f5b83811015615314577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08684030185526152fe838351615243565b60209586019590935091909101906001016152c4565b509098975050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115610e3c57610e3c615322565b604081525f6153746040830185615243565b90508260208301529392505050565b81810381811115610e3c57610e3c615322565b5f61ffff8216806153a9576153a9615322565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b5f60ff8216806153a9576153a9615322565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82615443577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b5f60208284031215615458575f80fd5b5051919050565b6fffffffffffffffffffffffffffffffff8181168382160190811115610e3c57610e3c615322565b5f60208284031215615497575f80fd5b81516fffffffffffffffffffffffffffffffff8116811461229d575f80fd5b60405160a0810167ffffffffffffffff811182821017156154fe577f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405290565b62ffffff811681146126bb575f80fd5b8060020b81146126bb575f80fd5b5f8082840360c0811215615534575f80fd5b60a0811215615541575f80fd5b5061554a6154b6565b835161555581614f30565b8152602084015161556581614f30565b6020820152604084015161557881615504565b6040820152606084015161558b81615514565b6060820152608084015161559e81614f30565b608082015260a0939093015192949293505050565b5f80604083850312156155c4575f80fd5b505080516020909101519092909150565b5f602082840312156155e5575f80fd5b815161229d81614fde565b8082028115828204841417610e3c57610e3c615322565b5f60208284031215615617575f80fd5b815160ff8116811461229d575f80fd5b5f82810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808112607f82131715610e3c57610e3c615322565b5f60a0828403128015615676575f80fd5b5061567f6154b6565b823561568a81614f30565b8152602083013561569a81614f30565b602082015260408301356156ad81615504565b604082015260608301356156c081615514565b606082015260808301356156d381614f30565b60808201529392505050565b5f61ffff821661ffff81036156f6576156f6615322565b60010192915050565b5f60ff821660ff81036156f6576156f6615322565b5f805f60608486031215615726575f80fd5b835161573181614f30565b602085015160409095015190969495509392505050565b5f60208284031215615758575f80fd5b815161229d81615504565b5f610100820190506001600160a01b0383511682526001600160a01b03602084015116602083015262ffffff604084015116604083015260608301516157b460608401826001600160a01b03169052565b506080830151608083015260a083015160a083015260c083015160c083015260e08301516157ed60e08401826001600160a01b03169052565b5092915050565b6fffffffffffffffffffffffffffffffff81811683821602908116908181146157ed576157ed615322565b5f81600f0b7fffffffffffffffffffffffffffffffff80000000000000000000000000000000810361585357615853615322565b5f0392915050565b5f6020828403121561586b575f80fd5b813561229d81615514565b5f893561588281614f30565b6001600160a01b0316825260208a013561589b81614f30565b6001600160a01b0316602083015260408a01356158b781615504565b62ffffff16604083015260608a01356158cf81615514565b60020b606083015260808a01356158e581614f30565b6001600160a01b03166080830152600289810b60a084015288900b60c08301526fffffffffffffffffffffffffffffffff871660e083015285610100830152846101208301526159416101408301856001600160a01b03169052565b610180610160830152615958610180830184615243565b9a995050505050505050505056fea26469706673582212203b35bc45192cf05936ab998540df86b511c4b307d5238b9cf202512868c25bef64736f6c634300081a0033