2 txs
10.6k calls
constructor
constructor(address _pool, address _factory, address _pluginFactory)
functions
ALGEBRA_BASE_PLUGIN_MANAGER
viewfunction ALGEBRA_BASE_PLUGIN_MANAGER() view returns (bytes32)
defaultPluginConfig
viewfunction defaultPluginConfig() view returns (uint8)
feeConfig
viewfunction feeConfig() view returns (uint16 alpha1, uint16 alpha2, uint32 beta1, uint32 beta2, uint16 gamma1, uint16 gamma2, uint16 baseFee)
feeType
viewfunction feeType() view returns (bool)
getCurrentFee
viewfunction getCurrentFee() view returns (uint16)
getPool
viewfunction getPool() view returns (address)
getPoolState
viewfunction getPoolState() view returns (uint160 price, int24 tick, uint16 fee, uint8 pluginConfig)
getSingleTimepoint
viewfunction getSingleTimepoint(uint32 secondsAgo) view returns (int56 tickCumulative, uint88 volatilityCumulative)
getTimepoints
viewfunction getTimepoints(uint32[] secondsAgos) view returns (int56[] tickCumulatives, uint88[] volatilityCumulatives)
handlePluginFee
viewfunction handlePluginFee(uint256, uint256) view returns (bytes4)
incentive
viewfunction incentive() view returns (address)
isIncentiveConnected
viewfunction isIncentiveConnected(address targetIncentive) view returns (bool)
isInitialized
viewfunction isInitialized() view returns (bool)
lastTimepointTimestamp
viewfunction lastTimepointTimestamp() view returns (uint32)
paused
viewfunction paused() view returns (bool)
pool
viewfunction pool() view returns (address)
s_baseFee
viewfunction s_baseFee() view returns (uint16)
s_feeFactors
viewfunction s_feeFactors() view returns (uint128 zeroToOneFeeFactor, uint128 oneToZeroFeeFactor)
s_priceChangeFactor
viewfunction s_priceChangeFactor() view returns (uint16)
timepointIndex
viewfunction timepointIndex() view returns (uint16)
timepoints
viewfunction timepoints(uint256) view returns (bool initialized, uint32 blockTimestamp, int56 tickCumulative, uint88 volatilityCumulative, int24 tick, int24 averageTick, uint16 windowStartIndex)
afterFlash
nonpayablefunction afterFlash(address, address, uint256, uint256, uint256, uint256, bytes) returns (bytes4)
afterInitialize
nonpayablefunction afterInitialize(address, uint160, int24 tick) returns (bytes4)
afterModifyPosition
nonpayablefunction afterModifyPosition(address, address, int24, int24, int128, uint256, uint256, bytes) returns (bytes4)
afterSwap
nonpayablefunction afterSwap(address, address, bool zeroToOne, int256, uint160, int256, int256, bytes) returns (bytes4)
beforeFlash
nonpayablefunction beforeFlash(address, address, uint256, uint256, bytes) returns (bytes4)
beforeInitialize
nonpayablefunction beforeInitialize(address, uint160) returns (bytes4)
beforeModifyPosition
nonpayablefunction beforeModifyPosition(address, address, int24, int24, int128, bytes) returns (bytes4, uint24)
beforeSwap
nonpayablefunction beforeSwap(address, address, bool zeroToOne, int256, uint160, bool, bytes) returns (bytes4, uint24, uint24)
changeFeeConfiguration
nonpayablefunction changeFeeConfiguration(tuple _config)
collectPluginFee
nonpayablefunction collectPluginFee(address token, uint256 amount, address recipient)
initialize
nonpayablefunction initialize()
pause
nonpayablefunction pause()
prepayTimepointsStorageSlots
nonpayablefunction prepayTimepointsStorageSlots(uint16 startIndex, uint16 amount)
setBaseFee
nonpayablefunction setBaseFee(uint16 newBaseFee)
setFeeType
nonpayablefunction setFeeType(bool _feeType)
setIncentive
nonpayablefunction setIncentive(address newIncentive)
setPriceChangeFactor
nonpayablefunction setPriceChangeFactor(uint16 newPriceChangeFactor)
unpause
nonpayablefunction unpause()
events
BaseFee
event BaseFee(uint16 baseFee)
FeeConfiguration
event FeeConfiguration((uint16 alpha1, uint16 alpha2, uint32 beta1, uint32 beta2, uint16 gamma1, uint16 gamma2, uint16 baseFee) feeConfig)
FeeTypeUpdated
event FeeTypeUpdated(bool oldFeeType, bool newFeeType)
Incentive
event Incentive(address newIncentive)
Paused
event Paused(address account)
PriceChangeFactor
event PriceChangeFactor(uint256 priceChangeFactor)
Unpaused
event Unpaused(address account)
errors
AlreadyInitialized
error AlreadyInitialized()
InvalidAmount
error InvalidAmount()
NotAllowed
error NotAllowed()
NotInitialized
error NotInitialized()
PluginNotAttached
error PluginNotAttached()
PriceNotInitialized
error PriceNotInitialized()
targetIsTooOld
error targetIsTooOld()
tickOutOfRange
error tickOutOfRange()
transferFailed
error transferFailed()
volatilityOracleAlreadyInitialized
error volatilityOracleAlreadyInitialized()
creation bytecode
0x60e060405262010002805463ffffffff1916630bb803e81790553480156200002657600080fd5b506040516200493a3803806200493a8339810160408190526200004991620000d8565b6001600160a01b0390811660c0529182166080521660a052604080518082019091526c01000000000000000000000000808252602091909101527c0100000000000000000000000000000001000000000000000000000000620100015562010004805460ff60901b1916905562000122565b80516001600160a01b0381168114620000d357600080fd5b919050565b600080600060608486031215620000ee57600080fd5b620000f984620000bb565b92506200010960208501620000bb565b91506200011960408501620000bb565b90509250925092565b60805160a05160c051614771620001c9600039600081816108760152818161095801528181610cac01528181610dd001528181610e970152818161125701526116360152600081816109ba01528181610bc1015281816113cb01526116980152600081816102b4015281816103720152818161175e0152818161182f01528181611c3d01528181611dc301528181611e8601528181611f3e01526130cc01526147716000f3fe608060405234801561001057600080fd5b50600436106102ad5760003560e01c8063689ea3701161017b5780639d3a5241116100d8578063e63015f01161008c578063f5985d3511610071578063f5985d351461079d578063f70d9362146107ca578063fb8dc179146107d257600080fd5b8063e63015f014610777578063e72c652d1461078a57600080fd5b8063aa6b14bb116100bd578063aa6b14bb1461073e578063d685201014610751578063da7052351461076457600080fd5b80639d3a52411461070a578063a37a84561461072b57600080fd5b806382dd65221161012f57806388f2e8621161011457806388f2e862146106af5780638de0a8ee146106e45780639cb5a963146106f757600080fd5b806382dd6522146106945780638456cb59146106a757600080fd5b80637b3de5c6116101605780637b3de5c6146106695780637c1fe0c8146106795780638129fc1c1461068c57600080fd5b8063689ea370146105e557806374eceae6146105ff57600080fd5b8063217ac237116102295780633f4ba83a116101dd5780635c975abb116101c25780635c975abb146105875780635e2411b21461059b578063636fd804146105d257600080fd5b80633f4ba83a1461053f57806358e31bfd1461054757600080fd5b8063343d37ff1161020e578063343d37ff146104de578063392e53cd1461050a5780633b586c7f1461052c57600080fd5b8063217ac2371461046857806331b25d1a146104a957600080fd5b806316f0115b116102805780631d39215e116102655780631d39215e146103a95780631d4632ac146103bc5780631e5eb1d0146103d957600080fd5b806316f0115b1461036d5780631d022e2e1461039457600080fd5b8063026b1d5f146102b2578063029c1cb7146102f15780630786feb61461033057806308cd197514610357575b600080fd5b7f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b0390911681526020015b60405180910390f35b6103046102ff366004613cc5565b6107df565b604080516001600160e01b0319909416845262ffffff92831660208501529116908201526060016102e8565b6000546103449062010000900461ffff1681565b60405161ffff90911681526020016102e8565b62010002546103449062010000900461ffff1681565b6102d47f000000000000000000000000000000000000000000000000000000000000000081565b6103a76103a2366004613d6f565b61086b565b005b6103a76103b7366004613d8c565b61094d565b62010002546102d49064010000000090046001600160a01b031681565b610420620100045461ffff80821692601083901c82169263ffffffff602082901c811693604083901c90911692606083901c821692607081901c83169260809190911c1690565b6040805161ffff9889168152968816602088015263ffffffff9586169087015293909216606085015284166080840152831660a08301529190911660c082015260e0016102e8565b610470610b41565b604080516001600160a01b03909516855260029390930b602085015261ffff9091169183019190915260ff1660608201526080016102e8565b6104d07f8e8000aba5b365c0be9685da1153f7f096e76d1ecfb42c050ae1e387aa65b4f581565b6040519081526020016102e8565b6104f16104ec366004613da4565b610b5d565b6040516001600160e01b031990911681526020016102e8565b60005461051c90610100900460ff1681565b60405190151581526020016102e8565b6103a761053a366004613e33565b610b86565b6103a7610ca1565b6201000154610567906001600160801b0380821691600160801b90041682565b604080516001600160801b039384168152929091166020830152016102e8565b6201000454600160901b900460ff1661051c565b6105ae6105a9366004613e71565b610cf4565b604080516001600160e01b0319909316835262ffffff9091166020830152016102e8565b6104f16105e0366004613f10565b610d2b565b6105ed60c381565b60405160ff90911681526020016102e8565b61061261060d366004613f49565b610d4f565b60408051971515885263ffffffff909616602088015260069490940b948601949094526001600160581b039091166060850152600290810b60808501529190910b60a083015261ffff1660c082015260e0016102e8565b62010002546103449061ffff1681565b6103a7610687366004613f62565b610db9565b6103a7611188565b6104f16106a2366004613f7f565b611228565b6103a761124c565b6106c26106bd366004613fde565b61129d565b6040805160069390930b83526001600160581b039091166020830152016102e8565b6104f16106f2366004613ff9565b6112f7565b6104f1610705366004614075565b611327565b61071d61071836600461416a565b611350565b6040516102e8929190614217565b6103a7610739366004613e33565b611390565b6104f161074c36600461429e565b6114a1565b6104f161075f3660046142c0565b6114ba565b6103a7610772366004614328565b6114e4565b61051c610785366004613f62565b6115b9565b6103a7610798366004614356565b61162b565b6000546107b590640100000000900463ffffffff1681565b60405163ffffffff90911681526020016102e8565b61034461171f565b60005461051c9060ff1681565b60008060006107ec611753565b6107f46117cb565b6000805460ff161561083157600061080a611827565b50509150506108218b8261081c6118bf565b61196c565b915061082b611a7b565b50610849565b610839611a7b565b610849610844611b6e565b611bb4565b63029c1cb760e01b935061ffff16915060009050985098509895505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108b457604051631eb49d6d60e11b815260040160405180910390fd5b6000546040805160ff9092161515825282151560208301527f4c178ce4718c9cd3c1e46dc348c68224830b3a6f5b945c37f46d93ca8b65bb89910160405180910390a16000805482151560ff19821681179092556040805160ff909216801515835260208301939093527f4c178ce4718c9cd3c1e46dc348c68224830b3a6f5b945c37f46d93ca8b65bb89910160405180910390a15050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610a2d575060405163e8ae2b6960e01b81527f8e8000aba5b365c0be9685da1153f7f096e76d1ecfb42c050ae1e387aa65b4f560048201523360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e8ae2b6990604401602060405180830381865afa158015610a09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2d919061438d565b610a3657600080fd5b610a4d610a48368390038301836143aa565b611ca8565b610ace610a5f368390038301836143aa565b600080826000015161ffff166010846020015161ffff16901b6020856040015163ffffffff16901b6040866060015163ffffffff16901b6060876080015161ffff16901b60708860a0015161ffff16901b60808960c0015161ffff16901b171717171717905080915050919050565b62010004805471ffffffffffffffffffffffffffffffffffff191671ffffffffffffffffffffffffffffffffffff929092169190911790556040517f348d1d6a31fa4a2a3ef887c493549a9500fbb77b5218be0c81a71c553364305a90610b36908390614462565b60405180910390a150565b600080600080610b4f611827565b935093509350935090919293565b6000610b67611753565b610b7160c3611d8f565b5063343d37ff60e01b98975050505050505050565b60405163e8ae2b6960e01b81527f8e8000aba5b365c0be9685da1153f7f096e76d1ecfb42c050ae1e387aa65b4f560048201523360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e8ae2b6990604401602060405180830381865afa158015610c10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c34919061438d565b610c5157604051631eb49d6d60e11b815260040160405180910390fd5b62010002805463ffff000019166201000061ffff8416908102919091179091556040519081527fc91eb493942701aff5078930c9629ab20229818e33e54743671490dcf57a7b1090602001610b36565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cea57604051631eb49d6d60e11b815260040160405180910390fd5b610cf2611e2b565b565b600080610cff611753565b610d076117cb565b610d1160c3611d8f565b50632f1208d960e11b905060005b97509795505050505050565b6000610d35611753565b610d3f60c3611d8f565b506318dbf60160e21b5b92915050565b600181620100008110610d6157600080fd5b015460ff81169150610100810463ffffffff169065010000000000810460060b90600160601b81046001600160581b031690600160b81b8104600290810b91600160d01b810490910b90600160e81b900461ffff1687565b6001600160a01b03811615801590600090610e6b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638a2ade586040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e509190614507565b6001600160a01b0316336001600160a01b0316149050610f2e565b62010003546001600160a01b031615610e90575062010003546001600160a01b031633145b80610f2e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638a2ade586040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f179190614507565b6001600160a01b0316336001600160a01b03161490505b80610f805760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420616c6c6f77656420746f2073657420696e63656e746976650000000060448201526064015b60405180910390fd5b600030610f8b611e82565b6001600160a01b03161490508215610fea5780610fea5760405162461bcd60e51b815260206004820152601360248201527f506c7567696e206e6f74206174746163686564000000000000000000000000006044820152606401610f77565b62010002546001600160a01b03640100000000909104811690851681036110535760405162461bcd60e51b815260206004820152600e60248201527f416c7265616479206163746976650000000000000000000000000000000000006044820152606401610f77565b83156110b0576001600160a01b038116156110b05760405162461bcd60e51b815260206004820152601460248201527f4861732061637469766520696e63656e746976650000000000000000000000006044820152606401610f77565b6201000280547fffffffffffffffff0000000000000000000000000000000000000000ffffffff166401000000006001600160a01b038816908102919091179091556040519081527f915c5369e6580733735d1c2e30ca20dcaa395697a041033c9f35f80f53525e849060200160405180910390a183156111515762010003805473ffffffffffffffffffffffffffffffffffffffff191633179055611171565b62010003805473ffffffffffffffffffffffffffffffffffffffff191690555b8115611181576111816002611f06565b5050505050565b600054610100900460ff16156111b05760405162dc149f60e41b815260040160405180910390fd5b306111b9611e82565b6001600160a01b0316146111e05760405163a909652b60e01b815260040160405180910390fd5b6000806111eb611827565b505091509150816001600160a01b031660000361121b57604051636fdc2d5b60e01b815260040160405180910390fd5b61122481611fa8565b5050565b6000611232611753565b61123b82611fa8565b5063416eb29160e11b5b9392505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461129557604051631eb49d6d60e11b815260040160405180910390fd5b610cf2611fea565b60008060006112aa611827565b5050600080549193506201000090910461ffff1691506112cb60018361202f565b905060006112de60014289878787612062565b6040810151606090910151909890975095505050505050565b6000611301611753565b6113096117cb565b61131360c3611d8f565b506346f0547760e11b5b9695505050505050565b6000611331611753565b61133a886122e3565b50639cb5a96360e01b9998505050505050505050565b606080600061135d611827565b505091505061138661136c4290565b600054600191908790859062010000900461ffff1661238f565b9250925050915091565b60405163e8ae2b6960e01b81527f8e8000aba5b365c0be9685da1153f7f096e76d1ecfb42c050ae1e387aa65b4f560048201523360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e8ae2b6990604401602060405180830381865afa15801561141a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143e919061438d565b61145b57604051631eb49d6d60e11b815260040160405180910390fd5b62010002805461ffff191661ffff83169081179091556040519081527f1011f83fc34609d67eda9d83258819bf0713ae683f06389bbd69417645eed04690602001610b36565b60006114ab611753565b5063aa6b14bb60e01b92915050565b60006114c4611753565b6114ce60c3611d8f565b50630d68520160e41b9998505050505050505050565b60018261ffff166201000081106114fd576114fd614524565b015460ff161561151f5760405162dc149f60e41b815260040160405180910390fd5b61ffff8116158061154457508061ffff168261ffff61153e9190614550565b61ffff16105b156115625760405163162908e360e11b815260040160405180910390fd5b61ffff82165b81830161ffff168110156115b4576001808262010000811061158c5761158c614524565b01805463ffffffff929092166101000264ffffffff0019909216919091179055600101611568565b505050565b62010002546000906001600160a01b0383811664010000000090920416146115e357506000919050565b306115ec611e82565b6001600160a01b03161461160257506000919050565b600061160c611827565b9350505050600281166116225750600092915050565b50600192915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061170b575060405163e8ae2b6960e01b81527f8e8000aba5b365c0be9685da1153f7f096e76d1ecfb42c050ae1e387aa65b4f560048201523360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e8ae2b6990604401602060405180830381865afa1580156116e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170b919061438d565b61171457600080fd5b6115b4838284612510565b6000805460ff161561173e5750620100025462010000900461ffff1690565b61174e611749611b6e565b612574565b905090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cf25760405162461bcd60e51b815260206004820152601760248201527f4f6e6c7920706f6f6c2063616e2063616c6c20746869730000000000000000006044820152606401610f77565b6201000454600160901b900460ff1615610cf25760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610f77565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e76c01e46040518163ffffffff1660e01b815260040160c060405180830381865afa15801561188b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118af919061456b565b5093989297509095509350915050565b60008054819060019061ffff6201000091829004169081106118e3576118e3614524565b6040805160e081018252919092015460ff811615158252610100810463ffffffff16602083015265010000000000810460060b92820192909252600160601b82046001600160581b03166060820152600160b81b8204600290810b60808301819052600160d01b840490910b60a0830152600160e81b90920461ffff1660c09091015292915050565b6040805180820190915260008082526020820181905290620100025461ffff8082169162010000900416600286810b9086900b146119d6576119af8686846125c2565b805160208201516001600160801b03908116600160801b0291161762010001559250611a03565b6040805180820190915262010001546001600160801b038082168352600160801b90910416602082015292505b600087611a30576020840151606090611a29906001600160801b031661ffff85166145f8565b901c611a4f565b8351606090611a4c906001600160801b031661ffff85166145f8565b901c5b905061ffff811115611a64575061ffff611a70565b80600003611a70575060015b979650505050505050565b60005462010000810461ffff1690640100000000810463ffffffff1690610100900460ff1680611aed5760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420696e697469616c697a656400000000000000000000000000000000006044820152606401610f77565b4263ffffffff80821690841603611b045750505050565b6000611b0e611827565b5090925060009150611b2590506001878585612764565b506000805463ffffffff9095166401000000000267ffffffff000000001961ffff90931662010000029290921667ffffffffffff00001990951694909417179092555050505050565b60004281611b7a611827565b5050600080549193506201000090910461ffff169150611b9b60018361202f565b9050611bab6001858585856129fd565b94505050505090565b620100045460009071ffffffffffffffffffffffffffffffffffff1681611bd9611827565b5092505050601082901c61ffff1661ffff83161761ffff16600003611c0857608082901c61ffff169250611c15565b611c128483612c5f565b92505b8061ffff168361ffff1614611ca257604051638e00555360e01b815261ffff841660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690638e00555390602401600060405180830381600087803b158015611c8957600080fd5b505af1158015611c9d573d6000803e3d6000fd5b505050505b50505050565b60c08101516020820151825161ffff92831691611cca9190841690841661460f565b611cd4919061460f565b1115611d225760405162461bcd60e51b815260206004820152601060248201527f4d617820666565206578636565646564000000000000000000000000000000006044820152606401610f77565b608081015161ffff1615801590611d40575060a081015161ffff1615155b611d8c5760405162461bcd60e51b815260206004820152601260248201527f47616d6d6173206d757374206265203e203000000000000000000000000000006044820152606401610f77565b50565b6000611d99611827565b93505050508160ff168160ff16146112245760405163bca57f8160e01b815260ff831660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063bca57f8190602401600060405180830381600087803b158015611e0f57600080fd5b505af1158015611e23573d6000803e3d6000fd5b505050505050565b611e33612cfa565b62010004805460ff60901b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ef01df4f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ee2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174e9190614507565b6000611f10611827565b93505050828217905060ff808316908216146115b45760405163bca57f8160e01b815260ff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063bca57f81906024015b600060405180830381600087803b158015611f8b57600080fd5b505af1158015611f9f573d6000803e3d6000fd5b50505050505050565b42611fb560018284612d55565b6000805461ff001963ffffffff8416640100000000021667ffffffff0000ff0019909116176101001790556112246041611f06565b611ff26117cb565b62010004805460ff60901b1916600160901b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611e653390565b6000600182018361ffff821662010000811061204d5761204d614524565b015460ff161561205b578091505b5092915050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810191909152848603600080806120af8b8b868a8a612df2565b506040805160e081018252845460ff811615158252610100810463ffffffff9081166020840181905265010000000000830460060b94840194909452600160601b82046001600160581b03166060840152600160b81b8204600290810b6080850152600160d01b8304900b60a0840152600160e81b90910461ffff1660c083015290995093965091945092509085160361214c575050505061131d565b801561218a5760008061216c8d878c8c8c8c602001518d60400151612fb4565b9150915061217d87878c8585612fdb565b965050505050505061131d565b815463ffffffff610100820481169165010000000000900460060b9086168290036122375750506040805160e081018252925460ff811615158452610100810463ffffffff16602085015265010000000000810460060b91840191909152600160601b81046001600160581b03166060840152600160b81b8104600290810b6080850152600160d01b8204900b60a0840152600160e81b900461ffff1660c083015250925061131d915050565b602087015160408801518184039188039063ffffffff80831691908416600690810b918603900b8161226b5761226b614622565b60408c01805192909105929092020160060b90526060890151865463ffffffff80841692908516916001600160581b03600160601b90910481169190910316816122b7576122b7614622565b60608c0180516001600160581b0393909204939093020116905250505050505050509695505050505050565b620100025464010000000090046001600160a01b03168015612385576000612309611827565b505060405163034d335960e41b8152600282900b600482015285151560248201529092506001600160a01b03841691506334d33590906044016020604051808303816000875af1158015612361573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca2919061438d565b6112246002613093565b825160609081908067ffffffffffffffff8111156123af576123af614123565b6040519080825280602002602001820160405280156123d8578160200160208202803683370190505b5092508067ffffffffffffffff8111156123f4576123f4614123565b60405190808252806020026020018201604052801561241d578160200160208202803683370190505b509150600061242c898661202f565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290529192505b83811015612502576124978b8b8b848151811061248757612487614524565b60200260200101518b8b88612062565b9150816040015182606001518783815181106124b5576124b5614524565b602002602001018784815181106124ce576124ce614524565b60200260200101826001600160581b03166001600160581b03168152508260060b60060b8152505050806001019050612468565b505050509550959350505050565b600060405163a9059cbb60e01b6000526001600160a01b03841660045282602452602060006044600080895af19150813d1560203d146001600051141617169150806040525080611ca257604051637232c81f60e11b815260040160405180910390fd5b620100045460009071ffffffffffffffffffffffffffffffffffff81169060101c61ffff1661ffff82161761ffff166000036125b857608081901c61ffff16611245565b6112458382612c5f565b604080518082019091526000808252602082015260008360020b8560020b6125ea9190614638565b90506125f9620d89e719614658565b60020b81131561261a57612610620d89e719614658565b60020b905061262d565b620d89e71981121561262d5750620d89e7195b600061263882613103565b6001600160a01b031690506000600160601b6126558380836133de565b61265f9190614638565b905060006103e861267461ffff88168461467a565b61267e91906146aa565b6040805180820190915262010001546001600160801b03808216808452600160801b9092041660208301529096509091506000906126c0908390600f0b614638565b90508060001280156126d55750600160611b81125b15612716576040518060400160405280826001600160801b0316815260200183886020015161270491906146e6565b6001600160801b031690529550612758565b6000811361273d576040805180820190915260008152600160611b60208201529550612758565b60408051808201909152600160611b81526000602082015295505b50505050509392505050565b6000806000868661ffff1662010000811061278157612781614524565b6040805160e081018252919092015460ff811615158252610100810463ffffffff9081166020840181905265010000000000830460060b94840194909452600160601b82046001600160581b03166060840152600160b81b8204600290810b6080850152600160d01b8304900b60a0840152600160e81b90910461ffff1660c08301529092508616900361281c5785600092509250506129f4565b856001019250868361ffff1662010000811061283a5761283a614524565b015460ff1615612848578291505b6000806128628988888b8888602001518960400151612fb4565b915091508461ffff168161ffff1603612879576001015b6128868388888585612fdb565b898661ffff1662010000811061289e5761289e614524565b825191018054602084015160408501516060860151608087015160a088015160c09098015164ffffffffff1990951696151564ffffffff0019169690961761010063ffffffff90941693909302929092177fffffffffffffffffff000000000000000000000000000000000000ffffffffff166501000000000066ffffffffffffff909216919091027fffffffffffffffffff0000000000000000000000ffffffffffffffffffffffff1617600160601b6001600160581b03909216919091021765ffffffffffff60b81b1916600160b81b62ffffff948516027fffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffffff1617600160d01b9390941692909202929092177fff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e81b61ffff9283160217909155858116908516036129f0576001909301925b5050505b94509492505050565b600080868461ffff16620100008110612a1857612a18614524565b018054909150610100810463ffffffff90811690881614906001600160581b03600160601b8204169061ffff600160e81b9091041682612a6457612a618a8a60008b8b8b613477565b91505b60008a8761ffff16620100008110612a7e57612a7e614524565b0154610100900463ffffffff169050612a9e816201517f198c018c6135b0565b15612bc95760008415612b97578b8361ffff16620100008110612ac357612ac3614524565b0154610100900463ffffffff168c61ffff8516620100008110612ae857612ae8614524565b0154909250600160601b90046001600160581b031690506000828d6001860161ffff16620100008110612b1d57612b1d614524565b015463ffffffff610100909104811691909103915081811690848e036201517f190116838f61ffff6001890116620100008110612b5c57612b5c614524565b01600001600c9054906101000a90046001600160581b031603026001600160581b031681612b8c57612b8c614622565b048201915050612bab565b612ba88c8c620151808d8d8d613477565b90505b620151806001600160581b0382860316049650505050505050612c56565b8063ffffffff168a63ffffffff1614612c505760008b8861ffff16620100008110612bf657612bf6614524565b0154600160601b90046001600160581b03169050818b03600163ffffffff82161115612c2157600019015b8063ffffffff168286036001600160581b031681612c4157612c41614622565b04975050505050505050612c56565b50505050505b95945050505050565b6000600f6001600160581b0384160492506000612ca86001600160581b038516607085901c61ffff16601086901c61ffff16604087901c63ffffffff165b63ffffffff166135d8565b612cd36001600160581b038616606086901c61ffff1661ffff8716602088901c63ffffffff16612c9d565b01905061ffff608084901c8116820190811115612cf257612cf2614725565b949350505050565b6201000454600160901b900460ff16610cf25760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610f77565b8254839060ff1615612d7a576040516308ab11a360e11b815260040160405180910390fd5b8054600165ffffffffffff60b81b19909116600160d01b62ffffff949094169384027fffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff1617600160b81b939093029290921764ffffffffff191661010063ffffffff949094169390930260ff19169290921717905550565b6000806000806000898761ffff16620100008110612e1257612e12614524565b01805490915063ffffffff610100820481169161ffff600160e81b90910416908a8116908c161480612e4a5750612e4a828b8d6135b0565b15612e66575090945084935060019250505061ffff8516612fa8565b6000620151808b840363ffffffff1611612e9457819850620151808c0363ffffffff168b63ffffffff161490505b60008d8a61ffff16620100008110612eae57612eae614524565b0154610100900463ffffffff169050612ec8818d8f6135b0565b612ee45760405162bc60f160e41b815260040160405180910390fd5b8b63ffffffff168163ffffffff1603612f44578d8a61ffff16620100008110612f0f57612f0f614524565b018e8b61ffff16620100008110612f2857612f28614524565b919a50019750600196505061ffff89169450612fa89350505050565b8960010161ffff168b61ffff1603612f89578d8a61ffff16620100008110612f6e57612f6e614524565b019850939650600095505061ffff88169350612fa892505050565b50612f988d8d8d8d8d8661368c565b9199509750600096509450505050505b95509550955095915050565b600080600080612fc98b8b8b8b8b8b8b6136da565b909c909b509950505050505050505050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526020860180516001885263ffffffff878116909252604088018051918803928316600288810b82810290940160060b90925260a08a015161305e9391928291810b9089900b613814565b606088018051919091016001600160581b031690525050600292830b6080860152910b60a084015261ffff1660c08301525090565b600061309d611827565b9350505082198216905060ff808316908216146115b45760405163bca57f8160e01b815260ff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063bca57f8190602401611f71565b6000600282900b60171d62ffffff818401821816620d89e881111561313b57604051633c10250f60e01b815260040160405180910390fd5b600160801b600182161561315c57506ffffcb933bd6fad37aa2d162d1a5940015b600282161561317b576ffff97272373d413259a46990580e213a0260801c5b600482161561319a576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b60088216156131b9576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b60108216156131d8576fffcb9843d60f6159c9db58835c9266440260801c5b60208216156131f7576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615613216576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615613235576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615613255576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615613275576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615613295576ff3392b0822b70005940c7a398e4b70f30260801c5b6108008216156132b5576fe7159475a2c29b7443b29c7fa6e889d90260801c5b6110008216156132d5576fd097f3bdfd2022b8845ad8f792aa58250260801c5b6120008216156132f5576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615613315576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615613335576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615613356576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615613376576e5d6af8dedb81196699c329225ee6040260801c5b6204000082106133bc576204000082161561339f576d2216e584f5fa1ea926041bedfe980260801c5b620800008216156133bc576b048a170391f7dc42444e8fa20260801c5b60008560020b13156133cd57600019045b63ffffffff0160201c949350505050565b6000838302816000198587098281108382030391505080841161340057600080fd5b8060000361341357508290049050611245565b8385870960008581038616958690049560026003880281188089028203028089028203028089028203028089028203028089028203028089029091030291819003819004600101858411909403939093029190930391909104170290509392505050565b600084860381808061348c8b8b868a8a612df2565b508254929550909350915063ffffffff61010082048116916001600160581b03600160601b909104169086168290036134cc57955061131d945050505050565b82156135335760006134f48e888d8d8d888c60000160059054906101000a900460060b612fb4565b5086549091506135239063ffffffff858a03169060028e810b918291600160d01b909104810b9086900b613814565b820197505050505050505061131d565b835463ffffffff61010082048116916001600160581b03600160601b9091041690881682900361356c57975061131d9650505050505050565b83820384890363ffffffff8082169083166001600160581b03878603168161359657613596614622565b040285019a50505050505050505050509695505050505050565b63ffffffff808216848216811091841611810361124557505063ffffffff9081169116111590565b6000818511156136385781850394508361ffff166006028510613600575061ffff8216612cf2565b600461ffff85160a600061361587878461386f565b9050808201818661ffff16028161362e5761362e614622565b0492505050612cf2565b93810393600661ffff851602851061365257506000612cf2565b600461ffff85160a600061366787878461386f565b8201905080828661ffff16028161368057613680614622565b04979650505050505050565b6000808061ffff808616908290881682116136ab578761ffff166136b6565b620100008861ffff16015b90506136c68b8b8b85858b6139e5565b919d909c50909a5098505050505050505050565b6000806000808a8761ffff166201000081106136f8576136f8614524565b0154610100900463ffffffff168b61ffff891662010000811061371d5761371d614524565b015490925065010000000000900460060b9050600289900b63ffffffff878c0316028501613752836201517f198d018d6135b0565b6137b3578263ffffffff168b63ffffffff160361377e57505050600287900b91505061ffff8416610d1f565b828b0363ffffffff1660060b82820360060b8161379d5761379d614622565b0560060b94505061ffff87169250610d1f915050565b6137c387620151808d038d6135b0565b156137dd57505050600287900b91505061ffff8516610d1f565b60006137f08d8d620151808e8e8e613b56565b955090506201518081830360060b0560060b95505050505097509795505050505050565b600082820385850303838603870260018089018902906002808b029091018202906006818c0a81029180870a8402868802860283020190860a8d02909102018161386057613860614622565b059a9950505050505050505050565b6000808385048080156138ae57600181146138bf57600281146138d057600381146138e157600481146138f2576903248ca20bb7b5032f5f9250613900565b68056bc75e2d631000009250613900565b680ebc5fb417461211109250613900565b68280e60114edb805d039250613900565b686ce2482d63ef54b74c9250613900565b690127fa27722cc06cc5e392505b50509383900693600261ffff85160461ffff16851061395057600261ffff85160461ffff168503945068056bc75e2d63100000816808f00f760a4b2db55c028161394c5761394c614622565b0490505b8291508461ffff8516838161396757613967614622565b049350838102830192508461ffff16848161398457613984614622565b0493508502600281850204830192508461ffff1684816139a6576139a6614622565b04935085026018600461ffff871683020282880201048301925068056bc75e2d63100000828402816139da576139da614622565b049695505050505050565b60008060008380156139f957506002868603115b15613a08575060018501613a10565b5084840160011c5b888161ffff16620100008110613a2857613a28614524565b01925082915060015b835460ff811690610100900463ffffffff168115613ad557613a54818b8d6135b0565b15613aca578b8460010161ffff16620100008110613a7457613a74614524565b01805490955060ff811690610100900463ffffffff168115613ab557613a9b8c828f6135b0565b15613aaa575050505050613b4a565b856001019a50613ac3565b50869550613b4a9350505050565b5050613adc565b600184039750613adc565b8360010198505b6000838015613ae85750875b8015613af65750846001018a145b9050808015613b07575060108a8a03115b15613b1757896008019450613b20565b89890160011c94505b8c8561ffff16620100008110613b3857613b38614524565b019650600093505050506001613a3157505b96509650969350505050565b60008085870381808080613b6d8d8d878c8c612df2565b83549397509195509350915063ffffffff610100820481169165010000000000900460060b908716829003613bac579750909550613c4e945050505050565b8315613bd35781870363ffffffff168c60020b028101839850985050505050505050613c4e565b845463ffffffff610100820481169165010000000000900460060b908916829003613c1057995050505060010161ffff169450613c4e9350505050565b838203848a0363ffffffff808216908316600690810b90878603900b81613c3957613c39614622565b05028501879c509c5050505050505050505050505b965096945050505050565b6001600160a01b0381168114611d8c57600080fd5b8015158114611d8c57600080fd5b60008083601f840112613c8e57600080fd5b50813567ffffffffffffffff811115613ca657600080fd5b602083019150836020828501011115613cbe57600080fd5b9250929050565b60008060008060008060008060e0898b031215613ce157600080fd5b8835613cec81613c59565b97506020890135613cfc81613c59565b96506040890135613d0c81613c6e565b9550606089013594506080890135613d2381613c59565b935060a0890135613d3381613c6e565b925060c089013567ffffffffffffffff811115613d4f57600080fd5b613d5b8b828c01613c7c565b999c989b5096995094979396929594505050565b600060208284031215613d8157600080fd5b813561124581613c6e565b600060e08284031215613d9e57600080fd5b50919050565b60008060008060008060008060e0898b031215613dc057600080fd5b8835613dcb81613c59565b97506020890135613ddb81613c59565b965060408901359550606089013594506080890135935060a0890135925060c089013567ffffffffffffffff811115613d4f57600080fd5b61ffff81168114611d8c57600080fd5b8035613e2e81613e13565b919050565b600060208284031215613e4557600080fd5b813561124581613e13565b8060020b8114611d8c57600080fd5b8035600f81900b8114613e2e57600080fd5b600080600080600080600060c0888a031215613e8c57600080fd5b8735613e9781613c59565b96506020880135613ea781613c59565b95506040880135613eb781613e50565b94506060880135613ec781613e50565b9350613ed560808901613e5f565b925060a088013567ffffffffffffffff811115613ef157600080fd5b613efd8a828b01613c7c565b989b979a50959850939692959293505050565b60008060408385031215613f2357600080fd5b8235613f2e81613c59565b91506020830135613f3e81613c59565b809150509250929050565b600060208284031215613f5b57600080fd5b5035919050565b600060208284031215613f7457600080fd5b813561124581613c59565b600080600060608486031215613f9457600080fd5b8335613f9f81613c59565b92506020840135613faf81613c59565b91506040840135613fbf81613e50565b809150509250925092565b803563ffffffff81168114613e2e57600080fd5b600060208284031215613ff057600080fd5b61124582613fca565b60008060008060008060a0878903121561401257600080fd5b863561401d81613c59565b9550602087013561402d81613c59565b94506040870135935060608701359250608087013567ffffffffffffffff81111561405757600080fd5b61406389828a01613c7c565b979a9699509497509295939492505050565b60008060008060008060008060006101008a8c03121561409457600080fd5b893561409f81613c59565b985060208a01356140af81613c59565b975060408a01356140bf81613c6e565b965060608a0135955060808a01356140d681613c59565b945060a08a0135935060c08a0135925060e08a013567ffffffffffffffff81111561410057600080fd5b61410c8c828d01613c7c565b915080935050809150509295985092959850929598565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561416257614162614123565b604052919050565b6000602080838503121561417d57600080fd5b823567ffffffffffffffff8082111561419557600080fd5b818501915085601f8301126141a957600080fd5b8135818111156141bb576141bb614123565b8060051b91506141cc848301614139565b81815291830184019184810190888411156141e657600080fd5b938501935b8385101561420b576141fc85613fca565b825293850193908501906141eb565b98975050505050505050565b604080825283519082018190526000906020906060840190828701845b8281101561425357815160060b84529284019290840190600101614234565b5050508381038285015284518082528583019183019060005b818110156142915783516001600160581b03168352928401929184019160010161426c565b5090979650505050505050565b600080604083850312156142b157600080fd5b50508035926020909101359150565b60008060008060008060008060006101008a8c0312156142df57600080fd5b89356142ea81613c59565b985060208a01356142fa81613c59565b975060408a013561430a81613e50565b965060608a013561431a81613e50565b95506140d660808b01613e5f565b6000806040838503121561433b57600080fd5b823561434681613e13565b91506020830135613f3e81613e13565b60008060006060848603121561436b57600080fd5b833561437681613c59565b9250602084013591506040840135613fbf81613c59565b60006020828403121561439f57600080fd5b815161124581613c6e565b600060e082840312156143bc57600080fd5b60405160e0810181811067ffffffffffffffff821117156143df576143df614123565b60405282356143ed81613e13565b815260208301356143fd81613e13565b602082015261440e60408401613fca565b604082015261441f60608401613fca565b6060820152608083013561443281613e13565b608082015260a083013561444581613e13565b60a082015261445660c08401613e23565b60c08201529392505050565b60e08101823561447181613e13565b61ffff908116835260208401359061448882613e13565b808216602085015261449c60408601613fca565b915063ffffffff8083166040860152806144b860608801613fca565b16606086015250608085013591506144cf82613e13565b908116608084015260a0840135906144e682613e13565b1660a08301526144f860c08401613e23565b61ffff811660c084015261205b565b60006020828403121561451957600080fd5b815161124581613c59565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b61ffff82811682821603908082111561205b5761205b61453a565b60008060008060008060c0878903121561458457600080fd5b865161458f81613c59565b60208801519096506145a081613e50565b60408801519095506145b181613e13565b606088015190945060ff811681146145c857600080fd5b60808801519093506145d981613e13565b60a08801519092506145ea81613c6e565b809150509295509295509295565b8082028115828204841417610d4957610d4961453a565b80820180821115610d4957610d4961453a565b634e487b7160e01b600052601260045260246000fd5b818103600083128015838313168383128216171561205b5761205b61453a565b60008160020b627fffff1981036146715761467161453a565b60000392915050565b80820260008212600160ff1b841416156146965761469661453a565b8181058314821517610d4957610d4961453a565b6000826146c757634e487b7160e01b600052601260045260246000fd5b600160ff1b8214600019841416156146e1576146e161453a565b500590565b600f81810b9083900b016f7fffffffffffffffffffffffffffffff81136f7fffffffffffffffffffffffffffffff1982121715610d4957610d4961453a565b634e487b7160e01b600052600160045260246000fdfea26469706673582212203e433fde94345b5d7f31635d853b7368161c4649c57cda52c2d768e88d99639564736f6c634300081400330000000000000000000000009ea0f51fd2133d995cf00229bc523737415ad31800000000000000000000000030055f87716d3dfd0e5198c27024481099fb4a98000000000000000000000000438e337779db4389841ecd4df8cd38ecaa0da19d