{"matchId":"56667219","creationMatch":"match","runtimeMatch":"match","verifiedAt":"2026-10-21T15:41:57Z","creationBytecode":{"onchainBytecode":"0x608060405234801561001057600080fd5b50615efb80620000216000396000f3fe608060405234801561001057600080fd5b506004361061029f5760003560e01c80636f89244c11610167578063b64cc67b116100ce578063e8bfe65c11610087578063e8bfe65c14610595578063eb4ad999146105a8578063f1e663a9146105bb578063f3058399146105c3578063f30dba93146105cb578063fe0106d5146105f45761029f565b8063b64cc67b1461054b578063c45a015514610553578063d0b06f5d1461055b578063d0c93a7c14610570578063d21220a714610585578063ddca3f431461058d5761029f565b8063a16368c911610120578063a16368c9146104e0578063a34123a7146104f3578063a38807f214610506578063a480ca7914610528578063a6f19c841461053b578063b056b49a146105435761029f565b80636f89244c1461047657806370cf754a14610489578063883bdbfd146104915780638f50914d146104b2578063918f8674146104c557806396518d4a146104cd5761029f565b80633850c7bd1161020b578063490e6cbc116101c4578063490e6cbc146104095780634f1eb3d81461041c578063514ea4bf1461042f5780635339c2961461045357806357806ada14610466578063648da8591461046e5761029f565b80633850c7bd146103af5780633ab04b20146103c95780633bf0c9fb146103d15780633c8a7d8d146103d957806346141319146103ec57806347ccca02146104015761029f565b80631f7c35681161025d5780631f7c3568146103285780632071d8841461033d578063252c09d714610350578063293833ba14610373578063313383741461038957806332148f671461039c5761029f565b8062d0139a146102a4578063044078e1146102c25780630dfe1681146102e2578063128acb08146102ea578063171852be1461030b5780631a68650214610313575b600080fd5b6102ac6105fc565b6040516102b99190615795565b60405180910390f35b6102d56102d03660046152f9565b61060d565b6040516102b99190615e04565b6102ac6106ad565b6102fd6102f8366004614dbb565b6106bc565b6040516102b992919061587a565b6102ac611362565b61031b6113ac565b6040516102b99190615cfc565b61033b610336366004614d04565b6113bb565b005b61033b61034b366004614d3c565b611522565b61036361035e36600461502a565b611678565b6040516102b99493929190615e14565b61037b6116bd565b6040516102b9929190615d79565b61037b610397366004614ef6565b6116d7565b61033b6103aa366004615482565b611710565b6103b7611790565b6040516102b996959493929190615dc5565b61031b6117d7565b6102ac6117e6565b6102fd6103e7366004614e3b565b6117f5565b6103f46119a0565b6040516102b99190615863565b6102ac6119a6565b61033b610417366004614f55565b6119b5565b61037b61042a366004614e8a565b611af4565b61044261043d36600461502a565b611b24565b6040516102b9959493929190615d93565b6103f461046136600461508b565b611b61565b6103f4611b73565b6103f4611b79565b6102fd61048436600461513e565b611b82565b61031b611bb7565b6104a461049f366004614fbc565b611bcd565b6040516102b99291906157c3565b61033b6104c0366004615042565b611c4f565b6103f4611d6d565b6102fd6104db3660046150c6565b611d74565b6103f46104ee366004615195565b611e19565b6102fd6105013660046150f8565b611ec5565b6105196105143660046150c6565b611ef1565b6040516102b9939291906158ea565b61037b610536366004614ccc565b61201d565b6102ac6120e0565b6103f46120ef565b6102d56120f5565b6102ac61217c565b61056361218b565b6040516102b99190615e45565b6105786121a0565b6040516102b9919061586c565b6102ac6121b0565b6102d56121bf565b6102d56105a3366004615219565b6121db565b6102d56105b63660046152c7565b612286565b6103f46122d9565b6103f46122e0565b6105de6105d93660046150ac565b6122e6565b6040516102b99a99989796959493929190615d10565b6103f4612360565b62010010546001600160a01b031681565b60008054604051631465b7d360e21b8152731ad7a8703ebff81c0d753190938f228672ec7e4291635196df4c9161065491879187916001600160a01b031690600401615cbe565b60206040518083038186803b15801561066c57600080fd5b505af4158015610680573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a491906154a4565b90505b92915050565b6001546001600160a01b031681565b6000806106e7866000141560405180604001604052806002815260200161415360f01b81525061238d565b6040805160c0810182526006546001600160a01b0381168252600160a01b8104600290810b810b900b602080840191909152600160b81b820461ffff90811684860152600160c81b830481166060850152600160d81b8304166080840152600160e81b90910460ff16151560a08301819052835180850190945260038452624c4f4b60e81b91840191909152909161077f919061238d565b610820886107cd5781600001516001600160a01b0316876001600160a01b03161180156107c8575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038816105b6107ff565b81600001516001600160a01b0316876001600160a01b03161080156107ff57506401000276a36001600160a01b038816115b6040518060400160405280600381526020016214d41360ea1b81525061238d565b6006805460ff60e81b191690556040805160e081018252600d546001600160801b039081168252600c541660208201524263ffffffff16818301526000606082018190526080820181905260a082018190528054925163d8f7529960e01b8152909260c08301916001600160a01b039091169063d8f75299906108a7903090600401615795565b60206040518083038186803b1580156108bf57600080fd5b505afa1580156108d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f79190614ce8565b6001600160a01b031681525090506000808913905060006040518061014001604052808b81526020016000815260200185600001516001600160a01b03168152602001856020015160020b8152602001600062ffffff1681526020016000151581526020018c6109695760085461096d565b6007545b815260200160006001600160801b0316815260200184600001516001600160801b0316815260200184602001516001600160801b03168152509050610a73604051806101000160405280336001600160a01b031681526020018e6001600160a01b031681526020018d151581526020018c81526020018b6001600160a01b031681526020018a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250938552505088516001600160a01b039081166020808601919091528a0151600290810b6040909501949094529154600c5460c08a0151841695949190931692600160b01b9004900b90506123b5565b62ffffff1660808201525b805115801590610aa45750886001600160a01b031681604001516001600160a01b031614155b15610e7157610ab1614a08565b60408201516001600160a01b031681526060820151600c54610ae091600f91600160b01b900460020b8f6124ee565b15156040830152600290810b810b60208301819052620d89e719910b1215610b1157620d89e7196020820152610b30565b6020810151620d89e860029190910b1315610b3057620d89e860208201525b610b3d8160200151612630565b6001600160a01b031660608201526040820151610bb3908d610b77578b6001600160a01b031683606001516001600160a01b031611610b91565b8b6001600160a01b031683606001516001600160a01b0316105b610b9f578260600151610ba1565b8b5b61010085015185516080870151612961565b60c085015260a084015260808301526001600160a01b031660408301528215610c1557610be98160c00151826080015101612b53565b825103825260a0810151610c0b90610c0090612b53565b602084015190612b65565b6020830152610c50565b610c228160a00151612b53565b825101825260c08101516080820151610c4a91610c3f9101612b53565b602084015190612b7b565b60208301525b6101008201516001600160801b031615610ca457600080610c808360c00151856101000151866101200151612b91565b60c0860180519290920190915260e0850180519091016001600160801b0316905250505b80606001516001600160a01b031682604001516001600160a01b03161415610e3057806040015115610e07578360a00151610d2e57610d0c846040015160008760200151886040015188600001518a606001516011612c30909695949392919063ffffffff16565b6001600160a01b03166080860152600690810b900b6060850152600160a08501525b8160a00151610d4757610d3f612dc2565b600160a08301525b6000610d9782602001518e610d5e57600754610d64565b8460c001515b8f610d73578560c00151610d77565b6008545b608089015160608a015160408b0151600954600e96959493929190612e86565b90508c15610dbf5780516000908103600f90810b810b8352602083018051909203810b900b90525b610dd28361010001518260000151612f75565b6001600160801b03166101008401526101208301516020820151610df69190612f75565b6001600160801b0316610120840152505b8b610e16578060200151610e1f565b60018160200151035b600290810b900b6060830152610e6b565b80600001516001600160a01b031682604001516001600160a01b031614610e6b57610e5e826040015161302b565b600290810b900b60608301525b50610a7e565b610f27604051806101000160405280336001600160a01b031681526020018e6001600160a01b031681526020018d151581526020018c81526020018b6001600160a01b031681526020018a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506040808501516001600160a01b039081166020840152606086015160020b919092015260c086015116908386600a613345565b836020015160020b816060015160020b14610ff557600080610f7586604001518660400151886020015188600001518a606001518b6080015160116134f9909695949392919063ffffffff16565b604085015160608601516006805461ffff60c81b1916600160c81b61ffff958616021761ffff60b81b1916600160b81b95909416949094029290921762ffffff60a01b1916600160a01b62ffffff60029490940b9390931692909202919091176001600160a01b0319166001600160a01b039091161790555061101a9050565b6040810151600680546001600160a01b0319166001600160a01b039092169190911790555b8061010001516001600160801b031683600001516001600160801b03161461106257610100810151600d80546001600160801b0319166001600160801b039092169190911790555b8061012001516001600160801b031683602001516001600160801b0316146110aa57610120810151600c80546001600160801b0319166001600160801b039092169190911790555b8a156110fa5760c081015160075560e08101516001600160801b0316156110f55760e0810151600a80546001600160801b031981166001600160801b03918216909301169190911790555b611140565b60c081015160085560e08101516001600160801b0316156111405760e0810151600a80546001600160801b03808216600160801b92839004821690940116029190911790555b8115158b15151461115957602081015181518b03611166565b80600001518a0381602001515b90965094508a1561123b57600085121561119557600254611195906001600160a01b03168d6000889003613694565b600061119f6137db565b60405163fa461e3360e01b8152909150339063fa461e33906111cb908a908a908e908e90600401615888565b600060405180830381600087803b1580156111e557600080fd5b505af11580156111f9573d6000803e3d6000fd5b505050506112356112086137db565b611212838a61385c565b11156040518060400160405280600381526020016249494160e81b81525061238d565b506112de565b600086121561125f5760015461125f906001600160a01b03168d6000899003613694565b600061126961386c565b60405163fa461e3360e01b8152909150339063fa461e3390611295908a908a908e908e90600401615888565b600060405180830381600087803b1580156112af57600080fd5b505af11580156112c3573d6000803e3d6000fd5b505050506112dc6112d261386c565b611212838961385c565b505b8b6001600160a01b0316336001600160a01b03167fc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca678888856040015186610100015187606001516040516113369594939291906158b2565b60405180910390a350506006805460ff60e81b1916600160e81b17905550919890975095505050505050565b6201001054600c546001600160a01b03909116906001600160801b031680156113a857600c546113a390600160801b900465ffffffffffff1642038261389d565b820191505b5090565b600d546001600160801b031681565b6113c36138bd565b60055460005460405163bc5bde7b60e01b8152731ad7a8703ebff81c0d753190938f228672ec7e429263bc5bde7b9261140e926001600160a01b0392831692909116906004016157a9565b60006040518083038186803b15801561142657600080fd5b505af415801561143a573d6000803e3d6000fd5b50506003546001600160a01b0316159150611456905057600080fd5b600380546001600160a01b038085166001600160a01b0319928316811790935560048054918516919092161781556040805163f7413fef60e01b815290516000939263f7413fef9280820192602092909182900301818787803b1580156114bc57600080fd5b505af11580156114d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f491906154c0565b90506115158142600c60109054906101000a900465ffffffffffff166138fd565b61151d6139a6565b505050565b6000546001600160a01b031615801561154357506001600160a01b03861615155b61154c57600080fd5b600080546001600160a01b038089166001600160a01b0319928316179092556001805488841690831617905560028054878416908316178155600c80549187900b62ffffff16600160b01b0262ffffff60b01b199092169190911790556005805492851692909116919091179055731ad7a8703ebff81c0d753190938f228672ec7e426307219df660066011846115e28161302b565b886040518663ffffffff1660e01b8152600401611603959493929190615c1f565b60206040518083038186803b15801561161b57600080fd5b505af415801561162f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116539190615402565b600d80546001600160801b03928316600160801b029216919091179055505050505050565b60118161ffff811061168957600080fd5b015463ffffffff81169150600160201b810460060b90600160581b81046001600160a01b031690600160f81b900460ff1684565b600a546001600160801b0380821691600160801b90041682565b6000806116e26138bd565b6116ea6139bb565b6116f88888888888886139f0565b90925090506117056139a6565b965096945050505050565b6117186138bd565b604051633c7e0d5560e21b8152731ad7a8703ebff81c0d753190938f228672ec7e429063f1f8355490611755906011906006908690600401615849565b60006040518083038186803b15801561176d57600080fd5b505af4158015611781573d6000803e3d6000fd5b5050505061178d6139a6565b50565b6006546001600160a01b03811690600160a01b810460020b9061ffff600160b81b8204811691600160c81b8104821691600160d81b8204169060ff600160e81b9091041686565b600c546001600160801b031681565b6005546001600160a01b031681565b6000806118006138bd565b600061180d898989613aad565b6001600160801b03871661014082015260405163025e487960e41b815290915060009081908190731ad7a8703ebff81c0d753190938f228672ec7e42906325e487909061186d90601090600e90600f906011906006908c906004016159be565b60606040518083038186803b15801561188557600080fd5b505af4158015611899573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bd919061544c565b92509250925082600d60006101000a8154816001600160801b0302191690836001600160801b03160217905550731ad7a8703ebff81c0d753190938f228672ec7e4263e0ed1c1a858484600160009054906101000a90046001600160a01b0316600260009054906101000a90046001600160a01b03168e8e6040518863ffffffff1660e01b81526004016119579796959493929190615bc4565b60006040518083038186803b15801561196f57600080fd5b505af4158015611983573d6000803e3d6000fd5b5050505061198f6139a6565b909b909a5098505050505050505050565b60085481565b6004546001600160a01b031681565b6119bd6138bd565b60408051610120810182526001546001600160a01b039081168252600280548216602084015260008054831684860152600c54600160b01b8104830b90920b6060850152600d546001600160801b03908116608086015290911660a084015290881660c083015260e082018790526101008201869052915163b79fa2e360e01b81528291731ad7a8703ebff81c0d753190938f228672ec7e429163b79fa2e391611a7191600a919089908990600401615b0e565b604080518083038186803b158015611a8857600080fd5b505af4158015611a9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac091906154d8565b90925090508115611ad45760078054830190555b8015611ae35760088054820190555b611aeb6139a6565b50505050505050565b600080611aff6138bd565b611b0d8787878787336139f0565b9092509050611b1a6139a6565b9550959350505050565b60106020526000908152604090208054600182015460028301546003909301546001600160801b0392831693919281811691600160801b90041685565b600f6020526000908152604090205481565b60095481565b6110d360f21b81565b600080611b8d6138bd565b611b956139bb565b611ba186868686613b43565b9092509050611bae6139a6565b94509492505050565b600d54600160801b90046001600160801b031681565b606080611c434285858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600654600d54601195949350600160a01b820460020b925061ffff600160b81b83048116926001600160801b0390921691600160c81b900416613c34565b915091505b9250929050565b611c576138bd565b611c5f613d8c565b600654600160a01b9004600290810b9083810b9082900b12801590611c8957508160020b8160020b125b15611ccd57611c96612dc2565b600c54611cac906001600160801b031685612f75565b600c80546001600160801b0319166001600160801b03929092169190911790555b731ad7a8703ebff81c0d753190938f228672ec7e4263c3846f716010600e600460009054906101000a90046001600160a01b03168787878b6007546008546040518a63ffffffff1660e01b8152600401611d2f9998979695949392919061596e565b60006040518083038186803b158015611d4757600080fd5b505af4158015611d5b573d6000803e3d6000fd5b50505050611d676139a6565b50505050565b620f424081565b60065460075460085460405163b76224fb60e01b81526000938493731ad7a8703ebff81c0d753190938f228672ec7e429363b76224fb93611dca93600e938b938b93600160a01b90930460020b92600401615a39565b604080518083038186803b158015611de157600080fd5b505af4158015611df5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4391906154d8565b60065460095460405163bf4efc0760e01b8152600092731ad7a8703ebff81c0d753190938f228672ec7e429263bf4efc0792611e6b92600e928a928a92600160a01b900460020b918a91600401615a39565b60206040518083038186803b158015611e8357600080fd5b505af4158015611e97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebb91906154c0565b90505b9392505050565b600080611ed06138bd565b611edc85858533613b43565b9092509050611ee96139a6565b935093915050565b6040805160c0810182526006546001600160a01b0381168252600160a01b8104600290810b810b900b60208301819052600160b81b820461ffff908116848601819052600160c81b8404821660608601819052600160d81b85049092166080860152600160e81b90930460ff16151560a0850152600d549451633e0d664760e11b8152600095869586959094731ad7a8703ebff81c0d753190938f228672ec7e4294637c1acc8e94611fbf94600e946011948f948f94919390916001600160801b03909116906004016159ef565b60606040518083038186803b158015611fd757600080fd5b505af4158015611feb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200f91906151d0565b935093509350509250925092565b6000806120286138bd565b612030613d8c565b60015460025460405163152245cf60e11b8152731ad7a8703ebff81c0d753190938f228672ec7e4292632a448b9e9261207f92600a9289926001600160a01b0391821692911690600401615ae7565b604080518083038186803b15801561209657600080fd5b505af41580156120aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ce919061541e565b90925090506120db6139a6565b915091565b6003546001600160a01b031681565b600b5481565b600080546040516348cf7a4360e01b81526001600160a01b03909116906348cf7a4390612126903090600401615795565b60206040518083038186803b15801561213e57600080fd5b505afa158015612152573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217691906154a4565b90505b90565b6000546001600160a01b031681565b600c54600160801b900465ffffffffffff1681565b600c54600160b01b900460020b81565b6002546001600160a01b031681565b60006121c9614a44565b3381526121d581612286565b91505090565b60008054600c54604051633082eea360e01b8152731ad7a8703ebff81c0d753190938f228672ec7e4292633082eea39261222e9287926001600160a01b031691600160b01b900460020b90600401615a7b565b60206040518083038186803b15801561224657600080fd5b505af415801561225a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227e91906154a4565b90505b919050565b60008054600c5460405163099f15f760e01b8152731ad7a8703ebff81c0d753190938f228672ec7e429263099f15f79261222e9287926001600160a01b031691600160b01b900460020b90600401615c64565b620186a081565b60075481565b600e602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160801b03851695600160801b909504600f90810b9594900b9390600681900b90600160381b81046001600160a01b031690600160d81b810463ffffffff1690600160f81b900460ff168a565b600061236a6138bd565b612372613d8c565b61237a612dc2565b600b549050600b600090556121796139a6565b808261151d5760405162461bcd60e51b81526004016123ac9190615a68565b60405180910390fd5b60006001600160a01b0385161561246757604051631a7cd7eb60e31b81526000906001600160a01b0387169063d3e6bf58906123f5908890600401615c51565b602060405180830381600087803b15801561240f57600080fd5b505af1158015612423573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244791906154a4565b905062ffffff8116156124655761245d81613dbd565b9150506124e6565b505b604051631c06e0e160e11b81526001600160a01b0384169063380dc1c29061249390859060040161586c565b60206040518083038186803b1580156124ab57600080fd5b505afa1580156124bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e391906154a4565b90505b949350505050565b60008060008460020b8660020b8161250257fe5b05905060008660020b12801561252957508460020b8660020b8161252257fe5b0760020b15155b1561253357600019015b83156125a85760008061254583613dd7565b600182810b810b600090815260208d9052604090205460ff83169190911b8001600019019081168015159750929450909250908561258a57888360ff1686030261259d565b8861259482613de9565b840360ff168603025b965050505050612626565b6000806125b783600101613dd7565b91509150600060018260ff166001901b031990506000818b60008660010b60010b815260200190815260200160002054169050806000141595508561260957888360ff0360ff1686600101010261261f565b888361261483613e88565b0360ff168660010101025b9650505050505b5094509492505050565b60008060008360020b12612647578260020b61264f565b8260020b6000035b9050620d89e881111561268d576040805162461bcd60e51b81526020600482015260016024820152601560fa1b604482015290519081900360640190fd5b6000600182166126a157600160801b6126b3565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff16905060028216156126e7576ffff97272373d413259a46990580e213a0260801c5b6004821615612706576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612725576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612744576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612763576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612782576fff2ea16466c96a3843ec78b326b528610260801c5b60808216156127a1576ffe5dee046a99a2a811c461f1969c30530260801c5b6101008216156127c1576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b6102008216156127e1576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612801576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612821576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612841576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612861576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612881576f70d869a156d2a1b890bb3df62baf32f70260801c5b6180008216156128a1576f31be135f97d08fd981231505542fcfa60260801c5b620100008216156128c2576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b620200008216156128e2576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612901576d2216e584f5fa1ea926041bedfe980260801c5b6208000082161561291e576b048a170391f7dc42444e8fa20260801c5b60008460020b131561293957806000198161293557fe5b0490505b600160201b81061561294c57600161294f565b60005b60ff16602082901c0192505050919050565b60008080806001600160a01b03808916908a1610158187128015906129e657600061299a8989620f42400362ffffff16620f4240613f71565b9050826129b3576129ae8c8c8c6001614020565b6129c0565b6129c08b8d8c6001614090565b95508581106129d1578a96506129e0565b6129dd8c8b838661413b565b96505b50612a30565b816129fd576129f88b8b8b6000614090565b612a0a565b612a0a8a8c8b6000614020565b9350838860000310612a1e57899550612a30565b612a2d8b8a8a60000385614187565b95505b6001600160a01b038a8116908716148215612a9357808015612a4f5750815b612a6557612a60878d8c6001614090565b612a67565b855b9550808015612a74575081155b612a8a57612a85878d8c6000614020565b612a8c565b845b9450612add565b808015612a9d5750815b612ab357612aae8c888c6001614020565b612ab5565b855b9550808015612ac2575081155b612ad857612ad38c888c6000614090565b612ada565b845b94505b81158015612aed57508860000385115b15612af9578860000394505b818015612b1857508a6001600160a01b0316876001600160a01b031614155b15612b27578589039350612b44565b612b41868962ffffff168a620f42400362ffffff166141d3565b93505b50505095509550955095915050565b6000600160ff1b82106113a857600080fd5b808203828113156000831215146106a757600080fd5b818101828112156000831215146106a757600080fd5b600080826001600160801b0316846001600160801b03161415612bb5575083611ee9565b6001600160801b038316612bf857600080612bd187600061420d565b91509150612bed82600160801b886001600160801b0316613f71565b93509150611ee99050565b600080612c0687878761423b565b91509150612c2482600160801b8789036001600160801b0316613f71565b97909650945050505050565b60008063ffffffff8716612cd6576000898661ffff1661ffff8110612c5157fe5b60408051608081018252919092015463ffffffff808216808452600160201b8304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508a1614612cc257612cbf818a8988614275565b90505b806020015181604001519250925050612db6565b868803600080612ceb8c8c858c8c8c8c614318565b91509150816000015163ffffffff168363ffffffff161415612d1d578160200151826040015194509450505050612db6565b805163ffffffff84811691161415612d45578060200151816040015194509450505050612db6565b8151815160208085015190840151918390039286039163ffffffff80841692908516910360060b81612d7357fe5b05028460200151018263ffffffff168263ffffffff1686604001518660400151036001600160a01b03160281612da557fe5b048560400151019650965050505050505b97509795505050505050565b600c54429065ffffffffffff600160801b9091048116908216811415612de9575050612e84565b6003546001600160a01b031680612e0257505050612e84565b6000816001600160a01b031663f7413fef6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612e3f57600080fd5b505af1158015612e53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e7791906154c0565b9050611d678185856138fd565b565b612e8e614a87565b600297880b880b60009081526020998a5260409020978801805490970390965560038701805490950390945560048601805490940390935560058501805463ffffffff600160d81b6001600160a01b03600160381b808504821690970316909502670100000000000000600160d81b031990921691909117600681810b90940390930b66ffffffffffffff1666ffffffffffffff1990931692909217838104831690940390911690910263ffffffff60d81b199092169190911790558154600160801b9004600f90810b810b810b8252600190920154820b820b90910b9181019190915290565b60008082600f0b1215612fda57826001600160801b03168260000384039150816001600160801b031610612fd5576040805162461bcd60e51b81526020600482015260026024820152614c5360f01b604482015290519081900360640190fd5b6106a7565b826001600160801b03168284019150816001600160801b031610156106a7576040805162461bcd60e51b81526020600482015260026024820152614c4160f01b604482015290519081900360640190fd5b60006401000276a36001600160a01b03831610801590613067575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038316105b61309c576040805162461bcd60e51b81526020600482015260016024820152602960f91b604482015290519081900360640190fd5b640100000000600160c01b03602083901b166001600160801b03811160071b81811c6001600160401b03811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c9790881196179094179092171790911717176080811061312f57607f810383901c9150613139565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c600160381b161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b1461333657886001600160a01b031661331a82612630565b6001600160a01b0316111561332f5781613331565b805b613338565b815b9998505050505050505050565b6001600160a01b038516613358576134f2565b60006001600160a01b03861663a991dd8b866133748787614512565b6040518363ffffffff1660e01b8152600401613391929190615c9a565b602060405180830381600087803b1580156133ab57600080fd5b505af11580156133bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e391906154a4565b905062ffffff81166133f557506134f2565b6133fe81613dbd565b9050600080866060015113905060008161341c578560200151613425565b85602001516000035b9050600061343c8262ffffff8616620f42406141d3565b60208801805182019052905082156134a05787604001511561347b5784546001600160801b03600160801b80830482168401821602911617855561349b565b84546001600160801b038082168301166001600160801b03199091161785555b6134ed565b8760400151156134ce5784546001600160801b038082168301166001600160801b03199091161785556134ed565b84546001600160801b03600160801b8083048216840182160291161785555b505050505b5050505050565b6000806000898961ffff1661ffff811061350f57fe5b60408051608081018252919092015463ffffffff808216808452600160201b8304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508916141561357e5788859250925050612db6565b8461ffff168461ffff1611801561359f57506001850361ffff168961ffff16145b156135ac578391506135b0565b8491505b8161ffff168960010161ffff16816135c457fe5b0692506135d381898989614275565b8a8461ffff1661ffff81106135e457fe5b825191018054602084015160408501516060909501511515600160f81b026001600160f81b036001600160a01b03909616600160581b027fff0000000000000000000000000000000000000000ffffffffffffffffffffff60069390930b66ffffffffffffff16600160201b026affffffffffffff000000001963ffffffff90971663ffffffff199095169490941795909516929092171692909217929092161790555097509795505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b602083106137105780518252601f1990920191602091820191016136f1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613772576040519150601f19603f3d011682016040523d82523d6000602084013e613777565b606091505b50915091508180156137a55750805115806137a557508080602001905160208110156137a257600080fd5b50515b6134f2576040805162461bcd60e51b81526020600482015260026024820152612a2360f11b604482015290519081900360640190fd5b6001546040516370a0823160e01b81526000916001600160a01b0316906370a082319061380c903090600401615795565b60206040518083038186803b15801561382457600080fd5b505afa158015613838573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217691906154c0565b808201828110156106a757600080fd5b6002546040516370a0823160e01b81526000916001600160a01b0316906370a082319061380c903090600401615795565b6000816001600160801b0316608084901b816138b557fe5b049392505050565b6006546040805180820190915260038152624c4f4b60e81b60208201526138ee91600160e81b900460ff169061238d565b6006805460ff60e81b19169055565b600c546001600160801b031680156139705761392784600160801b836001600160801b0316613f71565b60098054909101905561394465ffffffffffff838503168261389d565b6201001080546001600160a01b031981166001600160a01b039182169390930116919091179055613979565b600b8054850190555b5050600c805465ffffffffffff909216600160801b0265ffffffffffff60801b1990921691909117905550565b6006805460ff60e81b1916600160e81b179055565b6004805460408051808201909152918252631393919560e21b6020830152612e84916001600160a01b0390911633149061238d565b6001546002546040516309426dd160e41b81526000928392731ad7a8703ebff81c0d753190938f228672ec7e4292639426dd1092613a4f926010928e928e928e928e928e928e926001600160a01b039283169290911690600401615914565b604080518083038186803b158015613a6657600080fd5b505af4158015613a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a9e919061541e565b91509150965096945050505050565b613ab5614a9e565b5060408051610160810182526001600160a01b039485168152600293840b602082015291830b90820152600d546001600160801b038082166060840152600160801b90910416608082015260075460a082015260085460c082015260095460e0820152600354909216610100830152600c54600160b01b9004810b900b610120820152600061014082015290565b6000806000613b53848888613aad565b6001600160801b0386166101408201526040516377998a5760e01b815290915060009081908190731ad7a8703ebff81c0d753190938f228672ec7e42906377998a5790613bb390601090600e90600f906011906006908c906004016159be565b60606040518083038186803b158015613bcb57600080fd5b505af4158015613bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c03919061544c565b600d80546001600160801b0319166001600160801b0394909416939093179092559b909a5098505050505050505050565b60608060008361ffff1611613c74576040805162461bcd60e51b81526020600482015260016024820152604960f81b604482015290519081900360640190fd5b86516001600160401b0381118015613c8b57600080fd5b50604051908082528060200260200182016040528015613cb5578160200160208202803683370190505b50915086516001600160401b0381118015613ccf57600080fd5b50604051908082528060200260200182016040528015613cf9578160200160208202803683370190505b50905060005b8751811015613d7f57613d2a8a8a8a8481518110613d1957fe5b60200260200101518a8a8a8a612c30565b848381518110613d3657fe5b60200260200101848481518110613d4957fe5b60200260200101826001600160a01b03166001600160a01b03168152508260060b60060b81525050508080600101915050613cff565b5097509795505050505050565b6003546040805180820190915260028152614e4760f01b6020820152612e84916001600160a01b031633149061238d565b6000620186a062ffffff8316106113a857620186a061227e565b60020b600881901d9161010090910790565b6000808211613df757600080fd5b600160801b8210613e0a57608091821c91015b680100000000000000008210613e2257604091821c91015b600160201b8210613e3557602091821c91015b620100008210613e4757601091821c91015b6101008210613e5857600891821c91015b60108210613e6857600491821c91015b60048210613e7857600291821c91015b6002821061228157600101919050565b6000808211613e9657600080fd5b5060ff6001600160801b03821615613eb157607f1901613eb9565b608082901c91505b6001600160401b03821615613ed157603f1901613ed9565b604082901c91505b63ffffffff821615613eee57601f1901613ef6565b602082901c91505b61ffff821615613f0957600f1901613f11565b601082901c91505b60ff821615613f235760071901613f2b565b600882901c91505b600f821615613f3d5760031901613f45565b600482901c91505b6003821615613f575760011901613f5f565b600282901c91505b60018216156122815760001901919050565b6000808060001985870986860292508281109083900303905080613fa75760008411613f9c57600080fd5b508290049050611ebe565b808411613fb357600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b6000836001600160a01b0316856001600160a01b03161115614040579293925b8161406d57614068836001600160801b03168686036001600160a01b0316600160601b613f71565b6124e3565b6124e3836001600160801b03168686036001600160a01b0316600160601b6141d3565b6000836001600160a01b0316856001600160a01b031611156140b0579293925b600160601b600160e01b03606084901b166001600160a01b0386860381169087166140da57600080fd5b8361410a57866001600160a01b03166140fd8383896001600160a01b0316613f71565b8161410457fe5b04614130565b6141306141218383896001600160a01b03166141d3565b886001600160a01b03166145cc565b979650505050505050565b600080856001600160a01b03161161415257600080fd5b6000846001600160801b03161161416857600080fd5b8161417a5761406885858560016145d7565b6124e385858560016146b0565b600080856001600160a01b03161161419e57600080fd5b6000846001600160801b0316116141b457600080fd5b816141c65761406885858560006146b0565b6124e385858560006145d7565b60006141e0848484613f71565b9050600082806141ec57fe5b8486091115611ebe57600019811061420357600080fd5b6001019392505050565b600080600061422c8561421e6120f5565b62ffffff16620f42406141d3565b94859003959390940193505050565b60008061425b85846001600160801b0316866001600160801b03166141d3565b90506142698186038261420d565b90969095509350505050565b61427d614afa565b600085600001518503905060405180608001604052808663ffffffff1681526020018263ffffffff168660020b0288602001510160060b81526020016000856001600160801b0316116142d15760016142d3565b845b6001600160801b031663ffffffff60801b608085901b16816142f157fe5b048860400151016001600160a01b0316815260200160011515815250915050949350505050565b614320614afa565b614328614afa565b888561ffff1661ffff811061433957fe5b60408051608081018252919092015463ffffffff8116808352600160201b8204600690810b810b900b6020840152600160581b82046001600160a01b031693830193909352600160f81b900460ff1615156060820152925061439d90899089614793565b156143d5578663ffffffff16826000015163ffffffff1614156143bf57612db6565b816143cc83898988614275565b91509150612db6565b888361ffff168660010161ffff16816143ea57fe5b0661ffff1661ffff81106143fa57fe5b60408051608081018252929091015463ffffffff81168352600160201b8104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082018190529092506144af57604080516080810182528a5463ffffffff81168252600160201b8104600690810b810b900b6020830152600160581b81046001600160a01b031692820192909252600160f81b90910460ff161515606082015291505b6144be88836000015189614793565b6144f5576040805162461bcd60e51b815260206004820152600360248201526213d31160ea1b604482015290519081900360640190fd5b6145028989898887614854565b9150915097509795505050505050565b61451a614a9e565b6040518061016001604052808460000151815260200184602001518152602001846080015162ffffff1681526020018460a00151151581526020018460c0015181526020018460e001516001600160801b031681526020018461010001516001600160801b031681526020018461012001516001600160801b03168152602001836060015160060b815260200183608001516001600160a01b031681526020018360a001511515815250905092915050565b808204910615150190565b600081156146425760006001600160a01b0384111561460d5761460884600160601b876001600160801b0316613f71565b614625565b6001600160801b038516606085901b8161462357fe5b045b905061245d61463d6001600160a01b0388168361385c565b6149f2565b60006001600160a01b038411156146705761466b84600160601b876001600160801b03166141d3565b614687565b614687606085901b6001600160801b0387166145cc565b905080866001600160a01b03161161469e57600080fd5b6001600160a01b0386160390506124e6565b6000826146be5750836124e6565b600160601b600160e01b03606085901b16821561474c576001600160a01b038616848102908582816146ec57fe5b04141561471d5781810182811061471b5761471183896001600160a01b0316836141d3565b93505050506124e6565b505b6147438261473e878a6001600160a01b0316868161473757fe5b049061385c565b6145cc565b925050506124e6565b6001600160a01b0386168481029085828161476357fe5b0414801561477057508082115b61477957600080fd5b80820361471161463d846001600160a01b038b16846141d3565b60008363ffffffff168363ffffffff16111580156147bd57508363ffffffff168263ffffffff1611155b156147d9578163ffffffff168363ffffffff1611159050611ebe565b60008463ffffffff168463ffffffff1611614800578363ffffffff16600160201b01614808565b8363ffffffff165b64ffffffffff16905060008563ffffffff168463ffffffff1611614838578363ffffffff16600160201b01614840565b8363ffffffff165b64ffffffffff169091111595945050505050565b61485c614afa565b614864614afa565b60008361ffff168560010161ffff168161487a57fe5b0661ffff169050600060018561ffff16830103905060005b506002818301048961ffff871682816148a757fe5b0661ffff81106148b357fe5b60408051608081018252929091015463ffffffff81168352600160201b8104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b9091041615156060820181905290955061491d57806001019250614892565b898661ffff16826001018161492e57fe5b0661ffff811061493a57fe5b60408051608081018252929091015463ffffffff81168352600160201b8104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082015285519094506000906149a4908b908b614793565b90508080156149bd57506149bd8a8a8760000151614793565b156149c857506149e5565b806149d8576001820392506149df565b8160010193505b50614892565b5050509550959350505050565b806001600160a01b038116811461228157600080fd5b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b604080516101008101825260008082526020820181905291810182905260608082018390526080820183905260a082015260c0810182905260e081019190915290565b604080518082019091526000808252602082015290565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b803561228181615e7b565b8035801515811461228157600080fd5b60008083601f840112614b4d578182fd5b5081356001600160401b03811115614b63578182fd5b602083019150836020828501011115611c4857600080fd5b600082601f830112614b8b578081fd5b81356001600160401b03811115614b9e57fe5b614bb1601f8201601f1916602001615e58565b818152846020838601011115614bc5578283fd5b816020850160208301379081016020019190915292915050565b8035600281900b811461228157600080fd5b803561228181615e90565b6000610100808385031215614c0f578182fd5b614c1881615e58565b915050614c2482614b21565b8152614c3260208301614b21565b6020820152614c4360408301614b2c565b604082015260608201356060820152614c5e60808301614b21565b608082015260a08201356001600160401b03811115614c7c57600080fd5b614c8884828501614b7b565b60a083015250614c9a60c08301614b21565b60c0820152614cab60e08301614bdf565b60e082015292915050565b803561228181615e9f565b803561228181615eb4565b600060208284031215614cdd578081fd5b8135611ebe81615e7b565b600060208284031215614cf9578081fd5b8151611ebe81615e7b565b60008060408385031215614d16578081fd5b8235614d2181615e7b565b91506020830135614d3181615e7b565b809150509250929050565b60008060008060008060c08789031215614d54578182fd5b8635614d5f81615e7b565b95506020870135614d6f81615e7b565b94506040870135614d7f81615e7b565b9350614d8d60608801614bdf565b92506080870135614d9d81615e7b565b915060a0870135614dad81615e7b565b809150509295509295509295565b60008060008060008060a08789031215614dd3578384fd5b8635614dde81615e7b565b9550614dec60208801614b2c565b9450604087013593506060870135614e0381615e7b565b925060808701356001600160401b03811115614e1d578283fd5b614e2989828a01614b3c565b979a9699509497509295939492505050565b60008060008060008060a08789031215614e53578384fd5b8635614e5e81615e7b565b9550614e6c60208801614bdf565b9450614e7a60408801614bdf565b93506060870135614e0381615e9f565b600080600080600060a08688031215614ea1578283fd5b8535614eac81615e7b565b9450614eba60208701614bdf565b9350614ec860408701614bdf565b92506060860135614ed881615e9f565b91506080860135614ee881615e9f565b809150509295509295909350565b60008060008060008060c08789031215614f0e578384fd5b8635614f1981615e7b565b9550614f2760208801614bdf565b9450614f3560408801614bdf565b93506060870135614f4581615e9f565b92506080870135614d9d81615e9f565b600080600080600060808688031215614f6c578283fd5b8535614f7781615e7b565b9450602086013593506040860135925060608601356001600160401b03811115614f9f578182fd5b614fab88828901614b3c565b969995985093965092949392505050565b60008060208385031215614fce578182fd5b82356001600160401b0380821115614fe4578384fd5b818501915085601f830112614ff7578384fd5b813581811115615005578485fd5b8660208083028501011115615018578485fd5b60209290920196919550909350505050565b60006020828403121561503b578081fd5b5035919050565b600080600060608486031215615056578081fd5b833580600f0b8114615066578182fd5b925061507460208501614bdf565b915061508260408501614bdf565b90509250925092565b60006020828403121561509c578081fd5b81358060010b8114611ebe578182fd5b6000602082840312156150bd578081fd5b6106a482614bdf565b600080604083850312156150d8578182fd5b6150e183614bdf565b91506150ef60208401614bdf565b90509250929050565b60008060006060848603121561510c578081fd5b61511584614bdf565b925061512360208501614bdf565b9150604084013561513381615e9f565b809150509250925092565b60008060008060808587031215615153578182fd5b61515c85614bdf565b935061516a60208601614bdf565b9250604085013561517a81615e9f565b9150606085013561518a81615e7b565b939692955090935050565b6000806000606084860312156151a9578081fd5b6151b284614bdf565b92506151c060208501614bdf565b9150604084013590509250925092565b6000806000606084860312156151e4578081fd5b83516151ef81615e90565b602085015190935061520081615e7b565b604085015190925063ffffffff81168114615133578182fd5b60006020828403121561522a578081fd5b81356001600160401b0380821115615240578283fd5b9083019060a08286031215615253578283fd5b60405160a08101818110838211171561526857fe5b60405261527483614b21565b815261528260208401614b21565b602082015260408301356040820152606083013560608201526080830135828111156152ac578485fd5b6152b887828601614b7b565b60808301525095945050505050565b6000602082840312156152d8578081fd5b81356001600160401b038111156152ed578182fd5b6124e684828501614bfc565b60008082840361018081121561530d578283fd5b83356001600160401b03811115615322578384fd5b61532e86828701614bfc565b93505061016080601f1983011215615344578283fd5b61534d81615e58565b9150602085013582526040850135602083015261536c60608601614cc1565b604083015261537d60808601614b2c565b606083015260a0850135608083015261539860c08601614cb6565b60a08301526153a960e08601614cb6565b60c08301526101006153bc818701614cb6565b60e08401526101206153cf818801614bf1565b8285015261014091506153e3828801614b21565b908401526153f2868301614b2c565b9083015250919491935090915050565b600060208284031215615413578081fd5b8151611ebe81615e9f565b60008060408385031215615430578182fd5b825161543b81615e9f565b6020840151909250614d3181615e9f565b600080600060608486031215615460578081fd5b835161546b81615e9f565b602085015160409095015190969495509392505050565b600060208284031215615493578081fd5b813561ffff81168114611ebe578182fd5b6000602082840312156154b5578081fd5b8151611ebe81615eb4565b6000602082840312156154d1578081fd5b5051919050565b600080604083850312156154ea578182fd5b505080516020909101519092909150565b6001600160a01b03169052565b15159052565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452815b8181101561555d57602081850181015186830182015201615541565b8181111561556e5782602083870101525b50601f01601f19169290920160200192915050565b60020b9052565b60060b9052565b805182526020810151602083015260408101516155b1604084018261578c565b5060608101516155c46060840182615508565b506080810151608083015260a08101516155e160a084018261577f565b5060c08101516155f460c084018261577f565b5060e081015161560760e084018261577f565b506101008082015161561b8285018261558a565b505061012080820151615630828501826154fb565b505061014080820151611d6782850182615508565b6156508282516154fb565b60208101516156626020840182615583565b5060408101516156756040840182615583565b506060810151615688606084018261577f565b50608081015161569b608084018261577f565b5060a081015160a083015260c081015160c083015260e081015160e0830152610100808201516156cd828501826154fb565b5050610120808201516156e282850182615583565b505061014080820151611d678285018261577f565b600061010060018060a01b03808451168552806020850151166020860152604084015115156040860152606084015160608601528060808501511660808601525060a08301518160a086015261574f82860182615538565b91505060c083015161576460c08601826154fb565b5060e083015161577760e0860182615583565b509392505050565b6001600160801b03169052565b62ffffff169052565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b604080825283519082018190526000906020906060840190828701845b828110156157ff57815160060b845292840192908401906001016157e0565b50505083810382850152845180825285830191830190845b8181101561583c5783516001600160a01b031683529284019291840191600101615817565b5090979650505050505050565b928352602083019190915261ffff16604082015260600190565b90815260200190565b60029190910b815260200190565b918252602082015260400190565b6000858252846020830152606060408301526158a860608301848661550e565b9695505050505050565b94855260208501939093526001600160a01b039190911660408401526001600160801b0316606083015260020b608082015260a00190565b60069390930b83526001600160a01b0391909116602083015263ffffffff16604082015260600190565b9889526001600160a01b0397881660208a0152600296870b60408a01529490950b60608801526001600160801b039283166080880152911660a0860152831660c085015290821660e0840152166101008201526101200190565b98895260208901979097526001600160a01b03959095166040880152600293840b606088015291830b608087015290910b60a0850152600f0b60c084015260e08301526101008201526101200190565b60006102008201905087825286602083015285604083015284606083015283608083015261413060a0830184615645565b9788526020880196909652600294850b604088015292840b6060870152920b608085015261ffff91821660a08501521660c08301526001600160801b031660e08201526101000190565b958652600294850b602087015292840b6040860152920b6060840152608083019190915260a082015260c00190565b6000602082526106a46020830184615538565b60006060825260018060a01b03808651166060840152806020870151166080840152604086015160a0840152606086015160c0840152608086015160a060e0850152615acb610100850182615538565b959091166020840152505060029190910b604090910152919050565b9384526001600160a01b039283166020850152908216604084015216606082015260800190565b600061016086835260018060a01b0386511660208401526020860151615b3760408501826154fb565b506040860151615b4a60608501826154fb565b506060860151615b5d6080850182615583565b506080860151615b7060a085018261577f565b5060a0860151615b8360c085018261577f565b5060c0860151615b9660e08501826154fb565b5060e0860151610100818186015280880151610120860152505080610140840152614130818401858761550e565b6000610200615bd3838b615645565b610160830189905261018083018890526001600160a01b038781166101a085015286166101c08401526101e08301819052615c11818401858761550e565b9a9950505050505050505050565b94855260208501939093526001600160a01b03919091166040840152600290810b60608401520b608082015260a00190565b6000602082526106a460208301846156f7565b600060608252615c7760608301866156f7565b6001600160a01b039490941660208301525060029190910b604090910152919050565b6000610180808352615cae818401866156f7565b915050611ebe6020830184615591565b60006101a0808352615cd2818401876156f7565b915050615ce26020830185615591565b6001600160a01b0392909216610180919091015292915050565b6001600160801b0391909116815260200190565b6001600160801b039a909a168a52600f98890b60208b01529690970b60408901526060880194909452608087019290925260a086015260060b60c08501526001600160a01b031660e084015263ffffffff90911661010083015215156101208201526101400190565b6001600160801b0392831681529116602082015260400190565b6001600160801b0395861681526020810194909452604084019290925283166060830152909116608082015260a00190565b6001600160a01b0396909616865260029490940b602086015261ffff92831660408601529082166060850152166080830152151560a082015260c00190565b62ffffff91909116815260200190565b63ffffffff94909416845260069290920b60208401526001600160a01b031660408301521515606082015260800190565b65ffffffffffff91909116815260200190565b6040518181016001600160401b0381118282101715615e7357fe5b604052919050565b6001600160a01b038116811461178d57600080fd5b8060060b811461178d57600080fd5b6001600160801b038116811461178d57600080fd5b62ffffff8116811461178d57600080fdfea26469706673582212208259f71667ea509ad0140699f895cddafc625b856bb68a6d7710f5b84cbd4d9d64736f6c63430007060033","recompiledBytecode":"0x608060405234801561001057600080fd5b50615efb80620000216000396000f3fe608060405234801561001057600080fd5b506004361061029f5760003560e01c80636f89244c11610167578063b64cc67b116100ce578063e8bfe65c11610087578063e8bfe65c14610595578063eb4ad999146105a8578063f1e663a9146105bb578063f3058399146105c3578063f30dba93146105cb578063fe0106d5146105f45761029f565b8063b64cc67b1461054b578063c45a015514610553578063d0b06f5d1461055b578063d0c93a7c14610570578063d21220a714610585578063ddca3f431461058d5761029f565b8063a16368c911610120578063a16368c9146104e0578063a34123a7146104f3578063a38807f214610506578063a480ca7914610528578063a6f19c841461053b578063b056b49a146105435761029f565b80636f89244c1461047657806370cf754a14610489578063883bdbfd146104915780638f50914d146104b2578063918f8674146104c557806396518d4a146104cd5761029f565b80633850c7bd1161020b578063490e6cbc116101c4578063490e6cbc146104095780634f1eb3d81461041c578063514ea4bf1461042f5780635339c2961461045357806357806ada14610466578063648da8591461046e5761029f565b80633850c7bd146103af5780633ab04b20146103c95780633bf0c9fb146103d15780633c8a7d8d146103d957806346141319146103ec57806347ccca02146104015761029f565b80631f7c35681161025d5780631f7c3568146103285780632071d8841461033d578063252c09d714610350578063293833ba14610373578063313383741461038957806332148f671461039c5761029f565b8062d0139a146102a4578063044078e1146102c25780630dfe1681146102e2578063128acb08146102ea578063171852be1461030b5780631a68650214610313575b600080fd5b6102ac6105fc565b6040516102b99190615795565b60405180910390f35b6102d56102d03660046152f9565b61060d565b6040516102b99190615e04565b6102ac6106ad565b6102fd6102f8366004614dbb565b6106bc565b6040516102b992919061587a565b6102ac611362565b61031b6113ac565b6040516102b99190615cfc565b61033b610336366004614d04565b6113bb565b005b61033b61034b366004614d3c565b611522565b61036361035e36600461502a565b611678565b6040516102b99493929190615e14565b61037b6116bd565b6040516102b9929190615d79565b61037b610397366004614ef6565b6116d7565b61033b6103aa366004615482565b611710565b6103b7611790565b6040516102b996959493929190615dc5565b61031b6117d7565b6102ac6117e6565b6102fd6103e7366004614e3b565b6117f5565b6103f46119a0565b6040516102b99190615863565b6102ac6119a6565b61033b610417366004614f55565b6119b5565b61037b61042a366004614e8a565b611af4565b61044261043d36600461502a565b611b24565b6040516102b9959493929190615d93565b6103f461046136600461508b565b611b61565b6103f4611b73565b6103f4611b79565b6102fd61048436600461513e565b611b82565b61031b611bb7565b6104a461049f366004614fbc565b611bcd565b6040516102b99291906157c3565b61033b6104c0366004615042565b611c4f565b6103f4611d6d565b6102fd6104db3660046150c6565b611d74565b6103f46104ee366004615195565b611e19565b6102fd6105013660046150f8565b611ec5565b6105196105143660046150c6565b611ef1565b6040516102b9939291906158ea565b61037b610536366004614ccc565b61201d565b6102ac6120e0565b6103f46120ef565b6102d56120f5565b6102ac61217c565b61056361218b565b6040516102b99190615e45565b6105786121a0565b6040516102b9919061586c565b6102ac6121b0565b6102d56121bf565b6102d56105a3366004615219565b6121db565b6102d56105b63660046152c7565b612286565b6103f46122d9565b6103f46122e0565b6105de6105d93660046150ac565b6122e6565b6040516102b99a99989796959493929190615d10565b6103f4612360565b62010010546001600160a01b031681565b60008054604051631465b7d360e21b815273000000000000000000000000000000000000000091635196df4c9161065491879187916001600160a01b031690600401615cbe565b60206040518083038186803b15801561066c57600080fd5b505af4158015610680573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a491906154a4565b90505b92915050565b6001546001600160a01b031681565b6000806106e7866000141560405180604001604052806002815260200161415360f01b81525061238d565b6040805160c0810182526006546001600160a01b0381168252600160a01b8104600290810b810b900b602080840191909152600160b81b820461ffff90811684860152600160c81b830481166060850152600160d81b8304166080840152600160e81b90910460ff16151560a08301819052835180850190945260038452624c4f4b60e81b91840191909152909161077f919061238d565b610820886107cd5781600001516001600160a01b0316876001600160a01b03161180156107c8575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038816105b6107ff565b81600001516001600160a01b0316876001600160a01b03161080156107ff57506401000276a36001600160a01b038816115b6040518060400160405280600381526020016214d41360ea1b81525061238d565b6006805460ff60e81b191690556040805160e081018252600d546001600160801b039081168252600c541660208201524263ffffffff16818301526000606082018190526080820181905260a082018190528054925163d8f7529960e01b8152909260c08301916001600160a01b039091169063d8f75299906108a7903090600401615795565b60206040518083038186803b1580156108bf57600080fd5b505afa1580156108d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f79190614ce8565b6001600160a01b031681525090506000808913905060006040518061014001604052808b81526020016000815260200185600001516001600160a01b03168152602001856020015160020b8152602001600062ffffff1681526020016000151581526020018c6109695760085461096d565b6007545b815260200160006001600160801b0316815260200184600001516001600160801b0316815260200184602001516001600160801b03168152509050610a73604051806101000160405280336001600160a01b031681526020018e6001600160a01b031681526020018d151581526020018c81526020018b6001600160a01b031681526020018a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250938552505088516001600160a01b039081166020808601919091528a0151600290810b6040909501949094529154600c5460c08a0151841695949190931692600160b01b9004900b90506123b5565b62ffffff1660808201525b805115801590610aa45750886001600160a01b031681604001516001600160a01b031614155b15610e7157610ab1614a08565b60408201516001600160a01b031681526060820151600c54610ae091600f91600160b01b900460020b8f6124ee565b15156040830152600290810b810b60208301819052620d89e719910b1215610b1157620d89e7196020820152610b30565b6020810151620d89e860029190910b1315610b3057620d89e860208201525b610b3d8160200151612630565b6001600160a01b031660608201526040820151610bb3908d610b77578b6001600160a01b031683606001516001600160a01b031611610b91565b8b6001600160a01b031683606001516001600160a01b0316105b610b9f578260600151610ba1565b8b5b61010085015185516080870151612961565b60c085015260a084015260808301526001600160a01b031660408301528215610c1557610be98160c00151826080015101612b53565b825103825260a0810151610c0b90610c0090612b53565b602084015190612b65565b6020830152610c50565b610c228160a00151612b53565b825101825260c08101516080820151610c4a91610c3f9101612b53565b602084015190612b7b565b60208301525b6101008201516001600160801b031615610ca457600080610c808360c00151856101000151866101200151612b91565b60c0860180519290920190915260e0850180519091016001600160801b0316905250505b80606001516001600160a01b031682604001516001600160a01b03161415610e3057806040015115610e07578360a00151610d2e57610d0c846040015160008760200151886040015188600001518a606001516011612c30909695949392919063ffffffff16565b6001600160a01b03166080860152600690810b900b6060850152600160a08501525b8160a00151610d4757610d3f612dc2565b600160a08301525b6000610d9782602001518e610d5e57600754610d64565b8460c001515b8f610d73578560c00151610d77565b6008545b608089015160608a015160408b0151600954600e96959493929190612e86565b90508c15610dbf5780516000908103600f90810b810b8352602083018051909203810b900b90525b610dd28361010001518260000151612f75565b6001600160801b03166101008401526101208301516020820151610df69190612f75565b6001600160801b0316610120840152505b8b610e16578060200151610e1f565b60018160200151035b600290810b900b6060830152610e6b565b80600001516001600160a01b031682604001516001600160a01b031614610e6b57610e5e826040015161302b565b600290810b900b60608301525b50610a7e565b610f27604051806101000160405280336001600160a01b031681526020018e6001600160a01b031681526020018d151581526020018c81526020018b6001600160a01b031681526020018a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506040808501516001600160a01b039081166020840152606086015160020b919092015260c086015116908386600a613345565b836020015160020b816060015160020b14610ff557600080610f7586604001518660400151886020015188600001518a606001518b6080015160116134f9909695949392919063ffffffff16565b604085015160608601516006805461ffff60c81b1916600160c81b61ffff958616021761ffff60b81b1916600160b81b95909416949094029290921762ffffff60a01b1916600160a01b62ffffff60029490940b9390931692909202919091176001600160a01b0319166001600160a01b039091161790555061101a9050565b6040810151600680546001600160a01b0319166001600160a01b039092169190911790555b8061010001516001600160801b031683600001516001600160801b03161461106257610100810151600d80546001600160801b0319166001600160801b039092169190911790555b8061012001516001600160801b031683602001516001600160801b0316146110aa57610120810151600c80546001600160801b0319166001600160801b039092169190911790555b8a156110fa5760c081015160075560e08101516001600160801b0316156110f55760e0810151600a80546001600160801b031981166001600160801b03918216909301169190911790555b611140565b60c081015160085560e08101516001600160801b0316156111405760e0810151600a80546001600160801b03808216600160801b92839004821690940116029190911790555b8115158b15151461115957602081015181518b03611166565b80600001518a0381602001515b90965094508a1561123b57600085121561119557600254611195906001600160a01b03168d6000889003613694565b600061119f6137db565b60405163fa461e3360e01b8152909150339063fa461e33906111cb908a908a908e908e90600401615888565b600060405180830381600087803b1580156111e557600080fd5b505af11580156111f9573d6000803e3d6000fd5b505050506112356112086137db565b611212838a61385c565b11156040518060400160405280600381526020016249494160e81b81525061238d565b506112de565b600086121561125f5760015461125f906001600160a01b03168d6000899003613694565b600061126961386c565b60405163fa461e3360e01b8152909150339063fa461e3390611295908a908a908e908e90600401615888565b600060405180830381600087803b1580156112af57600080fd5b505af11580156112c3573d6000803e3d6000fd5b505050506112dc6112d261386c565b611212838961385c565b505b8b6001600160a01b0316336001600160a01b03167fc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca678888856040015186610100015187606001516040516113369594939291906158b2565b60405180910390a350506006805460ff60e81b1916600160e81b17905550919890975095505050505050565b6201001054600c546001600160a01b03909116906001600160801b031680156113a857600c546113a390600160801b900465ffffffffffff1642038261389d565b820191505b5090565b600d546001600160801b031681565b6113c36138bd565b60055460005460405163bc5bde7b60e01b81527300000000000000000000000000000000000000009263bc5bde7b9261140e926001600160a01b0392831692909116906004016157a9565b60006040518083038186803b15801561142657600080fd5b505af415801561143a573d6000803e3d6000fd5b50506003546001600160a01b0316159150611456905057600080fd5b600380546001600160a01b038085166001600160a01b0319928316811790935560048054918516919092161781556040805163f7413fef60e01b815290516000939263f7413fef9280820192602092909182900301818787803b1580156114bc57600080fd5b505af11580156114d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f491906154c0565b90506115158142600c60109054906101000a900465ffffffffffff166138fd565b61151d6139a6565b505050565b6000546001600160a01b031615801561154357506001600160a01b03861615155b61154c57600080fd5b600080546001600160a01b038089166001600160a01b0319928316179092556001805488841690831617905560028054878416908316178155600c80549187900b62ffffff16600160b01b0262ffffff60b01b1990921691909117905560058054928516929091169190911790557300000000000000000000000000000000000000006307219df660066011846115e28161302b565b886040518663ffffffff1660e01b8152600401611603959493929190615c1f565b60206040518083038186803b15801561161b57600080fd5b505af415801561162f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116539190615402565b600d80546001600160801b03928316600160801b029216919091179055505050505050565b60118161ffff811061168957600080fd5b015463ffffffff81169150600160201b810460060b90600160581b81046001600160a01b031690600160f81b900460ff1684565b600a546001600160801b0380821691600160801b90041682565b6000806116e26138bd565b6116ea6139bb565b6116f88888888888886139f0565b90925090506117056139a6565b965096945050505050565b6117186138bd565b604051633c7e0d5560e21b81527300000000000000000000000000000000000000009063f1f8355490611755906011906006908690600401615849565b60006040518083038186803b15801561176d57600080fd5b505af4158015611781573d6000803e3d6000fd5b5050505061178d6139a6565b50565b6006546001600160a01b03811690600160a01b810460020b9061ffff600160b81b8204811691600160c81b8104821691600160d81b8204169060ff600160e81b9091041686565b600c546001600160801b031681565b6005546001600160a01b031681565b6000806118006138bd565b600061180d898989613aad565b6001600160801b03871661014082015260405163025e487960e41b815290915060009081908190730000000000000000000000000000000000000000906325e487909061186d90601090600e90600f906011906006908c906004016159be565b60606040518083038186803b15801561188557600080fd5b505af4158015611899573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bd919061544c565b92509250925082600d60006101000a8154816001600160801b0302191690836001600160801b0316021790555073000000000000000000000000000000000000000063e0ed1c1a858484600160009054906101000a90046001600160a01b0316600260009054906101000a90046001600160a01b03168e8e6040518863ffffffff1660e01b81526004016119579796959493929190615bc4565b60006040518083038186803b15801561196f57600080fd5b505af4158015611983573d6000803e3d6000fd5b5050505061198f6139a6565b909b909a5098505050505050505050565b60085481565b6004546001600160a01b031681565b6119bd6138bd565b60408051610120810182526001546001600160a01b039081168252600280548216602084015260008054831684860152600c54600160b01b8104830b90920b6060850152600d546001600160801b03908116608086015290911660a084015290881660c083015260e082018790526101008201869052915163b79fa2e360e01b815282917300000000000000000000000000000000000000009163b79fa2e391611a7191600a919089908990600401615b0e565b604080518083038186803b158015611a8857600080fd5b505af4158015611a9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac091906154d8565b90925090508115611ad45760078054830190555b8015611ae35760088054820190555b611aeb6139a6565b50505050505050565b600080611aff6138bd565b611b0d8787878787336139f0565b9092509050611b1a6139a6565b9550959350505050565b60106020526000908152604090208054600182015460028301546003909301546001600160801b0392831693919281811691600160801b90041685565b600f6020526000908152604090205481565b60095481565b6110d360f21b81565b600080611b8d6138bd565b611b956139bb565b611ba186868686613b43565b9092509050611bae6139a6565b94509492505050565b600d54600160801b90046001600160801b031681565b606080611c434285858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600654600d54601195949350600160a01b820460020b925061ffff600160b81b83048116926001600160801b0390921691600160c81b900416613c34565b915091505b9250929050565b611c576138bd565b611c5f613d8c565b600654600160a01b9004600290810b9083810b9082900b12801590611c8957508160020b8160020b125b15611ccd57611c96612dc2565b600c54611cac906001600160801b031685612f75565b600c80546001600160801b0319166001600160801b03929092169190911790555b73000000000000000000000000000000000000000063c3846f716010600e600460009054906101000a90046001600160a01b03168787878b6007546008546040518a63ffffffff1660e01b8152600401611d2f9998979695949392919061596e565b60006040518083038186803b158015611d4757600080fd5b505af4158015611d5b573d6000803e3d6000fd5b50505050611d676139a6565b50505050565b620f424081565b60065460075460085460405163b76224fb60e01b815260009384937300000000000000000000000000000000000000009363b76224fb93611dca93600e938b938b93600160a01b90930460020b92600401615a39565b604080518083038186803b158015611de157600080fd5b505af4158015611df5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4391906154d8565b60065460095460405163bf4efc0760e01b81526000927300000000000000000000000000000000000000009263bf4efc0792611e6b92600e928a928a92600160a01b900460020b918a91600401615a39565b60206040518083038186803b158015611e8357600080fd5b505af4158015611e97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebb91906154c0565b90505b9392505050565b600080611ed06138bd565b611edc85858533613b43565b9092509050611ee96139a6565b935093915050565b6040805160c0810182526006546001600160a01b0381168252600160a01b8104600290810b810b900b60208301819052600160b81b820461ffff908116848601819052600160c81b8404821660608601819052600160d81b85049092166080860152600160e81b90930460ff16151560a0850152600d549451633e0d664760e11b815260009586958695909473000000000000000000000000000000000000000094637c1acc8e94611fbf94600e946011948f948f94919390916001600160801b03909116906004016159ef565b60606040518083038186803b158015611fd757600080fd5b505af4158015611feb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200f91906151d0565b935093509350509250925092565b6000806120286138bd565b612030613d8c565b60015460025460405163152245cf60e11b815273000000000000000000000000000000000000000092632a448b9e9261207f92600a9289926001600160a01b0391821692911690600401615ae7565b604080518083038186803b15801561209657600080fd5b505af41580156120aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ce919061541e565b90925090506120db6139a6565b915091565b6003546001600160a01b031681565b600b5481565b600080546040516348cf7a4360e01b81526001600160a01b03909116906348cf7a4390612126903090600401615795565b60206040518083038186803b15801561213e57600080fd5b505afa158015612152573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217691906154a4565b90505b90565b6000546001600160a01b031681565b600c54600160801b900465ffffffffffff1681565b600c54600160b01b900460020b81565b6002546001600160a01b031681565b60006121c9614a44565b3381526121d581612286565b91505090565b60008054600c54604051633082eea360e01b815273000000000000000000000000000000000000000092633082eea39261222e9287926001600160a01b031691600160b01b900460020b90600401615a7b565b60206040518083038186803b15801561224657600080fd5b505af415801561225a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227e91906154a4565b90505b919050565b60008054600c5460405163099f15f760e01b81527300000000000000000000000000000000000000009263099f15f79261222e9287926001600160a01b031691600160b01b900460020b90600401615c64565b620186a081565b60075481565b600e602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160801b03851695600160801b909504600f90810b9594900b9390600681900b90600160381b81046001600160a01b031690600160d81b810463ffffffff1690600160f81b900460ff168a565b600061236a6138bd565b612372613d8c565b61237a612dc2565b600b549050600b600090556121796139a6565b808261151d5760405162461bcd60e51b81526004016123ac9190615a68565b60405180910390fd5b60006001600160a01b0385161561246757604051631a7cd7eb60e31b81526000906001600160a01b0387169063d3e6bf58906123f5908890600401615c51565b602060405180830381600087803b15801561240f57600080fd5b505af1158015612423573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244791906154a4565b905062ffffff8116156124655761245d81613dbd565b9150506124e6565b505b604051631c06e0e160e11b81526001600160a01b0384169063380dc1c29061249390859060040161586c565b60206040518083038186803b1580156124ab57600080fd5b505afa1580156124bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e391906154a4565b90505b949350505050565b60008060008460020b8660020b8161250257fe5b05905060008660020b12801561252957508460020b8660020b8161252257fe5b0760020b15155b1561253357600019015b83156125a85760008061254583613dd7565b600182810b810b600090815260208d9052604090205460ff83169190911b8001600019019081168015159750929450909250908561258a57888360ff1686030261259d565b8861259482613de9565b840360ff168603025b965050505050612626565b6000806125b783600101613dd7565b91509150600060018260ff166001901b031990506000818b60008660010b60010b815260200190815260200160002054169050806000141595508561260957888360ff0360ff1686600101010261261f565b888361261483613e88565b0360ff168660010101025b9650505050505b5094509492505050565b60008060008360020b12612647578260020b61264f565b8260020b6000035b9050620d89e881111561268d576040805162461bcd60e51b81526020600482015260016024820152601560fa1b604482015290519081900360640190fd5b6000600182166126a157600160801b6126b3565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff16905060028216156126e7576ffff97272373d413259a46990580e213a0260801c5b6004821615612706576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612725576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612744576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612763576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612782576fff2ea16466c96a3843ec78b326b528610260801c5b60808216156127a1576ffe5dee046a99a2a811c461f1969c30530260801c5b6101008216156127c1576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b6102008216156127e1576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612801576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612821576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612841576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612861576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612881576f70d869a156d2a1b890bb3df62baf32f70260801c5b6180008216156128a1576f31be135f97d08fd981231505542fcfa60260801c5b620100008216156128c2576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b620200008216156128e2576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612901576d2216e584f5fa1ea926041bedfe980260801c5b6208000082161561291e576b048a170391f7dc42444e8fa20260801c5b60008460020b131561293957806000198161293557fe5b0490505b600160201b81061561294c57600161294f565b60005b60ff16602082901c0192505050919050565b60008080806001600160a01b03808916908a1610158187128015906129e657600061299a8989620f42400362ffffff16620f4240613f71565b9050826129b3576129ae8c8c8c6001614020565b6129c0565b6129c08b8d8c6001614090565b95508581106129d1578a96506129e0565b6129dd8c8b838661413b565b96505b50612a30565b816129fd576129f88b8b8b6000614090565b612a0a565b612a0a8a8c8b6000614020565b9350838860000310612a1e57899550612a30565b612a2d8b8a8a60000385614187565b95505b6001600160a01b038a8116908716148215612a9357808015612a4f5750815b612a6557612a60878d8c6001614090565b612a67565b855b9550808015612a74575081155b612a8a57612a85878d8c6000614020565b612a8c565b845b9450612add565b808015612a9d5750815b612ab357612aae8c888c6001614020565b612ab5565b855b9550808015612ac2575081155b612ad857612ad38c888c6000614090565b612ada565b845b94505b81158015612aed57508860000385115b15612af9578860000394505b818015612b1857508a6001600160a01b0316876001600160a01b031614155b15612b27578589039350612b44565b612b41868962ffffff168a620f42400362ffffff166141d3565b93505b50505095509550955095915050565b6000600160ff1b82106113a857600080fd5b808203828113156000831215146106a757600080fd5b818101828112156000831215146106a757600080fd5b600080826001600160801b0316846001600160801b03161415612bb5575083611ee9565b6001600160801b038316612bf857600080612bd187600061420d565b91509150612bed82600160801b886001600160801b0316613f71565b93509150611ee99050565b600080612c0687878761423b565b91509150612c2482600160801b8789036001600160801b0316613f71565b97909650945050505050565b60008063ffffffff8716612cd6576000898661ffff1661ffff8110612c5157fe5b60408051608081018252919092015463ffffffff808216808452600160201b8304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508a1614612cc257612cbf818a8988614275565b90505b806020015181604001519250925050612db6565b868803600080612ceb8c8c858c8c8c8c614318565b91509150816000015163ffffffff168363ffffffff161415612d1d578160200151826040015194509450505050612db6565b805163ffffffff84811691161415612d45578060200151816040015194509450505050612db6565b8151815160208085015190840151918390039286039163ffffffff80841692908516910360060b81612d7357fe5b05028460200151018263ffffffff168263ffffffff1686604001518660400151036001600160a01b03160281612da557fe5b048560400151019650965050505050505b97509795505050505050565b600c54429065ffffffffffff600160801b9091048116908216811415612de9575050612e84565b6003546001600160a01b031680612e0257505050612e84565b6000816001600160a01b031663f7413fef6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612e3f57600080fd5b505af1158015612e53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e7791906154c0565b9050611d678185856138fd565b565b612e8e614a87565b600297880b880b60009081526020998a5260409020978801805490970390965560038701805490950390945560048601805490940390935560058501805463ffffffff600160d81b6001600160a01b03600160381b808504821690970316909502670100000000000000600160d81b031990921691909117600681810b90940390930b66ffffffffffffff1666ffffffffffffff1990931692909217838104831690940390911690910263ffffffff60d81b199092169190911790558154600160801b9004600f90810b810b810b8252600190920154820b820b90910b9181019190915290565b60008082600f0b1215612fda57826001600160801b03168260000384039150816001600160801b031610612fd5576040805162461bcd60e51b81526020600482015260026024820152614c5360f01b604482015290519081900360640190fd5b6106a7565b826001600160801b03168284019150816001600160801b031610156106a7576040805162461bcd60e51b81526020600482015260026024820152614c4160f01b604482015290519081900360640190fd5b60006401000276a36001600160a01b03831610801590613067575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038316105b61309c576040805162461bcd60e51b81526020600482015260016024820152602960f91b604482015290519081900360640190fd5b640100000000600160c01b03602083901b166001600160801b03811160071b81811c6001600160401b03811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c9790881196179094179092171790911717176080811061312f57607f810383901c9150613139565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c600160381b161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b1461333657886001600160a01b031661331a82612630565b6001600160a01b0316111561332f5781613331565b805b613338565b815b9998505050505050505050565b6001600160a01b038516613358576134f2565b60006001600160a01b03861663a991dd8b866133748787614512565b6040518363ffffffff1660e01b8152600401613391929190615c9a565b602060405180830381600087803b1580156133ab57600080fd5b505af11580156133bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e391906154a4565b905062ffffff81166133f557506134f2565b6133fe81613dbd565b9050600080866060015113905060008161341c578560200151613425565b85602001516000035b9050600061343c8262ffffff8616620f42406141d3565b60208801805182019052905082156134a05787604001511561347b5784546001600160801b03600160801b80830482168401821602911617855561349b565b84546001600160801b038082168301166001600160801b03199091161785555b6134ed565b8760400151156134ce5784546001600160801b038082168301166001600160801b03199091161785556134ed565b84546001600160801b03600160801b8083048216840182160291161785555b505050505b5050505050565b6000806000898961ffff1661ffff811061350f57fe5b60408051608081018252919092015463ffffffff808216808452600160201b8304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508916141561357e5788859250925050612db6565b8461ffff168461ffff1611801561359f57506001850361ffff168961ffff16145b156135ac578391506135b0565b8491505b8161ffff168960010161ffff16816135c457fe5b0692506135d381898989614275565b8a8461ffff1661ffff81106135e457fe5b825191018054602084015160408501516060909501511515600160f81b026001600160f81b036001600160a01b03909616600160581b027fff0000000000000000000000000000000000000000ffffffffffffffffffffff60069390930b66ffffffffffffff16600160201b026affffffffffffff000000001963ffffffff90971663ffffffff199095169490941795909516929092171692909217929092161790555097509795505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b602083106137105780518252601f1990920191602091820191016136f1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613772576040519150601f19603f3d011682016040523d82523d6000602084013e613777565b606091505b50915091508180156137a55750805115806137a557508080602001905160208110156137a257600080fd5b50515b6134f2576040805162461bcd60e51b81526020600482015260026024820152612a2360f11b604482015290519081900360640190fd5b6001546040516370a0823160e01b81526000916001600160a01b0316906370a082319061380c903090600401615795565b60206040518083038186803b15801561382457600080fd5b505afa158015613838573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217691906154c0565b808201828110156106a757600080fd5b6002546040516370a0823160e01b81526000916001600160a01b0316906370a082319061380c903090600401615795565b6000816001600160801b0316608084901b816138b557fe5b049392505050565b6006546040805180820190915260038152624c4f4b60e81b60208201526138ee91600160e81b900460ff169061238d565b6006805460ff60e81b19169055565b600c546001600160801b031680156139705761392784600160801b836001600160801b0316613f71565b60098054909101905561394465ffffffffffff838503168261389d565b6201001080546001600160a01b031981166001600160a01b039182169390930116919091179055613979565b600b8054850190555b5050600c805465ffffffffffff909216600160801b0265ffffffffffff60801b1990921691909117905550565b6006805460ff60e81b1916600160e81b179055565b6004805460408051808201909152918252631393919560e21b6020830152612e84916001600160a01b0390911633149061238d565b6001546002546040516309426dd160e41b8152600092839273000000000000000000000000000000000000000092639426dd1092613a4f926010928e928e928e928e928e928e926001600160a01b039283169290911690600401615914565b604080518083038186803b158015613a6657600080fd5b505af4158015613a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a9e919061541e565b91509150965096945050505050565b613ab5614a9e565b5060408051610160810182526001600160a01b039485168152600293840b602082015291830b90820152600d546001600160801b038082166060840152600160801b90910416608082015260075460a082015260085460c082015260095460e0820152600354909216610100830152600c54600160b01b9004810b900b610120820152600061014082015290565b6000806000613b53848888613aad565b6001600160801b0386166101408201526040516377998a5760e01b815290915060009081908190730000000000000000000000000000000000000000906377998a5790613bb390601090600e90600f906011906006908c906004016159be565b60606040518083038186803b158015613bcb57600080fd5b505af4158015613bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c03919061544c565b600d80546001600160801b0319166001600160801b0394909416939093179092559b909a5098505050505050505050565b60608060008361ffff1611613c74576040805162461bcd60e51b81526020600482015260016024820152604960f81b604482015290519081900360640190fd5b86516001600160401b0381118015613c8b57600080fd5b50604051908082528060200260200182016040528015613cb5578160200160208202803683370190505b50915086516001600160401b0381118015613ccf57600080fd5b50604051908082528060200260200182016040528015613cf9578160200160208202803683370190505b50905060005b8751811015613d7f57613d2a8a8a8a8481518110613d1957fe5b60200260200101518a8a8a8a612c30565b848381518110613d3657fe5b60200260200101848481518110613d4957fe5b60200260200101826001600160a01b03166001600160a01b03168152508260060b60060b81525050508080600101915050613cff565b5097509795505050505050565b6003546040805180820190915260028152614e4760f01b6020820152612e84916001600160a01b031633149061238d565b6000620186a062ffffff8316106113a857620186a061227e565b60020b600881901d9161010090910790565b6000808211613df757600080fd5b600160801b8210613e0a57608091821c91015b680100000000000000008210613e2257604091821c91015b600160201b8210613e3557602091821c91015b620100008210613e4757601091821c91015b6101008210613e5857600891821c91015b60108210613e6857600491821c91015b60048210613e7857600291821c91015b6002821061228157600101919050565b6000808211613e9657600080fd5b5060ff6001600160801b03821615613eb157607f1901613eb9565b608082901c91505b6001600160401b03821615613ed157603f1901613ed9565b604082901c91505b63ffffffff821615613eee57601f1901613ef6565b602082901c91505b61ffff821615613f0957600f1901613f11565b601082901c91505b60ff821615613f235760071901613f2b565b600882901c91505b600f821615613f3d5760031901613f45565b600482901c91505b6003821615613f575760011901613f5f565b600282901c91505b60018216156122815760001901919050565b6000808060001985870986860292508281109083900303905080613fa75760008411613f9c57600080fd5b508290049050611ebe565b808411613fb357600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b6000836001600160a01b0316856001600160a01b03161115614040579293925b8161406d57614068836001600160801b03168686036001600160a01b0316600160601b613f71565b6124e3565b6124e3836001600160801b03168686036001600160a01b0316600160601b6141d3565b6000836001600160a01b0316856001600160a01b031611156140b0579293925b600160601b600160e01b03606084901b166001600160a01b0386860381169087166140da57600080fd5b8361410a57866001600160a01b03166140fd8383896001600160a01b0316613f71565b8161410457fe5b04614130565b6141306141218383896001600160a01b03166141d3565b886001600160a01b03166145cc565b979650505050505050565b600080856001600160a01b03161161415257600080fd5b6000846001600160801b03161161416857600080fd5b8161417a5761406885858560016145d7565b6124e385858560016146b0565b600080856001600160a01b03161161419e57600080fd5b6000846001600160801b0316116141b457600080fd5b816141c65761406885858560006146b0565b6124e385858560006145d7565b60006141e0848484613f71565b9050600082806141ec57fe5b8486091115611ebe57600019811061420357600080fd5b6001019392505050565b600080600061422c8561421e6120f5565b62ffffff16620f42406141d3565b94859003959390940193505050565b60008061425b85846001600160801b0316866001600160801b03166141d3565b90506142698186038261420d565b90969095509350505050565b61427d614afa565b600085600001518503905060405180608001604052808663ffffffff1681526020018263ffffffff168660020b0288602001510160060b81526020016000856001600160801b0316116142d15760016142d3565b845b6001600160801b031663ffffffff60801b608085901b16816142f157fe5b048860400151016001600160a01b0316815260200160011515815250915050949350505050565b614320614afa565b614328614afa565b888561ffff1661ffff811061433957fe5b60408051608081018252919092015463ffffffff8116808352600160201b8204600690810b810b900b6020840152600160581b82046001600160a01b031693830193909352600160f81b900460ff1615156060820152925061439d90899089614793565b156143d5578663ffffffff16826000015163ffffffff1614156143bf57612db6565b816143cc83898988614275565b91509150612db6565b888361ffff168660010161ffff16816143ea57fe5b0661ffff1661ffff81106143fa57fe5b60408051608081018252929091015463ffffffff81168352600160201b8104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082018190529092506144af57604080516080810182528a5463ffffffff81168252600160201b8104600690810b810b900b6020830152600160581b81046001600160a01b031692820192909252600160f81b90910460ff161515606082015291505b6144be88836000015189614793565b6144f5576040805162461bcd60e51b815260206004820152600360248201526213d31160ea1b604482015290519081900360640190fd5b6145028989898887614854565b9150915097509795505050505050565b61451a614a9e565b6040518061016001604052808460000151815260200184602001518152602001846080015162ffffff1681526020018460a00151151581526020018460c0015181526020018460e001516001600160801b031681526020018461010001516001600160801b031681526020018461012001516001600160801b03168152602001836060015160060b815260200183608001516001600160a01b031681526020018360a001511515815250905092915050565b808204910615150190565b600081156146425760006001600160a01b0384111561460d5761460884600160601b876001600160801b0316613f71565b614625565b6001600160801b038516606085901b8161462357fe5b045b905061245d61463d6001600160a01b0388168361385c565b6149f2565b60006001600160a01b038411156146705761466b84600160601b876001600160801b03166141d3565b614687565b614687606085901b6001600160801b0387166145cc565b905080866001600160a01b03161161469e57600080fd5b6001600160a01b0386160390506124e6565b6000826146be5750836124e6565b600160601b600160e01b03606085901b16821561474c576001600160a01b038616848102908582816146ec57fe5b04141561471d5781810182811061471b5761471183896001600160a01b0316836141d3565b93505050506124e6565b505b6147438261473e878a6001600160a01b0316868161473757fe5b049061385c565b6145cc565b925050506124e6565b6001600160a01b0386168481029085828161476357fe5b0414801561477057508082115b61477957600080fd5b80820361471161463d846001600160a01b038b16846141d3565b60008363ffffffff168363ffffffff16111580156147bd57508363ffffffff168263ffffffff1611155b156147d9578163ffffffff168363ffffffff1611159050611ebe565b60008463ffffffff168463ffffffff1611614800578363ffffffff16600160201b01614808565b8363ffffffff165b64ffffffffff16905060008563ffffffff168463ffffffff1611614838578363ffffffff16600160201b01614840565b8363ffffffff165b64ffffffffff169091111595945050505050565b61485c614afa565b614864614afa565b60008361ffff168560010161ffff168161487a57fe5b0661ffff169050600060018561ffff16830103905060005b506002818301048961ffff871682816148a757fe5b0661ffff81106148b357fe5b60408051608081018252929091015463ffffffff81168352600160201b8104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b9091041615156060820181905290955061491d57806001019250614892565b898661ffff16826001018161492e57fe5b0661ffff811061493a57fe5b60408051608081018252929091015463ffffffff81168352600160201b8104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082015285519094506000906149a4908b908b614793565b90508080156149bd57506149bd8a8a8760000151614793565b156149c857506149e5565b806149d8576001820392506149df565b8160010193505b50614892565b5050509550959350505050565b806001600160a01b038116811461228157600080fd5b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b604080516101008101825260008082526020820181905291810182905260608082018390526080820183905260a082015260c0810182905260e081019190915290565b604080518082019091526000808252602082015290565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b803561228181615e7b565b8035801515811461228157600080fd5b60008083601f840112614b4d578182fd5b5081356001600160401b03811115614b63578182fd5b602083019150836020828501011115611c4857600080fd5b600082601f830112614b8b578081fd5b81356001600160401b03811115614b9e57fe5b614bb1601f8201601f1916602001615e58565b818152846020838601011115614bc5578283fd5b816020850160208301379081016020019190915292915050565b8035600281900b811461228157600080fd5b803561228181615e90565b6000610100808385031215614c0f578182fd5b614c1881615e58565b915050614c2482614b21565b8152614c3260208301614b21565b6020820152614c4360408301614b2c565b604082015260608201356060820152614c5e60808301614b21565b608082015260a08201356001600160401b03811115614c7c57600080fd5b614c8884828501614b7b565b60a083015250614c9a60c08301614b21565b60c0820152614cab60e08301614bdf565b60e082015292915050565b803561228181615e9f565b803561228181615eb4565b600060208284031215614cdd578081fd5b8135611ebe81615e7b565b600060208284031215614cf9578081fd5b8151611ebe81615e7b565b60008060408385031215614d16578081fd5b8235614d2181615e7b565b91506020830135614d3181615e7b565b809150509250929050565b60008060008060008060c08789031215614d54578182fd5b8635614d5f81615e7b565b95506020870135614d6f81615e7b565b94506040870135614d7f81615e7b565b9350614d8d60608801614bdf565b92506080870135614d9d81615e7b565b915060a0870135614dad81615e7b565b809150509295509295509295565b60008060008060008060a08789031215614dd3578384fd5b8635614dde81615e7b565b9550614dec60208801614b2c565b9450604087013593506060870135614e0381615e7b565b925060808701356001600160401b03811115614e1d578283fd5b614e2989828a01614b3c565b979a9699509497509295939492505050565b60008060008060008060a08789031215614e53578384fd5b8635614e5e81615e7b565b9550614e6c60208801614bdf565b9450614e7a60408801614bdf565b93506060870135614e0381615e9f565b600080600080600060a08688031215614ea1578283fd5b8535614eac81615e7b565b9450614eba60208701614bdf565b9350614ec860408701614bdf565b92506060860135614ed881615e9f565b91506080860135614ee881615e9f565b809150509295509295909350565b60008060008060008060c08789031215614f0e578384fd5b8635614f1981615e7b565b9550614f2760208801614bdf565b9450614f3560408801614bdf565b93506060870135614f4581615e9f565b92506080870135614d9d81615e9f565b600080600080600060808688031215614f6c578283fd5b8535614f7781615e7b565b9450602086013593506040860135925060608601356001600160401b03811115614f9f578182fd5b614fab88828901614b3c565b969995985093965092949392505050565b60008060208385031215614fce578182fd5b82356001600160401b0380821115614fe4578384fd5b818501915085601f830112614ff7578384fd5b813581811115615005578485fd5b8660208083028501011115615018578485fd5b60209290920196919550909350505050565b60006020828403121561503b578081fd5b5035919050565b600080600060608486031215615056578081fd5b833580600f0b8114615066578182fd5b925061507460208501614bdf565b915061508260408501614bdf565b90509250925092565b60006020828403121561509c578081fd5b81358060010b8114611ebe578182fd5b6000602082840312156150bd578081fd5b6106a482614bdf565b600080604083850312156150d8578182fd5b6150e183614bdf565b91506150ef60208401614bdf565b90509250929050565b60008060006060848603121561510c578081fd5b61511584614bdf565b925061512360208501614bdf565b9150604084013561513381615e9f565b809150509250925092565b60008060008060808587031215615153578182fd5b61515c85614bdf565b935061516a60208601614bdf565b9250604085013561517a81615e9f565b9150606085013561518a81615e7b565b939692955090935050565b6000806000606084860312156151a9578081fd5b6151b284614bdf565b92506151c060208501614bdf565b9150604084013590509250925092565b6000806000606084860312156151e4578081fd5b83516151ef81615e90565b602085015190935061520081615e7b565b604085015190925063ffffffff81168114615133578182fd5b60006020828403121561522a578081fd5b81356001600160401b0380821115615240578283fd5b9083019060a08286031215615253578283fd5b60405160a08101818110838211171561526857fe5b60405261527483614b21565b815261528260208401614b21565b602082015260408301356040820152606083013560608201526080830135828111156152ac578485fd5b6152b887828601614b7b565b60808301525095945050505050565b6000602082840312156152d8578081fd5b81356001600160401b038111156152ed578182fd5b6124e684828501614bfc565b60008082840361018081121561530d578283fd5b83356001600160401b03811115615322578384fd5b61532e86828701614bfc565b93505061016080601f1983011215615344578283fd5b61534d81615e58565b9150602085013582526040850135602083015261536c60608601614cc1565b604083015261537d60808601614b2c565b606083015260a0850135608083015261539860c08601614cb6565b60a08301526153a960e08601614cb6565b60c08301526101006153bc818701614cb6565b60e08401526101206153cf818801614bf1565b8285015261014091506153e3828801614b21565b908401526153f2868301614b2c565b9083015250919491935090915050565b600060208284031215615413578081fd5b8151611ebe81615e9f565b60008060408385031215615430578182fd5b825161543b81615e9f565b6020840151909250614d3181615e9f565b600080600060608486031215615460578081fd5b835161546b81615e9f565b602085015160409095015190969495509392505050565b600060208284031215615493578081fd5b813561ffff81168114611ebe578182fd5b6000602082840312156154b5578081fd5b8151611ebe81615eb4565b6000602082840312156154d1578081fd5b5051919050565b600080604083850312156154ea578182fd5b505080516020909101519092909150565b6001600160a01b03169052565b15159052565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452815b8181101561555d57602081850181015186830182015201615541565b8181111561556e5782602083870101525b50601f01601f19169290920160200192915050565b60020b9052565b60060b9052565b805182526020810151602083015260408101516155b1604084018261578c565b5060608101516155c46060840182615508565b506080810151608083015260a08101516155e160a084018261577f565b5060c08101516155f460c084018261577f565b5060e081015161560760e084018261577f565b506101008082015161561b8285018261558a565b505061012080820151615630828501826154fb565b505061014080820151611d6782850182615508565b6156508282516154fb565b60208101516156626020840182615583565b5060408101516156756040840182615583565b506060810151615688606084018261577f565b50608081015161569b608084018261577f565b5060a081015160a083015260c081015160c083015260e081015160e0830152610100808201516156cd828501826154fb565b5050610120808201516156e282850182615583565b505061014080820151611d678285018261577f565b600061010060018060a01b03808451168552806020850151166020860152604084015115156040860152606084015160608601528060808501511660808601525060a08301518160a086015261574f82860182615538565b91505060c083015161576460c08601826154fb565b5060e083015161577760e0860182615583565b509392505050565b6001600160801b03169052565b62ffffff169052565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b604080825283519082018190526000906020906060840190828701845b828110156157ff57815160060b845292840192908401906001016157e0565b50505083810382850152845180825285830191830190845b8181101561583c5783516001600160a01b031683529284019291840191600101615817565b5090979650505050505050565b928352602083019190915261ffff16604082015260600190565b90815260200190565b60029190910b815260200190565b918252602082015260400190565b6000858252846020830152606060408301526158a860608301848661550e565b9695505050505050565b94855260208501939093526001600160a01b039190911660408401526001600160801b0316606083015260020b608082015260a00190565b60069390930b83526001600160a01b0391909116602083015263ffffffff16604082015260600190565b9889526001600160a01b0397881660208a0152600296870b60408a01529490950b60608801526001600160801b039283166080880152911660a0860152831660c085015290821660e0840152166101008201526101200190565b98895260208901979097526001600160a01b03959095166040880152600293840b606088015291830b608087015290910b60a0850152600f0b60c084015260e08301526101008201526101200190565b60006102008201905087825286602083015285604083015284606083015283608083015261413060a0830184615645565b9788526020880196909652600294850b604088015292840b6060870152920b608085015261ffff91821660a08501521660c08301526001600160801b031660e08201526101000190565b958652600294850b602087015292840b6040860152920b6060840152608083019190915260a082015260c00190565b6000602082526106a46020830184615538565b60006060825260018060a01b03808651166060840152806020870151166080840152604086015160a0840152606086015160c0840152608086015160a060e0850152615acb610100850182615538565b959091166020840152505060029190910b604090910152919050565b9384526001600160a01b039283166020850152908216604084015216606082015260800190565b600061016086835260018060a01b0386511660208401526020860151615b3760408501826154fb565b506040860151615b4a60608501826154fb565b506060860151615b5d6080850182615583565b506080860151615b7060a085018261577f565b5060a0860151615b8360c085018261577f565b5060c0860151615b9660e08501826154fb565b5060e0860151610100818186015280880151610120860152505080610140840152614130818401858761550e565b6000610200615bd3838b615645565b610160830189905261018083018890526001600160a01b038781166101a085015286166101c08401526101e08301819052615c11818401858761550e565b9a9950505050505050505050565b94855260208501939093526001600160a01b03919091166040840152600290810b60608401520b608082015260a00190565b6000602082526106a460208301846156f7565b600060608252615c7760608301866156f7565b6001600160a01b039490941660208301525060029190910b604090910152919050565b6000610180808352615cae818401866156f7565b915050611ebe6020830184615591565b60006101a0808352615cd2818401876156f7565b915050615ce26020830185615591565b6001600160a01b0392909216610180919091015292915050565b6001600160801b0391909116815260200190565b6001600160801b039a909a168a52600f98890b60208b01529690970b60408901526060880194909452608087019290925260a086015260060b60c08501526001600160a01b031660e084015263ffffffff90911661010083015215156101208201526101400190565b6001600160801b0392831681529116602082015260400190565b6001600160801b0395861681526020810194909452604084019290925283166060830152909116608082015260a00190565b6001600160a01b0396909616865260029490940b602086015261ffff92831660408601529082166060850152166080830152151560a082015260c00190565b62ffffff91909116815260200190565b63ffffffff94909416845260069290920b60208401526001600160a01b031660408301521515606082015260800190565b65ffffffffffff91909116815260200190565b6040518181016001600160401b0381118282101715615e7357fe5b604052919050565b6001600160a01b038116811461178d57600080fd5b8060060b811461178d57600080fd5b6001600160801b038116811461178d57600080fd5b62ffffff8116811461178d57600080fdfea2646970667358221220a469918fd754a61268a102489254f65c850a135863b7cb2abe1c81001a04ce3664736f6c63430007060033","sourceMap":"968:31805:0:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{"contracts/core/libraries/CLPoolNonSwapPath.sol":{"CLPoolNonSwapPath":[{"start":1601,"length":20},{"start":5113,"length":20},{"start":5597,"length":20},{"start":5960,"length":20},{"start":6231,"length":20},{"start":6413,"length":20},{"start":6756,"length":20},{"start":7408,"length":20},{"start":7602,"length":20},{"start":7762,"length":20},{"start":8096,"length":20},{"start":8294,"length":20},{"start":8722,"length":20},{"start":8893,"length":20},{"start":14891,"length":20},{"start":15261,"length":20}]}},"cborAuxdata":{"1":{"value":"0xa2646970667358221220a469918fd754a61268a102489254f65c850a135863b7cb2abe1c81001a04ce3664736f6c63430007060033","offset":24295}},"transformations":[{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":1601,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":5113,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":5597,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":5960,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":6231,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":6413,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":6756,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":7408,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":7602,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":7762,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":8096,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":8294,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":8722,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":8893,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":14891,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":15261,"reason":"library"},{"id":"1","type":"replace","offset":24295,"reason":"cborAuxdata"}],"transformationValues":{"libraries":{"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath":"0x1ad7a8703ebff81c0d753190938f228672ec7e42"},"cborAuxdata":{"1":"0xa26469706673582212208259f71667ea509ad0140699f895cddafc625b856bb68a6d7710f5b84cbd4d9d64736f6c63430007060033"}}},"runtimeBytecode":{"onchainBytecode":"0x608060405234801561001057600080fd5b506004361061029f5760003560e01c80636f89244c11610167578063b64cc67b116100ce578063e8bfe65c11610087578063e8bfe65c14610595578063eb4ad999146105a8578063f1e663a9146105bb578063f3058399146105c3578063f30dba93146105cb578063fe0106d5146105f45761029f565b8063b64cc67b1461054b578063c45a015514610553578063d0b06f5d1461055b578063d0c93a7c14610570578063d21220a714610585578063ddca3f431461058d5761029f565b8063a16368c911610120578063a16368c9146104e0578063a34123a7146104f3578063a38807f214610506578063a480ca7914610528578063a6f19c841461053b578063b056b49a146105435761029f565b80636f89244c1461047657806370cf754a14610489578063883bdbfd146104915780638f50914d146104b2578063918f8674146104c557806396518d4a146104cd5761029f565b80633850c7bd1161020b578063490e6cbc116101c4578063490e6cbc146104095780634f1eb3d81461041c578063514ea4bf1461042f5780635339c2961461045357806357806ada14610466578063648da8591461046e5761029f565b80633850c7bd146103af5780633ab04b20146103c95780633bf0c9fb146103d15780633c8a7d8d146103d957806346141319146103ec57806347ccca02146104015761029f565b80631f7c35681161025d5780631f7c3568146103285780632071d8841461033d578063252c09d714610350578063293833ba14610373578063313383741461038957806332148f671461039c5761029f565b8062d0139a146102a4578063044078e1146102c25780630dfe1681146102e2578063128acb08146102ea578063171852be1461030b5780631a68650214610313575b600080fd5b6102ac6105fc565b6040516102b99190615795565b60405180910390f35b6102d56102d03660046152f9565b61060d565b6040516102b99190615e04565b6102ac6106ad565b6102fd6102f8366004614dbb565b6106bc565b6040516102b992919061587a565b6102ac611362565b61031b6113ac565b6040516102b99190615cfc565b61033b610336366004614d04565b6113bb565b005b61033b61034b366004614d3c565b611522565b61036361035e36600461502a565b611678565b6040516102b99493929190615e14565b61037b6116bd565b6040516102b9929190615d79565b61037b610397366004614ef6565b6116d7565b61033b6103aa366004615482565b611710565b6103b7611790565b6040516102b996959493929190615dc5565b61031b6117d7565b6102ac6117e6565b6102fd6103e7366004614e3b565b6117f5565b6103f46119a0565b6040516102b99190615863565b6102ac6119a6565b61033b610417366004614f55565b6119b5565b61037b61042a366004614e8a565b611af4565b61044261043d36600461502a565b611b24565b6040516102b9959493929190615d93565b6103f461046136600461508b565b611b61565b6103f4611b73565b6103f4611b79565b6102fd61048436600461513e565b611b82565b61031b611bb7565b6104a461049f366004614fbc565b611bcd565b6040516102b99291906157c3565b61033b6104c0366004615042565b611c4f565b6103f4611d6d565b6102fd6104db3660046150c6565b611d74565b6103f46104ee366004615195565b611e19565b6102fd6105013660046150f8565b611ec5565b6105196105143660046150c6565b611ef1565b6040516102b9939291906158ea565b61037b610536366004614ccc565b61201d565b6102ac6120e0565b6103f46120ef565b6102d56120f5565b6102ac61217c565b61056361218b565b6040516102b99190615e45565b6105786121a0565b6040516102b9919061586c565b6102ac6121b0565b6102d56121bf565b6102d56105a3366004615219565b6121db565b6102d56105b63660046152c7565b612286565b6103f46122d9565b6103f46122e0565b6105de6105d93660046150ac565b6122e6565b6040516102b99a99989796959493929190615d10565b6103f4612360565b62010010546001600160a01b031681565b60008054604051631465b7d360e21b8152731ad7a8703ebff81c0d753190938f228672ec7e4291635196df4c9161065491879187916001600160a01b031690600401615cbe565b60206040518083038186803b15801561066c57600080fd5b505af4158015610680573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a491906154a4565b90505b92915050565b6001546001600160a01b031681565b6000806106e7866000141560405180604001604052806002815260200161415360f01b81525061238d565b6040805160c0810182526006546001600160a01b0381168252600160a01b8104600290810b810b900b602080840191909152600160b81b820461ffff90811684860152600160c81b830481166060850152600160d81b8304166080840152600160e81b90910460ff16151560a08301819052835180850190945260038452624c4f4b60e81b91840191909152909161077f919061238d565b610820886107cd5781600001516001600160a01b0316876001600160a01b03161180156107c8575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038816105b6107ff565b81600001516001600160a01b0316876001600160a01b03161080156107ff57506401000276a36001600160a01b038816115b6040518060400160405280600381526020016214d41360ea1b81525061238d565b6006805460ff60e81b191690556040805160e081018252600d546001600160801b039081168252600c541660208201524263ffffffff16818301526000606082018190526080820181905260a082018190528054925163d8f7529960e01b8152909260c08301916001600160a01b039091169063d8f75299906108a7903090600401615795565b60206040518083038186803b1580156108bf57600080fd5b505afa1580156108d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f79190614ce8565b6001600160a01b031681525090506000808913905060006040518061014001604052808b81526020016000815260200185600001516001600160a01b03168152602001856020015160020b8152602001600062ffffff1681526020016000151581526020018c6109695760085461096d565b6007545b815260200160006001600160801b0316815260200184600001516001600160801b0316815260200184602001516001600160801b03168152509050610a73604051806101000160405280336001600160a01b031681526020018e6001600160a01b031681526020018d151581526020018c81526020018b6001600160a01b031681526020018a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250938552505088516001600160a01b039081166020808601919091528a0151600290810b6040909501949094529154600c5460c08a0151841695949190931692600160b01b9004900b90506123b5565b62ffffff1660808201525b805115801590610aa45750886001600160a01b031681604001516001600160a01b031614155b15610e7157610ab1614a08565b60408201516001600160a01b031681526060820151600c54610ae091600f91600160b01b900460020b8f6124ee565b15156040830152600290810b810b60208301819052620d89e719910b1215610b1157620d89e7196020820152610b30565b6020810151620d89e860029190910b1315610b3057620d89e860208201525b610b3d8160200151612630565b6001600160a01b031660608201526040820151610bb3908d610b77578b6001600160a01b031683606001516001600160a01b031611610b91565b8b6001600160a01b031683606001516001600160a01b0316105b610b9f578260600151610ba1565b8b5b61010085015185516080870151612961565b60c085015260a084015260808301526001600160a01b031660408301528215610c1557610be98160c00151826080015101612b53565b825103825260a0810151610c0b90610c0090612b53565b602084015190612b65565b6020830152610c50565b610c228160a00151612b53565b825101825260c08101516080820151610c4a91610c3f9101612b53565b602084015190612b7b565b60208301525b6101008201516001600160801b031615610ca457600080610c808360c00151856101000151866101200151612b91565b60c0860180519290920190915260e0850180519091016001600160801b0316905250505b80606001516001600160a01b031682604001516001600160a01b03161415610e3057806040015115610e07578360a00151610d2e57610d0c846040015160008760200151886040015188600001518a606001516011612c30909695949392919063ffffffff16565b6001600160a01b03166080860152600690810b900b6060850152600160a08501525b8160a00151610d4757610d3f612dc2565b600160a08301525b6000610d9782602001518e610d5e57600754610d64565b8460c001515b8f610d73578560c00151610d77565b6008545b608089015160608a015160408b0151600954600e96959493929190612e86565b90508c15610dbf5780516000908103600f90810b810b8352602083018051909203810b900b90525b610dd28361010001518260000151612f75565b6001600160801b03166101008401526101208301516020820151610df69190612f75565b6001600160801b0316610120840152505b8b610e16578060200151610e1f565b60018160200151035b600290810b900b6060830152610e6b565b80600001516001600160a01b031682604001516001600160a01b031614610e6b57610e5e826040015161302b565b600290810b900b60608301525b50610a7e565b610f27604051806101000160405280336001600160a01b031681526020018e6001600160a01b031681526020018d151581526020018c81526020018b6001600160a01b031681526020018a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506040808501516001600160a01b039081166020840152606086015160020b919092015260c086015116908386600a613345565b836020015160020b816060015160020b14610ff557600080610f7586604001518660400151886020015188600001518a606001518b6080015160116134f9909695949392919063ffffffff16565b604085015160608601516006805461ffff60c81b1916600160c81b61ffff958616021761ffff60b81b1916600160b81b95909416949094029290921762ffffff60a01b1916600160a01b62ffffff60029490940b9390931692909202919091176001600160a01b0319166001600160a01b039091161790555061101a9050565b6040810151600680546001600160a01b0319166001600160a01b039092169190911790555b8061010001516001600160801b031683600001516001600160801b03161461106257610100810151600d80546001600160801b0319166001600160801b039092169190911790555b8061012001516001600160801b031683602001516001600160801b0316146110aa57610120810151600c80546001600160801b0319166001600160801b039092169190911790555b8a156110fa5760c081015160075560e08101516001600160801b0316156110f55760e0810151600a80546001600160801b031981166001600160801b03918216909301169190911790555b611140565b60c081015160085560e08101516001600160801b0316156111405760e0810151600a80546001600160801b03808216600160801b92839004821690940116029190911790555b8115158b15151461115957602081015181518b03611166565b80600001518a0381602001515b90965094508a1561123b57600085121561119557600254611195906001600160a01b03168d6000889003613694565b600061119f6137db565b60405163fa461e3360e01b8152909150339063fa461e33906111cb908a908a908e908e90600401615888565b600060405180830381600087803b1580156111e557600080fd5b505af11580156111f9573d6000803e3d6000fd5b505050506112356112086137db565b611212838a61385c565b11156040518060400160405280600381526020016249494160e81b81525061238d565b506112de565b600086121561125f5760015461125f906001600160a01b03168d6000899003613694565b600061126961386c565b60405163fa461e3360e01b8152909150339063fa461e3390611295908a908a908e908e90600401615888565b600060405180830381600087803b1580156112af57600080fd5b505af11580156112c3573d6000803e3d6000fd5b505050506112dc6112d261386c565b611212838961385c565b505b8b6001600160a01b0316336001600160a01b03167fc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca678888856040015186610100015187606001516040516113369594939291906158b2565b60405180910390a350506006805460ff60e81b1916600160e81b17905550919890975095505050505050565b6201001054600c546001600160a01b03909116906001600160801b031680156113a857600c546113a390600160801b900465ffffffffffff1642038261389d565b820191505b5090565b600d546001600160801b031681565b6113c36138bd565b60055460005460405163bc5bde7b60e01b8152731ad7a8703ebff81c0d753190938f228672ec7e429263bc5bde7b9261140e926001600160a01b0392831692909116906004016157a9565b60006040518083038186803b15801561142657600080fd5b505af415801561143a573d6000803e3d6000fd5b50506003546001600160a01b0316159150611456905057600080fd5b600380546001600160a01b038085166001600160a01b0319928316811790935560048054918516919092161781556040805163f7413fef60e01b815290516000939263f7413fef9280820192602092909182900301818787803b1580156114bc57600080fd5b505af11580156114d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f491906154c0565b90506115158142600c60109054906101000a900465ffffffffffff166138fd565b61151d6139a6565b505050565b6000546001600160a01b031615801561154357506001600160a01b03861615155b61154c57600080fd5b600080546001600160a01b038089166001600160a01b0319928316179092556001805488841690831617905560028054878416908316178155600c80549187900b62ffffff16600160b01b0262ffffff60b01b199092169190911790556005805492851692909116919091179055731ad7a8703ebff81c0d753190938f228672ec7e426307219df660066011846115e28161302b565b886040518663ffffffff1660e01b8152600401611603959493929190615c1f565b60206040518083038186803b15801561161b57600080fd5b505af415801561162f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116539190615402565b600d80546001600160801b03928316600160801b029216919091179055505050505050565b60118161ffff811061168957600080fd5b015463ffffffff81169150600160201b810460060b90600160581b81046001600160a01b031690600160f81b900460ff1684565b600a546001600160801b0380821691600160801b90041682565b6000806116e26138bd565b6116ea6139bb565b6116f88888888888886139f0565b90925090506117056139a6565b965096945050505050565b6117186138bd565b604051633c7e0d5560e21b8152731ad7a8703ebff81c0d753190938f228672ec7e429063f1f8355490611755906011906006908690600401615849565b60006040518083038186803b15801561176d57600080fd5b505af4158015611781573d6000803e3d6000fd5b5050505061178d6139a6565b50565b6006546001600160a01b03811690600160a01b810460020b9061ffff600160b81b8204811691600160c81b8104821691600160d81b8204169060ff600160e81b9091041686565b600c546001600160801b031681565b6005546001600160a01b031681565b6000806118006138bd565b600061180d898989613aad565b6001600160801b03871661014082015260405163025e487960e41b815290915060009081908190731ad7a8703ebff81c0d753190938f228672ec7e42906325e487909061186d90601090600e90600f906011906006908c906004016159be565b60606040518083038186803b15801561188557600080fd5b505af4158015611899573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bd919061544c565b92509250925082600d60006101000a8154816001600160801b0302191690836001600160801b03160217905550731ad7a8703ebff81c0d753190938f228672ec7e4263e0ed1c1a858484600160009054906101000a90046001600160a01b0316600260009054906101000a90046001600160a01b03168e8e6040518863ffffffff1660e01b81526004016119579796959493929190615bc4565b60006040518083038186803b15801561196f57600080fd5b505af4158015611983573d6000803e3d6000fd5b5050505061198f6139a6565b909b909a5098505050505050505050565b60085481565b6004546001600160a01b031681565b6119bd6138bd565b60408051610120810182526001546001600160a01b039081168252600280548216602084015260008054831684860152600c54600160b01b8104830b90920b6060850152600d546001600160801b03908116608086015290911660a084015290881660c083015260e082018790526101008201869052915163b79fa2e360e01b81528291731ad7a8703ebff81c0d753190938f228672ec7e429163b79fa2e391611a7191600a919089908990600401615b0e565b604080518083038186803b158015611a8857600080fd5b505af4158015611a9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac091906154d8565b90925090508115611ad45760078054830190555b8015611ae35760088054820190555b611aeb6139a6565b50505050505050565b600080611aff6138bd565b611b0d8787878787336139f0565b9092509050611b1a6139a6565b9550959350505050565b60106020526000908152604090208054600182015460028301546003909301546001600160801b0392831693919281811691600160801b90041685565b600f6020526000908152604090205481565b60095481565b6110d360f21b81565b600080611b8d6138bd565b611b956139bb565b611ba186868686613b43565b9092509050611bae6139a6565b94509492505050565b600d54600160801b90046001600160801b031681565b606080611c434285858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600654600d54601195949350600160a01b820460020b925061ffff600160b81b83048116926001600160801b0390921691600160c81b900416613c34565b915091505b9250929050565b611c576138bd565b611c5f613d8c565b600654600160a01b9004600290810b9083810b9082900b12801590611c8957508160020b8160020b125b15611ccd57611c96612dc2565b600c54611cac906001600160801b031685612f75565b600c80546001600160801b0319166001600160801b03929092169190911790555b731ad7a8703ebff81c0d753190938f228672ec7e4263c3846f716010600e600460009054906101000a90046001600160a01b03168787878b6007546008546040518a63ffffffff1660e01b8152600401611d2f9998979695949392919061596e565b60006040518083038186803b158015611d4757600080fd5b505af4158015611d5b573d6000803e3d6000fd5b50505050611d676139a6565b50505050565b620f424081565b60065460075460085460405163b76224fb60e01b81526000938493731ad7a8703ebff81c0d753190938f228672ec7e429363b76224fb93611dca93600e938b938b93600160a01b90930460020b92600401615a39565b604080518083038186803b158015611de157600080fd5b505af4158015611df5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4391906154d8565b60065460095460405163bf4efc0760e01b8152600092731ad7a8703ebff81c0d753190938f228672ec7e429263bf4efc0792611e6b92600e928a928a92600160a01b900460020b918a91600401615a39565b60206040518083038186803b158015611e8357600080fd5b505af4158015611e97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebb91906154c0565b90505b9392505050565b600080611ed06138bd565b611edc85858533613b43565b9092509050611ee96139a6565b935093915050565b6040805160c0810182526006546001600160a01b0381168252600160a01b8104600290810b810b900b60208301819052600160b81b820461ffff908116848601819052600160c81b8404821660608601819052600160d81b85049092166080860152600160e81b90930460ff16151560a0850152600d549451633e0d664760e11b8152600095869586959094731ad7a8703ebff81c0d753190938f228672ec7e4294637c1acc8e94611fbf94600e946011948f948f94919390916001600160801b03909116906004016159ef565b60606040518083038186803b158015611fd757600080fd5b505af4158015611feb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200f91906151d0565b935093509350509250925092565b6000806120286138bd565b612030613d8c565b60015460025460405163152245cf60e11b8152731ad7a8703ebff81c0d753190938f228672ec7e4292632a448b9e9261207f92600a9289926001600160a01b0391821692911690600401615ae7565b604080518083038186803b15801561209657600080fd5b505af41580156120aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ce919061541e565b90925090506120db6139a6565b915091565b6003546001600160a01b031681565b600b5481565b600080546040516348cf7a4360e01b81526001600160a01b03909116906348cf7a4390612126903090600401615795565b60206040518083038186803b15801561213e57600080fd5b505afa158015612152573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217691906154a4565b90505b90565b6000546001600160a01b031681565b600c54600160801b900465ffffffffffff1681565b600c54600160b01b900460020b81565b6002546001600160a01b031681565b60006121c9614a44565b3381526121d581612286565b91505090565b60008054600c54604051633082eea360e01b8152731ad7a8703ebff81c0d753190938f228672ec7e4292633082eea39261222e9287926001600160a01b031691600160b01b900460020b90600401615a7b565b60206040518083038186803b15801561224657600080fd5b505af415801561225a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227e91906154a4565b90505b919050565b60008054600c5460405163099f15f760e01b8152731ad7a8703ebff81c0d753190938f228672ec7e429263099f15f79261222e9287926001600160a01b031691600160b01b900460020b90600401615c64565b620186a081565b60075481565b600e602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160801b03851695600160801b909504600f90810b9594900b9390600681900b90600160381b81046001600160a01b031690600160d81b810463ffffffff1690600160f81b900460ff168a565b600061236a6138bd565b612372613d8c565b61237a612dc2565b600b549050600b600090556121796139a6565b808261151d5760405162461bcd60e51b81526004016123ac9190615a68565b60405180910390fd5b60006001600160a01b0385161561246757604051631a7cd7eb60e31b81526000906001600160a01b0387169063d3e6bf58906123f5908890600401615c51565b602060405180830381600087803b15801561240f57600080fd5b505af1158015612423573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244791906154a4565b905062ffffff8116156124655761245d81613dbd565b9150506124e6565b505b604051631c06e0e160e11b81526001600160a01b0384169063380dc1c29061249390859060040161586c565b60206040518083038186803b1580156124ab57600080fd5b505afa1580156124bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e391906154a4565b90505b949350505050565b60008060008460020b8660020b8161250257fe5b05905060008660020b12801561252957508460020b8660020b8161252257fe5b0760020b15155b1561253357600019015b83156125a85760008061254583613dd7565b600182810b810b600090815260208d9052604090205460ff83169190911b8001600019019081168015159750929450909250908561258a57888360ff1686030261259d565b8861259482613de9565b840360ff168603025b965050505050612626565b6000806125b783600101613dd7565b91509150600060018260ff166001901b031990506000818b60008660010b60010b815260200190815260200160002054169050806000141595508561260957888360ff0360ff1686600101010261261f565b888361261483613e88565b0360ff168660010101025b9650505050505b5094509492505050565b60008060008360020b12612647578260020b61264f565b8260020b6000035b9050620d89e881111561268d576040805162461bcd60e51b81526020600482015260016024820152601560fa1b604482015290519081900360640190fd5b6000600182166126a157600160801b6126b3565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff16905060028216156126e7576ffff97272373d413259a46990580e213a0260801c5b6004821615612706576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612725576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612744576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612763576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612782576fff2ea16466c96a3843ec78b326b528610260801c5b60808216156127a1576ffe5dee046a99a2a811c461f1969c30530260801c5b6101008216156127c1576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b6102008216156127e1576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612801576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612821576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612841576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612861576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612881576f70d869a156d2a1b890bb3df62baf32f70260801c5b6180008216156128a1576f31be135f97d08fd981231505542fcfa60260801c5b620100008216156128c2576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b620200008216156128e2576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612901576d2216e584f5fa1ea926041bedfe980260801c5b6208000082161561291e576b048a170391f7dc42444e8fa20260801c5b60008460020b131561293957806000198161293557fe5b0490505b600160201b81061561294c57600161294f565b60005b60ff16602082901c0192505050919050565b60008080806001600160a01b03808916908a1610158187128015906129e657600061299a8989620f42400362ffffff16620f4240613f71565b9050826129b3576129ae8c8c8c6001614020565b6129c0565b6129c08b8d8c6001614090565b95508581106129d1578a96506129e0565b6129dd8c8b838661413b565b96505b50612a30565b816129fd576129f88b8b8b6000614090565b612a0a565b612a0a8a8c8b6000614020565b9350838860000310612a1e57899550612a30565b612a2d8b8a8a60000385614187565b95505b6001600160a01b038a8116908716148215612a9357808015612a4f5750815b612a6557612a60878d8c6001614090565b612a67565b855b9550808015612a74575081155b612a8a57612a85878d8c6000614020565b612a8c565b845b9450612add565b808015612a9d5750815b612ab357612aae8c888c6001614020565b612ab5565b855b9550808015612ac2575081155b612ad857612ad38c888c6000614090565b612ada565b845b94505b81158015612aed57508860000385115b15612af9578860000394505b818015612b1857508a6001600160a01b0316876001600160a01b031614155b15612b27578589039350612b44565b612b41868962ffffff168a620f42400362ffffff166141d3565b93505b50505095509550955095915050565b6000600160ff1b82106113a857600080fd5b808203828113156000831215146106a757600080fd5b818101828112156000831215146106a757600080fd5b600080826001600160801b0316846001600160801b03161415612bb5575083611ee9565b6001600160801b038316612bf857600080612bd187600061420d565b91509150612bed82600160801b886001600160801b0316613f71565b93509150611ee99050565b600080612c0687878761423b565b91509150612c2482600160801b8789036001600160801b0316613f71565b97909650945050505050565b60008063ffffffff8716612cd6576000898661ffff1661ffff8110612c5157fe5b60408051608081018252919092015463ffffffff808216808452600160201b8304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508a1614612cc257612cbf818a8988614275565b90505b806020015181604001519250925050612db6565b868803600080612ceb8c8c858c8c8c8c614318565b91509150816000015163ffffffff168363ffffffff161415612d1d578160200151826040015194509450505050612db6565b805163ffffffff84811691161415612d45578060200151816040015194509450505050612db6565b8151815160208085015190840151918390039286039163ffffffff80841692908516910360060b81612d7357fe5b05028460200151018263ffffffff168263ffffffff1686604001518660400151036001600160a01b03160281612da557fe5b048560400151019650965050505050505b97509795505050505050565b600c54429065ffffffffffff600160801b9091048116908216811415612de9575050612e84565b6003546001600160a01b031680612e0257505050612e84565b6000816001600160a01b031663f7413fef6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612e3f57600080fd5b505af1158015612e53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e7791906154c0565b9050611d678185856138fd565b565b612e8e614a87565b600297880b880b60009081526020998a5260409020978801805490970390965560038701805490950390945560048601805490940390935560058501805463ffffffff600160d81b6001600160a01b03600160381b808504821690970316909502670100000000000000600160d81b031990921691909117600681810b90940390930b66ffffffffffffff1666ffffffffffffff1990931692909217838104831690940390911690910263ffffffff60d81b199092169190911790558154600160801b9004600f90810b810b810b8252600190920154820b820b90910b9181019190915290565b60008082600f0b1215612fda57826001600160801b03168260000384039150816001600160801b031610612fd5576040805162461bcd60e51b81526020600482015260026024820152614c5360f01b604482015290519081900360640190fd5b6106a7565b826001600160801b03168284019150816001600160801b031610156106a7576040805162461bcd60e51b81526020600482015260026024820152614c4160f01b604482015290519081900360640190fd5b60006401000276a36001600160a01b03831610801590613067575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038316105b61309c576040805162461bcd60e51b81526020600482015260016024820152602960f91b604482015290519081900360640190fd5b640100000000600160c01b03602083901b166001600160801b03811160071b81811c6001600160401b03811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c9790881196179094179092171790911717176080811061312f57607f810383901c9150613139565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c600160381b161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b1461333657886001600160a01b031661331a82612630565b6001600160a01b0316111561332f5781613331565b805b613338565b815b9998505050505050505050565b6001600160a01b038516613358576134f2565b60006001600160a01b03861663a991dd8b866133748787614512565b6040518363ffffffff1660e01b8152600401613391929190615c9a565b602060405180830381600087803b1580156133ab57600080fd5b505af11580156133bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e391906154a4565b905062ffffff81166133f557506134f2565b6133fe81613dbd565b9050600080866060015113905060008161341c578560200151613425565b85602001516000035b9050600061343c8262ffffff8616620f42406141d3565b60208801805182019052905082156134a05787604001511561347b5784546001600160801b03600160801b80830482168401821602911617855561349b565b84546001600160801b038082168301166001600160801b03199091161785555b6134ed565b8760400151156134ce5784546001600160801b038082168301166001600160801b03199091161785556134ed565b84546001600160801b03600160801b8083048216840182160291161785555b505050505b5050505050565b6000806000898961ffff1661ffff811061350f57fe5b60408051608081018252919092015463ffffffff808216808452600160201b8304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508916141561357e5788859250925050612db6565b8461ffff168461ffff1611801561359f57506001850361ffff168961ffff16145b156135ac578391506135b0565b8491505b8161ffff168960010161ffff16816135c457fe5b0692506135d381898989614275565b8a8461ffff1661ffff81106135e457fe5b825191018054602084015160408501516060909501511515600160f81b026001600160f81b036001600160a01b03909616600160581b027fff0000000000000000000000000000000000000000ffffffffffffffffffffff60069390930b66ffffffffffffff16600160201b026affffffffffffff000000001963ffffffff90971663ffffffff199095169490941795909516929092171692909217929092161790555097509795505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b602083106137105780518252601f1990920191602091820191016136f1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613772576040519150601f19603f3d011682016040523d82523d6000602084013e613777565b606091505b50915091508180156137a55750805115806137a557508080602001905160208110156137a257600080fd5b50515b6134f2576040805162461bcd60e51b81526020600482015260026024820152612a2360f11b604482015290519081900360640190fd5b6001546040516370a0823160e01b81526000916001600160a01b0316906370a082319061380c903090600401615795565b60206040518083038186803b15801561382457600080fd5b505afa158015613838573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217691906154c0565b808201828110156106a757600080fd5b6002546040516370a0823160e01b81526000916001600160a01b0316906370a082319061380c903090600401615795565b6000816001600160801b0316608084901b816138b557fe5b049392505050565b6006546040805180820190915260038152624c4f4b60e81b60208201526138ee91600160e81b900460ff169061238d565b6006805460ff60e81b19169055565b600c546001600160801b031680156139705761392784600160801b836001600160801b0316613f71565b60098054909101905561394465ffffffffffff838503168261389d565b6201001080546001600160a01b031981166001600160a01b039182169390930116919091179055613979565b600b8054850190555b5050600c805465ffffffffffff909216600160801b0265ffffffffffff60801b1990921691909117905550565b6006805460ff60e81b1916600160e81b179055565b6004805460408051808201909152918252631393919560e21b6020830152612e84916001600160a01b0390911633149061238d565b6001546002546040516309426dd160e41b81526000928392731ad7a8703ebff81c0d753190938f228672ec7e4292639426dd1092613a4f926010928e928e928e928e928e928e926001600160a01b039283169290911690600401615914565b604080518083038186803b158015613a6657600080fd5b505af4158015613a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a9e919061541e565b91509150965096945050505050565b613ab5614a9e565b5060408051610160810182526001600160a01b039485168152600293840b602082015291830b90820152600d546001600160801b038082166060840152600160801b90910416608082015260075460a082015260085460c082015260095460e0820152600354909216610100830152600c54600160b01b9004810b900b610120820152600061014082015290565b6000806000613b53848888613aad565b6001600160801b0386166101408201526040516377998a5760e01b815290915060009081908190731ad7a8703ebff81c0d753190938f228672ec7e42906377998a5790613bb390601090600e90600f906011906006908c906004016159be565b60606040518083038186803b158015613bcb57600080fd5b505af4158015613bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c03919061544c565b600d80546001600160801b0319166001600160801b0394909416939093179092559b909a5098505050505050505050565b60608060008361ffff1611613c74576040805162461bcd60e51b81526020600482015260016024820152604960f81b604482015290519081900360640190fd5b86516001600160401b0381118015613c8b57600080fd5b50604051908082528060200260200182016040528015613cb5578160200160208202803683370190505b50915086516001600160401b0381118015613ccf57600080fd5b50604051908082528060200260200182016040528015613cf9578160200160208202803683370190505b50905060005b8751811015613d7f57613d2a8a8a8a8481518110613d1957fe5b60200260200101518a8a8a8a612c30565b848381518110613d3657fe5b60200260200101848481518110613d4957fe5b60200260200101826001600160a01b03166001600160a01b03168152508260060b60060b81525050508080600101915050613cff565b5097509795505050505050565b6003546040805180820190915260028152614e4760f01b6020820152612e84916001600160a01b031633149061238d565b6000620186a062ffffff8316106113a857620186a061227e565b60020b600881901d9161010090910790565b6000808211613df757600080fd5b600160801b8210613e0a57608091821c91015b680100000000000000008210613e2257604091821c91015b600160201b8210613e3557602091821c91015b620100008210613e4757601091821c91015b6101008210613e5857600891821c91015b60108210613e6857600491821c91015b60048210613e7857600291821c91015b6002821061228157600101919050565b6000808211613e9657600080fd5b5060ff6001600160801b03821615613eb157607f1901613eb9565b608082901c91505b6001600160401b03821615613ed157603f1901613ed9565b604082901c91505b63ffffffff821615613eee57601f1901613ef6565b602082901c91505b61ffff821615613f0957600f1901613f11565b601082901c91505b60ff821615613f235760071901613f2b565b600882901c91505b600f821615613f3d5760031901613f45565b600482901c91505b6003821615613f575760011901613f5f565b600282901c91505b60018216156122815760001901919050565b6000808060001985870986860292508281109083900303905080613fa75760008411613f9c57600080fd5b508290049050611ebe565b808411613fb357600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b6000836001600160a01b0316856001600160a01b03161115614040579293925b8161406d57614068836001600160801b03168686036001600160a01b0316600160601b613f71565b6124e3565b6124e3836001600160801b03168686036001600160a01b0316600160601b6141d3565b6000836001600160a01b0316856001600160a01b031611156140b0579293925b600160601b600160e01b03606084901b166001600160a01b0386860381169087166140da57600080fd5b8361410a57866001600160a01b03166140fd8383896001600160a01b0316613f71565b8161410457fe5b04614130565b6141306141218383896001600160a01b03166141d3565b886001600160a01b03166145cc565b979650505050505050565b600080856001600160a01b03161161415257600080fd5b6000846001600160801b03161161416857600080fd5b8161417a5761406885858560016145d7565b6124e385858560016146b0565b600080856001600160a01b03161161419e57600080fd5b6000846001600160801b0316116141b457600080fd5b816141c65761406885858560006146b0565b6124e385858560006145d7565b60006141e0848484613f71565b9050600082806141ec57fe5b8486091115611ebe57600019811061420357600080fd5b6001019392505050565b600080600061422c8561421e6120f5565b62ffffff16620f42406141d3565b94859003959390940193505050565b60008061425b85846001600160801b0316866001600160801b03166141d3565b90506142698186038261420d565b90969095509350505050565b61427d614afa565b600085600001518503905060405180608001604052808663ffffffff1681526020018263ffffffff168660020b0288602001510160060b81526020016000856001600160801b0316116142d15760016142d3565b845b6001600160801b031663ffffffff60801b608085901b16816142f157fe5b048860400151016001600160a01b0316815260200160011515815250915050949350505050565b614320614afa565b614328614afa565b888561ffff1661ffff811061433957fe5b60408051608081018252919092015463ffffffff8116808352600160201b8204600690810b810b900b6020840152600160581b82046001600160a01b031693830193909352600160f81b900460ff1615156060820152925061439d90899089614793565b156143d5578663ffffffff16826000015163ffffffff1614156143bf57612db6565b816143cc83898988614275565b91509150612db6565b888361ffff168660010161ffff16816143ea57fe5b0661ffff1661ffff81106143fa57fe5b60408051608081018252929091015463ffffffff81168352600160201b8104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082018190529092506144af57604080516080810182528a5463ffffffff81168252600160201b8104600690810b810b900b6020830152600160581b81046001600160a01b031692820192909252600160f81b90910460ff161515606082015291505b6144be88836000015189614793565b6144f5576040805162461bcd60e51b815260206004820152600360248201526213d31160ea1b604482015290519081900360640190fd5b6145028989898887614854565b9150915097509795505050505050565b61451a614a9e565b6040518061016001604052808460000151815260200184602001518152602001846080015162ffffff1681526020018460a00151151581526020018460c0015181526020018460e001516001600160801b031681526020018461010001516001600160801b031681526020018461012001516001600160801b03168152602001836060015160060b815260200183608001516001600160a01b031681526020018360a001511515815250905092915050565b808204910615150190565b600081156146425760006001600160a01b0384111561460d5761460884600160601b876001600160801b0316613f71565b614625565b6001600160801b038516606085901b8161462357fe5b045b905061245d61463d6001600160a01b0388168361385c565b6149f2565b60006001600160a01b038411156146705761466b84600160601b876001600160801b03166141d3565b614687565b614687606085901b6001600160801b0387166145cc565b905080866001600160a01b03161161469e57600080fd5b6001600160a01b0386160390506124e6565b6000826146be5750836124e6565b600160601b600160e01b03606085901b16821561474c576001600160a01b038616848102908582816146ec57fe5b04141561471d5781810182811061471b5761471183896001600160a01b0316836141d3565b93505050506124e6565b505b6147438261473e878a6001600160a01b0316868161473757fe5b049061385c565b6145cc565b925050506124e6565b6001600160a01b0386168481029085828161476357fe5b0414801561477057508082115b61477957600080fd5b80820361471161463d846001600160a01b038b16846141d3565b60008363ffffffff168363ffffffff16111580156147bd57508363ffffffff168263ffffffff1611155b156147d9578163ffffffff168363ffffffff1611159050611ebe565b60008463ffffffff168463ffffffff1611614800578363ffffffff16600160201b01614808565b8363ffffffff165b64ffffffffff16905060008563ffffffff168463ffffffff1611614838578363ffffffff16600160201b01614840565b8363ffffffff165b64ffffffffff169091111595945050505050565b61485c614afa565b614864614afa565b60008361ffff168560010161ffff168161487a57fe5b0661ffff169050600060018561ffff16830103905060005b506002818301048961ffff871682816148a757fe5b0661ffff81106148b357fe5b60408051608081018252929091015463ffffffff81168352600160201b8104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b9091041615156060820181905290955061491d57806001019250614892565b898661ffff16826001018161492e57fe5b0661ffff811061493a57fe5b60408051608081018252929091015463ffffffff81168352600160201b8104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082015285519094506000906149a4908b908b614793565b90508080156149bd57506149bd8a8a8760000151614793565b156149c857506149e5565b806149d8576001820392506149df565b8160010193505b50614892565b5050509550959350505050565b806001600160a01b038116811461228157600080fd5b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b604080516101008101825260008082526020820181905291810182905260608082018390526080820183905260a082015260c0810182905260e081019190915290565b604080518082019091526000808252602082015290565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b803561228181615e7b565b8035801515811461228157600080fd5b60008083601f840112614b4d578182fd5b5081356001600160401b03811115614b63578182fd5b602083019150836020828501011115611c4857600080fd5b600082601f830112614b8b578081fd5b81356001600160401b03811115614b9e57fe5b614bb1601f8201601f1916602001615e58565b818152846020838601011115614bc5578283fd5b816020850160208301379081016020019190915292915050565b8035600281900b811461228157600080fd5b803561228181615e90565b6000610100808385031215614c0f578182fd5b614c1881615e58565b915050614c2482614b21565b8152614c3260208301614b21565b6020820152614c4360408301614b2c565b604082015260608201356060820152614c5e60808301614b21565b608082015260a08201356001600160401b03811115614c7c57600080fd5b614c8884828501614b7b565b60a083015250614c9a60c08301614b21565b60c0820152614cab60e08301614bdf565b60e082015292915050565b803561228181615e9f565b803561228181615eb4565b600060208284031215614cdd578081fd5b8135611ebe81615e7b565b600060208284031215614cf9578081fd5b8151611ebe81615e7b565b60008060408385031215614d16578081fd5b8235614d2181615e7b565b91506020830135614d3181615e7b565b809150509250929050565b60008060008060008060c08789031215614d54578182fd5b8635614d5f81615e7b565b95506020870135614d6f81615e7b565b94506040870135614d7f81615e7b565b9350614d8d60608801614bdf565b92506080870135614d9d81615e7b565b915060a0870135614dad81615e7b565b809150509295509295509295565b60008060008060008060a08789031215614dd3578384fd5b8635614dde81615e7b565b9550614dec60208801614b2c565b9450604087013593506060870135614e0381615e7b565b925060808701356001600160401b03811115614e1d578283fd5b614e2989828a01614b3c565b979a9699509497509295939492505050565b60008060008060008060a08789031215614e53578384fd5b8635614e5e81615e7b565b9550614e6c60208801614bdf565b9450614e7a60408801614bdf565b93506060870135614e0381615e9f565b600080600080600060a08688031215614ea1578283fd5b8535614eac81615e7b565b9450614eba60208701614bdf565b9350614ec860408701614bdf565b92506060860135614ed881615e9f565b91506080860135614ee881615e9f565b809150509295509295909350565b60008060008060008060c08789031215614f0e578384fd5b8635614f1981615e7b565b9550614f2760208801614bdf565b9450614f3560408801614bdf565b93506060870135614f4581615e9f565b92506080870135614d9d81615e9f565b600080600080600060808688031215614f6c578283fd5b8535614f7781615e7b565b9450602086013593506040860135925060608601356001600160401b03811115614f9f578182fd5b614fab88828901614b3c565b969995985093965092949392505050565b60008060208385031215614fce578182fd5b82356001600160401b0380821115614fe4578384fd5b818501915085601f830112614ff7578384fd5b813581811115615005578485fd5b8660208083028501011115615018578485fd5b60209290920196919550909350505050565b60006020828403121561503b578081fd5b5035919050565b600080600060608486031215615056578081fd5b833580600f0b8114615066578182fd5b925061507460208501614bdf565b915061508260408501614bdf565b90509250925092565b60006020828403121561509c578081fd5b81358060010b8114611ebe578182fd5b6000602082840312156150bd578081fd5b6106a482614bdf565b600080604083850312156150d8578182fd5b6150e183614bdf565b91506150ef60208401614bdf565b90509250929050565b60008060006060848603121561510c578081fd5b61511584614bdf565b925061512360208501614bdf565b9150604084013561513381615e9f565b809150509250925092565b60008060008060808587031215615153578182fd5b61515c85614bdf565b935061516a60208601614bdf565b9250604085013561517a81615e9f565b9150606085013561518a81615e7b565b939692955090935050565b6000806000606084860312156151a9578081fd5b6151b284614bdf565b92506151c060208501614bdf565b9150604084013590509250925092565b6000806000606084860312156151e4578081fd5b83516151ef81615e90565b602085015190935061520081615e7b565b604085015190925063ffffffff81168114615133578182fd5b60006020828403121561522a578081fd5b81356001600160401b0380821115615240578283fd5b9083019060a08286031215615253578283fd5b60405160a08101818110838211171561526857fe5b60405261527483614b21565b815261528260208401614b21565b602082015260408301356040820152606083013560608201526080830135828111156152ac578485fd5b6152b887828601614b7b565b60808301525095945050505050565b6000602082840312156152d8578081fd5b81356001600160401b038111156152ed578182fd5b6124e684828501614bfc565b60008082840361018081121561530d578283fd5b83356001600160401b03811115615322578384fd5b61532e86828701614bfc565b93505061016080601f1983011215615344578283fd5b61534d81615e58565b9150602085013582526040850135602083015261536c60608601614cc1565b604083015261537d60808601614b2c565b606083015260a0850135608083015261539860c08601614cb6565b60a08301526153a960e08601614cb6565b60c08301526101006153bc818701614cb6565b60e08401526101206153cf818801614bf1565b8285015261014091506153e3828801614b21565b908401526153f2868301614b2c565b9083015250919491935090915050565b600060208284031215615413578081fd5b8151611ebe81615e9f565b60008060408385031215615430578182fd5b825161543b81615e9f565b6020840151909250614d3181615e9f565b600080600060608486031215615460578081fd5b835161546b81615e9f565b602085015160409095015190969495509392505050565b600060208284031215615493578081fd5b813561ffff81168114611ebe578182fd5b6000602082840312156154b5578081fd5b8151611ebe81615eb4565b6000602082840312156154d1578081fd5b5051919050565b600080604083850312156154ea578182fd5b505080516020909101519092909150565b6001600160a01b03169052565b15159052565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452815b8181101561555d57602081850181015186830182015201615541565b8181111561556e5782602083870101525b50601f01601f19169290920160200192915050565b60020b9052565b60060b9052565b805182526020810151602083015260408101516155b1604084018261578c565b5060608101516155c46060840182615508565b506080810151608083015260a08101516155e160a084018261577f565b5060c08101516155f460c084018261577f565b5060e081015161560760e084018261577f565b506101008082015161561b8285018261558a565b505061012080820151615630828501826154fb565b505061014080820151611d6782850182615508565b6156508282516154fb565b60208101516156626020840182615583565b5060408101516156756040840182615583565b506060810151615688606084018261577f565b50608081015161569b608084018261577f565b5060a081015160a083015260c081015160c083015260e081015160e0830152610100808201516156cd828501826154fb565b5050610120808201516156e282850182615583565b505061014080820151611d678285018261577f565b600061010060018060a01b03808451168552806020850151166020860152604084015115156040860152606084015160608601528060808501511660808601525060a08301518160a086015261574f82860182615538565b91505060c083015161576460c08601826154fb565b5060e083015161577760e0860182615583565b509392505050565b6001600160801b03169052565b62ffffff169052565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b604080825283519082018190526000906020906060840190828701845b828110156157ff57815160060b845292840192908401906001016157e0565b50505083810382850152845180825285830191830190845b8181101561583c5783516001600160a01b031683529284019291840191600101615817565b5090979650505050505050565b928352602083019190915261ffff16604082015260600190565b90815260200190565b60029190910b815260200190565b918252602082015260400190565b6000858252846020830152606060408301526158a860608301848661550e565b9695505050505050565b94855260208501939093526001600160a01b039190911660408401526001600160801b0316606083015260020b608082015260a00190565b60069390930b83526001600160a01b0391909116602083015263ffffffff16604082015260600190565b9889526001600160a01b0397881660208a0152600296870b60408a01529490950b60608801526001600160801b039283166080880152911660a0860152831660c085015290821660e0840152166101008201526101200190565b98895260208901979097526001600160a01b03959095166040880152600293840b606088015291830b608087015290910b60a0850152600f0b60c084015260e08301526101008201526101200190565b60006102008201905087825286602083015285604083015284606083015283608083015261413060a0830184615645565b9788526020880196909652600294850b604088015292840b6060870152920b608085015261ffff91821660a08501521660c08301526001600160801b031660e08201526101000190565b958652600294850b602087015292840b6040860152920b6060840152608083019190915260a082015260c00190565b6000602082526106a46020830184615538565b60006060825260018060a01b03808651166060840152806020870151166080840152604086015160a0840152606086015160c0840152608086015160a060e0850152615acb610100850182615538565b959091166020840152505060029190910b604090910152919050565b9384526001600160a01b039283166020850152908216604084015216606082015260800190565b600061016086835260018060a01b0386511660208401526020860151615b3760408501826154fb565b506040860151615b4a60608501826154fb565b506060860151615b5d6080850182615583565b506080860151615b7060a085018261577f565b5060a0860151615b8360c085018261577f565b5060c0860151615b9660e08501826154fb565b5060e0860151610100818186015280880151610120860152505080610140840152614130818401858761550e565b6000610200615bd3838b615645565b610160830189905261018083018890526001600160a01b038781166101a085015286166101c08401526101e08301819052615c11818401858761550e565b9a9950505050505050505050565b94855260208501939093526001600160a01b03919091166040840152600290810b60608401520b608082015260a00190565b6000602082526106a460208301846156f7565b600060608252615c7760608301866156f7565b6001600160a01b039490941660208301525060029190910b604090910152919050565b6000610180808352615cae818401866156f7565b915050611ebe6020830184615591565b60006101a0808352615cd2818401876156f7565b915050615ce26020830185615591565b6001600160a01b0392909216610180919091015292915050565b6001600160801b0391909116815260200190565b6001600160801b039a909a168a52600f98890b60208b01529690970b60408901526060880194909452608087019290925260a086015260060b60c08501526001600160a01b031660e084015263ffffffff90911661010083015215156101208201526101400190565b6001600160801b0392831681529116602082015260400190565b6001600160801b0395861681526020810194909452604084019290925283166060830152909116608082015260a00190565b6001600160a01b0396909616865260029490940b602086015261ffff92831660408601529082166060850152166080830152151560a082015260c00190565b62ffffff91909116815260200190565b63ffffffff94909416845260069290920b60208401526001600160a01b031660408301521515606082015260800190565b65ffffffffffff91909116815260200190565b6040518181016001600160401b0381118282101715615e7357fe5b604052919050565b6001600160a01b038116811461178d57600080fd5b8060060b811461178d57600080fd5b6001600160801b038116811461178d57600080fd5b62ffffff8116811461178d57600080fdfea26469706673582212208259f71667ea509ad0140699f895cddafc625b856bb68a6d7710f5b84cbd4d9d64736f6c63430007060033","recompiledBytecode":"0x608060405234801561001057600080fd5b506004361061029f5760003560e01c80636f89244c11610167578063b64cc67b116100ce578063e8bfe65c11610087578063e8bfe65c14610595578063eb4ad999146105a8578063f1e663a9146105bb578063f3058399146105c3578063f30dba93146105cb578063fe0106d5146105f45761029f565b8063b64cc67b1461054b578063c45a015514610553578063d0b06f5d1461055b578063d0c93a7c14610570578063d21220a714610585578063ddca3f431461058d5761029f565b8063a16368c911610120578063a16368c9146104e0578063a34123a7146104f3578063a38807f214610506578063a480ca7914610528578063a6f19c841461053b578063b056b49a146105435761029f565b80636f89244c1461047657806370cf754a14610489578063883bdbfd146104915780638f50914d146104b2578063918f8674146104c557806396518d4a146104cd5761029f565b80633850c7bd1161020b578063490e6cbc116101c4578063490e6cbc146104095780634f1eb3d81461041c578063514ea4bf1461042f5780635339c2961461045357806357806ada14610466578063648da8591461046e5761029f565b80633850c7bd146103af5780633ab04b20146103c95780633bf0c9fb146103d15780633c8a7d8d146103d957806346141319146103ec57806347ccca02146104015761029f565b80631f7c35681161025d5780631f7c3568146103285780632071d8841461033d578063252c09d714610350578063293833ba14610373578063313383741461038957806332148f671461039c5761029f565b8062d0139a146102a4578063044078e1146102c25780630dfe1681146102e2578063128acb08146102ea578063171852be1461030b5780631a68650214610313575b600080fd5b6102ac6105fc565b6040516102b99190615795565b60405180910390f35b6102d56102d03660046152f9565b61060d565b6040516102b99190615e04565b6102ac6106ad565b6102fd6102f8366004614dbb565b6106bc565b6040516102b992919061587a565b6102ac611362565b61031b6113ac565b6040516102b99190615cfc565b61033b610336366004614d04565b6113bb565b005b61033b61034b366004614d3c565b611522565b61036361035e36600461502a565b611678565b6040516102b99493929190615e14565b61037b6116bd565b6040516102b9929190615d79565b61037b610397366004614ef6565b6116d7565b61033b6103aa366004615482565b611710565b6103b7611790565b6040516102b996959493929190615dc5565b61031b6117d7565b6102ac6117e6565b6102fd6103e7366004614e3b565b6117f5565b6103f46119a0565b6040516102b99190615863565b6102ac6119a6565b61033b610417366004614f55565b6119b5565b61037b61042a366004614e8a565b611af4565b61044261043d36600461502a565b611b24565b6040516102b9959493929190615d93565b6103f461046136600461508b565b611b61565b6103f4611b73565b6103f4611b79565b6102fd61048436600461513e565b611b82565b61031b611bb7565b6104a461049f366004614fbc565b611bcd565b6040516102b99291906157c3565b61033b6104c0366004615042565b611c4f565b6103f4611d6d565b6102fd6104db3660046150c6565b611d74565b6103f46104ee366004615195565b611e19565b6102fd6105013660046150f8565b611ec5565b6105196105143660046150c6565b611ef1565b6040516102b9939291906158ea565b61037b610536366004614ccc565b61201d565b6102ac6120e0565b6103f46120ef565b6102d56120f5565b6102ac61217c565b61056361218b565b6040516102b99190615e45565b6105786121a0565b6040516102b9919061586c565b6102ac6121b0565b6102d56121bf565b6102d56105a3366004615219565b6121db565b6102d56105b63660046152c7565b612286565b6103f46122d9565b6103f46122e0565b6105de6105d93660046150ac565b6122e6565b6040516102b99a99989796959493929190615d10565b6103f4612360565b62010010546001600160a01b031681565b60008054604051631465b7d360e21b815273000000000000000000000000000000000000000091635196df4c9161065491879187916001600160a01b031690600401615cbe565b60206040518083038186803b15801561066c57600080fd5b505af4158015610680573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a491906154a4565b90505b92915050565b6001546001600160a01b031681565b6000806106e7866000141560405180604001604052806002815260200161415360f01b81525061238d565b6040805160c0810182526006546001600160a01b0381168252600160a01b8104600290810b810b900b602080840191909152600160b81b820461ffff90811684860152600160c81b830481166060850152600160d81b8304166080840152600160e81b90910460ff16151560a08301819052835180850190945260038452624c4f4b60e81b91840191909152909161077f919061238d565b610820886107cd5781600001516001600160a01b0316876001600160a01b03161180156107c8575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038816105b6107ff565b81600001516001600160a01b0316876001600160a01b03161080156107ff57506401000276a36001600160a01b038816115b6040518060400160405280600381526020016214d41360ea1b81525061238d565b6006805460ff60e81b191690556040805160e081018252600d546001600160801b039081168252600c541660208201524263ffffffff16818301526000606082018190526080820181905260a082018190528054925163d8f7529960e01b8152909260c08301916001600160a01b039091169063d8f75299906108a7903090600401615795565b60206040518083038186803b1580156108bf57600080fd5b505afa1580156108d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f79190614ce8565b6001600160a01b031681525090506000808913905060006040518061014001604052808b81526020016000815260200185600001516001600160a01b03168152602001856020015160020b8152602001600062ffffff1681526020016000151581526020018c6109695760085461096d565b6007545b815260200160006001600160801b0316815260200184600001516001600160801b0316815260200184602001516001600160801b03168152509050610a73604051806101000160405280336001600160a01b031681526020018e6001600160a01b031681526020018d151581526020018c81526020018b6001600160a01b031681526020018a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250938552505088516001600160a01b039081166020808601919091528a0151600290810b6040909501949094529154600c5460c08a0151841695949190931692600160b01b9004900b90506123b5565b62ffffff1660808201525b805115801590610aa45750886001600160a01b031681604001516001600160a01b031614155b15610e7157610ab1614a08565b60408201516001600160a01b031681526060820151600c54610ae091600f91600160b01b900460020b8f6124ee565b15156040830152600290810b810b60208301819052620d89e719910b1215610b1157620d89e7196020820152610b30565b6020810151620d89e860029190910b1315610b3057620d89e860208201525b610b3d8160200151612630565b6001600160a01b031660608201526040820151610bb3908d610b77578b6001600160a01b031683606001516001600160a01b031611610b91565b8b6001600160a01b031683606001516001600160a01b0316105b610b9f578260600151610ba1565b8b5b61010085015185516080870151612961565b60c085015260a084015260808301526001600160a01b031660408301528215610c1557610be98160c00151826080015101612b53565b825103825260a0810151610c0b90610c0090612b53565b602084015190612b65565b6020830152610c50565b610c228160a00151612b53565b825101825260c08101516080820151610c4a91610c3f9101612b53565b602084015190612b7b565b60208301525b6101008201516001600160801b031615610ca457600080610c808360c00151856101000151866101200151612b91565b60c0860180519290920190915260e0850180519091016001600160801b0316905250505b80606001516001600160a01b031682604001516001600160a01b03161415610e3057806040015115610e07578360a00151610d2e57610d0c846040015160008760200151886040015188600001518a606001516011612c30909695949392919063ffffffff16565b6001600160a01b03166080860152600690810b900b6060850152600160a08501525b8160a00151610d4757610d3f612dc2565b600160a08301525b6000610d9782602001518e610d5e57600754610d64565b8460c001515b8f610d73578560c00151610d77565b6008545b608089015160608a015160408b0151600954600e96959493929190612e86565b90508c15610dbf5780516000908103600f90810b810b8352602083018051909203810b900b90525b610dd28361010001518260000151612f75565b6001600160801b03166101008401526101208301516020820151610df69190612f75565b6001600160801b0316610120840152505b8b610e16578060200151610e1f565b60018160200151035b600290810b900b6060830152610e6b565b80600001516001600160a01b031682604001516001600160a01b031614610e6b57610e5e826040015161302b565b600290810b900b60608301525b50610a7e565b610f27604051806101000160405280336001600160a01b031681526020018e6001600160a01b031681526020018d151581526020018c81526020018b6001600160a01b031681526020018a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506040808501516001600160a01b039081166020840152606086015160020b919092015260c086015116908386600a613345565b836020015160020b816060015160020b14610ff557600080610f7586604001518660400151886020015188600001518a606001518b6080015160116134f9909695949392919063ffffffff16565b604085015160608601516006805461ffff60c81b1916600160c81b61ffff958616021761ffff60b81b1916600160b81b95909416949094029290921762ffffff60a01b1916600160a01b62ffffff60029490940b9390931692909202919091176001600160a01b0319166001600160a01b039091161790555061101a9050565b6040810151600680546001600160a01b0319166001600160a01b039092169190911790555b8061010001516001600160801b031683600001516001600160801b03161461106257610100810151600d80546001600160801b0319166001600160801b039092169190911790555b8061012001516001600160801b031683602001516001600160801b0316146110aa57610120810151600c80546001600160801b0319166001600160801b039092169190911790555b8a156110fa5760c081015160075560e08101516001600160801b0316156110f55760e0810151600a80546001600160801b031981166001600160801b03918216909301169190911790555b611140565b60c081015160085560e08101516001600160801b0316156111405760e0810151600a80546001600160801b03808216600160801b92839004821690940116029190911790555b8115158b15151461115957602081015181518b03611166565b80600001518a0381602001515b90965094508a1561123b57600085121561119557600254611195906001600160a01b03168d6000889003613694565b600061119f6137db565b60405163fa461e3360e01b8152909150339063fa461e33906111cb908a908a908e908e90600401615888565b600060405180830381600087803b1580156111e557600080fd5b505af11580156111f9573d6000803e3d6000fd5b505050506112356112086137db565b611212838a61385c565b11156040518060400160405280600381526020016249494160e81b81525061238d565b506112de565b600086121561125f5760015461125f906001600160a01b03168d6000899003613694565b600061126961386c565b60405163fa461e3360e01b8152909150339063fa461e3390611295908a908a908e908e90600401615888565b600060405180830381600087803b1580156112af57600080fd5b505af11580156112c3573d6000803e3d6000fd5b505050506112dc6112d261386c565b611212838961385c565b505b8b6001600160a01b0316336001600160a01b03167fc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca678888856040015186610100015187606001516040516113369594939291906158b2565b60405180910390a350506006805460ff60e81b1916600160e81b17905550919890975095505050505050565b6201001054600c546001600160a01b03909116906001600160801b031680156113a857600c546113a390600160801b900465ffffffffffff1642038261389d565b820191505b5090565b600d546001600160801b031681565b6113c36138bd565b60055460005460405163bc5bde7b60e01b81527300000000000000000000000000000000000000009263bc5bde7b9261140e926001600160a01b0392831692909116906004016157a9565b60006040518083038186803b15801561142657600080fd5b505af415801561143a573d6000803e3d6000fd5b50506003546001600160a01b0316159150611456905057600080fd5b600380546001600160a01b038085166001600160a01b0319928316811790935560048054918516919092161781556040805163f7413fef60e01b815290516000939263f7413fef9280820192602092909182900301818787803b1580156114bc57600080fd5b505af11580156114d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f491906154c0565b90506115158142600c60109054906101000a900465ffffffffffff166138fd565b61151d6139a6565b505050565b6000546001600160a01b031615801561154357506001600160a01b03861615155b61154c57600080fd5b600080546001600160a01b038089166001600160a01b0319928316179092556001805488841690831617905560028054878416908316178155600c80549187900b62ffffff16600160b01b0262ffffff60b01b1990921691909117905560058054928516929091169190911790557300000000000000000000000000000000000000006307219df660066011846115e28161302b565b886040518663ffffffff1660e01b8152600401611603959493929190615c1f565b60206040518083038186803b15801561161b57600080fd5b505af415801561162f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116539190615402565b600d80546001600160801b03928316600160801b029216919091179055505050505050565b60118161ffff811061168957600080fd5b015463ffffffff81169150600160201b810460060b90600160581b81046001600160a01b031690600160f81b900460ff1684565b600a546001600160801b0380821691600160801b90041682565b6000806116e26138bd565b6116ea6139bb565b6116f88888888888886139f0565b90925090506117056139a6565b965096945050505050565b6117186138bd565b604051633c7e0d5560e21b81527300000000000000000000000000000000000000009063f1f8355490611755906011906006908690600401615849565b60006040518083038186803b15801561176d57600080fd5b505af4158015611781573d6000803e3d6000fd5b5050505061178d6139a6565b50565b6006546001600160a01b03811690600160a01b810460020b9061ffff600160b81b8204811691600160c81b8104821691600160d81b8204169060ff600160e81b9091041686565b600c546001600160801b031681565b6005546001600160a01b031681565b6000806118006138bd565b600061180d898989613aad565b6001600160801b03871661014082015260405163025e487960e41b815290915060009081908190730000000000000000000000000000000000000000906325e487909061186d90601090600e90600f906011906006908c906004016159be565b60606040518083038186803b15801561188557600080fd5b505af4158015611899573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bd919061544c565b92509250925082600d60006101000a8154816001600160801b0302191690836001600160801b0316021790555073000000000000000000000000000000000000000063e0ed1c1a858484600160009054906101000a90046001600160a01b0316600260009054906101000a90046001600160a01b03168e8e6040518863ffffffff1660e01b81526004016119579796959493929190615bc4565b60006040518083038186803b15801561196f57600080fd5b505af4158015611983573d6000803e3d6000fd5b5050505061198f6139a6565b909b909a5098505050505050505050565b60085481565b6004546001600160a01b031681565b6119bd6138bd565b60408051610120810182526001546001600160a01b039081168252600280548216602084015260008054831684860152600c54600160b01b8104830b90920b6060850152600d546001600160801b03908116608086015290911660a084015290881660c083015260e082018790526101008201869052915163b79fa2e360e01b815282917300000000000000000000000000000000000000009163b79fa2e391611a7191600a919089908990600401615b0e565b604080518083038186803b158015611a8857600080fd5b505af4158015611a9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac091906154d8565b90925090508115611ad45760078054830190555b8015611ae35760088054820190555b611aeb6139a6565b50505050505050565b600080611aff6138bd565b611b0d8787878787336139f0565b9092509050611b1a6139a6565b9550959350505050565b60106020526000908152604090208054600182015460028301546003909301546001600160801b0392831693919281811691600160801b90041685565b600f6020526000908152604090205481565b60095481565b6110d360f21b81565b600080611b8d6138bd565b611b956139bb565b611ba186868686613b43565b9092509050611bae6139a6565b94509492505050565b600d54600160801b90046001600160801b031681565b606080611c434285858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600654600d54601195949350600160a01b820460020b925061ffff600160b81b83048116926001600160801b0390921691600160c81b900416613c34565b915091505b9250929050565b611c576138bd565b611c5f613d8c565b600654600160a01b9004600290810b9083810b9082900b12801590611c8957508160020b8160020b125b15611ccd57611c96612dc2565b600c54611cac906001600160801b031685612f75565b600c80546001600160801b0319166001600160801b03929092169190911790555b73000000000000000000000000000000000000000063c3846f716010600e600460009054906101000a90046001600160a01b03168787878b6007546008546040518a63ffffffff1660e01b8152600401611d2f9998979695949392919061596e565b60006040518083038186803b158015611d4757600080fd5b505af4158015611d5b573d6000803e3d6000fd5b50505050611d676139a6565b50505050565b620f424081565b60065460075460085460405163b76224fb60e01b815260009384937300000000000000000000000000000000000000009363b76224fb93611dca93600e938b938b93600160a01b90930460020b92600401615a39565b604080518083038186803b158015611de157600080fd5b505af4158015611df5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4391906154d8565b60065460095460405163bf4efc0760e01b81526000927300000000000000000000000000000000000000009263bf4efc0792611e6b92600e928a928a92600160a01b900460020b918a91600401615a39565b60206040518083038186803b158015611e8357600080fd5b505af4158015611e97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebb91906154c0565b90505b9392505050565b600080611ed06138bd565b611edc85858533613b43565b9092509050611ee96139a6565b935093915050565b6040805160c0810182526006546001600160a01b0381168252600160a01b8104600290810b810b900b60208301819052600160b81b820461ffff908116848601819052600160c81b8404821660608601819052600160d81b85049092166080860152600160e81b90930460ff16151560a0850152600d549451633e0d664760e11b815260009586958695909473000000000000000000000000000000000000000094637c1acc8e94611fbf94600e946011948f948f94919390916001600160801b03909116906004016159ef565b60606040518083038186803b158015611fd757600080fd5b505af4158015611feb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200f91906151d0565b935093509350509250925092565b6000806120286138bd565b612030613d8c565b60015460025460405163152245cf60e11b815273000000000000000000000000000000000000000092632a448b9e9261207f92600a9289926001600160a01b0391821692911690600401615ae7565b604080518083038186803b15801561209657600080fd5b505af41580156120aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ce919061541e565b90925090506120db6139a6565b915091565b6003546001600160a01b031681565b600b5481565b600080546040516348cf7a4360e01b81526001600160a01b03909116906348cf7a4390612126903090600401615795565b60206040518083038186803b15801561213e57600080fd5b505afa158015612152573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217691906154a4565b90505b90565b6000546001600160a01b031681565b600c54600160801b900465ffffffffffff1681565b600c54600160b01b900460020b81565b6002546001600160a01b031681565b60006121c9614a44565b3381526121d581612286565b91505090565b60008054600c54604051633082eea360e01b815273000000000000000000000000000000000000000092633082eea39261222e9287926001600160a01b031691600160b01b900460020b90600401615a7b565b60206040518083038186803b15801561224657600080fd5b505af415801561225a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227e91906154a4565b90505b919050565b60008054600c5460405163099f15f760e01b81527300000000000000000000000000000000000000009263099f15f79261222e9287926001600160a01b031691600160b01b900460020b90600401615c64565b620186a081565b60075481565b600e602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160801b03851695600160801b909504600f90810b9594900b9390600681900b90600160381b81046001600160a01b031690600160d81b810463ffffffff1690600160f81b900460ff168a565b600061236a6138bd565b612372613d8c565b61237a612dc2565b600b549050600b600090556121796139a6565b808261151d5760405162461bcd60e51b81526004016123ac9190615a68565b60405180910390fd5b60006001600160a01b0385161561246757604051631a7cd7eb60e31b81526000906001600160a01b0387169063d3e6bf58906123f5908890600401615c51565b602060405180830381600087803b15801561240f57600080fd5b505af1158015612423573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244791906154a4565b905062ffffff8116156124655761245d81613dbd565b9150506124e6565b505b604051631c06e0e160e11b81526001600160a01b0384169063380dc1c29061249390859060040161586c565b60206040518083038186803b1580156124ab57600080fd5b505afa1580156124bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e391906154a4565b90505b949350505050565b60008060008460020b8660020b8161250257fe5b05905060008660020b12801561252957508460020b8660020b8161252257fe5b0760020b15155b1561253357600019015b83156125a85760008061254583613dd7565b600182810b810b600090815260208d9052604090205460ff83169190911b8001600019019081168015159750929450909250908561258a57888360ff1686030261259d565b8861259482613de9565b840360ff168603025b965050505050612626565b6000806125b783600101613dd7565b91509150600060018260ff166001901b031990506000818b60008660010b60010b815260200190815260200160002054169050806000141595508561260957888360ff0360ff1686600101010261261f565b888361261483613e88565b0360ff168660010101025b9650505050505b5094509492505050565b60008060008360020b12612647578260020b61264f565b8260020b6000035b9050620d89e881111561268d576040805162461bcd60e51b81526020600482015260016024820152601560fa1b604482015290519081900360640190fd5b6000600182166126a157600160801b6126b3565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff16905060028216156126e7576ffff97272373d413259a46990580e213a0260801c5b6004821615612706576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612725576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612744576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612763576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612782576fff2ea16466c96a3843ec78b326b528610260801c5b60808216156127a1576ffe5dee046a99a2a811c461f1969c30530260801c5b6101008216156127c1576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b6102008216156127e1576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612801576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612821576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612841576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612861576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612881576f70d869a156d2a1b890bb3df62baf32f70260801c5b6180008216156128a1576f31be135f97d08fd981231505542fcfa60260801c5b620100008216156128c2576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b620200008216156128e2576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612901576d2216e584f5fa1ea926041bedfe980260801c5b6208000082161561291e576b048a170391f7dc42444e8fa20260801c5b60008460020b131561293957806000198161293557fe5b0490505b600160201b81061561294c57600161294f565b60005b60ff16602082901c0192505050919050565b60008080806001600160a01b03808916908a1610158187128015906129e657600061299a8989620f42400362ffffff16620f4240613f71565b9050826129b3576129ae8c8c8c6001614020565b6129c0565b6129c08b8d8c6001614090565b95508581106129d1578a96506129e0565b6129dd8c8b838661413b565b96505b50612a30565b816129fd576129f88b8b8b6000614090565b612a0a565b612a0a8a8c8b6000614020565b9350838860000310612a1e57899550612a30565b612a2d8b8a8a60000385614187565b95505b6001600160a01b038a8116908716148215612a9357808015612a4f5750815b612a6557612a60878d8c6001614090565b612a67565b855b9550808015612a74575081155b612a8a57612a85878d8c6000614020565b612a8c565b845b9450612add565b808015612a9d5750815b612ab357612aae8c888c6001614020565b612ab5565b855b9550808015612ac2575081155b612ad857612ad38c888c6000614090565b612ada565b845b94505b81158015612aed57508860000385115b15612af9578860000394505b818015612b1857508a6001600160a01b0316876001600160a01b031614155b15612b27578589039350612b44565b612b41868962ffffff168a620f42400362ffffff166141d3565b93505b50505095509550955095915050565b6000600160ff1b82106113a857600080fd5b808203828113156000831215146106a757600080fd5b818101828112156000831215146106a757600080fd5b600080826001600160801b0316846001600160801b03161415612bb5575083611ee9565b6001600160801b038316612bf857600080612bd187600061420d565b91509150612bed82600160801b886001600160801b0316613f71565b93509150611ee99050565b600080612c0687878761423b565b91509150612c2482600160801b8789036001600160801b0316613f71565b97909650945050505050565b60008063ffffffff8716612cd6576000898661ffff1661ffff8110612c5157fe5b60408051608081018252919092015463ffffffff808216808452600160201b8304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508a1614612cc257612cbf818a8988614275565b90505b806020015181604001519250925050612db6565b868803600080612ceb8c8c858c8c8c8c614318565b91509150816000015163ffffffff168363ffffffff161415612d1d578160200151826040015194509450505050612db6565b805163ffffffff84811691161415612d45578060200151816040015194509450505050612db6565b8151815160208085015190840151918390039286039163ffffffff80841692908516910360060b81612d7357fe5b05028460200151018263ffffffff168263ffffffff1686604001518660400151036001600160a01b03160281612da557fe5b048560400151019650965050505050505b97509795505050505050565b600c54429065ffffffffffff600160801b9091048116908216811415612de9575050612e84565b6003546001600160a01b031680612e0257505050612e84565b6000816001600160a01b031663f7413fef6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612e3f57600080fd5b505af1158015612e53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e7791906154c0565b9050611d678185856138fd565b565b612e8e614a87565b600297880b880b60009081526020998a5260409020978801805490970390965560038701805490950390945560048601805490940390935560058501805463ffffffff600160d81b6001600160a01b03600160381b808504821690970316909502670100000000000000600160d81b031990921691909117600681810b90940390930b66ffffffffffffff1666ffffffffffffff1990931692909217838104831690940390911690910263ffffffff60d81b199092169190911790558154600160801b9004600f90810b810b810b8252600190920154820b820b90910b9181019190915290565b60008082600f0b1215612fda57826001600160801b03168260000384039150816001600160801b031610612fd5576040805162461bcd60e51b81526020600482015260026024820152614c5360f01b604482015290519081900360640190fd5b6106a7565b826001600160801b03168284019150816001600160801b031610156106a7576040805162461bcd60e51b81526020600482015260026024820152614c4160f01b604482015290519081900360640190fd5b60006401000276a36001600160a01b03831610801590613067575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038316105b61309c576040805162461bcd60e51b81526020600482015260016024820152602960f91b604482015290519081900360640190fd5b640100000000600160c01b03602083901b166001600160801b03811160071b81811c6001600160401b03811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c9790881196179094179092171790911717176080811061312f57607f810383901c9150613139565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c600160381b161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b1461333657886001600160a01b031661331a82612630565b6001600160a01b0316111561332f5781613331565b805b613338565b815b9998505050505050505050565b6001600160a01b038516613358576134f2565b60006001600160a01b03861663a991dd8b866133748787614512565b6040518363ffffffff1660e01b8152600401613391929190615c9a565b602060405180830381600087803b1580156133ab57600080fd5b505af11580156133bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e391906154a4565b905062ffffff81166133f557506134f2565b6133fe81613dbd565b9050600080866060015113905060008161341c578560200151613425565b85602001516000035b9050600061343c8262ffffff8616620f42406141d3565b60208801805182019052905082156134a05787604001511561347b5784546001600160801b03600160801b80830482168401821602911617855561349b565b84546001600160801b038082168301166001600160801b03199091161785555b6134ed565b8760400151156134ce5784546001600160801b038082168301166001600160801b03199091161785556134ed565b84546001600160801b03600160801b8083048216840182160291161785555b505050505b5050505050565b6000806000898961ffff1661ffff811061350f57fe5b60408051608081018252919092015463ffffffff808216808452600160201b8304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508916141561357e5788859250925050612db6565b8461ffff168461ffff1611801561359f57506001850361ffff168961ffff16145b156135ac578391506135b0565b8491505b8161ffff168960010161ffff16816135c457fe5b0692506135d381898989614275565b8a8461ffff1661ffff81106135e457fe5b825191018054602084015160408501516060909501511515600160f81b026001600160f81b036001600160a01b03909616600160581b027fff0000000000000000000000000000000000000000ffffffffffffffffffffff60069390930b66ffffffffffffff16600160201b026affffffffffffff000000001963ffffffff90971663ffffffff199095169490941795909516929092171692909217929092161790555097509795505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b602083106137105780518252601f1990920191602091820191016136f1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613772576040519150601f19603f3d011682016040523d82523d6000602084013e613777565b606091505b50915091508180156137a55750805115806137a557508080602001905160208110156137a257600080fd5b50515b6134f2576040805162461bcd60e51b81526020600482015260026024820152612a2360f11b604482015290519081900360640190fd5b6001546040516370a0823160e01b81526000916001600160a01b0316906370a082319061380c903090600401615795565b60206040518083038186803b15801561382457600080fd5b505afa158015613838573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217691906154c0565b808201828110156106a757600080fd5b6002546040516370a0823160e01b81526000916001600160a01b0316906370a082319061380c903090600401615795565b6000816001600160801b0316608084901b816138b557fe5b049392505050565b6006546040805180820190915260038152624c4f4b60e81b60208201526138ee91600160e81b900460ff169061238d565b6006805460ff60e81b19169055565b600c546001600160801b031680156139705761392784600160801b836001600160801b0316613f71565b60098054909101905561394465ffffffffffff838503168261389d565b6201001080546001600160a01b031981166001600160a01b039182169390930116919091179055613979565b600b8054850190555b5050600c805465ffffffffffff909216600160801b0265ffffffffffff60801b1990921691909117905550565b6006805460ff60e81b1916600160e81b179055565b6004805460408051808201909152918252631393919560e21b6020830152612e84916001600160a01b0390911633149061238d565b6001546002546040516309426dd160e41b8152600092839273000000000000000000000000000000000000000092639426dd1092613a4f926010928e928e928e928e928e928e926001600160a01b039283169290911690600401615914565b604080518083038186803b158015613a6657600080fd5b505af4158015613a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a9e919061541e565b91509150965096945050505050565b613ab5614a9e565b5060408051610160810182526001600160a01b039485168152600293840b602082015291830b90820152600d546001600160801b038082166060840152600160801b90910416608082015260075460a082015260085460c082015260095460e0820152600354909216610100830152600c54600160b01b9004810b900b610120820152600061014082015290565b6000806000613b53848888613aad565b6001600160801b0386166101408201526040516377998a5760e01b815290915060009081908190730000000000000000000000000000000000000000906377998a5790613bb390601090600e90600f906011906006908c906004016159be565b60606040518083038186803b158015613bcb57600080fd5b505af4158015613bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c03919061544c565b600d80546001600160801b0319166001600160801b0394909416939093179092559b909a5098505050505050505050565b60608060008361ffff1611613c74576040805162461bcd60e51b81526020600482015260016024820152604960f81b604482015290519081900360640190fd5b86516001600160401b0381118015613c8b57600080fd5b50604051908082528060200260200182016040528015613cb5578160200160208202803683370190505b50915086516001600160401b0381118015613ccf57600080fd5b50604051908082528060200260200182016040528015613cf9578160200160208202803683370190505b50905060005b8751811015613d7f57613d2a8a8a8a8481518110613d1957fe5b60200260200101518a8a8a8a612c30565b848381518110613d3657fe5b60200260200101848481518110613d4957fe5b60200260200101826001600160a01b03166001600160a01b03168152508260060b60060b81525050508080600101915050613cff565b5097509795505050505050565b6003546040805180820190915260028152614e4760f01b6020820152612e84916001600160a01b031633149061238d565b6000620186a062ffffff8316106113a857620186a061227e565b60020b600881901d9161010090910790565b6000808211613df757600080fd5b600160801b8210613e0a57608091821c91015b680100000000000000008210613e2257604091821c91015b600160201b8210613e3557602091821c91015b620100008210613e4757601091821c91015b6101008210613e5857600891821c91015b60108210613e6857600491821c91015b60048210613e7857600291821c91015b6002821061228157600101919050565b6000808211613e9657600080fd5b5060ff6001600160801b03821615613eb157607f1901613eb9565b608082901c91505b6001600160401b03821615613ed157603f1901613ed9565b604082901c91505b63ffffffff821615613eee57601f1901613ef6565b602082901c91505b61ffff821615613f0957600f1901613f11565b601082901c91505b60ff821615613f235760071901613f2b565b600882901c91505b600f821615613f3d5760031901613f45565b600482901c91505b6003821615613f575760011901613f5f565b600282901c91505b60018216156122815760001901919050565b6000808060001985870986860292508281109083900303905080613fa75760008411613f9c57600080fd5b508290049050611ebe565b808411613fb357600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b6000836001600160a01b0316856001600160a01b03161115614040579293925b8161406d57614068836001600160801b03168686036001600160a01b0316600160601b613f71565b6124e3565b6124e3836001600160801b03168686036001600160a01b0316600160601b6141d3565b6000836001600160a01b0316856001600160a01b031611156140b0579293925b600160601b600160e01b03606084901b166001600160a01b0386860381169087166140da57600080fd5b8361410a57866001600160a01b03166140fd8383896001600160a01b0316613f71565b8161410457fe5b04614130565b6141306141218383896001600160a01b03166141d3565b886001600160a01b03166145cc565b979650505050505050565b600080856001600160a01b03161161415257600080fd5b6000846001600160801b03161161416857600080fd5b8161417a5761406885858560016145d7565b6124e385858560016146b0565b600080856001600160a01b03161161419e57600080fd5b6000846001600160801b0316116141b457600080fd5b816141c65761406885858560006146b0565b6124e385858560006145d7565b60006141e0848484613f71565b9050600082806141ec57fe5b8486091115611ebe57600019811061420357600080fd5b6001019392505050565b600080600061422c8561421e6120f5565b62ffffff16620f42406141d3565b94859003959390940193505050565b60008061425b85846001600160801b0316866001600160801b03166141d3565b90506142698186038261420d565b90969095509350505050565b61427d614afa565b600085600001518503905060405180608001604052808663ffffffff1681526020018263ffffffff168660020b0288602001510160060b81526020016000856001600160801b0316116142d15760016142d3565b845b6001600160801b031663ffffffff60801b608085901b16816142f157fe5b048860400151016001600160a01b0316815260200160011515815250915050949350505050565b614320614afa565b614328614afa565b888561ffff1661ffff811061433957fe5b60408051608081018252919092015463ffffffff8116808352600160201b8204600690810b810b900b6020840152600160581b82046001600160a01b031693830193909352600160f81b900460ff1615156060820152925061439d90899089614793565b156143d5578663ffffffff16826000015163ffffffff1614156143bf57612db6565b816143cc83898988614275565b91509150612db6565b888361ffff168660010161ffff16816143ea57fe5b0661ffff1661ffff81106143fa57fe5b60408051608081018252929091015463ffffffff81168352600160201b8104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082018190529092506144af57604080516080810182528a5463ffffffff81168252600160201b8104600690810b810b900b6020830152600160581b81046001600160a01b031692820192909252600160f81b90910460ff161515606082015291505b6144be88836000015189614793565b6144f5576040805162461bcd60e51b815260206004820152600360248201526213d31160ea1b604482015290519081900360640190fd5b6145028989898887614854565b9150915097509795505050505050565b61451a614a9e565b6040518061016001604052808460000151815260200184602001518152602001846080015162ffffff1681526020018460a00151151581526020018460c0015181526020018460e001516001600160801b031681526020018461010001516001600160801b031681526020018461012001516001600160801b03168152602001836060015160060b815260200183608001516001600160a01b031681526020018360a001511515815250905092915050565b808204910615150190565b600081156146425760006001600160a01b0384111561460d5761460884600160601b876001600160801b0316613f71565b614625565b6001600160801b038516606085901b8161462357fe5b045b905061245d61463d6001600160a01b0388168361385c565b6149f2565b60006001600160a01b038411156146705761466b84600160601b876001600160801b03166141d3565b614687565b614687606085901b6001600160801b0387166145cc565b905080866001600160a01b03161161469e57600080fd5b6001600160a01b0386160390506124e6565b6000826146be5750836124e6565b600160601b600160e01b03606085901b16821561474c576001600160a01b038616848102908582816146ec57fe5b04141561471d5781810182811061471b5761471183896001600160a01b0316836141d3565b93505050506124e6565b505b6147438261473e878a6001600160a01b0316868161473757fe5b049061385c565b6145cc565b925050506124e6565b6001600160a01b0386168481029085828161476357fe5b0414801561477057508082115b61477957600080fd5b80820361471161463d846001600160a01b038b16846141d3565b60008363ffffffff168363ffffffff16111580156147bd57508363ffffffff168263ffffffff1611155b156147d9578163ffffffff168363ffffffff1611159050611ebe565b60008463ffffffff168463ffffffff1611614800578363ffffffff16600160201b01614808565b8363ffffffff165b64ffffffffff16905060008563ffffffff168463ffffffff1611614838578363ffffffff16600160201b01614840565b8363ffffffff165b64ffffffffff169091111595945050505050565b61485c614afa565b614864614afa565b60008361ffff168560010161ffff168161487a57fe5b0661ffff169050600060018561ffff16830103905060005b506002818301048961ffff871682816148a757fe5b0661ffff81106148b357fe5b60408051608081018252929091015463ffffffff81168352600160201b8104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b9091041615156060820181905290955061491d57806001019250614892565b898661ffff16826001018161492e57fe5b0661ffff811061493a57fe5b60408051608081018252929091015463ffffffff81168352600160201b8104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082015285519094506000906149a4908b908b614793565b90508080156149bd57506149bd8a8a8760000151614793565b156149c857506149e5565b806149d8576001820392506149df565b8160010193505b50614892565b5050509550959350505050565b806001600160a01b038116811461228157600080fd5b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b604080516101008101825260008082526020820181905291810182905260608082018390526080820183905260a082015260c0810182905260e081019190915290565b604080518082019091526000808252602082015290565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b803561228181615e7b565b8035801515811461228157600080fd5b60008083601f840112614b4d578182fd5b5081356001600160401b03811115614b63578182fd5b602083019150836020828501011115611c4857600080fd5b600082601f830112614b8b578081fd5b81356001600160401b03811115614b9e57fe5b614bb1601f8201601f1916602001615e58565b818152846020838601011115614bc5578283fd5b816020850160208301379081016020019190915292915050565b8035600281900b811461228157600080fd5b803561228181615e90565b6000610100808385031215614c0f578182fd5b614c1881615e58565b915050614c2482614b21565b8152614c3260208301614b21565b6020820152614c4360408301614b2c565b604082015260608201356060820152614c5e60808301614b21565b608082015260a08201356001600160401b03811115614c7c57600080fd5b614c8884828501614b7b565b60a083015250614c9a60c08301614b21565b60c0820152614cab60e08301614bdf565b60e082015292915050565b803561228181615e9f565b803561228181615eb4565b600060208284031215614cdd578081fd5b8135611ebe81615e7b565b600060208284031215614cf9578081fd5b8151611ebe81615e7b565b60008060408385031215614d16578081fd5b8235614d2181615e7b565b91506020830135614d3181615e7b565b809150509250929050565b60008060008060008060c08789031215614d54578182fd5b8635614d5f81615e7b565b95506020870135614d6f81615e7b565b94506040870135614d7f81615e7b565b9350614d8d60608801614bdf565b92506080870135614d9d81615e7b565b915060a0870135614dad81615e7b565b809150509295509295509295565b60008060008060008060a08789031215614dd3578384fd5b8635614dde81615e7b565b9550614dec60208801614b2c565b9450604087013593506060870135614e0381615e7b565b925060808701356001600160401b03811115614e1d578283fd5b614e2989828a01614b3c565b979a9699509497509295939492505050565b60008060008060008060a08789031215614e53578384fd5b8635614e5e81615e7b565b9550614e6c60208801614bdf565b9450614e7a60408801614bdf565b93506060870135614e0381615e9f565b600080600080600060a08688031215614ea1578283fd5b8535614eac81615e7b565b9450614eba60208701614bdf565b9350614ec860408701614bdf565b92506060860135614ed881615e9f565b91506080860135614ee881615e9f565b809150509295509295909350565b60008060008060008060c08789031215614f0e578384fd5b8635614f1981615e7b565b9550614f2760208801614bdf565b9450614f3560408801614bdf565b93506060870135614f4581615e9f565b92506080870135614d9d81615e9f565b600080600080600060808688031215614f6c578283fd5b8535614f7781615e7b565b9450602086013593506040860135925060608601356001600160401b03811115614f9f578182fd5b614fab88828901614b3c565b969995985093965092949392505050565b60008060208385031215614fce578182fd5b82356001600160401b0380821115614fe4578384fd5b818501915085601f830112614ff7578384fd5b813581811115615005578485fd5b8660208083028501011115615018578485fd5b60209290920196919550909350505050565b60006020828403121561503b578081fd5b5035919050565b600080600060608486031215615056578081fd5b833580600f0b8114615066578182fd5b925061507460208501614bdf565b915061508260408501614bdf565b90509250925092565b60006020828403121561509c578081fd5b81358060010b8114611ebe578182fd5b6000602082840312156150bd578081fd5b6106a482614bdf565b600080604083850312156150d8578182fd5b6150e183614bdf565b91506150ef60208401614bdf565b90509250929050565b60008060006060848603121561510c578081fd5b61511584614bdf565b925061512360208501614bdf565b9150604084013561513381615e9f565b809150509250925092565b60008060008060808587031215615153578182fd5b61515c85614bdf565b935061516a60208601614bdf565b9250604085013561517a81615e9f565b9150606085013561518a81615e7b565b939692955090935050565b6000806000606084860312156151a9578081fd5b6151b284614bdf565b92506151c060208501614bdf565b9150604084013590509250925092565b6000806000606084860312156151e4578081fd5b83516151ef81615e90565b602085015190935061520081615e7b565b604085015190925063ffffffff81168114615133578182fd5b60006020828403121561522a578081fd5b81356001600160401b0380821115615240578283fd5b9083019060a08286031215615253578283fd5b60405160a08101818110838211171561526857fe5b60405261527483614b21565b815261528260208401614b21565b602082015260408301356040820152606083013560608201526080830135828111156152ac578485fd5b6152b887828601614b7b565b60808301525095945050505050565b6000602082840312156152d8578081fd5b81356001600160401b038111156152ed578182fd5b6124e684828501614bfc565b60008082840361018081121561530d578283fd5b83356001600160401b03811115615322578384fd5b61532e86828701614bfc565b93505061016080601f1983011215615344578283fd5b61534d81615e58565b9150602085013582526040850135602083015261536c60608601614cc1565b604083015261537d60808601614b2c565b606083015260a0850135608083015261539860c08601614cb6565b60a08301526153a960e08601614cb6565b60c08301526101006153bc818701614cb6565b60e08401526101206153cf818801614bf1565b8285015261014091506153e3828801614b21565b908401526153f2868301614b2c565b9083015250919491935090915050565b600060208284031215615413578081fd5b8151611ebe81615e9f565b60008060408385031215615430578182fd5b825161543b81615e9f565b6020840151909250614d3181615e9f565b600080600060608486031215615460578081fd5b835161546b81615e9f565b602085015160409095015190969495509392505050565b600060208284031215615493578081fd5b813561ffff81168114611ebe578182fd5b6000602082840312156154b5578081fd5b8151611ebe81615eb4565b6000602082840312156154d1578081fd5b5051919050565b600080604083850312156154ea578182fd5b505080516020909101519092909150565b6001600160a01b03169052565b15159052565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452815b8181101561555d57602081850181015186830182015201615541565b8181111561556e5782602083870101525b50601f01601f19169290920160200192915050565b60020b9052565b60060b9052565b805182526020810151602083015260408101516155b1604084018261578c565b5060608101516155c46060840182615508565b506080810151608083015260a08101516155e160a084018261577f565b5060c08101516155f460c084018261577f565b5060e081015161560760e084018261577f565b506101008082015161561b8285018261558a565b505061012080820151615630828501826154fb565b505061014080820151611d6782850182615508565b6156508282516154fb565b60208101516156626020840182615583565b5060408101516156756040840182615583565b506060810151615688606084018261577f565b50608081015161569b608084018261577f565b5060a081015160a083015260c081015160c083015260e081015160e0830152610100808201516156cd828501826154fb565b5050610120808201516156e282850182615583565b505061014080820151611d678285018261577f565b600061010060018060a01b03808451168552806020850151166020860152604084015115156040860152606084015160608601528060808501511660808601525060a08301518160a086015261574f82860182615538565b91505060c083015161576460c08601826154fb565b5060e083015161577760e0860182615583565b509392505050565b6001600160801b03169052565b62ffffff169052565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b604080825283519082018190526000906020906060840190828701845b828110156157ff57815160060b845292840192908401906001016157e0565b50505083810382850152845180825285830191830190845b8181101561583c5783516001600160a01b031683529284019291840191600101615817565b5090979650505050505050565b928352602083019190915261ffff16604082015260600190565b90815260200190565b60029190910b815260200190565b918252602082015260400190565b6000858252846020830152606060408301526158a860608301848661550e565b9695505050505050565b94855260208501939093526001600160a01b039190911660408401526001600160801b0316606083015260020b608082015260a00190565b60069390930b83526001600160a01b0391909116602083015263ffffffff16604082015260600190565b9889526001600160a01b0397881660208a0152600296870b60408a01529490950b60608801526001600160801b039283166080880152911660a0860152831660c085015290821660e0840152166101008201526101200190565b98895260208901979097526001600160a01b03959095166040880152600293840b606088015291830b608087015290910b60a0850152600f0b60c084015260e08301526101008201526101200190565b60006102008201905087825286602083015285604083015284606083015283608083015261413060a0830184615645565b9788526020880196909652600294850b604088015292840b6060870152920b608085015261ffff91821660a08501521660c08301526001600160801b031660e08201526101000190565b958652600294850b602087015292840b6040860152920b6060840152608083019190915260a082015260c00190565b6000602082526106a46020830184615538565b60006060825260018060a01b03808651166060840152806020870151166080840152604086015160a0840152606086015160c0840152608086015160a060e0850152615acb610100850182615538565b959091166020840152505060029190910b604090910152919050565b9384526001600160a01b039283166020850152908216604084015216606082015260800190565b600061016086835260018060a01b0386511660208401526020860151615b3760408501826154fb565b506040860151615b4a60608501826154fb565b506060860151615b5d6080850182615583565b506080860151615b7060a085018261577f565b5060a0860151615b8360c085018261577f565b5060c0860151615b9660e08501826154fb565b5060e0860151610100818186015280880151610120860152505080610140840152614130818401858761550e565b6000610200615bd3838b615645565b610160830189905261018083018890526001600160a01b038781166101a085015286166101c08401526101e08301819052615c11818401858761550e565b9a9950505050505050505050565b94855260208501939093526001600160a01b03919091166040840152600290810b60608401520b608082015260a00190565b6000602082526106a460208301846156f7565b600060608252615c7760608301866156f7565b6001600160a01b039490941660208301525060029190910b604090910152919050565b6000610180808352615cae818401866156f7565b915050611ebe6020830184615591565b60006101a0808352615cd2818401876156f7565b915050615ce26020830185615591565b6001600160a01b0392909216610180919091015292915050565b6001600160801b0391909116815260200190565b6001600160801b039a909a168a52600f98890b60208b01529690970b60408901526060880194909452608087019290925260a086015260060b60c08501526001600160a01b031660e084015263ffffffff90911661010083015215156101208201526101400190565b6001600160801b0392831681529116602082015260400190565b6001600160801b0395861681526020810194909452604084019290925283166060830152909116608082015260a00190565b6001600160a01b0396909616865260029490940b602086015261ffff92831660408601529082166060850152166080830152151560a082015260c00190565b62ffffff91909116815260200190565b63ffffffff94909416845260069290920b60208401526001600160a01b031660408301521515606082015260800190565b65ffffffffffff91909116815260200190565b6040518181016001600160401b0381118282101715615e7357fe5b604052919050565b6001600160a01b038116811461178d57600080fd5b8060060b811461178d57600080fd5b6001600160801b038116811461178d57600080fd5b62ffffff8116811461178d57600080fdfea2646970667358221220a469918fd754a61268a102489254f65c850a135863b7cb2abe1c81001a04ce3664736f6c63430007060033","sourceMap":"968:31805:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3628:63;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5745:239;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1503:30::-;;;:::i;16081:9095::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;8460:360::-;;;:::i;3121:33::-;;;:::i;:::-;;;;;;;:::i;32109:662::-;;;;;;:::i;:::-;;:::i;:::-;;4963:541;;;;;;:::i;:::-;;:::i;3537:55::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;2766:35::-;;;:::i;:::-;;;;;;;;:::i;11221:513::-;;;;;;:::i;:::-;;:::i;8857:222::-;;;;;;:::i;:::-;;:::i;2345:27::-;;;:::i;:::-;;;;;;;;;;;;:::i;2905:39::-;;;:::i;1775:::-;;;:::i;10023:648::-;;;;;;:::i;:::-;;:::i;2487:44::-;;;:::i;:::-;;;;;;;:::i;1709:27::-;;;:::i;25213:1232::-;;;;;;:::i;:::-;;:::i;10708:476::-;;;;;;:::i;:::-;;:::i;3443:59::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;3356:52::-;;;;;;:::i;:::-;;:::i;2567:46::-;;;:::i;3921:49::-;;;:::i;12459:324::-;;;;;;:::i;:::-;;:::i;3193:43::-;;;:::i;8070:348::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;13313:596::-;;;;;;:::i;:::-;;:::i;3826:56::-;;;:::i;9114:290::-;;;;;;:::i;:::-;;:::i;26480:318::-;;;;;;:::i;:::-;;:::i;12135:287::-;;;;;;:::i;:::-;;:::i;7528:500::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;31841:231::-;;;;;;:::i;:::-;;:::i;1641:29::-;;;:::i;2837:32::-;;;:::i;6507:128::-;;;:::i;1433:31::-;;;:::i;2979:34::-;;;:::i;:::-;;;;;;;:::i;3052:33::-;;;:::i;:::-;;;;;;;:::i;1572:30::-;;;:::i;6291:181::-;;;:::i;6019:171::-;;;;;;:::i;:::-;;:::i;5539:::-;;;;;;:::i;:::-;;:::i;3731:56::-;;;:::i;2408:44::-;;;:::i;3272:49::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;:::i;28746:191::-;;;:::i;3628:63::-;;;-1:-1:-1;;;;;3628:63:0;;:::o;5745:239::-;5903:6;5971:7;;5924:55;;-1:-1:-1;;;5924:55:0;;:2;;:15;;:55;;5940:11;;5953:16;;-1:-1:-1;;;;;5971:7:0;;5924:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5917:62;;5745:239;;;;;:::o;1503:30::-;;;-1:-1:-1;;;;;1503:30:0;;:::o;16081:9095::-;16254:14;16270;16292:36;16301:15;16320:1;16301:20;;16292:36;;;;;;;;;;;;;-1:-1:-1;;;16292:36:0;;;:8;:36::i;:::-;16335:31;;;;;;;;16361:5;16335:31;-1:-1:-1;;;;;16335:31:0;;;;-1:-1:-1;;;16335:31:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16335:31:0;;;;;;;;;;-1:-1:-1;;;16335:31:0;;;;;;;;-1:-1:-1;;;16335:31:0;;;;;;;-1:-1:-1;;;16335:31:0;;;;;;;;;;;;;16373:36;;;;;;;;;;;-1:-1:-1;;;16373:36:0;;;;;;;16335:31;;16373:36;;16335:31;16373:8;:36::i;:::-;16415:247;16431:10;:212;;16573:10;:23;;;-1:-1:-1;;;;;16553:43:0;:17;-1:-1:-1;;;;;16553:43:0;;:90;;;;-1:-1:-1;992:65:29;-1:-1:-1;;;;;16600:43:0;;;16553:90;16431:212;;;16472:10;:23;;;-1:-1:-1;;;;;16452:43:0;:17;-1:-1:-1;;;;;16452:43:0;;:90;;;;-1:-1:-1;813:13:29;-1:-1:-1;;;;;16499:43:0;;;16452:90;16415:247;;;;;;;;;;;;;-1:-1:-1;;;16415:247:0;;;:8;:247::i;:::-;16669:5;:22;;-1:-1:-1;;;;16669:22:0;;;16723:319;;;;;;;;16757:9;;-1:-1:-1;;;;;16757:9:0;;;16723:319;;16796:15;;;16723:319;;;;16842:15;16723:319;;;;;;-1:-1:-1;16723:319:0;;;;;;;;;;;;;;;;;;16996:7;;16985:50;;-1:-1:-1;;;16985:50:0;;-1:-1:-1;;16723:319:0;;;;-1:-1:-1;;;;;16996:7:0;;;;16985:35;;:50;;17029:4;;16985:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;16723:319:0;;;;16698:344;;17049:15;17085:1;17067:15;:19;17049:37;;17093:22;17118:417;;;;;;;;17162:15;17118:417;;;;17203:1;17118:417;;;;17226:10;:23;;;-1:-1:-1;;;;;17118:417:0;;;;;17263:10;:15;;;17118:417;;;;;;17291:1;17118:417;;;;;;17329:5;17118:417;;;;;;17363:10;:56;;17399:20;;17363:56;;;17376:20;;17363:56;17118:417;;;;17437:1;-1:-1:-1;;;;;17118:417:0;;;;;17457:5;:20;;;-1:-1:-1;;;;;17118:417:0;;;;;17502:5;:26;;;-1:-1:-1;;;;;17118:417:0;;;;17093:442;;17554:412;17596:324;;;;;;;;17637:10;-1:-1:-1;;;;;17596:324:0;;;;;17670:9;-1:-1:-1;;;;;17596:324:0;;;;;17703:10;17596:324;;;;;;17742:15;17596:324;;;;17788:17;-1:-1:-1;;;;;17596:324:0;;;;;17823:4;;17596:324;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17596:324:0;;;-1:-1:-1;;17853:23:0;;-1:-1:-1;;;;;17596:324:0;;;;;;;;;;;17894:15;;;17596:324;;;;;;;;;;;;17930:7;;17947:11;;17554:14;;;;:32;;;:412;17930:7;;;;;-1:-1:-1;;;17947:11:0;;;;;-1:-1:-1;17554:32:0;:412::i;:::-;17542:424;;:9;;;:424;18085:4200;18092:30;;:35;;;;:78;;;18153:17;-1:-1:-1;;;;;18131:39:0;:5;:18;;;-1:-1:-1;;;;;18131:39:0;;;18092:78;18085:4200;;;18180:28;;:::i;:::-;18242:18;;;;-1:-1:-1;;;;;18217:43:0;;;18357:10;;;;18369:11;;18313:80;;:10;;-1:-1:-1;;;18369:11:0;;;;18382:10;18313:43;:80::i;:::-;18269:124;;18285:16;;;18269:124;;;;;;;18270:13;;;18269:124;;;-1:-1:-1;;18513:33:0;;;18509:188;;;-1:-1:-1;;18558:13:0;;;:33;18509:188;;;18610:13;;;;637:9:29;18610:33:0;;;;;;18606:91;;;637:9:29;18655:13:0;;;:33;18606:91;18770:42;18798:4;:13;;;18770:27;:42::i;:::-;-1:-1:-1;;;;;18746:66:0;:21;;;:66;19038:18;;;;19004:318;;19067:10;:98;;19148:17;-1:-1:-1;;;;;19124:41:0;:4;:21;;;-1:-1:-1;;;;;19124:41:0;;19067:98;;;19104:17;-1:-1:-1;;;;;19080:41:0;:4;:21;;;-1:-1:-1;;;;;19080:41:0;;19067:98;19066:164;;19209:4;:21;;;19066:164;;;19179:17;19066:164;19240:15;;;;19265:30;;19305:9;;;;19004:24;:318::i;:::-;18986:14;;;18934:388;18970:14;;;18934:388;18955:13;;;18934:388;-1:-1:-1;;;;;18934:388:0;18935:18;;;18934:388;19331:390;;;;19391:43;19408:4;:14;;;19392:4;:13;;;:30;19391:41;:43::i;:::-;19357:77;;;;;19496:14;;;;19469:53;;19496:25;;:23;:25::i;:::-;19469:22;;;;;:26;:53::i;:::-;19444:22;;;:78;19331:390;;;19581:25;:4;:14;;;:23;:25::i;:::-;19547:59;;;;;19685:14;;;;19669:13;;;;19641:71;;19668:43;;19669:30;19668:41;:43::i;:::-;19641:22;;;;;:26;:71::i;:::-;19616:22;;;:96;19331:390;19782:15;;;;-1:-1:-1;;;;;19782:19:0;;19778:295;;19814:28;19844:24;19882:69;19896:4;:14;;;19912:5;:15;;;19929:5;:21;;;19882:13;:69::i;:::-;19962:25;;;:49;;;;;;;;;20021:14;;;:43;;;;;-1:-1:-1;;;;;20021:43:0;;;-1:-1:-1;;19778:295:0;20156:4;:21;;;-1:-1:-1;;;;;20134:43:0;:5;:18;;;-1:-1:-1;;;;;20134:43:0;;20130:2149;;;20256:4;:16;;;20252:1702;;;20441:5;:31;;;20436:435;;20554:252;20596:5;:20;;;20632:1;20649:10;:15;;;20680:10;:27;;;20723:5;:20;;;20759:10;:33;;;20554:12;:26;;:252;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;20488:318:0;20511:39;;;20488:318;;;;;;;20489:20;;;20488:318;20854:4;20820:31;;;:38;20436:435;20887:5;:20;;;20882:111;;20923:16;:14;:16::i;:::-;20976:4;20953:20;;;:27;20882:111;21004:30;21037:361;21062:4;:13;;;21090:10;:61;;21131:20;;21090:61;;;21103:5;:25;;;21090:61;21167:10;:61;;21203:5;:25;;;21167:61;;;21180:20;;21167:61;21243:39;;;;21296:20;;;;21330;;;;21364:22;;21037:5;;:361;;;21243:39;21296:20;21330;21037:11;:361::i;:::-;21004:394;;21608:10;21604:145;;;21655:17;;;21654:18;;;21634:38;;;;;;;;21713:23;;;;;21712:24;;;21686:50;;;;;;21604:145;21779:58;21802:5;:15;;;21819:4;:17;;;21779:22;:58::i;:::-;-1:-1:-1;;;;;21761:76:0;:15;;;:76;21896:21;;;;21919:23;;;;21873:70;;21896:21;21873:22;:70::i;:::-;-1:-1:-1;;;;;21849:94:0;:21;;;:94;-1:-1:-1;20252:1702:0;21977:10;:46;;22010:4;:13;;;21977:46;;;22006:1;21990:4;:13;;;:17;21977:46;21964:59;;;;;;:10;;;:59;20130:2149;;;22064:4;:22;;;-1:-1:-1;;;;;22042:44:0;:5;:18;;;-1:-1:-1;;;;;22042:44:0;;22038:241;;22223:47;22251:5;:18;;;22223:27;:47::i;:::-;22210:60;;;;;;:10;;;:60;22038:241;18085:4200;;;;22366:412;22407:314;;;;;;;;22448:10;-1:-1:-1;;;;;22407:314:0;;;;;22481:9;-1:-1:-1;;;;;22407:314:0;;;;;22514:10;22407:314;;;;;;22553:15;22407:314;;;;22599:17;-1:-1:-1;;;;;22407:314:0;;;;;22634:4;;22407:314;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;22407:314:0;;;-1:-1:-1;22664:18:0;;;;;-1:-1:-1;;;;;22407:314:0;;;;;;;22700:10;;;;22407:314;;;;;;;22366:14;;;;:31;;22664:5;22746;22761:9;22366:31;:412::i;:::-;22867:10;:15;;;22853:29;;:5;:10;;;:29;;;22849:625;;22893:23;22918:29;22951:238;22979:10;:27;;;23016:5;:20;;;23046:10;:15;;;23071:5;:20;;;23101:10;:33;;;23144:10;:37;;;22951:12;:18;;:238;;;;;;;;;:::i;:::-;23293:18;;;;23313:10;;;;23198:5;23197:169;;-1:-1:-1;;;;23197:169:0;-1:-1:-1;;;23197:169:0;;;;;;-1:-1:-1;;;;23197:169:0;-1:-1:-1;;;23197:169:0;;;;;;;;;;;;-1:-1:-1;;;;23197:169:0;-1:-1:-1;;;23197:169:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23197:169:0;-1:-1:-1;;;;;23197:169:0;;;;;;-1:-1:-1;22849:625:0;;-1:-1:-1;22849:625:0;;23449:18;;;;23428:5;:39;;-1:-1:-1;;;;;;23428:39:0;-1:-1:-1;;;;;23428:39:0;;;;;;;;;22849:625;23566:5;:15;;;-1:-1:-1;;;;;23542:39:0;:5;:20;;;-1:-1:-1;;;;;23542:39:0;;23538:72;;23595:15;;;;23583:9;:27;;-1:-1:-1;;;;;;23583:27:0;-1:-1:-1;;;;;23583:27:0;;;;;;;;;23538:72;23650:5;:21;;;-1:-1:-1;;;;;23620:51:0;:5;:26;;;-1:-1:-1;;;;;23620:51:0;;23616:96;;23691:21;;;;23673:15;:39;;-1:-1:-1;;;;;;23673:39:0;-1:-1:-1;;;;;23673:39:0;;;;;;;;;23616:96;23879:10;23875:280;;;23922:25;;;;23899:20;:48;23959:14;;;;-1:-1:-1;;;;;23959:18:0;;23955:58;;23999:14;;;;23979:9;:34;;-1:-1:-1;;;;;;23979:34:0;;-1:-1:-1;;;;;23979:34:0;;;;;;;;;;;;;23955:58;23875:280;;;24057:25;;;;24034:20;:48;24094:14;;;;-1:-1:-1;;;;;24094:18:0;;24090:58;;24134:14;;;;24114:9;:34;;-1:-1:-1;;;;;24114:34:0;;;-1:-1:-1;;;24114:34:0;;;;;;;;;;;;;;;;;24090:58;24196:10;24182:24;;:10;:24;;;:190;;24299:22;;;;24341:30;;24323:48;;24182:190;;;24234:5;:30;;;24216:15;:48;24266:5;:22;;;24182:190;24161:211;;-1:-1:-1;24161:211:0;-1:-1:-1;24423:616:0;;;;24461:1;24451:7;:11;24447:82;;;24492:6;;24464:65;;-1:-1:-1;;;;;24492:6:0;24500:9;24492:6;24519:8;;;24464:27;:65::i;:::-;24538:22;24563:10;:8;:10::i;:::-;24581:73;;-1:-1:-1;;;24581:73:0;;24538:35;;-1:-1:-1;24597:10:0;;24581:49;;:73;;24631:7;;24640;;24649:4;;;;24581:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24662:67;24711:10;:8;:10::i;:::-;24671:36;:14;24698:7;24671:18;:36::i;:::-;:50;;24662:67;;;;;;;;;;;;;-1:-1:-1;;;24662:67:0;;;:8;:67::i;:::-;24423:616;;;;24764:1;24754:7;:11;24750:82;;;24795:6;;24767:65;;-1:-1:-1;;;;;24795:6:0;24803:9;24795:6;24822:8;;;24767:27;:65::i;:::-;24841:22;24866:10;:8;:10::i;:::-;24884:73;;-1:-1:-1;;;24884:73:0;;24841:35;;-1:-1:-1;24900:10:0;;24884:49;;:73;;24934:7;;24943;;24952:4;;;;24884:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24965:67;25014:10;:8;:10::i;:::-;24974:36;:14;25001:7;24974:18;:36::i;24965:67::-;24423:616;;25067:9;-1:-1:-1;;;;;25050:94:0;25055:10;-1:-1:-1;;;;;25050:94:0;;25078:7;25087;25096:5;:18;;;25116:5;:15;;;25133:5;:10;;;25050:94;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;25150:5:0;:21;;-1:-1:-1;;;;25150:21:0;-1:-1:-1;;;25150:21:0;;;-1:-1:-1;16081:9095:0;;;;-1:-1:-1;16081:9095:0;-1:-1:-1;;;;;;16081:9095:0:o;8460:360::-;8587:39;;8659:15;;-1:-1:-1;;;;;8587:39:0;;;;-1:-1:-1;;;;;8659:15:0;8684:20;;8680:136;;8779:11;;8729:80;;-1:-1:-1;;;8779:11:0;;;;8761:15;:29;8792:16;8729:31;:80::i;:::-;8714:95;;;;8680:136;8460:360;;:::o;3121:33::-;;;-1:-1:-1;;;;;3121:33:0;;:::o;32109:662::-;32199:7;:5;:7::i;:::-;32236:15;;;32253:7;32212:49;;-1:-1:-1;;;32212:49:0;;:2;;:23;;:49;;-1:-1:-1;;;;;32236:15:0;;;;32253:7;;;;32212:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32275:5:0;;-1:-1:-1;;;;;32275:5:0;:19;;-1:-1:-1;32267:28:0;;-1:-1:-1;32267:28:0;;;;;32301:5;:14;;-1:-1:-1;;;;;32301:14:0;;;-1:-1:-1;;;;;;32301:14:0;;;;;;;;32321:3;:10;;;;;;;;;;;;32629:30;;;-1:-1:-1;;;32629:30:0;;;;32301:5;;:14;32629:28;;:30;;;;;;;;;;;;;32301:5;:14;32629:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32598:61;;32665:86;32692:20;32721:15;32739:11;;;;;;;;;;;32665:26;:86::i;:::-;32757:9;:7;:9::i;:::-;32109:662;;;:::o;4963:541::-;5183:1;5164:7;-1:-1:-1;;;;;5164:7:0;:21;:47;;;;-1:-1:-1;;;;;;5189:22:0;;;;5164:47;5156:56;;;;;;5218:7;:18;;-1:-1:-1;;;;;5218:18:0;;;-1:-1:-1;;;;;;5218:18:0;;;;;;;;5242:16;;;;;;;;;;;5264:6;:16;;;;;;;;;;;5286:11;:26;;;;;;;;-1:-1:-1;;;5286:26:0;-1:-1:-1;;;;5286:26:0;;;;;;;;;5318:15;:34;;;;;;;;;;;;;;;5387:2;:18;5406:5;5413:12;5427:13;5442:42;5427:13;5442:27;:42::i;:::-;5486:12;5387:112;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5359:19;:140;;-1:-1:-1;;;;;5359:140:0;;;-1:-1:-1;;;5359:140:0;;;;;;;;;-1:-1:-1;;;;;;4963:541:0:o;3537:55::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;3537:55:0;;;;;-1:-1:-1;;;3537:55:0;;-1:-1:-1;;;;;3537:55:0;;-1:-1:-1;;;3537:55:0;;;;;:::o;2766:35::-;;;-1:-1:-1;;;;;2766:35:0;;;;-1:-1:-1;;;2766:35:0;;;;:::o;11221:513::-;11413:15;11430;11453:7;:5;:7::i;:::-;11466:17;:15;:17::i;:::-;11510:204;11538:9;11566;11594;11629:16;11671;11702:5;11510:8;:204::i;:::-;11489:225;;-1:-1:-1;11489:225:0;-1:-1:-1;11720:9:0;:7;:9::i;:::-;11221:513;;;;;;;;;:::o;8857:222::-;8960:7;:5;:7::i;:::-;8973:86;;-1:-1:-1;;;8973:86:0;;:2;;:37;;:86;;9011:12;;9025:5;;9032:26;;8973:86;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9065:9;:7;:9::i;:::-;8857:222;:::o;2345:27::-;;;-1:-1:-1;;;;;2345:27:0;;;-1:-1:-1;;;2345:27:0;;;;;;-1:-1:-1;;;2345:27:0;;;;;-1:-1:-1;;;2345:27:0;;;;;-1:-1:-1;;;2345:27:0;;;;;-1:-1:-1;;;2345:27:0;;;;;:::o;2905:39::-;;;-1:-1:-1;;;;;2905:39:0;;:::o;1775:::-;;;-1:-1:-1;;;;;1775:39:0;;:::o;10023:648::-;10178:15;10195;10218:7;:5;:7::i;:::-;10231:35;10269:53;10290:9;10301;10312;10269:20;:53::i;:::-;-1:-1:-1;;;;;10328:21:0;;:12;;;:21;10428:82;;-1:-1:-1;;;10428:82:0;;10231:91;;-1:-1:-1;10356:22:0;;;;;;10428:2;;:24;;:82;;10453:9;;10464:5;;10471:10;;10483:12;;10497:5;;10231:91;;10428:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10355:155;;;;;;10528:14;10516:9;;:26;;;;;-1:-1:-1;;;;;10516:26:0;;;;;-1:-1:-1;;;;;10516:26:0;;;;;;10548:2;:13;10562:5;10569:10;10581;10593:6;;;;;;;;;-1:-1:-1;;;;;10593:6:0;10601;;;;;;;;;-1:-1:-1;;;;;10601:6:0;10609:4;;10548:66;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10620:9;:7;:9::i;:::-;10643:10;;;;-1:-1:-1;10023:648:0;-1:-1:-1;;;;;;;;;10023:648:0:o;2487:44::-;;;;:::o;1709:27::-;;;-1:-1:-1;;;;;1709:27:0;;:::o;25213:1232::-;25326:7;:5;:7::i;:::-;25982:285;;;;;;;;26014:6;;-1:-1:-1;;;;;26014:6:0;;;25982:285;;26038:6;;;;;25982:285;;;;25897:23;26063:7;;;;25982:285;;;;26093:11;;-1:-1:-1;;;26093:11:0;;;;25982:285;;;;;;;26125:9;;-1:-1:-1;;;;;26125:9:0;;;25982:285;;;;26161:15;;;25982:285;;;;;;;;;;;;;;;;;26014:6;25982:285;;;;;25949:336;;-1:-1:-1;;;25949:336:0;;25897:23;;25949:2;;:8;;:336;;25965:9;;25982:285;26275:4;;;;25949:336;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25896:389;;-1:-1:-1;25896:389:0;-1:-1:-1;26295:19:0;;26291:64;;26316:20;:39;;;;;;26291:64;26365:19;;26361:64;;26386:20;:39;;;;;;26361:64;26431:9;:7;:9::i;:::-;25213:1232;;;;;;;:::o;10708:476::-;10881:15;10898;10921:7;:5;:7::i;:::-;10955:209;10983:9;11011;11039;11074:16;11116;11147:10;10955:8;:209::i;:::-;10934:230;;-1:-1:-1;10934:230:0;-1:-1:-1;11170:9:0;:7;:9::i;:::-;10708:476;;;;;;;;:::o;3443:59::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3443:59:0;;;;;;;;;;-1:-1:-1;;;3443:59:0;;;;:::o;3356:52::-;;;;;;;;;;;;;:::o;2567:46::-;;;;:::o;3921:49::-;-1:-1:-1;;;3921:49:0;:::o;12459:324::-;12585:15;12602;12625:7;:5;:7::i;:::-;12638:17;:15;:17::i;:::-;12682:81;12700:9;12722;12741:6;12756:5;12682;:81::i;:::-;12661:102;;-1:-1:-1;12661:102:0;-1:-1:-1;12769:9:0;:7;:9::i;:::-;12459:324;;;;;;;:::o;3193:43::-;;;-1:-1:-1;;;3193:43:0;;-1:-1:-1;;;;;3193:43:0;;:::o;8070:348::-;8166:30;8198:51;8266:147;8301:15;8319:11;;8266:147;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8332:5:0;:10;8368:9;;8266:12;;:147;;-1:-1:-1;;;;8332:10:0;;;;;-1:-1:-1;8344:22:0;-1:-1:-1;;;8344:22:0;;;;;-1:-1:-1;;;;;8368:9:0;;;;-1:-1:-1;;;8379:28:0;;;8266:20;:147::i;:::-;8259:154;;;;8070:348;;;;;;:::o;13313:596::-;13415:7;:5;:7::i;:::-;13428:12;:10;:12::i;:::-;13459:5;:10;-1:-1:-1;;;13459:10:0;;;;;;;13532:17;;;;;;;;;;;:37;;;13560:9;13553:16;;:4;:16;;;13532:37;13528:161;;;13579:16;:14;:16::i;:::-;13644:15;;13621:61;;-1:-1:-1;;;;;13644:15:0;13661:20;13621:22;:61::i;:::-;13603:15;:79;;-1:-1:-1;;;;;;13603:79:0;-1:-1:-1;;;;;13603:79:0;;;;;;;;;;13528:161;13695:2;:17;13720:9;13737:5;13750:3;;;;;;;;;-1:-1:-1;;;;;13750:3:0;13761:9;13778;13795:4;13807:20;13835;;13863;;13695:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13895:9;:7;:9::i;:::-;13313:596;;;;:::o;3826:56::-;3873:9;3826:56;:::o;9114:290::-;9344:5;:10;9356:20;;9378;;9293:106;;-1:-1:-1;;;9293:106:0;;9220:28;;;;9293:2;;:21;;:106;;9315:5;;9322:9;;9333;;-1:-1:-1;;;9344:10:0;;;;;;9293:106;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;26480:318::-;26728:5;:10;26765:22;;26667:126;;-1:-1:-1;;;26667:126:0;;26626:26;;26667:2;;:24;;:126;;26699:5;;26706:9;;26717;;-1:-1:-1;;;26728:10:0;;;;;26740:23;;26667:126;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26660:133;;26480:318;;;;;;:::o;12135:287::-;12242:15;12259;12282:7;:5;:7::i;:::-;12316:86;12334:9;12356;12375:6;12390:10;12316:5;:86::i;:::-;12295:107;;-1:-1:-1;12295:107:0;-1:-1:-1;12408:9:0;:7;:9::i;:::-;12135:287;;;;;;:::o;7528:500::-;7754:33;;;;;;;;7782:5;7754:33;-1:-1:-1;;;;;7754:33:0;;;;-1:-1:-1;;;7754:33:0;;;;;;;;;;;;;;;;-1:-1:-1;;;7754:33:0;;;;;;;;;;;;-1:-1:-1;;;7754:33:0;;;;;;;;;;-1:-1:-1;;;7754:33:0;;;;;;;;;-1:-1:-1;;;7754:33:0;;;;;;;;;;;8008:9;;7800:223;;-1:-1:-1;;;7800:223:0;;-1:-1:-1;;;;;;7754:33:0;;7800:2;;:28;;:223;;7836:5;;7849:12;;7869:9;;7886;;7754:33;;;;-1:-1:-1;;;;;8008:9:0;;;;7800:223;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7793:230;;;;;;;7528:500;;;;;:::o;31841:231::-;31908:15;31925;31948:7;:5;:7::i;:::-;31961:12;:10;:12::i;:::-;32037:6;;32045;;32000:52;;-1:-1:-1;;;32000:52:0;;:2;;:14;;:52;;32015:9;;32026;;-1:-1:-1;;;;;32037:6:0;;;;32045;;;32000:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31979:73;;-1:-1:-1;31979:73:0;-1:-1:-1;32058:9:0;:7;:9::i;:::-;31841:231;;;:::o;1641:29::-;;;-1:-1:-1;;;;;1641:29:0;;:::o;2837:32::-;;;;:::o;6507:128::-;6560:6;6592:7;;6581:49;;-1:-1:-1;;;6581:49:0;;-1:-1:-1;;;;;6592:7:0;;;;6581:34;;:49;;6624:4;;6581:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6574:56;;6507:128;;:::o;1433:31::-;;;-1:-1:-1;;;;;1433:31:0;;:::o;2979:34::-;;;-1:-1:-1;;;2979:34:0;;;;;:::o;3052:33::-;;;-1:-1:-1;;;3052:33:0;;;;;:::o;1572:30::-;;;-1:-1:-1;;;;;1572:30:0;;:::o;6291:181::-;6338:6;6352:39;;:::i;:::-;6418:10;6397:31;;6441:26;6397:11;6441:13;:26::i;:::-;6434:33;;;6291:181;:::o;6019:171::-;6112:11;6164:7;;6173:11;;6138:47;;-1:-1:-1;;;6138:47:0;;:2;;:11;;:47;;6150:12;;-1:-1:-1;;;;;6164:7:0;;-1:-1:-1;;;6173:11:0;;;;;6138:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6131:54;;6019:171;;;;:::o;5539:::-;5633:6;5684:7;;5693:11;;5654:51;;-1:-1:-1;;;5654:51:0;;:2;;:16;;:51;;5671:11;;-1:-1:-1;;;;;5684:7:0;;-1:-1:-1;;;5693:11:0;;;;;5654:51;;;:::i;3731:56::-;3780:7;3731:56;:::o;2408:44::-;;;;:::o;3272:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3272:49:0;;;-1:-1:-1;;;3272:49:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3272:49:0;;-1:-1:-1;;;;;3272:49:0;;-1:-1:-1;;;3272:49:0;;;;;-1:-1:-1;;;3272:49:0;;;;;:::o;28746:191::-;28798:17;28823:7;:5;:7::i;:::-;28836:12;:10;:12::i;:::-;28854:16;:14;:16::i;:::-;28888:8;;28876:20;;28909:8;28902:15;;;28923:9;:7;:9::i;4479:104::-;4572:5;4561:9;4553:25;;;;-1:-1:-1;;;4553:25:0;;;;;;;;:::i;:::-;;;;;;;;4333:379:32;4489:6;-1:-1:-1;;;;;4507:23:32;;;4503:140;;4554:44;;-1:-1:-1;;;4554:44:32;;4540:11;;-1:-1:-1;;;;;4554:31:32;;;;;:44;;4586:11;;4554:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4540:58;-1:-1:-1;4610:8:32;;;;4606:30;;4627:9;4631:4;4627:3;:9::i;:::-;4620:16;;;;;4606:30;4503:140;;4656:51;;-1:-1:-1;;;4656:51:32;;-1:-1:-1;;;;;4656:37:32;;;;;:51;;4694:12;;4656:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4649:58;;4333:379;;;;;;;:::o;2100:1747:28:-;2266:10;2278:16;2302;2328:11;2321:18;;:4;:18;;;;;;;;2302:37;;2356:1;2349:4;:8;;;:35;;;;;2368:11;2361:18;;:4;:18;;;;;;;;:23;;;;2349:35;2345:53;;;-1:-1:-1;;2386:12:28;2345:53;2444:3;2440:1403;;;2458:13;2473:12;2489:20;2498:10;2489:8;:20::i;:::-;2614:1;2651:13;;;;;2578:12;2651:13;;;;;;;;;;;2614:11;;;;;;;2593:33;;-1:-1:-1;;2593:33:28;2651:20;;;2806:11;;;;-1:-1:-1;2457:52:28;;-1:-1:-1;2457:52:28;;-1:-1:-1;2593:33:28;2806:11;2936:154;;3079:11;3068:6;3062:13;;3049:10;:26;3048:42;2936:154;;;3026:11;2987:34;3014:6;2987:26;:34::i;:::-;2978:6;:43;2972:50;;2959:10;:63;2958:79;2936:154;2929:161;;2440:1403;;;;;;;3203:13;3218:12;3234:24;3243:10;3256:1;3243:14;3234:8;:24::i;:::-;3202:56;;;;3318:12;3351:1;3341:6;3336:11;;:1;:11;;3335:17;3333:20;3318:35;;3361:14;3394:4;3378;:13;3383:7;3378:13;;;;;;;;;;;;;;;;:20;3361:37;;3525:6;3535:1;3525:11;;3511:25;;3655:11;:181;;3825:11;3814:6;3796:15;:24;3790:31;;3773:10;3786:1;3773:14;:48;3772:64;3655:181;;;3750:11;3739:6;3701:35;3729:6;3701:27;:35::i;:::-;:44;3695:51;;3678:10;3691:1;3678:14;:68;3677:84;3655:181;3648:188;;2440:1403;;;;;2100:1747;;;;;;;;:::o;1354:2470:29:-;1417:20;1445:15;1470:1;1463:4;:8;;;:57;;1514:4;1507:12;;1463:57;;;1490:4;1483:12;;1482:13;;1463:57;1445:75;-1:-1:-1;637:9:29;1534:28;;;1526:42;;;;;-1:-1:-1;;;1526:42:29;;;;;;;;;;;;-1:-1:-1;;;1526:42:29;;;;;;;;;;;;;;;1575:13;1601:3;1591:13;;:93;;-1:-1:-1;;;1591:93:29;;;1612:34;1591:93;1575:109;;;-1:-1:-1;1704:3:29;1694:13;;:18;1690:83;;1731:34;1723:42;1770:3;1722:51;1690:83;1793:3;1783:13;;:18;1779:83;;1820:34;1812:42;1859:3;1811:51;1779:83;1882:3;1872:13;;:18;1868:83;;1909:34;1901:42;1948:3;1900:51;1868:83;1971:4;1961:14;;:19;1957:84;;1999:34;1991:42;2038:3;1990:51;1957:84;2061:4;2051:14;;:19;2047:84;;2089:34;2081:42;2128:3;2080:51;2047:84;2151:4;2141:14;;:19;2137:84;;2179:34;2171:42;2218:3;2170:51;2137:84;2241:4;2231:14;;:19;2227:84;;2269:34;2261:42;2308:3;2260:51;2227:84;2331:5;2321:15;;:20;2317:85;;2360:34;2352:42;2399:3;2351:51;2317:85;2422:5;2412:15;;:20;2408:85;;2451:34;2443:42;2490:3;2442:51;2408:85;2513:5;2503:15;;:20;2499:85;;2542:34;2534:42;2581:3;2533:51;2499:85;2604:5;2594:15;;:20;2590:85;;2633:34;2625:42;2672:3;2624:51;2590:85;2695:6;2685:16;;:21;2681:86;;2725:34;2717:42;2764:3;2716:51;2681:86;2787:6;2777:16;;:21;2773:86;;2817:34;2809:42;2856:3;2808:51;2773:86;2879:6;2869:16;;:21;2865:86;;2909:34;2901:42;2948:3;2900:51;2865:86;2971:6;2961:16;;:21;2957:86;;3001:34;2993:42;3040:3;2992:51;2957:86;3063:7;3053:17;;:22;3049:86;;3094:33;3086:41;3132:3;3085:50;3049:86;3155:7;3145:17;;:22;3141:85;;3186:32;3178:40;3223:3;3177:49;3141:85;3246:7;3236:17;;:22;3232:83;;3277:30;3269:38;3312:3;3268:47;3232:83;3335:7;3325:17;;:22;3321:78;;3366:25;3358:33;3396:3;3357:42;3321:78;3417:1;3410:4;:8;;;3406:47;;;3448:5;-1:-1:-1;;3428:25:29;;;;;;3420:33;;3406:47;-1:-1:-1;;;3787:5:29;:17;:22;:30;;3816:1;3787:30;;;3812:1;3787:30;3770:48;;3780:2;3771:5;:11;;3770:48;3747:72;;1354:2470;;;;;:::o;1360:2741:26:-;1548:24;;;;-1:-1:-1;;;;;1654:41:26;;;;;;;;1716:20;;;;;;1743:1134;;1764:30;1797:61;1821:15;1845:7;1839:3;:13;1797:61;;1854:3;1797:15;:61::i;:::-;1764:94;;1877:10;:206;;1996:87;2026:19;2047:18;2067:9;2078:4;1996:29;:87::i;:::-;1877:206;;;1898:87;1928:18;1948:19;1969:9;1980:4;1898:29;:87::i;:::-;1866:217;;2121:8;2095:22;:34;2091:257;;2160:18;2141:37;;2091:257;;;2232:107;2272:19;2293:9;2304:22;2328:10;2232:39;:107::i;:::-;2203:136;;2091:257;1743:1134;;;;2380:10;:208;;2500:88;2530:19;2551:18;2571:9;2582:5;2500:29;:88::i;:::-;2380:208;;;2401:88;2431:18;2451:19;2472:9;2483:5;2401:29;:88::i;:::-;2368:220;;2629:9;2609:15;2608:16;;2600:38;2596:275;;2669:18;2650:37;;2596:275;;;2731:131;2783:19;2804:9;2824:15;2823:16;;2842:10;2731:40;:131::i;:::-;2712:150;;2596:275;-1:-1:-1;;;;;2894:38:26;;;;;;;2975:636;;;;3010:3;:14;;;;;3017:7;3010:14;:129;;3054:85;3084:16;3102:19;3123:9;3134:4;3054:29;:85::i;:::-;3010:129;;;3035:8;3010:129;2999:140;;3159:3;:15;;;;;3167:7;3166:8;3159:15;:132;;3205:86;3235:16;3253:19;3274:9;3285:5;3205:29;:86::i;:::-;3159:132;;;3185:9;3159:132;3147:144;;2975:636;;;3323:3;:14;;;;;3330:7;3323:14;:129;;3367:85;3397:19;3418:16;3436:9;3447:4;3367:29;:85::i;:::-;3323:129;;;3348:8;3323:129;3312:140;;3472:3;:15;;;;;3480:7;3479:8;3472:15;:132;;3518:86;3548:19;3569:16;3587:9;3598:5;3518:29;:86::i;:::-;3472:132;;;3498:9;3472:132;3460:144;;2975:636;3693:7;3692:8;:49;;;;;3725:15;3724:16;;3704:9;:37;3692:49;3688:107;;;3772:15;3771:16;;3751:37;;3688:107;3805:7;:49;;;;;3836:18;-1:-1:-1;;;;;3816:38:26;:16;-1:-1:-1;;;;;3816:38:26;;;3805:49;3801:296;;;3990:8;3971:15;3963:35;3951:47;;3801:296;;;4031:59;4057:8;4067:7;4031:59;;4082:7;4076:3;:13;4031:59;;:25;:59::i;:::-;4019:71;;3801:296;1360:2741;;;;;;;;;;;;;:::o;888:113:24:-;940:8;-1:-1:-1;;;964:1:24;:12;956:21;;;;;1499:114:21;1584:5;;;1579:16;;;;1555:8;1600:6;;;1579:28;1571:37;;;;;1218:114;1303:5;;;1298:16;;;;1274:8;1319:6;;;1298:28;1290:37;;;;;30829:970:0;30956:27;30985:23;31075:16;-1:-1:-1;;;;;31061:30:0;:10;-1:-1:-1;;;;;31061:30:0;;31057:738;;;-1:-1:-1;31119:9:0;31057:738;;;-1:-1:-1;;;;;31192:21:0;;31188:607;;31224:25;31251:24;31279:31;31297:9;31308:1;31279:17;:31::i;:::-;31223:87;;;;31340:66;31356:17;-1:-1:-1;;;31395:10:0;-1:-1:-1;;;;;31340:66:0;:15;:66::i;:::-;31318:88;-1:-1:-1;31432:16:0;-1:-1:-1;31188:607:0;;-1:-1:-1;31188:607:0;;31526:25;31553:24;31581:50;31591:9;31602:10;31614:16;31581:9;:50::i;:::-;31525:106;;;;31661:85;31677:17;-1:-1:-1;;;31729:16:0;31716:10;:29;-1:-1:-1;;;;;31661:85:0;:15;:85::i;:::-;31639:107;31772:16;;-1:-1:-1;30829:970:0;-1:-1:-1;;;;;30829:970:0:o;11876:1686:22:-;12085:20;;12160:15;;;12156:235;;12185:23;12211:4;12216:5;12211:11;;;;;;;;;12185:37;;;;;;;;12211:11;;;;12185:37;;;;;;;;-1:-1:-1;;;12185:37:22;;;;;;;;;;;;;;-1:-1:-1;;;12185:37:22;;-1:-1:-1;;;;;12185:37:22;;;;;;;;-1:-1:-1;;;12185:37:22;;;;;;;;;;;;;-1:-1:-1;12234:27:22;;;12230:78;;12270:38;12280:4;12286;12292;12298:9;12270;:38::i;:::-;12263:45;;12230:78;12324:4;:19;;;12345:4;:38;;;12316:68;;;;;;;12156:235;12413:17;;;12397:13;;12507:83;12534:4;12413;:17;12554:4;12560:5;12567:9;12578:11;12507:26;:83::i;:::-;12437:153;;;;12611:10;:25;;;12601:35;;:6;:35;;;12597:961;;;12690:10;:25;;;12717:10;:44;;;12682:80;;;;;;;;;12597:961;12789:24;;12779:34;;;;;;;12775:783;;;12868:9;:24;;;12894:9;:43;;;12860:78;;;;;;;;;12775:783;13045:25;;13018:24;;13215:25;;;;;13188:24;;;;13018:52;;;;;13099:34;;;13186:103;;;;;13187:77;;;;13188:52;13187:77;;;;;;;;13186:103;13158:10;:25;;;:131;13511:20;13377:154;;13496:11;13378:129;;13432:10;:44;;;13386:9;:43;;;:90;-1:-1:-1;;;;;13378:99:22;:129;13377:154;;;;;;13299:10;:44;;;:244;13141:410;;;;;;;;;11876:1686;;;;;;;;;;;:::o;28322:387:0:-;28434:11;;28390:15;;28434:11;-1:-1:-1;;;28434:11:0;;;;;;28455:26;;;;28451:39;;;28483:7;;;;28451:39;28513:5;;-1:-1:-1;;;;;28513:5:0;28528:20;28524:33;;28550:7;;;;;28524:33;28563:28;28603:6;-1:-1:-1;;;;;28594:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28563:61;;28630:74;28657:20;28679:10;28691:12;28630:26;:74::i;28322:387::-;:::o;11336:969:27:-;11629:25;;:::i;:::-;11687:10;;;;;;11662:22;11687:10;;;;;;;;;;11755:26;;;;;11732:49;;;11703:78;;;11839:26;;;;;11816:49;;;11787:78;;;11927:28;;;;;11902:53;;;11871:84;;;12035:35;;;;;12183:19;-1:-1:-1;;;;;;;;;;;12035:35:27;;;;;11999:71;;;11961:109;;;;-1:-1:-1;;;;;;11961:109:27;;;;;;;12122:26;;;;12105:43;;;12076:72;;;;;-1:-1:-1;;12076:72:27;;;;;;;12183:19;;;;;12176:26;;;12154:48;;;;;;-1:-1:-1;;;;12154:48:27;;;;;;;;;12228:17;;-1:-1:-1;;;12228:17:27;;;;;;12208:37;;;;;;-1:-1:-1;12277:23:27;;;;;;12251:49;;;;;:23;;;:49;;;;12208:4;11336:969::o;373:210:20:-;435:9;460:1;456;:5;;;452:127;;;503:1;-1:-1:-1;;;;;479:25:20;497:1;496:2;;484:1;:15;480:19;;;-1:-1:-1;;;;;479:25:20;;471:40;;;;;-1:-1:-1;;;471:40:20;;;;;;;;;;;;-1:-1:-1;;;471:40:20;;;;;;;;;;;;;;;452:127;;;564:1;-1:-1:-1;;;;;540:25:20;557:1;545;:14;541:18;;;-1:-1:-1;;;;;540:25:20;;;532:40;;;;;-1:-1:-1;;;532:40:20;;;;;;;;;;;;-1:-1:-1;;;532:40:20;;;;;;;;;;;;;;4231:3618:29;4304:10;813:13;-1:-1:-1;;;;;4425:30:29;;;;;;:63;;-1:-1:-1;992:65:29;-1:-1:-1;;;;;4459:29:29;;;4425:63;4417:77;;;;;-1:-1:-1;;;4417:77:29;;;;;;;;;;;;-1:-1:-1;;;4417:77:29;;;;;;;;;;;;;;;-1:-1:-1;;;;;4541:2:29;4516:27;;;;-1:-1:-1;;;;;4628:41:29;;4625:1;4621:49;4706:9;;;-1:-1:-1;;;;;4759:25:29;;4756:1;4752:33;4821:9;;;4880:10;4874:17;;4871:1;4867:25;4928:9;;;4987:6;4981:13;;4978:1;4974:21;5031:9;;;5090:4;5084:11;;5081:1;5077:19;;;5132:9;;;5191:3;5185:10;;5182:1;5178:18;5232:9;;;5285:10;;;5282:1;5278:18;;;5332:9;;;;5378:10;;;4799;;4906;;;5009;;;5110;5210;;;5310;5402;5435:3;5428:10;;5424:75;;5460:3;5454;:9;5444:5;:20;;5440:24;;5424:75;;;5495:3;5489;:9;5479:5;:20;;5475:24;;5424:75;5584:9;;;5579:3;5575:19;;;5610:11;;;;5670:9;;;;5721;;5712:19;;;5747:11;;;5807:9;5858;;5849:19;;;5884:11;;;5944:9;5995;;5986:19;;;6021:11;;;6081:9;6132;;6123:19;;;6158:11;;;6218:9;6269;;6260:19;;;6295:11;;;6355:9;6406;;6397:19;;;6432:11;;;6492:9;6543;;6534:19;;;6569:11;;;6629:9;6680;;6671:19;;;6706:11;;;6766:9;6817;;6808:19;;;6843:11;;;6903:9;6954;;6945:19;;;6980:11;;;7040:9;7091;;7082:19;;;7117:11;;;7177:9;7228;;7219:19;;;7254:11;;;;7314:9;;;;7365;;7356:19;;;;;5584:9;-1:-1:-1;;5522:17:29;;5544:2;5521:25;5647:10;;;;;;;5637:21;5784:10;;;;;;;5774:21;;;;5921:10;;;;;;;5911:21;;;;6058:10;;;;;;;6048:21;;;;6195:10;;;;;;;6185:21;;;;6332:10;;;;;;;6322:21;;;;6469:10;;;;;;;6459:21;6606:10;;;;;-1:-1:-1;;;6606:10:29;6596:21;6743:10;;;;;;;6733:21;6880:10;;;;;;;6870:21;7017:10;;;;;;;7007:21;7154:10;;;;;;;7144:21;7291:10;;;;;;;7281:21;7428:10;;;;;;;7418:21;7482:31;7474:39;;-1:-1:-1;;7561:65:29;;5536:3;7560:74;;;;7679:51;7663:67;;7662:76;;7753:17;;;;;;;;;:91;;7813:12;-1:-1:-1;;;;;7783:42:29;:26;7802:6;7783:18;:26::i;:::-;-1:-1:-1;;;;;7783:42:29;;;:61;;7837:7;7783:61;;;7828:6;7783:61;7753:91;;;7773:7;7753:91;7746:98;4231:3618;-1:-1:-1;;;;;;;;;4231:3618:29:o;5187:1765:32:-;-1:-1:-1;;;;;5409:23:32;;5405:36;;5434:7;;5405:36;5447:11;-1:-1:-1;;;;;5461:30:32;;;5492:11;5505:32;:6;5530;5505:24;:32::i;:::-;5461:77;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5447:91;-1:-1:-1;5548:9:32;;;5544:22;;5559:7;;;5544:22;5579:9;5583:4;5579:3;:9::i;:::-;5572:16;;5595;5644:1;5614:11;:27;;;:31;5595:50;;5785:19;5807:11;:82;;5865:6;:23;;;5807:82;;;5830:6;:23;;;5829:24;;5807:82;5785:104;-1:-1:-1;5934:18:32;5955:48;5785:104;5955:48;;;774:3;5955:28;:48::i;:::-;6345:23;;;:45;;;;;;5934:69;-1:-1:-1;6550:398:32;;;;6633:11;:22;;;6629:119;;;6657:39;;-1:-1:-1;;;;;;;;6657:39:32;;;;;;;;;;;;;;;6629:119;;;6709:39;;-1:-1:-1;;;;;6709:39:32;;;;;;-1:-1:-1;;;;;;6709:39:32;;;;;;6629:119;6550:398;;;6826:11;:22;;;6822:119;;;6850:39;;-1:-1:-1;;;;;6850:39:32;;;;;;-1:-1:-1;;;;;;6850:39:32;;;;;;6822:119;;;6902:39;;-1:-1:-1;;;;;;;;6902:39:32;;;;;;;;;;;;;;;6822:119;5187:1765;;;;;;;;;;:::o;4192:823:22:-;4403:19;4424:25;4457:23;4483:4;4488:5;4483:11;;;;;;;;;4457:37;;;;;;;;4483:11;;;;4457:37;;;;;;;;-1:-1:-1;;;4457:37:22;;;;;;;;;;;;;;-1:-1:-1;;;4457:37:22;;-1:-1:-1;;;;;4457:37:22;;;;;;;;-1:-1:-1;;;4457:37:22;;;;;;;;;;;;;-1:-1:-1;4576:37:22;;;4572:70;;;4623:5;4630:11;4615:27;;;;;;;4572:70;4735:11;4717:29;;:15;:29;;;:59;;;;;4774:1;4760:11;:15;4750:26;;:5;:26;;;4717:59;4713:169;;;4807:15;4786:36;;4713:169;;;4864:11;4843:32;;4713:169;4917:18;4903:32;;4904:5;4912:1;4904:9;4903:32;;;;;;;;4888:47;;4962:48;4972:4;4978:14;4994:4;5000:9;4962;:48::i;:::-;4941:4;4946:12;4941:18;;;;;;;;;:69;;:18;;:69;;;;;;;;;;;;;;;;;-1:-1:-1;;;4941:69:22;-1:-1:-1;;;;;;;;;;4941:69:22;;;-1:-1:-1;;;4941:69:22;;;;;;;;;-1:-1:-1;;;4941:69:22;-1:-1:-1;;4941:69:22;;;;-1:-1:-1;;4941:69:22;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4192:823:22;;;;;;;;;;:::o;590:276:30:-;716:66;;;-1:-1:-1;;;;;716:66:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;716:66:30;-1:-1:-1;;;716:66:30;;;705:78;;;;670:12;;;;705:10;;;;716:66;705:78;;;716:66;705:78;;716:66;705:78;;;;;;;;;;-1:-1:-1;;705:78:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;669:114;;;;797:7;:57;;;;-1:-1:-1;809:11:30;;:16;;:44;;;840:4;829:24;;;;;;;;;;;;;;;-1:-1:-1;829:24:30;809:44;789:72;;;;;-1:-1:-1;;;789:72:30;;;;;;;;;;;;-1:-1:-1;;;789:72:30;;;;;;;;;;;;;;7081:115:0;7159:6;;7145:46;;-1:-1:-1;;;7145:46:0;;7123:7;;-1:-1:-1;;;;;7159:6:0;;7145:31;;:46;;7185:4;;7145:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;425:105:21:-;513:5;;;508:16;;;;500:25;;;;;7371:115:0;7449:6;;7435:46;;-1:-1:-1;;;7435:46:0;;7413:7;;-1:-1:-1;;;;;7449:6:0;;7435:31;;:46;;7475:4;;7435:46;;;:::i;26887:180::-;26995:7;27045:16;-1:-1:-1;;;;;27025:36:0;27038:3;27026:8;:15;;27025:36;;;;;;;26887:180;-1:-1:-1;;;26887:180:0:o;4317:95::-;4357:5;:14;4348:31;;;;;;;;;;;;-1:-1:-1;;;4348:31:0;;;;;;-1:-1:-1;;;4357:14:0;;;;;4348:8;:31::i;:::-;4385:5;:22;;-1:-1:-1;;;;4385:22:0;;;4317:95::o;27288:507::-;27430:15;;-1:-1:-1;;;;;27430:15:0;27455:20;;27451:316;;27511:75;27527:20;-1:-1:-1;;;27569:16:0;-1:-1:-1;;;;;27511:75:0;:15;:75::i;:::-;27485:22;:101;;;;;;;27637:70;;27669:19;;;27637:70;27690:16;27637:31;:70::i;:::-;27594:39;:113;;-1:-1:-1;;;;;;27594:113:0;;-1:-1:-1;;;;;27594:113:0;;;;;;;;;;;;;;27451:316;;;27728:8;:32;;;;;;27451:316;-1:-1:-1;;27772:11:0;:18;;;;;;-1:-1:-1;;;27772:18:0;-1:-1:-1;;;;27772:18:0;;;;;;;;;-1:-1:-1;27288:507:0:o;4416:59::-;4449:5;:21;;-1:-1:-1;;;;4449:21:0;-1:-1:-1;;;4449:21:0;;;4416:59::o;4840:86::-;4909:3;;;4886:35;;;;;;;;;;;;-1:-1:-1;;;4886:35:0;;;;;;-1:-1:-1;;;;;4909:3:0;;;4895:10;:17;;4886:8;:35::i;11738:360::-;12073:6;;12081;;11968:125;;-1:-1:-1;;;11968:125:0;;11921:15;;;;11968:2;;:10;;:125;;11986:9;;11997;;12008;;12019;;12030:16;;12048;;12066:5;;-1:-1:-1;;;;;12073:6:0;;;;12081;;;;11968:125;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11961:132;;;;11738:360;;;;;;;;;:::o;9408:578::-;9525:35;;:::i;:::-;-1:-1:-1;9576:405:0;;;;;;;;-1:-1:-1;;;;;9576:405:0;;;;;;;;;;;;;;;;;;;;9694:9;;-1:-1:-1;;;;;9694:9:0;;;9576:405;;;;-1:-1:-1;;;9732:19:0;;;;9576:405;;;;9781:20;;9576:405;;;;9831:20;;9576:405;;;;9883:22;;9576:405;;;;9920:5;;;;;9694:9;9576:405;;;9946:11;;-1:-1:-1;;;9946:11:0;;;;9576:405;;;;;;-1:-1:-1;9576:405:0;;;;;9408:578::o;12787:489::-;12904:15;12921;12944:35;12982:49;13003:5;13010:9;13021;12982:20;:49::i;:::-;-1:-1:-1;;;;;13037:21:0;;:12;;;:21;13137:65;;-1:-1:-1;;;13137:65:0;;12944:87;;-1:-1:-1;13065:22:0;;;;;;13137:2;;:7;;:65;;13145:9;;13156:5;;13163:10;;13175:12;;13189:5;;12944:87;;13137:65;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13208:9;:26;;-1:-1:-1;;;;;;13208:26:0;-1:-1:-1;;;;;13208:26:0;;;;;;;;;;;13064:138;13208:26;;-1:-1:-1;12787:489:0;-1:-1:-1;;;;;;;;;12787:489:0:o;14492:687:22:-;14705:30;14737:51;14818:1;14804:11;:15;;;14796:29;;;;;-1:-1:-1;;;14796:29:22;;;;;;;;;;;;-1:-1:-1;;;14796:29:22;;;;;;;;;;;;;;;14862:11;:18;-1:-1:-1;;;;;14850:31:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14850:31:22;;14832:49;;14938:11;:18;-1:-1:-1;;;;;14924:33:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14924:33:22;;14887:70;;14968:9;14963:212;14987:11;:18;14983:1;:22;14963:212;;;15090:78;15104:4;15110;15116:11;15128:1;15116:14;;;;;;;;;;;;;;15132:4;15138:5;15145:9;15156:11;15090:13;:78::i;:::-;15021:15;15037:1;15021:18;;;;;;;;;;;;;15041:34;15076:1;15041:37;;;;;;;;;;;;;15020:148;-1:-1:-1;;;;;15020:148:22;-1:-1:-1;;;;;15020:148:22;;;;;;;;;;;;;;15007:3;;;;;;;14963:212;;;;14492:687;;;;;;;;;;:::o;4681:81:0:-;4745:5;;4722:35;;;;;;;;;;;;-1:-1:-1;;;4722:35:0;;;;;;-1:-1:-1;;;;;4745:5:0;4731:10;:19;;4722:8;:35::i;9180:137:32:-;9229:17;895:7;9267:21;;;;:45;;895:7;9267:45;;684:150:28;787:9;;795:1;787:9;;;;825:3;818:10;;;;684:150::o;657:581:15:-;719:7;746:1;742;:5;734:14;;;;;;-1:-1:-1;;;759:1:15;:40;755:86;;815:3;809:9;;;;826:8;755:86;855:19;850:1;:24;846:68;;890:2;884:8;;;;900:7;846:68;-1:-1:-1;;;923:1:15;:16;919:60;;955:2;949:8;;;;965:7;919:60;993:7;988:1;:12;984:56;;1016:2;1010:8;;;;1026:7;984:56;1054:5;1049:1;:10;1045:52;;1075:1;1069:7;;;;1084:6;1045:52;1111:4;1106:1;:9;1102:51;;1131:1;1125:7;;;;1140:6;1102:51;1167:3;1162:1;:8;1158:50;;1186:1;1180:7;;;;1195:6;1158:50;1222:3;1217:1;:8;1213:20;;1232:1;1227:6;657:581;;;:::o;1715:712::-;1778:7;1805:1;1801;:5;1793:14;;;;;;-1:-1:-1;1818:3:15;-1:-1:-1;;;;;1831:21:15;;:25;1827:84;;-1:-1:-1;;1866:8:15;1827:84;;;1901:3;1895:9;;;;;1827:84;-1:-1:-1;;;;;1920:20:15;;:24;1916:81;;-1:-1:-1;;1954:7:15;1916:81;;;1988:2;1982:8;;;;;1916:81;2010:16;2006:20;;:24;2002:81;;-1:-1:-1;;2040:7:15;2002:81;;;2074:2;2068:8;;;;;2002:81;2096:16;2092:20;;:24;2088:81;;-1:-1:-1;;2126:7:15;2088:81;;;2160:2;2154:8;;;;;2088:81;2182:15;2178:19;;:23;2174:78;;-1:-1:-1;;2211:6:15;2174:78;;;2244:1;2238:7;;;;;2174:78;2265:3;2261:7;;:11;2257:66;;-1:-1:-1;;2282:6:15;2257:66;;;2315:1;2309:7;;;;;2257:66;2336:3;2332:7;;:11;2328:66;;-1:-1:-1;;2353:6:15;2328:66;;;2386:1;2380:7;;;;;2328:66;2407:3;2403:7;;:11;2399:23;;-1:-1:-1;;2416:6:15;1715:712;;;:::o;735:3398:19:-;817:14;;;-1:-1:-1;;1286:1:19;1283;1276:20;1312:9;;;;-1:-1:-1;1357:13:19;;;1341:14;;;;1337:34;;-1:-1:-1;1441:10:19;1437:143;;1483:1;1469:11;:15;1461:24;;;;;;-1:-1:-1;1522:23:19;;;;-1:-1:-1;1560:13:19;;1437:143;1695:5;1681:11;:19;1673:28;;;;;;1954:17;2020:11;2017:1;2014;2007:25;2328:12;2343;;;:26;;2449:22;;;;;3176:1;3157;:15;;3156:21;;3387:17;;;3383:21;;3376:28;3441:17;;;3437:21;;3430:28;3496:17;;;3492:21;;3485:28;3551:17;;;3547:21;;3540:28;3606:17;;;3602:21;;3595:28;3662:17;;;3658:21;;;3651:28;2777:12;;;;2773:23;;;2798:1;2769:31;2131:20;;;2120:32;;;2820:12;;;;2168:21;;;;2559:16;;;;2811:21;;;;4098:11;;;;;-1:-1:-1;;735:3398:19;;;;;:::o;8001:472:25:-;8148:15;8191:13;-1:-1:-1;;;;;8175:29:25;:13;-1:-1:-1;;;;;8175:29:25;;8171:98;;;8240:13;;8255;8171:98;8283:7;:185;;8393:75;8409:9;-1:-1:-1;;;;;8393:75:25;8436:13;8420;:29;-1:-1:-1;;;;;8393:75:25;-1:-1:-1;;;8393:15:25;:75::i;:::-;8283:185;;;8299:85;8325:9;-1:-1:-1;;;;;8299:85:25;8352:13;8336;:29;-1:-1:-1;;;;;8299:85:25;-1:-1:-1;;;8299:25:25;:85::i;6913:649::-;7060:15;7103:13;-1:-1:-1;;;;;7087:29:25;:13;-1:-1:-1;;;;;7087:29:25;;7083:98;;;7152:13;;7167;7083:98;-1:-1:-1;;;;;;;307:2:18;7209:45:25;;;;-1:-1:-1;;;;;7281:29:25;;;7260:50;;;7325:17;;7317:26;;;;;;7357:7;:200;;7544:13;-1:-1:-1;;;;;7487:70:25;:54;7503:10;7515;7527:13;-1:-1:-1;;;;;7487:54:25;:15;:54::i;:::-;:70;;;;;;7357:200;;;7373:105;7398:64;7424:10;7436;7448:13;-1:-1:-1;;;;;7398:64:25;:25;:64::i;:::-;7464:13;-1:-1:-1;;;;;7373:105:25;:24;:105::i;:::-;7350:207;6913:649;-1:-1:-1;;;;;;;6913:649:25:o;4889:482::-;5039:16;5082:1;5071:8;-1:-1:-1;;;;;5071:12:25;;5063:21;;;;;;5110:1;5098:9;-1:-1:-1;;;;;5098:13:25;;5090:22;;;;;;5188:10;:178;;5290:76;5330:8;5340:9;5351:8;5361:4;5290:39;:76::i;5188:178::-;5207:74;5245:8;5255:9;5266:8;5276:4;5207:37;:74::i;5901:482::-;6053:16;6096:1;6085:8;-1:-1:-1;;;;;6085:12:25;;6077:21;;;;;;6124:1;6112:9;-1:-1:-1;;;;;6112:13:25;;6104:22;;;;;;6196:10;:182;;6302:76;6340:8;6350:9;6361;6372:5;6302:37;:76::i;6196:182::-;6215:78;6255:8;6265:9;6276;6287:5;6215:39;:78::i;4403:259:19:-;4495:14;4526:25;4533:1;4536;4539:11;4526:6;:25::i;:::-;4517:34;;4589:1;4574:11;4561:25;;;;;4571:1;4568;4561:25;:29;4557:101;;;-1:-1:-1;;4608:6:19;:26;4600:35;;;;;;4643:8;;4403:259;;;;;:::o;30347:381:0:-;30463:25;30490:23;30521:18;30542:71;30568:18;30588:13;:11;:13::i;:::-;30542:71;;30603:9;30542:25;:71::i;:::-;30639:31;;;;;30694:29;;;;;-1:-1:-1;;;30347:381:0:o;29456:378::-;29579:25;29606:23;29655:66;29681:9;29692:16;-1:-1:-1;;;;;29655:66:0;29710:10;-1:-1:-1;;;;;29655:66:0;:25;:66::i;:::-;29637:84;;29766:63;29796:15;29784:9;:27;29813:15;29766:17;:63::i;:::-;29727:102;;;;-1:-1:-1;29456:378:0;-1:-1:-1;;;;29456:378:0:o;1767:533:22:-;1907:18;;:::i;:::-;1933:12;1965:4;:19;;;1948:14;:36;1933:51;;1997:298;;;;;;;;2033:14;1997:298;;;;;;2107:5;2093:19;;2099:4;2093:11;;:19;2071:4;:19;;;:41;1997:298;;;;;;2244:1;2232:9;-1:-1:-1;;;;;2232:13:22;;:29;;2260:1;2232:29;;;2248:9;2232:29;-1:-1:-1;;;;;2205:57:22;-1:-1:-1;;;2224:3:22;2206:21;;;;2205:57;;;;;;2155:4;:38;;;:108;-1:-1:-1;;;;;1997:298:22;;;;;2284:4;1997:298;;;;;1990:305;;;1767:533;;;;;;:::o;9497:1296::-;9714:29;;:::i;:::-;9745:28;;:::i;:::-;9853:4;9858:5;9853:11;;;;;;;;;9840:24;;;;;;;;9853:11;;;;9840:24;;;;;;;-1:-1:-1;;;9840:24:22;;;;;;;;;;;;;;-1:-1:-1;;;9840:24:22;;-1:-1:-1;;;;;9840:24:22;;;;;;;;-1:-1:-1;;;9840:24:22;;;;;;;;;;;-1:-1:-1;9971:44:22;;9975:4;;10008:6;9971:3;:44::i;:::-;9967:389;;;10058:6;10029:35;;:10;:25;;;:35;;;10025:325;;;10176:30;;10025:325;10282:10;10294:46;10304:10;10316:6;10324:4;10330:9;10294;:46::i;:::-;10274:67;;;;;;10025:325;10424:4;10443:11;10429:25;;10430:5;10438:1;10430:9;10429:25;;;;;;;;10424:31;;;;;;;;;10411:44;;;;;;;;10424:31;;;;10411:44;;;;;;-1:-1:-1;;;10411:44:22;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;10411:44:22;;;;;;;;;;;-1:-1:-1;;;10411:44:22;;;;;;;;;;;;;;-1:-1:-1;10461:49:22;;10490:20;;;;;;;;;;;;;;;-1:-1:-1;;;10490:20:22;;;;;;;;;;;;;;-1:-1:-1;;;10490:20:22;;-1:-1:-1;;;;;10490:20:22;;;;;;;;-1:-1:-1;;;10490:20:22;;;;;;;;;;;;-1:-1:-1;10461:49:22;10609:44;10613:4;10619:10;:25;;;10646:6;10609:3;:44::i;:::-;10601:60;;;;;-1:-1:-1;;;10601:60:22;;;;;;;;;;;;-1:-1:-1;;;10601:60:22;;;;;;;;;;;;;;;10736:52;10749:4;10755;10761:6;10769:5;10776:11;10736:12;:52::i;:::-;10729:59;;;;9497:1296;;;;;;;;;;:::o;8207:787:32:-;8333:49;;:::i;:::-;8409:580;;;;;;;;8469:6;:31;;;8409:580;;;;8526:6;:23;;;8409:580;;;;8562:6;:10;;;8409:580;;;;;;8596:6;:21;;;8409:580;;;;;;8646:6;:26;;;8409:580;;;;8690:6;:15;;;-1:-1:-1;;;;;8409:580:32;;;;;8724:6;:16;;;-1:-1:-1;;;;;8409:580:32;;;;;8765:6;:22;;;-1:-1:-1;;;;;8409:580:32;;;;;8811:6;:21;;;8409:580;;;;;;8875:6;:40;;;-1:-1:-1;;;;;8409:580:32;;;;;8950:6;:32;;;8409:580;;;;;8390:599;;8207:787;;;;:::o;480:149:31:-;591:9;;;605;;602:16;;587:32;;574:51::o;3427:929:25:-;3582:7;3747:3;3743:609;;;3760:16;-1:-1:-1;;;;;3788:27:25;;;:152;;3888:52;3904:6;-1:-1:-1;;;3930:9:25;-1:-1:-1;;;;;3888:52:25;:15;:52::i;:::-;3788:152;;;-1:-1:-1;;;;;3828:47:25;;307:2:18;3829:33:25;;;3828:47;;;;;;3788:152;3760:181;-1:-1:-1;3957:43:25;:31;-1:-1:-1;;;;;3957:17:25;;3760:181;3957:21;:31::i;:::-;:41;:43::i;3743:609::-;4021:16;-1:-1:-1;;;;;4049:27:25;;;:185;;4172:62;4198:6;-1:-1:-1;;;4224:9:25;-1:-1:-1;;;;;4172:62:25;:25;:62::i;:::-;4049:185;;;4089:70;307:2:18;4114:33:25;;;-1:-1:-1;;;;;4089:70:25;;:24;:70::i;:::-;4021:214;;4263:8;4252;-1:-1:-1;;;;;4252:19:25;;4244:28;;;;;;-1:-1:-1;;;;;4325:19:25;;;;-1:-1:-1;4310:35:25;;1385:1238;1538:7;1665:11;1661:32;;-1:-1:-1;1685:8:25;1678:15;;1661:32;-1:-1:-1;;;;;;;307:2:18;1720:45:25;;;;1772:847;;;;-1:-1:-1;;;;;1816:50:25;;1827:17;;;;1848:6;1827:17;1848:6;1816:38;;;;;:50;1812:293;;;1900:20;;;1934:25;;;1930:167;;2025:60;2051:10;2063:8;-1:-1:-1;;;;;2025:60:25;2073:11;2025:25;:60::i;:::-;2010:76;;;;;;;1930:167;1812:293;;2128:73;2153:10;2165:35;2193:6;2179:8;-1:-1:-1;;;;;2166:21:25;:10;:21;;;;;;;2165:27;:35::i;:::-;2128:24;:73::i;:::-;2113:89;;;;;;1772:847;-1:-1:-1;;;;;2400:50:25;;2411:17;;;;2432:6;2411:17;2432:6;2400:38;;;;;:50;:74;;;;;2467:7;2454:10;:20;2400:74;2392:83;;;;;;2505:20;;;2540:72;:60;2505:10;-1:-1:-1;;;;;2540:60:25;;2505:20;2540:25;:60::i;6306:323:22:-;6374:4;6451;6446:9;;:1;:9;;;;:22;;;;;6464:4;6459:9;;:1;:9;;;;6446:22;6442:41;;;6482:1;6477:6;;:1;:6;;;;6470:13;;;;6442:41;6490:17;6514:4;6510:8;;:1;:8;;;:26;;6525:1;:11;;-1:-1:-1;;;6525:11:22;6510:26;;;6521:1;6510:26;;;6490:46;;;;6542:17;6566:4;6562:8;;:1;:8;;;:26;;6577:1;:11;;-1:-1:-1;;;6577:11:22;6562:26;;;6573:1;6562:26;;;6542:46;;6602:22;;;;;6306:323;-1:-1:-1;;;;;6306:323:22:o;7560:939::-;7724:29;;:::i;:::-;7755:28;;:::i;:::-;7791:9;7817:11;7803:25;;7804:5;7812:1;7804:9;7803:25;;;;;;;;7791:37;;;;7856:9;7886:1;7872:11;7868:15;;:1;:15;:19;7856:31;;7915:9;7930:565;-1:-1:-1;7965:1:22;7956:5;;;7955:11;7988:4;7993:15;;;7955:11;7993:15;;;;;;7988:21;;;;;;;7975:34;;;;;;;;7988:21;;;;7975:34;;;;;;-1:-1:-1;;;7975:34:22;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;7975:34:22;;;;;;;;;;;-1:-1:-1;;;7975:34:22;;;;;;;;;;;;;;-1:-1:-1;8104:75:22;;8147:1;8151;8147:5;8143:9;;8162:8;;8104:75;8199:4;8214:11;8204:21;;8205:1;8209;8205:5;8204:21;;;;;;8199:27;;;;;;;8187:39;;;;;;;;8199:27;;;;8187:39;;;;;;-1:-1:-1;;;8187:39:22;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;8187:39:22;;;;;;;;;;;-1:-1:-1;;;8187:39:22;;;;;;;;;;8268:25;;8187:39;;-1:-1:-1;;;8258:44:22;;8262:4;;8295:6;8258:3;:44::i;:::-;8235:67;;8357:15;:62;;;;;8376:43;8380:4;8386:6;8394:9;:24;;;8376:3;:43::i;:::-;8353:73;;;8421:5;;;8353:73;8440:15;8435:53;;8465:1;8461;:5;8457:9;;8435:53;;;8483:1;8487;8483:5;8479:9;;8435:53;7930:565;;;;7560:939;;;;;;;;;;;:::o;349:105:24:-;447:1;-1:-1:-1;;;;;427:21:24;;;;419:30;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:138:41:-;84:20;;113:33;84:20;113:33;:::i;157:162::-;224:20;;280:13;;273:21;263:32;;253:2;;309:1;306;299:12;324:377;;;441:3;434:4;426:6;422:17;418:27;408:2;;466:8;456;449:26;408:2;-1:-1:-1;496:20:41;;-1:-1:-1;;;;;528:30:41;;525:2;;;578:8;568;561:26;525:2;622:4;614:6;610:17;598:29;;674:3;667:4;658:6;650;646:19;642:30;639:39;636:2;;;691:1;688;681:12;706:542;;803:3;796:4;788:6;784:17;780:27;770:2;;825:5;818;811:20;770:2;865:6;852:20;-1:-1:-1;;;;;887:2:41;884:26;881:2;;;913:9;881:2;948:54;990:2;971:13;;-1:-1:-1;;967:27:41;996:4;963:38;948:54;:::i;:::-;1027:2;1018:7;1011:19;1073:3;1066:4;1061:2;1053:6;1049:15;1045:26;1042:35;1039:2;;;1094:5;1087;1080:20;1039:2;1163;1156:4;1148:6;1144:17;1137:4;1128:7;1124:18;1111:55;1186:16;;;1204:4;1182:27;1175:42;;;;1190:7;760:488;-1:-1:-1;;760:488:41:o;1253:162::-;1321:20;;1381:1;1370:20;;;1360:31;;1350:2;;1405:1;1402;1395:12;1420:134;1488:20;;1517:31;1488:20;1517:31;:::i;1559:885::-;;1649:6;1692:2;1680:9;1675:3;1671:19;1667:28;1664:2;;;1712:5;1705;1698:20;1664:2;1738:18;1753:2;1738:18;:::i;:::-;1729:27;;;1779:31;1800:9;1779:31;:::i;:::-;1772:5;1765:46;1843:40;1879:2;1868:9;1864:18;1843:40;:::i;:::-;1838:2;1831:5;1827:14;1820:64;1916:37;1949:2;1938:9;1934:18;1916:37;:::i;:::-;1911:2;1904:5;1900:14;1893:61;2014:2;2003:9;1999:18;1986:32;1981:2;1974:5;1970:14;1963:56;2052:41;2088:3;2077:9;2073:19;2052:41;:::i;:::-;2046:3;2039:5;2035:15;2028:66;2145:3;2134:9;2130:19;2117:33;-1:-1:-1;;;;;2165:6:41;2162:30;2159:2;;;2205:1;2202;2195:12;2159:2;2242:47;2285:3;2276:6;2265:9;2261:22;2242:47;:::i;:::-;2236:3;2229:5;2225:15;2218:72;;2323:41;2359:3;2348:9;2344:19;2323:41;:::i;:::-;2317:3;2310:5;2306:15;2299:66;2398:39;2432:3;2421:9;2417:19;2398:39;:::i;:::-;2392:3;2385:5;2381:15;2374:64;1629:815;;;;:::o;2449:138::-;2519:20;;2548:33;2519:20;2548:33;:::i;2592:136::-;2661:20;;2690:32;2661:20;2690:32;:::i;2733:259::-;;2845:2;2833:9;2824:7;2820:23;2816:32;2813:2;;;2866:6;2858;2851:22;2813:2;2910:9;2897:23;2929:33;2956:5;2929:33;:::i;2997:263::-;;3120:2;3108:9;3099:7;3095:23;3091:32;3088:2;;;3141:6;3133;3126:22;3088:2;3178:9;3172:16;3197:33;3224:5;3197:33;:::i;3265:402::-;;;3394:2;3382:9;3373:7;3369:23;3365:32;3362:2;;;3415:6;3407;3400:22;3362:2;3459:9;3446:23;3478:33;3505:5;3478:33;:::i;:::-;3530:5;-1:-1:-1;3587:2:41;3572:18;;3559:32;3600:35;3559:32;3600:35;:::i;:::-;3654:7;3644:17;;;3352:315;;;;;:::o;3672:906::-;;;;;;;3867:3;3855:9;3846:7;3842:23;3838:33;3835:2;;;3889:6;3881;3874:22;3835:2;3933:9;3920:23;3952:33;3979:5;3952:33;:::i;:::-;4004:5;-1:-1:-1;4061:2:41;4046:18;;4033:32;4074:35;4033:32;4074:35;:::i;:::-;4128:7;-1:-1:-1;4187:2:41;4172:18;;4159:32;4200:35;4159:32;4200:35;:::i;:::-;4254:7;-1:-1:-1;4280:38:41;4314:2;4299:18;;4280:38;:::i;:::-;4270:48;;4370:3;4359:9;4355:19;4342:33;4384:35;4411:7;4384:35;:::i;:::-;4438:7;-1:-1:-1;4497:3:41;4482:19;;4469:33;4511:35;4469:33;4511:35;:::i;:::-;4565:7;4555:17;;;3825:753;;;;;;;;:::o;4583:850::-;;;;;;;4778:3;4766:9;4757:7;4753:23;4749:33;4746:2;;;4800:6;4792;4785:22;4746:2;4844:9;4831:23;4863:33;4890:5;4863:33;:::i;:::-;4915:5;-1:-1:-1;4939:37:41;4972:2;4957:18;;4939:37;:::i;:::-;4929:47;;5023:2;5012:9;5008:18;4995:32;4985:42;;5079:2;5068:9;5064:18;5051:32;5092:35;5119:7;5092:35;:::i;:::-;5146:7;-1:-1:-1;5204:3:41;5189:19;;5176:33;-1:-1:-1;;;;;5221:30:41;;5218:2;;;5269:6;5261;5254:22;5218:2;5313:60;5365:7;5356:6;5345:9;5341:22;5313:60;:::i;:::-;4736:697;;;;-1:-1:-1;4736:697:41;;-1:-1:-1;4736:697:41;;5392:8;;4736:697;-1:-1:-1;;;4736:697:41:o;5438:857::-;;;;;;;5633:3;5621:9;5612:7;5608:23;5604:33;5601:2;;;5655:6;5647;5640:22;5601:2;5699:9;5686:23;5718:33;5745:5;5718:33;:::i;:::-;5770:5;-1:-1:-1;5794:38:41;5828:2;5813:18;;5794:38;:::i;:::-;5784:48;;5851:38;5885:2;5874:9;5870:18;5851:38;:::i;:::-;5841:48;;5941:2;5930:9;5926:18;5913:32;5954:35;5981:7;5954:35;:::i;6300:691::-;;;;;;6476:3;6464:9;6455:7;6451:23;6447:33;6444:2;;;6498:6;6490;6483:22;6444:2;6542:9;6529:23;6561:33;6588:5;6561:33;:::i;:::-;6613:5;-1:-1:-1;6637:38:41;6671:2;6656:18;;6637:38;:::i;:::-;6627:48;;6694:38;6728:2;6717:9;6713:18;6694:38;:::i;:::-;6684:48;;6784:2;6773:9;6769:18;6756:32;6797:35;6824:7;6797:35;:::i;:::-;6851:7;-1:-1:-1;6910:3:41;6895:19;;6882:33;6924:35;6882:33;6924:35;:::i;:::-;6978:7;6968:17;;;6434:557;;;;;;;;:::o;6996:835::-;;;;;;;7189:3;7177:9;7168:7;7164:23;7160:33;7157:2;;;7211:6;7203;7196:22;7157:2;7255:9;7242:23;7274:33;7301:5;7274:33;:::i;:::-;7326:5;-1:-1:-1;7350:38:41;7384:2;7369:18;;7350:38;:::i;:::-;7340:48;;7407:38;7441:2;7430:9;7426:18;7407:38;:::i;:::-;7397:48;;7497:2;7486:9;7482:18;7469:32;7510:35;7537:7;7510:35;:::i;:::-;7564:7;-1:-1:-1;7623:3:41;7608:19;;7595:33;7637:35;7595:33;7637:35;:::i;7836:705::-;;;;;;8018:3;8006:9;7997:7;7993:23;7989:33;7986:2;;;8040:6;8032;8025:22;7986:2;8084:9;8071:23;8103:33;8130:5;8103:33;:::i;:::-;8155:5;-1:-1:-1;8207:2:41;8192:18;;8179:32;;-1:-1:-1;8258:2:41;8243:18;;8230:32;;-1:-1:-1;8313:2:41;8298:18;;8285:32;-1:-1:-1;;;;;8329:30:41;;8326:2;;;8377:6;8369;8362:22;8326:2;8421:60;8473:7;8464:6;8453:9;8449:22;8421:60;:::i;:::-;7976:565;;;;-1:-1:-1;7976:565:41;;-1:-1:-1;8500:8:41;;8395:86;7976:565;-1:-1:-1;;;7976:565:41:o;8546:665::-;;;8692:2;8680:9;8671:7;8667:23;8663:32;8660:2;;;8713:6;8705;8698:22;8660:2;8758:9;8745:23;-1:-1:-1;;;;;8828:2:41;8820:6;8817:14;8814:2;;;8849:6;8841;8834:22;8814:2;8892:6;8881:9;8877:22;8867:32;;8937:7;8930:4;8926:2;8922:13;8918:27;8908:2;;8964:6;8956;8949:22;8908:2;9009;8996:16;9035:2;9027:6;9024:14;9021:2;;;9056:6;9048;9041:22;9021:2;9115:7;9110:2;9104;9096:6;9092:15;9088:2;9084:24;9080:33;9077:46;9074:2;;;9141:6;9133;9126:22;9074:2;9177;9169:11;;;;;9199:6;;-1:-1:-1;8650:561:41;;-1:-1:-1;;;;8650:561:41:o;9216:190::-;;9328:2;9316:9;9307:7;9303:23;9299:32;9296:2;;;9349:6;9341;9334:22;9296:2;-1:-1:-1;9377:23:41;;9286:120;-1:-1:-1;9286:120:41:o;9411:439::-;;;;9552:2;9540:9;9531:7;9527:23;9523:32;9520:2;;;9573:6;9565;9558:22;9520:2;9617:9;9604:23;9671:5;9667:2;9656:21;9649:5;9646:32;9636:2;;9697:6;9689;9682:22;9636:2;9725:5;-1:-1:-1;9749:38:41;9783:2;9768:18;;9749:38;:::i;:::-;9739:48;;9806:38;9840:2;9829:9;9825:18;9806:38;:::i;:::-;9796:48;;9510:340;;;;;:::o;9855:293::-;;9965:2;9953:9;9944:7;9940:23;9936:32;9933:2;;;9986:6;9978;9971:22;9933:2;10030:9;10017:23;10083:5;10080:1;10069:20;10062:5;10059:31;10049:2;;10109:6;10101;10094:22;10153:194;;10263:2;10251:9;10242:7;10238:23;10234:32;10231:2;;;10284:6;10276;10269:22;10231:2;10312:29;10331:9;10312:29;:::i;10352:266::-;;;10477:2;10465:9;10456:7;10452:23;10448:32;10445:2;;;10498:6;10490;10483:22;10445:2;10526:29;10545:9;10526:29;:::i;:::-;10516:39;;10574:38;10608:2;10597:9;10593:18;10574:38;:::i;:::-;10564:48;;10435:183;;;;;:::o;10623:403::-;;;;10765:2;10753:9;10744:7;10740:23;10736:32;10733:2;;;10786:6;10778;10771:22;10733:2;10814:29;10833:9;10814:29;:::i;:::-;10804:39;;10862:38;10896:2;10885:9;10881:18;10862:38;:::i;:::-;10852:48;;10950:2;10939:9;10935:18;10922:32;10963:33;10990:5;10963:33;:::i;:::-;11015:5;11005:15;;;10723:303;;;;;:::o;11031:547::-;;;;;11190:3;11178:9;11169:7;11165:23;11161:33;11158:2;;;11212:6;11204;11197:22;11158:2;11240:29;11259:9;11240:29;:::i;:::-;11230:39;;11288:38;11322:2;11311:9;11307:18;11288:38;:::i;:::-;11278:48;;11376:2;11365:9;11361:18;11348:32;11389:33;11416:5;11389:33;:::i;:::-;11441:5;-1:-1:-1;11498:2:41;11483:18;;11470:32;11511:35;11470:32;11511:35;:::i;:::-;11148:430;;;;-1:-1:-1;11148:430:41;;-1:-1:-1;;11148:430:41:o;11583:334::-;;;;11725:2;11713:9;11704:7;11700:23;11696:32;11693:2;;;11746:6;11738;11731:22;11693:2;11774:29;11793:9;11774:29;:::i;:::-;11764:39;;11822:38;11856:2;11845:9;11841:18;11822:38;:::i;:::-;11812:48;;11907:2;11896:9;11892:18;11879:32;11869:42;;11683:234;;;;;:::o;11922:570::-;;;;12076:2;12064:9;12055:7;12051:23;12047:32;12044:2;;;12097:6;12089;12082:22;12044:2;12134:9;12128:16;12153:31;12178:5;12153:31;:::i;:::-;12253:2;12238:18;;12232:25;12203:5;;-1:-1:-1;12266:35:41;12232:25;12266:35;:::i;:::-;12372:2;12357:18;;12351:25;12320:7;;-1:-1:-1;12420:10:41;12407:24;;12395:37;;12385:2;;12451:6;12443;12436:22;12497:1045;;12638:2;12626:9;12617:7;12613:23;12609:32;12606:2;;;12659:6;12651;12644:22;12606:2;12704:9;12691:23;-1:-1:-1;;;;;12774:2:41;12766:6;12763:14;12760:2;;;12795:6;12787;12780:22;12760:2;12823:22;;;;12879:4;12861:16;;;12857:27;12854:2;;;12902:6;12894;12887:22;12854:2;12940;12934:9;12982:4;12974:6;12970:17;13037:6;13025:10;13022:22;13017:2;13005:10;13002:18;12999:46;12996:2;;;13048:9;12996:2;13075;13068:22;13114:24;13135:2;13114:24;:::i;:::-;13106:6;13099:40;13172:33;13201:2;13197;13193:11;13172:33;:::i;:::-;13167:2;13159:6;13155:15;13148:58;13260:2;13256;13252:11;13239:25;13234:2;13226:6;13222:15;13215:50;13319:2;13315;13311:11;13298:25;13293:2;13285:6;13281:15;13274:50;13370:3;13366:2;13362:12;13349:26;13400:2;13390:8;13387:16;13384:2;;;13421:6;13413;13406:22;13384:2;13464:46;13502:7;13491:8;13487:2;13483:17;13464:46;:::i;:::-;13458:3;13446:16;;13439:72;-1:-1:-1;13450:6:41;12596:946;-1:-1:-1;;;;;12596:946:41:o;13547:374::-;;13687:2;13675:9;13666:7;13662:23;13658:32;13655:2;;;13708:6;13700;13693:22;13655:2;13753:9;13740:23;-1:-1:-1;;;;;13778:6:41;13775:30;13772:2;;;13823:6;13815;13808:22;13772:2;13851:64;13907:7;13898:6;13887:9;13883:22;13851:64;:::i;13926:1434::-;;;14107:9;14098:7;14094:23;14137:3;14133:2;14129:12;14126:2;;;14159:6;14151;14144:22;14126:2;14204:9;14191:23;-1:-1:-1;;;;;14229:6:41;14226:30;14223:2;;;14274:6;14266;14259:22;14223:2;14302:64;14358:7;14349:6;14338:9;14334:22;14302:64;:::i;:::-;14292:74;;;14385:6;14425:2;14419;14415:7;14411:2;14407:16;14403:25;14400:2;;;14446:6;14438;14431:22;14400:2;14477:18;14492:2;14477:18;:::i;:::-;14464:31;;14546:2;14535:9;14531:18;14518:32;14511:5;14504:47;14611:2;14600:9;14596:18;14583:32;14578:2;14571:5;14567:14;14560:56;14648:39;14683:2;14672:9;14668:18;14648:39;:::i;:::-;14643:2;14636:5;14632:14;14625:63;14720:38;14753:3;14742:9;14738:19;14720:38;:::i;:::-;14715:2;14708:5;14704:14;14697:62;14820:3;14809:9;14805:19;14792:33;14786:3;14779:5;14775:15;14768:58;14859:41;14895:3;14884:9;14880:19;14859:41;:::i;:::-;14853:3;14846:5;14842:15;14835:66;14934:41;14970:3;14959:9;14955:19;14934:41;:::i;:::-;14928:3;14921:5;14917:15;14910:66;14995:3;15031:40;15067:2;15056:9;15052:18;15031:40;:::i;:::-;15025:3;15018:5;15014:15;15007:65;15091:3;15126:38;15160:2;15149:9;15145:18;15126:38;:::i;:::-;15121:2;15114:5;15110:14;15103:62;15184:3;15174:13;;15219:40;15255:2;15244:9;15240:18;15219:40;:::i;:::-;15203:14;;;15196:64;15292:37;15310:18;;;15292:37;:::i;:::-;15276:14;;;15269:61;-1:-1:-1;14074:1286:41;;15280:5;;-1:-1:-1;14074:1286:41;;-1:-1:-1;;14074:1286:41:o;15365:263::-;;15488:2;15476:9;15467:7;15463:23;15459:32;15456:2;;;15509:6;15501;15494:22;15456:2;15546:9;15540:16;15565:33;15592:5;15565:33;:::i;15633:399::-;;;15773:2;15761:9;15752:7;15748:23;15744:32;15741:2;;;15794:6;15786;15779:22;15741:2;15831:9;15825:16;15850:33;15877:5;15850:33;:::i;:::-;15952:2;15937:18;;15931:25;15902:5;;-1:-1:-1;15965:35:41;15931:25;15965:35;:::i;16037:385::-;;;;16194:2;16182:9;16173:7;16169:23;16165:32;16162:2;;;16215:6;16207;16200:22;16162:2;16252:9;16246:16;16271:33;16298:5;16271:33;:::i;:::-;16368:2;16353:18;;16347:25;16412:2;16397:18;;;16391:25;16323:5;;16347:25;;-1:-1:-1;16391:25:41;16152:270;-1:-1:-1;;;16152:270:41:o;16427:292::-;;16538:2;16526:9;16517:7;16513:23;16509:32;16506:2;;;16559:6;16551;16544:22;16506:2;16603:9;16590:23;16653:6;16646:5;16642:18;16635:5;16632:29;16622:2;;16680:6;16672;16665:22;16724:261;;16846:2;16834:9;16825:7;16821:23;16817:32;16814:2;;;16867:6;16859;16852:22;16814:2;16904:9;16898:16;16923:32;16949:5;16923:32;:::i;17185:194::-;;17308:2;17296:9;17287:7;17283:23;17279:32;17276:2;;;17329:6;17321;17314:22;17276:2;-1:-1:-1;17357:16:41;;17266:113;-1:-1:-1;17266:113:41:o;17384:255::-;;;17524:2;17512:9;17503:7;17499:23;17495:32;17492:2;;;17545:6;17537;17530:22;17492:2;-1:-1:-1;;17573:16:41;;17629:2;17614:18;;;17608:25;17573:16;;17608:25;;-1:-1:-1;17482:157:41:o;17644:106::-;-1:-1:-1;;;;;17712:31:41;17700:44;;17690:60::o;17755:93::-;17827:13;17820:21;17808:34;;17798:50::o;17853:270::-;;17943:6;17938:3;17931:19;17995:6;17988:5;17981:4;17976:3;17972:14;17959:43;18047:3;18040:4;18031:6;18026:3;18022:16;18018:27;18011:40;18112:4;18105:2;18101:7;18096:2;18088:6;18084:15;18080:29;18075:3;18071:39;18067:50;18060:57;;17921:202;;;;;:::o;18128:477::-;;18209:5;18203:12;18236:6;18231:3;18224:19;18261:3;18273:162;18287:6;18284:1;18281:13;18273:162;;;18349:4;18405:13;;;18401:22;;18395:29;18377:11;;;18373:20;;18366:59;18302:12;18273:162;;;18453:6;18450:1;18447:13;18444:2;;;18519:3;18512:4;18503:6;18498:3;18494:16;18490:27;18483:40;18444:2;-1:-1:-1;18587:2:41;18566:15;-1:-1:-1;;18562:29:41;18553:39;;;;18594:4;18549:50;;18179:426;-1:-1:-1;;18179:426:41:o;18610:93::-;18687:1;18676:20;18664:33;;18654:49::o;18708:93::-;18785:1;18774:20;18762:33;;18752:49::o;18806:1185::-;18896:5;18890:12;18885:3;18878:25;18952:4;18945:5;18941:16;18935:23;18928:4;18923:3;18919:14;18912:47;19005:4;18998:5;18994:16;18988:23;19020:49;19063:4;19058:3;19054:14;19040:12;19020:49;:::i;:::-;;19117:4;19110:5;19106:16;19100:23;19132:49;19175:4;19170:3;19166:14;19150;19132:49;:::i;:::-;;19230:4;19223:5;19219:16;19213:23;19206:4;19201:3;19197:14;19190:47;19285:4;19278:5;19274:16;19268:23;19300:52;19346:4;19341:3;19337:14;19321;19300:52;:::i;:::-;;19400:4;19393:5;19389:16;19383:23;19415:52;19461:4;19456:3;19452:14;19436;19415:52;:::i;:::-;;19515:4;19508:5;19504:16;19498:23;19530:52;19576:4;19571:3;19567:14;19551;19530:52;:::i;:::-;;19601:6;19655:2;19648:5;19644:14;19638:21;19668:48;19712:2;19707:3;19703:12;19687:14;19668:48;:::i;:::-;;;19735:6;19789:2;19782:5;19778:14;19772:21;19802:50;19848:2;19843:3;19839:12;19823:14;19802:50;:::i;:::-;;;19871:6;19925:2;19918:5;19914:14;19908:21;19938:47;19981:2;19976:3;19972:12;19956:14;19938:47;:::i;19996:1147::-;20072:39;20107:3;20099:5;20093:12;20072:39;:::i;:::-;20157:4;20150:5;20146:16;20140:23;20172:48;20214:4;20209:3;20205:14;20191:12;20172:48;:::i;:::-;;20268:4;20261:5;20257:16;20251:23;20283:50;20327:4;20322:3;20318:14;20302;20283:50;:::i;:::-;;20381:4;20374:5;20370:16;20364:23;20396:52;20442:4;20437:3;20433:14;20417;20396:52;:::i;:::-;;20496:4;20489:5;20485:16;20479:23;20511:52;20557:4;20552:3;20548:14;20532;20511:52;:::i;:::-;;20612:4;20605:5;20601:16;20595:23;20588:4;20583:3;20579:14;20572:47;20668:4;20661:5;20657:16;20651:23;20644:4;20639:3;20635:14;20628:47;20724:4;20717:5;20713:16;20707:23;20700:4;20695:3;20691:14;20684:47;20750:6;20804:2;20797:5;20793:14;20787:21;20817:50;20863:2;20858:3;20854:12;20838:14;20817:50;:::i;:::-;;;20886:6;20940:2;20933:5;20929:14;20923:21;20953:48;20997:2;20992:3;20988:12;20972:14;20953:48;:::i;:::-;;;21020:6;21074:2;21067:5;21063:14;21057:21;21087:50;21133:2;21128:3;21124:12;21108:14;21087:50;:::i;21148:837::-;;21232:6;21274:1;21270;21265:3;21261:11;21257:19;21315:2;21307:5;21301:12;21297:21;21292:3;21285:34;21380:2;21372:4;21365:5;21361:16;21355:23;21351:32;21344:4;21339:3;21335:14;21328:56;21447:4;21440:5;21436:16;21430:23;21423:31;21416:39;21409:4;21404:3;21400:14;21393:63;21505:4;21498:5;21494:16;21488:23;21481:4;21476:3;21472:14;21465:47;21573:2;21565:4;21558:5;21554:16;21548:23;21544:32;21537:4;21532:3;21528:14;21521:56;;21623:4;21616:5;21612:16;21606:23;21661:2;21654:4;21649:3;21645:14;21638:26;21685:46;21727:2;21722:3;21718:12;21704;21685:46;:::i;:::-;21673:58;;;21779:4;21772:5;21768:16;21762:23;21794:52;21840:4;21835:3;21831:14;21815;21794:52;:::i;:::-;;21894:4;21887:5;21883:16;21877:23;21909:50;21953:4;21948:3;21944:14;21928;21909:50;:::i;:::-;-1:-1:-1;21975:4:41;21212:773;-1:-1:-1;;;21212:773:41:o;21990:121::-;-1:-1:-1;;;;;22058:46:41;22046:59;;22036:75::o;22116:94::-;22194:8;22183:20;22171:33;;22161:49::o;22215:203::-;-1:-1:-1;;;;;22379:32:41;;;;22361:51;;22349:2;22334:18;;22316:102::o;22423:312::-;-1:-1:-1;;;;;22661:15:41;;;22643:34;;22713:15;;22708:2;22693:18;;22686:43;22593:2;22578:18;;22560:175::o;22740:1195::-;23004:2;23016:21;;;23086:13;;22989:18;;;23108:22;;;22740:1195;;23183:4;;23161:2;23146:18;;;23210:15;;;22740:1195;23256:184;23270:6;23267:1;23264:13;23256:184;;;23345:13;;23342:1;23331:28;23319:41;;23380:12;;;;23415:15;;;;23292:1;23285:9;23256:184;;;-1:-1:-1;;;23476:19:41;;;23456:18;;;23449:47;23546:13;;23568:21;;;23644:15;;;;23607:12;;;23679:4;23692:215;23708:8;23703:3;23700:17;23692:215;;;23781:15;;-1:-1:-1;;;;;23777:41:41;23763:56;;23880:17;;;;23841:14;;;;23815:1;23727:11;23692:215;;;-1:-1:-1;23924:5:41;;22965:970;-1:-1:-1;;;;;;;22965:970:41:o;23940:407::-;24217:25;;;24273:2;24258:18;;24251:34;;;;24333:6;24321:19;24316:2;24301:18;;24294:47;24205:2;24190:18;;24172:175::o;24352:177::-;24498:25;;;24486:2;24471:18;;24453:76::o;24534:188::-;24705:1;24694:21;;;;24676:40;;24664:2;24649:18;;24631:91::o;24727:244::-;24897:25;;;24953:2;24938:18;;24931:34;24885:2;24870:18;;24852:119::o;24976:384::-;;25185:6;25174:9;25167:25;25228:6;25223:2;25212:9;25208:18;25201:34;25271:2;25266;25255:9;25251:18;25244:30;25291:63;25350:2;25339:9;25335:18;25327:6;25319;25291:63;:::i;:::-;25283:71;25157:203;-1:-1:-1;;;;;;25157:203:41:o;25365:537::-;25616:25;;;25672:2;25657:18;;25650:34;;;;-1:-1:-1;;;;;25720:32:41;;;;25715:2;25700:18;;25693:60;-1:-1:-1;;;;;25789:47:41;25784:2;25769:18;;25762:75;25885:1;25874:21;25868:3;25853:19;;25846:50;25603:3;25588:19;;25570:332::o;25907:371::-;26132:1;26121:21;;;;26103:40;;-1:-1:-1;;;;;26179:32:41;;;;26174:2;26159:18;;26152:60;26260:10;26248:23;26243:2;26228:18;;26221:51;26091:2;26076:18;;26058:220::o;26283:970::-;26698:25;;;-1:-1:-1;;;;;26797:15:41;;;26792:2;26777:18;;26770:43;26860:1;26849:21;;;26844:2;26829:18;;26822:49;26907:21;;;;26902:2;26887:18;;26880:49;-1:-1:-1;;;;;27019:15:41;;;27013:3;26998:19;;26991:44;27072:15;;26750:3;27051:19;;27044:44;27125:15;;27119:3;27104:19;;27097:44;27178:15;;;27172:3;27157:19;;27150:44;27231:15;27225:3;27210:19;;27203:44;26685:3;26670:19;;26652:601::o;27258:918::-;27709:25;;;27765:2;27750:18;;27743:34;;;;-1:-1:-1;;;;;27813:32:41;;;;27808:2;27793:18;;27786:60;27893:1;27882:21;;;27877:2;27862:18;;27855:49;27941:21;;;27935:3;27920:19;;27913:50;28000:21;;;27833:3;27979:19;;27972:50;28070:2;28059:22;28053:3;28038:19;;28031:51;28113:3;28098:19;;28091:35;28157:3;28142:19;;28135:35;27696:3;27681:19;;27663:513::o;28181:829::-;;28715:3;28704:9;28700:19;28692:27;;28746:6;28735:9;28728:25;28789:6;28784:2;28773:9;28769:18;28762:34;28832:6;28827:2;28816:9;28812:18;28805:34;28875:6;28870:2;28859:9;28855:18;28848:34;28919:6;28913:3;28902:9;28898:19;28891:35;28935:69;28999:3;28988:9;28984:19;28976:6;28935:69;:::i;29015:892::-;29442:25;;;29498:2;29483:18;;29476:34;;;;29557:1;29546:21;;;29541:2;29526:18;;29519:49;29604:21;;;29599:2;29584:18;;29577:49;29663:21;;29657:3;29642:19;;29635:50;29704:6;29747:15;;;29741:3;29726:19;;29719:44;29800:15;29794:3;29779:19;;29772:44;-1:-1:-1;;;;;29853:47:41;29847:3;29832:19;;29825:76;29429:3;29414:19;;29396:511::o;29912:618::-;30237:25;;;30309:1;30298:21;;;30293:2;30278:18;;30271:49;30356:21;;;30351:2;30336:18;;30329:49;30414:21;;30409:2;30394:18;;30387:49;30467:3;30452:19;;30445:35;;;;30511:3;30496:19;;30489:35;30224:3;30209:19;;30191:339::o;30535:221::-;;30684:2;30673:9;30666:21;30704:46;30746:2;30735:9;30731:18;30723:6;30704:46;:::i;30761:825::-;;31008:2;30997:9;30990:21;31047:1;31043;31038:3;31034:11;31030:19;31104:2;31095:6;31089:13;31085:22;31080:2;31069:9;31065:18;31058:50;31175:2;31167:4;31159:6;31155:17;31149:24;31145:33;31139:3;31128:9;31124:19;31117:62;31235:4;31227:6;31223:17;31217:24;31210:4;31199:9;31195:20;31188:54;31297:2;31289:6;31285:15;31279:22;31273:3;31262:9;31258:19;31251:51;31349:3;31341:6;31337:16;31331:23;31391:4;31385:3;31374:9;31370:19;31363:33;31413:53;31461:3;31450:9;31446:19;31432:12;31413:53;:::i;:::-;31504:15;;;;31497:4;31482:20;;31475:45;-1:-1:-1;;31569:1:41;31558:21;;;;31551:4;31536:20;;;31529:51;31405:61;30980:606;-1:-1:-1;30980:606:41:o;31591:487::-;31853:25;;;-1:-1:-1;;;;;31952:15:41;;;31947:2;31932:18;;31925:43;32004:15;;;31999:2;31984:18;;31977:43;32056:15;32051:2;32036:18;;32029:43;31840:3;31825:19;;31807:271::o;32083:1403::-;;32375:3;32405:6;32394:9;32387:25;32484:1;32480;32475:3;32471:11;32467:19;32458:6;32452:13;32448:39;32443:2;32432:9;32428:18;32421:67;32535:2;32527:6;32523:15;32517:22;32548:54;32598:2;32587:9;32583:18;32569:12;32548:54;:::i;:::-;;32651:2;32643:6;32639:15;32633:22;32664:56;32716:2;32705:9;32701:18;32685:14;32664:56;:::i;:::-;;32769:2;32761:6;32757:15;32751:22;32782:55;32832:3;32821:9;32817:19;32801:14;32782:55;:::i;:::-;;32886:3;32878:6;32874:16;32868:23;32900:57;32952:3;32941:9;32937:19;32921:14;32900:57;:::i;:::-;;33006:3;32998:6;32994:16;32988:23;33020:57;33072:3;33061:9;33057:19;33041:14;33020:57;:::i;:::-;;33126:3;33118:6;33114:16;33108:23;33140:57;33192:3;33181:9;33177:19;33161:14;33140:57;:::i;:::-;;33234:3;33226:6;33222:16;33216:23;33258:3;33297:2;33292;33281:9;33277:18;33270:30;33355:2;33347:6;33343:15;33337:22;33331:3;33320:9;33316:19;33309:51;;;33397:2;33391:3;33380:9;33376:19;33369:31;33417:63;33476:2;33465:9;33461:18;33453:6;33445;33417:63;:::i;33491:800::-;;33862:3;33874:59;33923:9;33915:6;33874:59;:::i;:::-;33964:3;33949:19;;33942:35;;;34008:3;33993:19;;33986:35;;;-1:-1:-1;;;;;34096:15:41;;;34090:3;34075:19;;34068:44;34149:15;;34143:3;34128:19;;34121:44;34196:3;34181:19;;34174:31;;;34222:63;34266:18;;;34258:6;34250;34222:63;:::i;:::-;34214:71;33842:449;-1:-1:-1;;;;;;;;;;33842:449:41:o;34296:588::-;34624:25;;;34680:2;34665:18;;34658:34;;;;-1:-1:-1;;;;;34728:32:41;;;;34723:2;34708:18;;34701:60;34808:1;34797:21;;;34792:2;34777:18;;34770:49;34856:21;34850:3;34835:19;;34828:50;34611:3;34596:19;;34578:306::o;34889:270::-;;35074:2;35063:9;35056:21;35094:59;35149:2;35138:9;35134:18;35126:6;35094:59;:::i;35164:457::-;;35409:2;35398:9;35391:21;35429:59;35484:2;35473:9;35469:18;35461:6;35429:59;:::i;:::-;-1:-1:-1;;;;;35524:32:41;;;;35519:2;35504:18;;35497:60;-1:-1:-1;35604:1:41;35593:21;;;;35588:2;35573:18;;;35566:49;35421:67;35381:240;-1:-1:-1;35381:240:41:o;35626:459::-;;35897:3;35927:2;35916:9;35909:21;35947:59;36002:2;35991:9;35987:18;35979:6;35947:59;:::i;:::-;35939:67;;;36015:64;36075:2;36064:9;36060:18;36052:6;36015:64;:::i;36090:565::-;;36397:3;36427:2;36416:9;36409:21;36447:59;36502:2;36491:9;36487:18;36479:6;36447:59;:::i;:::-;36439:67;;;36515:64;36575:2;36564:9;36560:18;36552:6;36515:64;:::i;:::-;-1:-1:-1;;;;;36616:32:41;;;;36610:3;36595:19;;;;36588:61;36377:278;;-1:-1:-1;;36377:278:41:o;36660:218::-;-1:-1:-1;;;;;36824:47:41;;;;36806:66;;36794:2;36779:18;;36761:117::o;36883:954::-;-1:-1:-1;;;;;37284:47:41;;;;37266:66;;37379:2;37368:22;;;37363:2;37348:18;;37341:50;37427:22;;;;37422:2;37407:18;;37400:50;37481:2;37466:18;;37459:34;;;;37524:3;37509:19;;37502:35;;;;37568:3;37553:19;;37546:35;37629:1;37618:21;37612:3;37597:19;;37590:50;-1:-1:-1;;;;;37677:32:41;37671:3;37656:19;;37649:61;37759:10;37747:23;;;37741:3;37726:19;;37719:52;37815:14;37808:22;37802:3;37787:19;;37780:51;37253:3;37238:19;;37220:617::o;37842:319::-;-1:-1:-1;;;;;38087:15:41;;;38069:34;;38139:15;;38134:2;38119:18;;38112:43;38004:2;37989:18;;37971:190::o;38166:543::-;-1:-1:-1;;;;;38496:15:41;;;38478:34;;38543:2;38528:18;;38521:34;;;;38586:2;38571:18;;38564:34;;;;38634:15;;38629:2;38614:18;;38607:43;38687:15;;;38681:3;38666:19;;38659:44;38412:3;38397:19;;38379:330::o;38922:628::-;-1:-1:-1;;;;;39211:32:41;;;;39193:51;;39291:1;39280:21;;;;39275:2;39260:18;;39253:49;39321:6;39363:15;;;39358:2;39343:18;;39336:43;39415:15;;;39410:2;39395:18;;39388:43;39468:15;39462:3;39447:19;;39440:44;39528:14;39521:22;39231:3;39500:19;;39493:51;39180:3;39165:19;;39147:403::o;39555:190::-;39729:8;39717:21;;;;39699:40;;39687:2;39672:18;;39654:91::o;40185:453::-;40434:10;40422:23;;;;40404:42;;40493:1;40482:21;;;;40477:2;40462:18;;40455:49;-1:-1:-1;;;;;40540:32:41;40535:2;40520:18;;40513:60;40616:14;40609:22;40604:2;40589:18;;40582:50;40391:3;40376:19;;40358:280::o;40643:196::-;40817:14;40805:27;;;;40787:46;;40775:2;40760:18;;40742:97::o;40844:242::-;40914:2;40908:9;40944:17;;;-1:-1:-1;;;;;40976:34:41;;41012:22;;;40973:62;40970:2;;;41038:9;40970:2;41065;41058:22;40888:198;;-1:-1:-1;40888:198:41:o;41091:133::-;-1:-1:-1;;;;;41168:31:41;;41158:42;;41148:2;;41214:1;41211;41204:12;41229:120;41318:5;41315:1;41304:20;41297:5;41294:31;41284:2;;41339:1;41336;41329:12;41354:148;-1:-1:-1;;;;;41435:5:41;41431:46;41424:5;41421:57;41411:2;;41492:1;41489;41482:12;41507:121;41594:8;41587:5;41583:20;41576:5;41573:31;41563:2;;41618:1;41615;41608:12","linkReferences":{"contracts/core/libraries/CLPoolNonSwapPath.sol":{"CLPoolNonSwapPath":[{"start":1568,"length":20},{"start":5080,"length":20},{"start":5564,"length":20},{"start":5927,"length":20},{"start":6198,"length":20},{"start":6380,"length":20},{"start":6723,"length":20},{"start":7375,"length":20},{"start":7569,"length":20},{"start":7729,"length":20},{"start":8063,"length":20},{"start":8261,"length":20},{"start":8689,"length":20},{"start":8860,"length":20},{"start":14858,"length":20},{"start":15228,"length":20}]}},"cborAuxdata":{"1":{"value":"0xa2646970667358221220a469918fd754a61268a102489254f65c850a135863b7cb2abe1c81001a04ce3664736f6c63430007060033","offset":24262}},"immutableReferences":{},"transformations":[{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":1568,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":5080,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":5564,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":5927,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":6198,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":6380,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":6723,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":7375,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":7569,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":7729,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":8063,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":8261,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":8689,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":8860,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":14858,"reason":"library"},{"id":"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath","type":"replace","offset":15228,"reason":"library"},{"id":"1","type":"replace","offset":24262,"reason":"cborAuxdata"}],"transformationValues":{"libraries":{"contracts/core/libraries/CLPoolNonSwapPath.sol:CLPoolNonSwapPath":"0x1ad7a8703ebff81c0d753190938f228672ec7e42"},"cborAuxdata":{"1":"0xa26469706673582212208259f71667ea509ad0140699f895cddafc625b856bb68a6d7710f5b84cbd4d9d64736f6c63430007060033"}}},"deployment":{"transactionHash":"0x130d981bc8f7d5048ae8d5d92a29fe8760660f8237f4dad3418a2d5bcae7b028","blockNumber":"52881646","transactionIndex":"37","deployer":"0xCaF2C1251465C90D91A16b2288D9d6389f836A0E"},"sources":{"contracts/core/CLPool.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity =0.7.6;\npragma abicoder v2;\n\nimport './interfaces/ICLPool.sol';\n\nimport './libraries/LowGasSafeMath.sol';\nimport './libraries/Oracle.sol';\nimport './libraries/Position.sol';\nimport './libraries/SafeCast.sol';\nimport './libraries/Tick.sol';\nimport './libraries/TickBitmap.sol';\n\nimport {CLPoolNonSwapPath as CL} from './libraries/CLPoolNonSwapPath.sol';\nimport './libraries/FixedPoint128.sol';\nimport './libraries/FullMath.sol';\nimport './libraries/LiquidityMath.sol';\nimport './libraries/SwapMath.sol';\nimport './libraries/TickMath.sol';\nimport './libraries/TransferHelper.sol';\nimport './libraries/hook/SwapHookLib.sol';\n\nimport './interfaces/ICLFactory.sol';\nimport './interfaces/IERC20Minimal.sol';\nimport './interfaces/IFactoryRegistry.sol';\nimport './interfaces/callback/ICLSwapCallback.sol';\nimport './interfaces/hook/ISwapHook.sol';\nimport {ICLGauge} from 'contracts/gauge/interfaces/ICLGauge.sol';\n\ncontract CLPool is ICLPool {\n  using LowGasSafeMath for uint256;\n  using LowGasSafeMath for int256;\n  using SafeCast for uint256;\n  using SafeCast for int256;\n  using Tick for mapping(int24 => Tick.Info);\n  using TickBitmap for mapping(int16 => uint256);\n  using Position for mapping(bytes32 => Position.Info);\n  using Position for Position.Info;\n  using Oracle for Oracle.Observation[65_535];\n  using SwapHookLib for address;\n\n  /// @inheritdoc ICLPoolConstants\n  address public override factory;\n  /// @inheritdoc ICLPoolConstants\n  address public override token0;\n  /// @inheritdoc ICLPoolConstants\n  address public override token1;\n  /// @inheritdoc ICLPoolConstants\n  address public override gauge;\n  /// @inheritdoc ICLPoolConstants\n  address public override nft;\n  /// @inheritdoc ICLPoolConstants\n  address public override factoryRegistry;\n\n  struct Slot0 {\n    // the current price\n    uint160 sqrtPriceX96;\n    // the current tick\n    int24 tick;\n    // the most-recently updated index of the observations array\n    uint16 observationIndex;\n    // the current maximum number of observations that are being stored\n    uint16 observationCardinality;\n    // the next maximum number of observations to store, triggered in observations.write\n    uint16 observationCardinalityNext;\n    // whether the pool is locked\n    bool unlocked;\n  }\n\n  /// @inheritdoc ICLPoolState\n  Slot0 public override slot0;\n\n  /// @inheritdoc ICLPoolState\n  uint256 public override feeGrowthGlobal0X128;\n  /// @inheritdoc ICLPoolState\n  uint256 public override feeGrowthGlobal1X128;\n\n  /// @inheritdoc ICLPoolState\n  uint256 public override rewardGrowthGlobalX128;\n\n  // accumulated gauge fees in token0/token1 units\n  struct GaugeFees {\n    uint128 token0;\n    uint128 token1;\n  }\n\n  /// @inheritdoc ICLPoolState\n  GaugeFees public override gaugeFees;\n\n  /// @inheritdoc ICLPoolState\n  uint256 public override rollover;\n\n  /// @inheritdoc ICLPoolState\n  uint128 public override stakedLiquidity;\n  /// @inheritdoc ICLPoolState\n  uint48 public override lastUpdated;\n  /// @inheritdoc ICLPoolConstants\n  int24 public override tickSpacing;\n\n  /// @inheritdoc ICLPoolState\n  uint128 public override liquidity;\n  /// @inheritdoc ICLPoolConstants\n  uint128 public override maxLiquidityPerTick;\n\n  /// @inheritdoc ICLPoolState\n  mapping(int24 => Tick.Info) public override ticks;\n  /// @inheritdoc ICLPoolState\n  mapping(int16 => uint256) public override tickBitmap;\n  /// @inheritdoc ICLPoolState\n  mapping(bytes32 => Position.Info) public override positions;\n  /// @inheritdoc ICLPoolState\n  Oracle.Observation[65_535] public override observations;\n\n  /// @inheritdoc ICLPoolState\n  uint160 public override secondsPerStakedLiquidityCumulativeX128;\n\n  /// @inheritdoc ICLPoolConstants\n  uint256 public constant override SWAP_FEE_CEIL = 100_000;\n  /// @inheritdoc ICLPoolConstants\n  uint256 public constant override DENOMINATOR = 1_000_000;\n  /// @inheritdoc ICLPoolConstants\n  bytes32 public constant override POOL_TYPE = 'CL';\n\n  /// @dev Mutually exclusive reentrancy protection into the pool to/from a method. This method also prevents entrance\n  /// to a function before the pool is initialized. The reentrancy guard is required throughout the contract because\n  /// we use balance checks to determine the payment status of interactions such as mint, swap and flash.\n  function _lock() private {\n    _require(slot0.unlocked, 'LOK');\n    slot0.unlocked = false;\n  }\n\n  function _unlock() private {\n    slot0.unlocked = true;\n  }\n\n  function _require(bool condition, string memory error) private pure {\n    require(condition, error);\n  }\n\n  /// @dev Prevents calling a function from anyone except the gauge associated with this pool\n  function _onlyGauge() private view {\n    _require(msg.sender == gauge, 'NG');\n  }\n\n  /// @dev Prevents calling a function from anyone except the nft manager\n  function _onlyNftManager() private view {\n    _require(msg.sender == nft, 'NNFT');\n  }\n\n  /// @inheritdoc ICLPoolActions\n  function initialize(\n    address _factory,\n    address _token0,\n    address _token1,\n    int24 _tickSpacing,\n    address _factoryRegistry,\n    uint160 _sqrtPriceX96\n  ) external override {\n    require(factory == address(0) && _factory != address(0));\n    factory = _factory;\n    token0 = _token0;\n    token1 = _token1;\n    tickSpacing = _tickSpacing;\n    factoryRegistry = _factoryRegistry;\n\n    maxLiquidityPerTick =\n      CL.initializeSlot0(slot0, observations, _sqrtPriceX96, TickMath.getTickAtSqrtRatio(_sqrtPriceX96), _tickSpacing);\n  }\n\n  /// @inheritdoc ICLPoolState\n  function beforeSwapFee(ISwapHook.SwapParams memory _swapParams) public view override returns (uint24) {\n    return CL.beforeSwapFee(_swapParams, factory, tickSpacing);\n  }\n\n  /// @inheritdoc ICLPoolState\n  function afterSwapFee(\n    ISwapHook.SwapParams memory _swapParams,\n    ISwapHook.AfterSwapParams memory _afterSwapParams\n  ) external view override returns (uint24) {\n    return CL.afterSwapFee(_swapParams, _afterSwapParams, factory);\n  }\n\n  /// @inheritdoc ICLPoolState\n  function flashFee(ISwapHook.FlashParams memory _flashParams) external view override returns (uint24 _fee) {\n    return CL.flashFee(_flashParams, factory, tickSpacing);\n  }\n\n  /// @inheritdoc ICLPoolState\n  /// @dev This method can be used for \"legacy\" swap fee modules.\n  function fee() external view override returns (uint24) {\n    ISwapHook.SwapParams memory _swapParams;\n    _swapParams.caller = msg.sender;\n    return beforeSwapFee(_swapParams);\n  }\n\n  /// @inheritdoc ICLPoolState\n  function unstakedFee() public view override returns (uint24) {\n    return ICLFactory(factory).getUnstakedFee(address(this));\n  }\n\n  /// @dev Common checks for valid tick inputs.\n  function checkTicks(int24 tickLower, int24 tickUpper) private pure {\n    require(tickLower < tickUpper, 'TLU');\n    require(tickLower >= TickMath.MIN_TICK, 'TLM');\n    require(tickUpper <= TickMath.MAX_TICK, 'TUM');\n  }\n\n  /// @dev Get the pool's balance of token0\n  /// @dev This function is gas optimized to avoid a redundant extcodesize check in addition to the returndatasize\n  /// check\n  function balance0() private view returns (uint256) {\n    return IERC20Minimal(token0).balanceOf(address(this));\n  }\n\n  /// @dev Get the pool's balance of token1\n  /// @dev This function is gas optimized to avoid a redundant extcodesize check in addition to the returndatasize\n  /// check\n  function balance1() private view returns (uint256) {\n    return IERC20Minimal(token1).balanceOf(address(this));\n  }\n\n  /// @inheritdoc ICLPoolDerivedState\n  function snapshotCumulativesInside(\n    int24 tickLower,\n    int24 tickUpper\n  )\n    external\n    view\n    override\n    returns (int56 tickCumulativeInside, uint160 secondsPerLiquidityInsideX128, uint32 secondsInside)\n  {\n    Slot0 memory currentSlot0 = slot0;\n    return CL.snapshotCumulativesInside(\n      ticks,\n      observations,\n      tickLower,\n      tickUpper,\n      currentSlot0.tick,\n      currentSlot0.observationIndex,\n      currentSlot0.observationCardinality,\n      liquidity\n    );\n  }\n\n  /// @inheritdoc ICLPoolDerivedState\n  function observe(uint32[] calldata secondsAgos)\n    external\n    view\n    override\n    returns (int56[] memory tickCumulatives, uint160[] memory secondsPerLiquidityCumulativeX128s)\n  {\n    return observations.observe(\n      uint32(block.timestamp), secondsAgos, slot0.tick, slot0.observationIndex, liquidity, slot0.observationCardinality\n    );\n  }\n\n  /// @inheritdoc ICLPoolDerivedState\n  function getSecondsPerStakedLiquidityCumulativeX128() external view override returns (uint160 _cumulative) {\n    _cumulative = secondsPerStakedLiquidityCumulativeX128;\n    uint128 _stakedLiquidity = stakedLiquidity;\n    if (_stakedLiquidity > 0) {\n      _cumulative += _secondsPerStakedLiquidityDelta(block.timestamp - lastUpdated, _stakedLiquidity);\n    }\n  }\n\n  /// @inheritdoc ICLPoolActions\n  function increaseObservationCardinalityNext(uint16 observationCardinalityNext) external override {\n    _lock();\n    CL.increaseObservationCardinalityNext(observations, slot0, observationCardinalityNext);\n    _unlock();\n  }\n\n  /// @inheritdoc ICLPoolState\n  function getFeeGrowthInside(\n    int24 tickLower,\n    int24 tickUpper\n  ) external view override returns (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128) {\n    return CL.getFeeGrowthInside(ticks, tickLower, tickUpper, slot0.tick, feeGrowthGlobal0X128, feeGrowthGlobal1X128);\n  }\n\n  function _modifyPositionInput(\n    address owner,\n    int24 tickLower,\n    int24 tickUpper\n  ) private view returns (CL.ModifyPositionInput memory input) {\n    input = CL.ModifyPositionInput({\n      owner: owner,\n      tickLower: tickLower,\n      tickUpper: tickUpper,\n      liquidity: liquidity,\n      maxLiquidityPerTick: maxLiquidityPerTick,\n      feeGrowthGlobal0X128: feeGrowthGlobal0X128,\n      feeGrowthGlobal1X128: feeGrowthGlobal1X128,\n      rewardGrowthGlobalX128: rewardGrowthGlobalX128,\n      gauge: gauge,\n      tickSpacing: tickSpacing,\n      amount: 0\n    });\n  }\n\n  /// @inheritdoc ICLPoolActions\n  function mint(\n    address recipient,\n    int24 tickLower,\n    int24 tickUpper,\n    uint128 amount,\n    bytes calldata data\n  ) external override returns (uint256 amount0, uint256 amount1) {\n    _lock();\n    CL.ModifyPositionInput memory input = _modifyPositionInput(recipient, tickLower, tickUpper);\n    input.amount = amount;\n    (uint128 liquidityAfter, uint256 amount0Out, uint256 amount1Out) =\n      CL.modifyPositionForMint(positions, ticks, tickBitmap, observations, slot0, input);\n    liquidity = liquidityAfter;\n    CL.settleMint(input, amount0Out, amount1Out, token0, token1, data);\n    _unlock();\n    return (amount0Out, amount1Out);\n  }\n\n  /// @inheritdoc ICLPoolActions\n  function collect(\n    address recipient,\n    int24 tickLower,\n    int24 tickUpper,\n    uint128 amount0Requested,\n    uint128 amount1Requested\n  ) external override returns (uint128 amount0, uint128 amount1) {\n    _lock();\n    (amount0, amount1) = _collect({\n      recipient: recipient,\n      tickLower: tickLower,\n      tickUpper: tickUpper,\n      amount0Requested: amount0Requested,\n      amount1Requested: amount1Requested,\n      owner: msg.sender\n    });\n    _unlock();\n  }\n\n  /// @inheritdoc ICLPoolActions\n  function collect(\n    address recipient,\n    int24 tickLower,\n    int24 tickUpper,\n    uint128 amount0Requested,\n    uint128 amount1Requested,\n    address owner\n  ) external override returns (uint128 amount0, uint128 amount1) {\n    _lock();\n    _onlyNftManager();\n    (amount0, amount1) = _collect({\n      recipient: recipient,\n      tickLower: tickLower,\n      tickUpper: tickUpper,\n      amount0Requested: amount0Requested,\n      amount1Requested: amount1Requested,\n      owner: owner\n    });\n    _unlock();\n  }\n\n  function _collect(\n    address recipient,\n    int24 tickLower,\n    int24 tickUpper,\n    uint128 amount0Requested,\n    uint128 amount1Requested,\n    address owner\n  ) private returns (uint128 amount0, uint128 amount1) {\n    return CL.collect(\n      positions, recipient, tickLower, tickUpper, amount0Requested, amount1Requested, owner, token0, token1\n    );\n  }\n\n  /// @inheritdoc ICLPoolActions\n  function burn(\n    int24 tickLower,\n    int24 tickUpper,\n    uint128 amount\n  ) external override returns (uint256 amount0, uint256 amount1) {\n    _lock();\n    (amount0, amount1) = _burn({tickLower: tickLower, tickUpper: tickUpper, amount: amount, owner: msg.sender});\n    _unlock();\n  }\n\n  /// @inheritdoc ICLPoolActions\n  function burn(\n    int24 tickLower,\n    int24 tickUpper,\n    uint128 amount,\n    address owner\n  ) external override returns (uint256 amount0, uint256 amount1) {\n    _lock();\n    _onlyNftManager();\n    (amount0, amount1) = _burn({tickLower: tickLower, tickUpper: tickUpper, amount: amount, owner: owner});\n    _unlock();\n  }\n\n  function _burn(\n    int24 tickLower,\n    int24 tickUpper,\n    uint128 amount,\n    address owner\n  ) private returns (uint256 amount0, uint256 amount1) {\n    CL.ModifyPositionInput memory input = _modifyPositionInput(owner, tickLower, tickUpper);\n    input.amount = amount;\n    (uint128 liquidityAfter, uint256 amount0Out, uint256 amount1Out) =\n      CL.burn(positions, ticks, tickBitmap, observations, slot0, input);\n    liquidity = liquidityAfter;\n    return (amount0Out, amount1Out);\n  }\n\n  /// @inheritdoc ICLPoolActions\n  function stake(int128 stakedLiquidityDelta, int24 tickLower, int24 tickUpper) external override {\n    _lock();\n    _onlyGauge();\n    int24 tick = slot0.tick;\n    // Increase staked liquidity in the current tick\n    if (tick >= tickLower && tick < tickUpper) {\n      _settleToBlock();\n      stakedLiquidity = LiquidityMath.addDelta(stakedLiquidity, stakedLiquidityDelta);\n    }\n\n    CL.stakePositions(\n      positions,\n      ticks,\n      nft,\n      tickLower,\n      tickUpper,\n      tick,\n      stakedLiquidityDelta,\n      feeGrowthGlobal0X128,\n      feeGrowthGlobal1X128\n    );\n    _unlock();\n  }\n\n  struct SwapCache {\n    // liquidity at the beginning of the swap\n    uint128 liquidityStart;\n    // staked liquidity at the beginning of the swap\n    uint128 stakedLiquidityStart;\n    // the timestamp of the current block\n    uint32 blockTimestamp;\n    // the current value of the tick accumulator, computed only if we cross an initialized tick\n    int56 tickCumulative;\n    // the current value of seconds per liquidity accumulator, computed only if we cross an initialized tick\n    uint160 secondsPerLiquidityCumulativeX128;\n    // whether we've computed and cached the above two accumulators\n    bool computedLatestObservation;\n    // global swap hook used to call beforeSwap/afterSwap methods.\n    address swapHook;\n  }\n\n  // the top level state of the swap, the results of which are recorded in storage at the end\n  struct SwapState {\n    // the amount remaining to be swapped in/out of the input/output asset\n    int256 amountSpecifiedRemaining;\n    // the amount already swapped out/in of the output/input asset\n    int256 amountCalculated;\n    // current sqrt(price)\n    uint160 sqrtPriceX96;\n    // the tick associated with the current price\n    int24 tick;\n    // the fee associated with the pool\n    uint24 fee;\n    // wether we've updated the fees in the current swap\n    bool hasUpdatedFees;\n    // the global fee growth of the input token\n    uint256 feeGrowthGlobalX128;\n    // amount of input token paid as gauge fee\n    uint128 gaugeFee;\n    // the current liquidity in range\n    uint128 liquidity;\n    // the current staked liquidity in range\n    uint128 stakedLiquidity;\n  }\n\n  struct StepComputations {\n    // the price at the beginning of the step\n    uint160 sqrtPriceStartX96;\n    // the next tick to swap to from the current tick in the swap direction\n    int24 tickNext;\n    // whether tickNext is initialized or not\n    bool initialized;\n    // sqrt(price) for the next tick (1/0)\n    uint160 sqrtPriceNextX96;\n    // how much is being swapped in in this step\n    uint256 amountIn;\n    // how much is being swapped out\n    uint256 amountOut;\n    // how much fee is being paid in\n    uint256 feeAmount;\n  }\n\n  /// @inheritdoc ICLPoolActions\n  function swap(\n    address recipient,\n    bool zeroForOne,\n    int256 amountSpecified,\n    uint160 sqrtPriceLimitX96,\n    bytes calldata data\n  ) external override returns (int256 amount0, int256 amount1) {\n    _require(amountSpecified != 0, 'AS');\n\n    Slot0 memory slot0Start = slot0;\n\n    _require(slot0Start.unlocked, 'LOK');\n    _require(\n      zeroForOne\n        ? sqrtPriceLimitX96 < slot0Start.sqrtPriceX96 && sqrtPriceLimitX96 > TickMath.MIN_SQRT_RATIO\n        : sqrtPriceLimitX96 > slot0Start.sqrtPriceX96 && sqrtPriceLimitX96 < TickMath.MAX_SQRT_RATIO,\n      'SPL'\n    );\n\n    slot0.unlocked = false;\n\n    SwapCache memory cache = SwapCache({\n      liquidityStart: liquidity,\n      stakedLiquidityStart: stakedLiquidity,\n      blockTimestamp: uint32(block.timestamp),\n      secondsPerLiquidityCumulativeX128: 0,\n      tickCumulative: 0,\n      computedLatestObservation: false,\n      swapHook: ICLFactory(factory).getPoolSwapHook(address(this))\n    });\n\n    bool exactInput = amountSpecified > 0;\n\n    SwapState memory state = SwapState({\n      amountSpecifiedRemaining: amountSpecified,\n      amountCalculated: 0,\n      sqrtPriceX96: slot0Start.sqrtPriceX96,\n      tick: slot0Start.tick,\n      fee: 0, // set below\n      hasUpdatedFees: false,\n      feeGrowthGlobalX128: zeroForOne ? feeGrowthGlobal0X128 : feeGrowthGlobal1X128,\n      gaugeFee: 0,\n      liquidity: cache.liquidityStart,\n      stakedLiquidity: cache.stakedLiquidityStart\n    });\n\n    state.fee = cache.swapHook\n      .beforeSwap(\n        ISwapHook.SwapParams({\n          caller: msg.sender,\n          recipient: recipient,\n          zeroForOne: zeroForOne,\n          amountSpecified: amountSpecified,\n          sqrtPriceLimitX96: sqrtPriceLimitX96,\n          data: data,\n          sqrtPriceX96: slot0Start.sqrtPriceX96,\n          tick: slot0Start.tick\n        }),\n        factory,\n        tickSpacing\n      );\n\n    // continue swapping as long as we haven't used the entire input/output and haven't reached the price limit\n    while (state.amountSpecifiedRemaining != 0 && state.sqrtPriceX96 != sqrtPriceLimitX96) {\n      StepComputations memory step;\n\n      step.sqrtPriceStartX96 = state.sqrtPriceX96;\n\n      (step.tickNext, step.initialized) =\n        tickBitmap.nextInitializedTickWithinOneWord(state.tick, tickSpacing, zeroForOne);\n\n      // ensure that we do not overshoot the min/max tick, as the tick bitmap is not aware of these bounds\n      if (step.tickNext < TickMath.MIN_TICK) {\n        step.tickNext = TickMath.MIN_TICK;\n      } else if (step.tickNext > TickMath.MAX_TICK) {\n        step.tickNext = TickMath.MAX_TICK;\n      }\n\n      // get the price for the next tick\n      step.sqrtPriceNextX96 = TickMath.getSqrtRatioAtTick(step.tickNext);\n\n      // compute values to swap to the target tick, price limit, or point where input/output amount is exhausted\n      (state.sqrtPriceX96, step.amountIn, step.amountOut, step.feeAmount) = SwapMath.computeSwapStep(\n        state.sqrtPriceX96,\n        (zeroForOne ? step.sqrtPriceNextX96 < sqrtPriceLimitX96 : step.sqrtPriceNextX96 > sqrtPriceLimitX96)\n          ? sqrtPriceLimitX96\n          : step.sqrtPriceNextX96,\n        state.liquidity,\n        state.amountSpecifiedRemaining,\n        state.fee\n      );\n\n      if (exactInput) {\n        state.amountSpecifiedRemaining -= (step.amountIn + step.feeAmount).toInt256();\n        state.amountCalculated = state.amountCalculated.sub(step.amountOut.toInt256());\n      } else {\n        state.amountSpecifiedRemaining += step.amountOut.toInt256();\n        state.amountCalculated = state.amountCalculated.add((step.amountIn + step.feeAmount).toInt256());\n      }\n\n      // update global fee tracker and gauge fee\n      if (state.liquidity > 0) {\n        (uint256 _feeGrowthGlobalX128, uint256 _stakedFeeAmount) =\n          calculateFees(step.feeAmount, state.liquidity, state.stakedLiquidity);\n\n        state.feeGrowthGlobalX128 += _feeGrowthGlobalX128;\n        state.gaugeFee += uint128(_stakedFeeAmount);\n      }\n\n      // shift tick if we reached the next price\n      if (state.sqrtPriceX96 == step.sqrtPriceNextX96) {\n        // if the tick is initialized, run the tick transition\n        if (step.initialized) {\n          // check for the placeholder value, which we replace with the actual value the first time the swap\n          // crosses an initialized tick\n          if (!cache.computedLatestObservation) {\n            (cache.tickCumulative, cache.secondsPerLiquidityCumulativeX128) = observations.observeSingle(\n              cache.blockTimestamp,\n              0,\n              slot0Start.tick,\n              slot0Start.observationIndex,\n              cache.liquidityStart,\n              slot0Start.observationCardinality\n            );\n            cache.computedLatestObservation = true;\n          }\n          if (!state.hasUpdatedFees) {\n            _settleToBlock();\n            state.hasUpdatedFees = true;\n          }\n          Tick.LiquidityNets memory nets = ticks.cross(\n            step.tickNext,\n            (zeroForOne ? state.feeGrowthGlobalX128 : feeGrowthGlobal0X128),\n            (zeroForOne ? feeGrowthGlobal1X128 : state.feeGrowthGlobalX128),\n            cache.secondsPerLiquidityCumulativeX128,\n            cache.tickCumulative,\n            cache.blockTimestamp,\n            rewardGrowthGlobalX128\n          );\n          // if we're moving leftward, we interpret liquidityNet & stakedLiquidityNet as the opposite sign\n          // safe because liquidityNet & stakedLiquidityNet cannot be type(int128).min\n          if (zeroForOne) {\n            nets.liquidityNet = -nets.liquidityNet;\n            nets.stakedLiquidityNet = -nets.stakedLiquidityNet;\n          }\n\n          state.liquidity = LiquidityMath.addDelta(state.liquidity, nets.liquidityNet);\n          state.stakedLiquidity = LiquidityMath.addDelta(state.stakedLiquidity, nets.stakedLiquidityNet);\n        }\n\n        state.tick = zeroForOne ? step.tickNext - 1 : step.tickNext;\n      } else if (state.sqrtPriceX96 != step.sqrtPriceStartX96) {\n        // recompute unless we're on a lower tick boundary (i.e. already transitioned ticks), and haven't moved\n        state.tick = TickMath.getTickAtSqrtRatio(state.sqrtPriceX96);\n      }\n    }\n\n    /// @dev This function is able to mutate `gaugeFees` storage variable.\n    cache.swapHook\n      .afterSwap(\n        ISwapHook.SwapParams({\n          caller: msg.sender,\n          recipient: recipient,\n          zeroForOne: zeroForOne,\n          amountSpecified: amountSpecified,\n          sqrtPriceLimitX96: sqrtPriceLimitX96,\n          data: data,\n          sqrtPriceX96: state.sqrtPriceX96,\n          tick: state.tick\n        }),\n        state,\n        cache,\n        gaugeFees\n      );\n\n    // update tick and write an oracle entry if the tick change\n    if (state.tick != slot0Start.tick) {\n      (uint16 observationIndex, uint16 observationCardinality) = observations.write(\n        slot0Start.observationIndex,\n        cache.blockTimestamp,\n        slot0Start.tick,\n        cache.liquidityStart,\n        slot0Start.observationCardinality,\n        slot0Start.observationCardinalityNext\n      );\n      (slot0.sqrtPriceX96, slot0.tick, slot0.observationIndex, slot0.observationCardinality) =\n      (state.sqrtPriceX96, state.tick, observationIndex, observationCardinality);\n    } else {\n      // otherwise just update the price\n      slot0.sqrtPriceX96 = state.sqrtPriceX96;\n    }\n\n    // update liquidity and stakedLiquidity if it changed\n    if (cache.liquidityStart != state.liquidity) liquidity = state.liquidity;\n    if (cache.stakedLiquidityStart != state.stakedLiquidity) stakedLiquidity = state.stakedLiquidity;\n\n    // update fee growth global and, if necessary, gauge fees\n    // overflow is acceptable, protocol has to withdraw before it hits type(uint128).max fees\n    if (zeroForOne) {\n      feeGrowthGlobal0X128 = state.feeGrowthGlobalX128;\n      if (state.gaugeFee > 0) gaugeFees.token0 += state.gaugeFee;\n    } else {\n      feeGrowthGlobal1X128 = state.feeGrowthGlobalX128;\n      if (state.gaugeFee > 0) gaugeFees.token1 += state.gaugeFee;\n    }\n\n    (amount0, amount1) = zeroForOne == exactInput\n      ? (amountSpecified - state.amountSpecifiedRemaining, state.amountCalculated)\n      : (state.amountCalculated, amountSpecified - state.amountSpecifiedRemaining);\n\n    // do the transfers and collect payment\n    if (zeroForOne) {\n      if (amount1 < 0) TransferHelper.safeTransfer(token1, recipient, uint256(-amount1));\n\n      uint256 balance0Before = balance0();\n      ICLSwapCallback(msg.sender).uniswapV3SwapCallback(amount0, amount1, data);\n      _require(balance0Before.add(uint256(amount0)) <= balance0(), 'IIA');\n    } else {\n      if (amount0 < 0) TransferHelper.safeTransfer(token0, recipient, uint256(-amount0));\n\n      uint256 balance1Before = balance1();\n      ICLSwapCallback(msg.sender).uniswapV3SwapCallback(amount0, amount1, data);\n      _require(balance1Before.add(uint256(amount1)) <= balance1(), 'IIA');\n    }\n\n    emit Swap(msg.sender, recipient, amount0, amount1, state.sqrtPriceX96, state.liquidity, state.tick);\n    slot0.unlocked = true;\n  }\n\n  /// @inheritdoc ICLPoolActions\n  function flash(address recipient, uint256 amount0, uint256 amount1, bytes calldata data) external override {\n    _lock();\n\n    /// @dev The internal call credits part of the paid fee to gauge's token0/1.\n    ///      And thus changes the original sequence of fee updates from:\n    ///       1) getUnstakedFee() -> feeGrowthGlobal0X128 += x  -> gaugeFees.token0 += y\n    ///       2) getUnstakedFee() -> feeGrowthGlobal1X128 += x' -> gaugeFees.token1 += y'\n    ///      to:\n    ///       1) getUnstakedFee() -> gaugeFees.token0 += y\n    ///       2) getUnstakedFee() -> gaugeFees.token1 += y'\n    ///       3) feeGrowthGlobal0X128 += x\n    ///       4) feeGrowthGlobal1X128 += x'\n    (uint256 feeGrowthDelta0, uint256 feeGrowthDelta1) = CL.flash(\n      gaugeFees,\n      CL.FlashInput({\n        token0: token0,\n        token1: token1,\n        factory: factory,\n        tickSpacing: tickSpacing,\n        liquidity: liquidity,\n        stakedLiquidity: stakedLiquidity,\n        recipient: recipient,\n        amount0: amount0,\n        amount1: amount1\n      }),\n      data\n    );\n    if (feeGrowthDelta0 > 0) feeGrowthGlobal0X128 += feeGrowthDelta0;\n    if (feeGrowthDelta1 > 0) feeGrowthGlobal1X128 += feeGrowthDelta1;\n    _unlock();\n  }\n\n  /// @inheritdoc ICLPoolState\n  function getRewardGrowthInside(\n    int24 tickLower,\n    int24 tickUpper,\n    uint256 _rewardGrowthGlobalX128\n  ) external view override returns (uint256 rewardGrowthInside) {\n    return CL.getRewardGrowthInside(\n      ticks, tickLower, tickUpper, slot0.tick, _rewardGrowthGlobalX128, rewardGrowthGlobalX128\n    );\n  }\n\n  /// @dev Seconds elapsed converted into X128 seconds per unit of staked liquidity.\n  function _secondsPerStakedLiquidityDelta(uint256 _elapsed, uint128 _stakedLiquidity) internal pure returns (uint160) {\n    return uint160((_elapsed << 128) / _stakedLiquidity);\n  }\n\n  /// @dev Credits realized emissions to the accumulator when staked liquidity is in range, otherwise banks\n  ///      them into rollover, then advances the settlement timestamp. Both settlement paths terminate here.\n  function _updateRewardsGrowthGlobal(uint256 _rewardsToDistribute, uint48 _now, uint48 _lastUpdated) internal {\n    uint128 _stakedLiquidity = stakedLiquidity;\n    if (_stakedLiquidity > 0) {\n      rewardGrowthGlobalX128 += FullMath.mulDiv(_rewardsToDistribute, FixedPoint128.Q128, _stakedLiquidity);\n      secondsPerStakedLiquidityCumulativeX128 += _secondsPerStakedLiquidityDelta(_now - _lastUpdated, _stakedLiquidity);\n    } else {\n      rollover += _rewardsToDistribute;\n    }\n    lastUpdated = _now;\n  }\n\n  /// @dev Realizes rewards up to the current block by pulling the emissions accrued since the last\n  /// settlement through the gauge. Calls {_updateRewardsGrowthGlobal} to update the rewards to\n  /// distribute and lastUpdated. The LeafVoter's settlement is permissionless and returns 0 for\n  /// unregistered gauges, so the gauge pull reverts in exactly one case: the gauge's factory relays\n  /// the settle to the gauge tape inside a gas-capped call, and the caller funded the settle but\n  /// not that capped subcall.\n  function _settleToBlock() internal {\n    uint48 _timestamp = uint48(block.timestamp);\n    uint48 _lastUpdated = lastUpdated;\n    if (_timestamp == _lastUpdated) return;\n\n    address _gauge = gauge;\n    if (_gauge == address(0)) return;\n\n    uint256 _rewardsToDistribute = ICLGauge(_gauge).settleGauge();\n    _updateRewardsGrowthGlobal(_rewardsToDistribute, _timestamp, _lastUpdated);\n  }\n\n  /// @inheritdoc ICLPoolActions\n  function settleToBlock() external override returns (uint256 _rollover) {\n    _lock();\n    _onlyGauge();\n    _settleToBlock();\n    _rollover = rollover;\n    delete rollover;\n    _unlock();\n  }\n\n  /// @notice Calculates the fees owed to staked liquidity, then calculates fee levied on unstaked liquidity\n  /// @param feeAmount Total fees\n  /// @param _liquidity Current liquidity in active tick\n  /// @param _stakedLiquidity Current staked liquidity in active tick\n  /// @return unstakedFeeAmount Fee amount for unstaked LPs after accounting for staked liquidity contribution and unstaked fee\n  /// @return stakedFeeAmount Fee amount for staked LPs consisting of staked liquidity contribution and unstaked fee\n  function splitFees(\n    uint256 feeAmount,\n    uint128 _liquidity,\n    uint128 _stakedLiquidity\n  ) internal view returns (uint256 unstakedFeeAmount, uint256 stakedFeeAmount) {\n    stakedFeeAmount = FullMath.mulDivRoundingUp(feeAmount, _stakedLiquidity, _liquidity);\n    (unstakedFeeAmount, stakedFeeAmount) = applyUnstakedFees(feeAmount - stakedFeeAmount, stakedFeeAmount);\n  }\n\n  /// @notice Calculates fee for levied on unstaked liquidity only\n  /// @param _unstakedFeeAmount Fee amount for unstaked LPs net of staked liquidity contribution\n  /// @param _stakedFeeAmount Fee amount for staked LPs consisting of staked liquidity contribution\n  /// @return unstakedFeeAmount Fee amount for unstaked LPs after accounting for staked liquidity contribution and unstaked fee\n  /// @return stakedFeeAmount Fee amount for staked LPs consisting of staked liquidity contribution and unstaked fee\n  function applyUnstakedFees(\n    uint256 _unstakedFeeAmount,\n    uint256 _stakedFeeAmount\n  ) internal view returns (uint256 unstakedFeeAmount, uint256 stakedFeeAmount) {\n    uint256 _stakedFee = FullMath.mulDivRoundingUp(_unstakedFeeAmount, unstakedFee(), 1_000_000);\n    unstakedFeeAmount = _unstakedFeeAmount - _stakedFee;\n    stakedFeeAmount = _stakedFeeAmount + _stakedFee;\n  }\n\n  // calculates the fee growths for unstaked liquidity and returns it with the staked fee amount\n  function calculateFees(\n    uint256 feeAmount,\n    uint128 _liquidity,\n    uint128 _stakedLiquidity\n  ) internal view returns (uint256 feeGrowthGlobalX128, uint256 stakedFeeAmount) {\n    // if there is only staked liquidity\n    if (_liquidity == _stakedLiquidity) {\n      stakedFeeAmount = feeAmount;\n    }\n    // if there is only unstaked liquidity\n    else if (_stakedLiquidity == 0) {\n      (uint256 unstakedFeeAmount, uint256 _stakedFeeAmount) = applyUnstakedFees(feeAmount, 0);\n      feeGrowthGlobalX128 = FullMath.mulDiv(unstakedFeeAmount, FixedPoint128.Q128, _liquidity);\n      stakedFeeAmount = _stakedFeeAmount;\n    }\n    // if there are staked and unstaked liquidities\n    else {\n      (uint256 unstakedFeeAmount, uint256 _stakedFeeAmount) = splitFees(feeAmount, _liquidity, _stakedLiquidity);\n      feeGrowthGlobalX128 = FullMath.mulDiv(unstakedFeeAmount, FixedPoint128.Q128, _liquidity - _stakedLiquidity);\n      stakedFeeAmount = _stakedFeeAmount;\n    }\n  }\n\n  /// @inheritdoc ICLPoolOwnerActions\n  function collectFees(address recipient) external override returns (uint128 amount0, uint128 amount1) {\n    _lock();\n    _onlyGauge();\n    (amount0, amount1) = CL.collectFees(gaugeFees, recipient, token0, token1);\n    _unlock();\n  }\n\n  /// @inheritdoc ICLPoolActions\n  function setGaugeAndPositionManager(address _gauge, address _nft) external override {\n    _lock();\n    CL.validateGaugeFactory(factoryRegistry, factory);\n    require(gauge == address(0));\n    gauge = _gauge;\n    nft = _nft;\n    // Pull any emissions the voter accrued before the gauge was connected. No liquidity can be\n    // staked yet, so the accrual banks into rollover instead of crediting future stakers, and the\n    // gauge's settlement cursor is initialized in the same call.\n    uint256 _rewardsToDistribute = ICLGauge(_gauge).settleGauge();\n    _updateRewardsGrowthGlobal(_rewardsToDistribute, uint48(block.timestamp), lastUpdated);\n    _unlock();\n  }\n}\n"},"contracts/core/interfaces/ICLFactory.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\nimport {IFactoryRegistry} from 'contracts/core/interfaces/IFactoryRegistry.sol';\nimport {ILeafVoter} from 'contracts/gauge/interfaces/ILeafVoter.sol';\n\n/// @title The interface for the CL Factory\n/// @notice The CL Factory facilitates creation of CL pools and control over the protocol fees\ninterface ICLFactory {\n  /// @notice An initial tick spacing and its default swap fee, in millionths.\n  /// @param tickSpacing Minimum distance between initialized ticks.\n  /// @param fee Default swap fee, in millionths.\n  struct FeeTier {\n    int24 tickSpacing;\n    uint24 fee;\n  }\n\n  /// @notice Dependencies, initial managers and fee tiers of a newly deployed factory.\n  /// @param owner Initial factory owner.\n  /// @param swapFeeManager Initial swap fee manager.\n  /// @param unstakedFeeManager Initial unstaked fee manager.\n  /// @param voter Leaf voter, or zero until configured.\n  /// @param poolImplementation Implementation cloned for new pools.\n  /// @param positionManager Canonical position manager.\n  /// @param factoryRegistry Registry that approves the factory and records its pools.\n  /// @param defaultSwapHook Initial swap hook, or zero until configured.\n  /// @param discountRegistryManager Initial discount registry manager.\n  /// @param clPoolTapeManager Initial pool tape manager.\n  /// @param initialFeeTiers Tick spacings and fees enabled during construction.\n  struct ConstructorParams {\n    address owner;\n    address swapFeeManager;\n    address unstakedFeeManager;\n    address voter;\n    address poolImplementation;\n    address positionManager;\n    address factoryRegistry;\n    address defaultSwapHook;\n    address discountRegistryManager;\n    address clPoolTapeManager;\n    FeeTier[] initialFeeTiers;\n  }\n\n  /// @notice Emitted when the owner of the factory is changed\n  /// @param oldOwner The owner before the owner was changed\n  /// @param newOwner The owner after the owner was changed\n  event OwnerChanged(address indexed oldOwner, address indexed newOwner);\n\n  /// @notice Emitted when the swapFeeManager of the factory is changed\n  /// @param oldFeeManager The swapFeeManager before the swapFeeManager was changed\n  /// @param newFeeManager The swapFeeManager after the swapFeeManager was changed\n  event SwapFeeManagerChanged(address indexed oldFeeManager, address indexed newFeeManager);\n\n  /// @notice Emitted when the unstakedFeeManager of the factory is changed\n  /// @param oldFeeManager The unstakedFeeManager before the unstakedFeeManager was changed\n  /// @param newFeeManager The unstakedFeeManager after the unstakedFeeManager was changed\n  event UnstakedFeeManagerChanged(address indexed oldFeeManager, address indexed newFeeManager);\n\n  /// @notice Emitted when the default swap hook of the factory is changed\n  /// @param swapHook The default swap hook after it was changed\n  event DefaultSwapHookChanged(address indexed swapHook);\n\n  /// @notice Emitted when the swap hook of a specific pool is changed\n  /// @param pool The pool whose swap hook was changed\n  /// @param swapHook The pool swap hook after it was changed\n  event PoolSwapHookChanged(address indexed pool, address indexed swapHook);\n\n  /// @notice Emitted when the unstakedFeeModule of the factory is changed\n  /// @param oldFeeModule The unstakedFeeModule before the unstakedFeeModule was changed\n  /// @param newFeeModule The unstakedFeeModule after the unstakedFeeModule was changed\n  event UnstakedFeeModuleChanged(address indexed oldFeeModule, address indexed newFeeModule);\n\n  /// @notice Emitted when the defaultUnstakedFee of the factory is changed\n  /// @param oldUnstakedFee The defaultUnstakedFee before the defaultUnstakedFee was changed\n  /// @param newUnstakedFee The defaultUnstakedFee after the unstakedFeeModule was changed\n  event DefaultUnstakedFeeChanged(uint24 indexed oldUnstakedFee, uint24 indexed newUnstakedFee);\n\n  /// @notice Emitted when the discountRegistryManager of the factory is changed\n  /// @param discountRegistryManager The discountRegistryManager after the discountRegistryManager was changed\n  event DiscountRegistryManagerChanged(address indexed discountRegistryManager);\n\n  /// @notice Emitted when the discountRegistry of the factory is changed\n  /// @param discountRegistry The discountRegistry after the discountRegistry was changed\n  event DiscountRegistryChanged(address indexed discountRegistry);\n\n  /// @notice Emitted when the clPoolTape module of the factory is set or cleared\n  /// @param clPoolTape The clPoolTape address after the change. The zero address disables tape registration\n  event ClPoolTapeChanged(address indexed clPoolTape);\n\n  /// @notice Emitted when the clPoolTapeManager of the factory is changed\n  /// @param clPoolTapeManager The clPoolTapeManager after the change\n  event ClPoolTapeManagerChanged(address indexed clPoolTapeManager);\n\n  /// @notice Emitted when the voter of the factory is set\n  /// @param voter The voter after it was set\n  event VoterSet(address indexed voter);\n\n  /// @notice Emitted when a pool is created\n  /// @param token0 The first token of the pool by address sort order\n  /// @param token1 The second token of the pool by address sort order\n  /// @param tickSpacing The minimum number of ticks between initialized ticks\n  /// @param pool The address of the created pool\n  event PoolCreated(address indexed token0, address indexed token1, int24 indexed tickSpacing, address pool);\n\n  /// @notice Emitted when a new tick spacing is enabled for pool creation via the factory\n  /// @param tickSpacing The minimum number of ticks between initialized ticks for pools\n  /// @param fee The default fee for a pool created with a given tickSpacing\n  event TickSpacingEnabled(int24 indexed tickSpacing, uint24 indexed fee);\n\n  /// @notice The LeafVoter contract, used to check gauge activation for unstaked fees\n  /// @dev May be the zero address until set via setVoter, as the voter can be deployed\n  ///      after the factory. Unstaked fees are zero until it is set\n  /// @return The address of the LeafVoter contract\n  function voter() external view returns (ILeafVoter);\n\n  /// @notice The address of the pool implementation contract used to deploy proxies / clones\n  /// @return The address of the pool implementation contract\n  function poolImplementation() external view returns (address);\n\n  /// @notice The canonical position manager for pools created by this factory\n  /// @return The address of the nonfungible position manager\n  function positionManager() external view returns (address);\n\n  /// @notice Factory registry that records pools as gauge targets\n  /// @dev Set at construction. Every created pool is registered as a target;\n  ///      pool creation reverts until this factory is an approved target factory\n  ///      in the registry\n  /// @return The address of the factory registry\n  function factoryRegistry() external view returns (IFactoryRegistry);\n\n  /// @notice Returns the current owner of the factory\n  /// @dev Can be changed by the current owner via setOwner\n  /// @return The address of the factory owner\n  function owner() external view returns (address);\n\n  /// @notice Returns the current swapFeeManager of the factory\n  /// @dev Can be changed by the current swap fee manager via setSwapFeeManager\n  /// @return The address of the factory swapFeeManager\n  function swapFeeManager() external view returns (address);\n\n  /// @notice Returns the current unstakedFeeManager of the factory\n  /// @dev Can be changed by the current unstaked fee manager via setUnstakedFeeManager\n  /// @return The address of the factory unstakedFeeManager\n  function unstakedFeeManager() external view returns (address);\n\n  /// @notice Returns the factory-wide default swap hook used when a pool has no hook set\n  /// @dev Can be changed by the current swap fee manager via setDefaultSwapHook\n  /// @return The address of the factory defaultSwapHook\n  function defaultSwapHook() external view returns (address);\n\n  /// @notice Returns the swap hook override set for a specific pool.\n  /// @param pool The pool to query\n  /// @return The pool swap hook override, or address(0) if unset\n  function poolSwapHook(address pool) external view returns (address);\n\n  /// @notice Resolves the swap hook address for a pool. If the pool doesn't have a swap hook specified,\n  ///         then the default hook address is returned.\n  /// @param pool The pool to resolve the swap hook for\n  /// @return The swap hook address for the pool\n  function getPoolSwapHook(address pool) external view returns (address);\n\n  /// @notice Returns the current unstakedFeeModule of the factory\n  /// @dev Can be changed by the current unstaked fee manager via setUnstakedFeeModule\n  /// @return The address of the factory unstakedFeeModule\n  function unstakedFeeModule() external view returns (address);\n\n  /// @notice Returns the current defaultUnstakedFee of the factory\n  /// @dev Can be changed by the current unstaked fee manager via setDefaultUnstakedFee\n  /// @return The default Unstaked Fee of the factory\n  function defaultUnstakedFee() external view returns (uint24);\n\n  /// @notice The current manager of {discountRegistry} of the factory\n  /// @return The address of the discount registry manager\n  function discountRegistryManager() external view returns (address);\n\n  /// @notice Discount registry for swap fee discounts\n  /// @return The address of the discount registry\n  function discountRegistry() external view returns (address);\n\n  /// @notice The clPoolTape module new pools are registered with. The zero address means registration is disabled\n  /// @return The address of the clPoolTape module\n  function clPoolTape() external view returns (address);\n\n  /// @notice The current clPoolTapeManager of the factory\n  /// @dev Can be changed by the current clPoolTapeManager via setClPoolTapeManager\n  /// @return The address of the clPoolTapeManager\n  function clPoolTapeManager() external view returns (address);\n\n  /// @notice Returns a default fee for a tick spacing.\n  /// @dev Use getFee for the most up to date fee for a given pool.\n  /// A tick spacing can never be removed, so this value should be hard coded or cached in the calling context\n  /// @param tickSpacing The enabled tick spacing. Returns 0 if not enabled\n  /// @return fee The default fee for the given tick spacing\n  function tickSpacingToFee(int24 tickSpacing) external view returns (uint24 fee);\n\n  /// @notice Returns a list of enabled tick spacings. Used to iterate through pools created by the factory\n  /// @dev Tick spacings cannot be removed. Tick spacings are not ordered\n  /// @return List of enabled tick spacings\n  function tickSpacings() external view returns (int24[] memory);\n\n  /// @notice Returns the pool address for a given pair of tokens and a tick spacing, or address 0 if it does not exist\n  /// @dev tokenA and tokenB may be passed in either token0/token1 or token1/token0 order\n  /// @param tokenA The contract address of either token0 or token1\n  /// @param tokenB The contract address of the other token\n  /// @param tickSpacing The tick spacing of the pool in uint24\n  /// @return pool The pool address\n  function getPool(address tokenA, address tokenB, uint24 tickSpacing) external view returns (address pool);\n\n  /// @notice Returns the pool address for a given pair of tokens and a tick spacing, or address 0 if it does not exist\n  /// @dev tokenA and tokenB may be passed in either token0/token1 or token1/token0 order\n  /// @param tokenA The contract address of either token0 or token1\n  /// @param tokenB The contract address of the other token\n  /// @param tickSpacing The tick spacing of the pool\n  /// @return pool The pool address\n  function getPool(address tokenA, address tokenB, int24 tickSpacing) external view returns (address pool);\n\n  /// @notice Return address of pool created by this factory given its `index`\n  /// @param index Index of the pool\n  /// @return The pool address in the given index\n  function allPools(uint256 index) external view returns (address);\n\n  /// @notice Returns the number of pools created from this factory\n  /// @return Number of pools created from this factory\n  function allPoolsLength() external view returns (uint256);\n\n  /// @notice Used in VotingEscrow to determine if a contract is a valid pool of the factory\n  /// @param pool The address of the pool to check\n  /// @return Whether the pool is a valid pool of the factory\n  function isPool(address pool) external view returns (bool);\n\n  /// @notice Get unstaked fee for a given pool. Accounts for default and dynamic fees\n  /// @dev Unstaked fee is denominated in pips. i.e. 1e-6\n  /// @param pool The pool to get the unstaked fee for\n  /// @return The unstaked fee for the given pool\n  function getUnstakedFee(address pool) external view returns (uint24);\n\n  /// @notice Creates a pool for the given two tokens and tick spacing\n  /// @param tokenA One of the two tokens in the desired pool\n  /// @param tokenB The other of the two tokens in the desired pool\n  /// @param tickSpacing The desired tick spacing for the pool\n  /// @dev Use encodeSqrtPrice(1,1) as price\n  /// @dev Used to programmatically create pools in case one does not exist\n  /// @dev Invalid tickSpacing will revert the transaction\n  /// @return pool The address of the newly created pool\n  function createPool(address tokenA, address tokenB, uint24 tickSpacing) external returns (address pool);\n\n  /// @notice Creates a pool for the given two tokens and tick spacing\n  /// @param tokenA One of the two tokens in the desired pool\n  /// @param tokenB The other of the two tokens in the desired pool\n  /// @param tickSpacing The desired tick spacing for the pool\n  /// @param sqrtPriceX96 The initial sqrt price of the pool, as a Q64.96\n  /// @dev tokenA and tokenB may be passed in either order: token0/token1 or token1/token0. The call will\n  /// revert if the pool already exists, the tick spacing is invalid, or the token arguments are invalid\n  /// @return pool The address of the newly created pool\n  function createPool(\n    address tokenA,\n    address tokenB,\n    int24 tickSpacing,\n    uint160 sqrtPriceX96\n  ) external returns (address pool);\n\n  /// @notice Updates the owner of the factory\n  /// @dev Must be called by the current owner\n  /// @param _owner The new owner of the factory\n  function setOwner(address _owner) external;\n\n  /// @notice Sets the voter of the factory\n  /// @dev Must be called by the current owner. Callable only while the voter is unset,\n  ///      so once set the voter is immutable. Used when the factory is deployed before the voter\n  /// @param _voter The voter of the factory\n  function setVoter(address _voter) external;\n\n  /// @notice Updates the swapFeeManager of the factory\n  /// @dev Must be called by the current swap fee manager\n  /// @param _swapFeeManager The new swapFeeManager of the factory\n  function setSwapFeeManager(address _swapFeeManager) external;\n\n  /// @notice Updates the unstakedFeeManager of the factory\n  /// @dev Must be called by the current unstaked fee manager\n  /// @param _unstakedFeeManager The new unstakedFeeManager of the factory\n  function setUnstakedFeeManager(address _unstakedFeeManager) external;\n\n  /// @notice Updates the discountRegistryManager of the factory\n  /// @dev Must be called by the current discount registry manager\n  /// @param _discountRegistryManager The new discountRegistryManager of the factory\n  function setDiscountRegistryManager(address _discountRegistryManager) external;\n\n  /// @notice Updates the unstakedFeeModule of the factory\n  /// @dev Must be called by the current unstaked fee manager\n  /// @param _unstakedFeeModule The new unstakedFeeModule of the factory\n  function setUnstakedFeeModule(address _unstakedFeeModule) external;\n\n  /// @notice Updates the defaultUnstakedFee of the factory\n  /// @dev Must be called by the current unstaked fee manager\n  /// @param _defaultUnstakedFee The new defaultUnstakedFee of the factory\n  function setDefaultUnstakedFee(uint24 _defaultUnstakedFee) external;\n\n  /// @notice Updates the factory-wide default swap hook\n  /// @dev Must be called by the current swap fee manager\n  /// @param _swapHook The new default swap hook of the factory\n  function setDefaultSwapHook(address _swapHook) external;\n\n  /// @notice Sets the swap hook override for a batch of pools\n  /// @dev Must be called by the current swap fee manager. Reverts with 'LMM' if the array lengths differ.\n  ///      For each pool, passing address(0) clears its override back to the default.\n  /// @param _pools The pools to set swap hooks for\n  /// @param _swapHooks The new swapHook for each corresponding pool\n  function setPoolSwapHook(address[] calldata _pools, address[] calldata _swapHooks) external;\n\n  /// @notice Updates the discountRegistry of the factory\n  /// @dev Must be called by the current discount registry manager\n  /// @param _discountRegistry The new discountRegistry of the factory\n  function setDiscountRegistry(address _discountRegistry) external;\n\n  /// @notice Updates the clPoolTapeManager of the factory\n  /// @dev Must be called by the current clPoolTapeManager\n  /// @param _clPoolTapeManager The new clPoolTapeManager of the factory\n  function setClPoolTapeManager(address _clPoolTapeManager) external;\n\n  /// @notice Sets or clears the clPoolTape module new pools are registered with\n  /// @dev Must be called by the clPoolTapeManager. The zero address disables tape registration\n  /// @param _clPoolTape The new clPoolTape module address\n  function setClPoolTape(address _clPoolTape) external;\n\n  /// @notice Enables a certain tickSpacing\n  /// @dev Tick spacings may never be removed once enabled\n  /// @param tickSpacing The spacing between ticks to be enforced in the pool\n  /// @param fee The default fee associated with a given tick spacing\n  function enableTickSpacing(int24 tickSpacing, uint24 fee) external;\n}\n"},"contracts/core/interfaces/ICLPool.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\npragma abicoder v2;\n\nimport './pool/ICLPoolActions.sol';\nimport './pool/ICLPoolConstants.sol';\nimport './pool/ICLPoolDerivedState.sol';\nimport './pool/ICLPoolEvents.sol';\nimport './pool/ICLPoolOwnerActions.sol';\nimport './pool/ICLPoolState.sol';\n\n/// @title The interface for a CL Pool\n/// @notice A CL pool facilitates swapping and automated market making between any two assets that strictly conform\n/// to the ERC20 specification\n/// @dev The pool interface is broken up into many smaller pieces\ninterface ICLPool is\n  ICLPoolConstants,\n  ICLPoolState,\n  ICLPoolDerivedState,\n  ICLPoolActions,\n  ICLPoolEvents,\n  ICLPoolOwnerActions\n{}\n"},"contracts/core/interfaces/IERC20Minimal.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Minimal ERC20 interface for CL\n/// @notice Contains a subset of the full ERC20 interface that is used in CL\ninterface IERC20Minimal {\n  /// @notice Returns the balance of a token\n  /// @param account The account for which to look up the number of tokens it has, i.e. its balance\n  /// @return The number of tokens held by the account\n  function balanceOf(address account) external view returns (uint256);\n\n  /// @notice Transfers the amount of token from the `msg.sender` to the recipient\n  /// @param recipient The account that will receive the amount transferred\n  /// @param amount The number of tokens to send from the sender to the recipient\n  /// @return Returns true for a successful transfer, false for an unsuccessful transfer\n  function transfer(address recipient, uint256 amount) external returns (bool);\n\n  /// @notice Returns the current allowance given to a spender by an owner\n  /// @param owner The account of the token owner\n  /// @param spender The account of the token spender\n  /// @return The current allowance granted by `owner` to `spender`\n  function allowance(address owner, address spender) external view returns (uint256);\n\n  /// @notice Sets the allowance of a spender from the `msg.sender` to the value `amount`\n  /// @param spender The account which will be allowed to spend a given amount of the owners tokens\n  /// @param amount The amount of tokens allowed to be used by `spender`\n  /// @return Returns true for a successful approval, false for unsuccessful\n  function approve(address spender, uint256 amount) external returns (bool);\n\n  /// @notice Transfers `amount` tokens from `sender` to `recipient` up to the allowance given to the `msg.sender`\n  /// @param sender The account from which the transfer will be initiated\n  /// @param recipient The recipient of the transfer\n  /// @param amount The amount of the transfer\n  /// @return Returns true for a successful transfer, false for unsuccessful\n  function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\n\n  /// @notice Event emitted when tokens are transferred from one address to another, either via `#transfer` or `#transferFrom`.\n  /// @param from The account from which the tokens were sent, i.e. the balance decreased\n  /// @param to The account to which the tokens were sent, i.e. the balance increased\n  /// @param value The amount of tokens that were transferred\n  event Transfer(address indexed from, address indexed to, uint256 value);\n\n  /// @notice Event emitted when the approval amount for the spender of a given owner's tokens changes.\n  /// @param owner The account that approved spending of its tokens\n  /// @param spender The account for which the spending allowance was modified\n  /// @param value The new allowance from the owner to the spender\n  event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n"},"contracts/core/interfaces/IFactoryRegistry.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.7.6;\n\n/**\n * @title IFactoryRegistry\n * @notice Surface of the metadex `FactoryRegistry` the CL stack calls.\n * @dev A pool is a \"target\" and a pool factory a \"target factory\". The periphery keeps its own read-only mirror in\n *      `contracts/periphery/interfaces/IV3FactoryRegistry.sol` for the quoters.\n */\ninterface IFactoryRegistry {\n  /**\n   * @notice Registers a gauge factory and the target factory it serves as a pair, writing their permanent link.\n   * @param gaugeFactory The gauge factory to register.\n   * @param targetFactory The target (pool) factory the gauge factory serves.\n   */\n  function registerFactories(address gaugeFactory, address targetFactory) external;\n\n  /**\n   * @notice Records a freshly deployed target. Called by the target factory inside its own creation function.\n   * @param target The deployed target (pool).\n   */\n  function registerTarget(address target) external;\n\n  /**\n   * @notice True when a target (pool) factory is in the approval set.\n   * @param targetFactory The target factory to check.\n   * @return Whether the factory is approved.\n   */\n  function isTargetFactoryApproved(address targetFactory) external view returns (bool);\n\n  /**\n   * @notice The gauge factory serving a target factory.\n   * @param targetFactory The target factory to resolve.\n   * @return The linked gauge factory, zero for an unlinked factory.\n   */\n  function targetFactoryToGaugeFactory(address targetFactory) external view returns (address);\n\n  /**\n   * @notice The gauge over a target (pool).\n   * @param target The target to resolve.\n   * @return The gauge for `target`, zero when none is recorded.\n   */\n  function targetToGauge(address target) external view returns (address);\n\n  /**\n   * @notice Effective emission cap for a gauge, resolved through the factory that deployed it.\n   * @dev Returns zero when the gauge is unknown or the factory call reverts.\n   * @param gauge The gauge to resolve.\n   * @return The effective cap in tokens per second.\n   */\n  function emissionCap(address gauge) external view returns (uint128);\n}\n"},"contracts/core/interfaces/callback/ICLFlashCallback.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Callback for ICLPoolActions#flash\n/// @notice Any contract that calls ICLPoolActions#flash must implement this interface\ninterface ICLFlashCallback {\n  /// @notice Called to `msg.sender` after transferring to the recipient from ICLPool#flash.\n  /// @dev In the implementation you must repay the pool the tokens sent by flash plus the computed fee amounts.\n  /// The caller of this method must be checked to be a CLPool deployed by the canonical CLFactory.\n  /// @param fee0 The fee amount in token0 due to the pool by the end of the flash\n  /// @param fee1 The fee amount in token1 due to the pool by the end of the flash\n  /// @param data Any data passed through by the caller via the ICLPoolActions#flash call\n  function uniswapV3FlashCallback(uint256 fee0, uint256 fee1, bytes calldata data) external;\n}\n"},"contracts/core/interfaces/callback/ICLMintCallback.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Callback for ICLPoolActions#mint\n/// @notice Any contract that calls ICLPoolActions#mint must implement this interface\ninterface ICLMintCallback {\n  /// @notice Called to `msg.sender` after minting liquidity to a position from ICLPool#mint.\n  /// @dev In the implementation you must pay the pool tokens owed for the minted liquidity.\n  /// The caller of this method must be checked to be a CLPool deployed by the canonical CLFactory.\n  /// @param amount0Owed The amount of token0 due to the pool for the minted liquidity\n  /// @param amount1Owed The amount of token1 due to the pool for the minted liquidity\n  /// @param data Any data passed through by the caller via the ICLPoolActions#mint call\n  function uniswapV3MintCallback(uint256 amount0Owed, uint256 amount1Owed, bytes calldata data) external;\n}\n"},"contracts/core/interfaces/callback/ICLSwapCallback.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Callback for ICLPoolActions#swap\n/// @notice Any contract that calls ICLPoolActions#swap must implement this interface\ninterface ICLSwapCallback {\n  /// @notice Called to `msg.sender` after executing a swap via ICLPool#swap.\n  /// @dev In the implementation you must pay the pool tokens owed for the swap.\n  /// The caller of this method must be checked to be a CLPool deployed by the canonical CLFactory.\n  /// amount0Delta and amount1Delta can both be 0 if no tokens were swapped.\n  /// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by\n  /// the end of the swap. If positive, the callback must send that amount of token0 to the pool.\n  /// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by\n  /// the end of the swap. If positive, the callback must send that amount of token1 to the pool.\n  /// @param data Any data passed through by the caller via the ICLPoolActions#swap call\n  function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes calldata data) external;\n}\n"},"contracts/core/interfaces/hook/ISwapHook.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.7.6;\npragma abicoder v2;\n\n/// @notice Interface for CLPool swap hooks that can override pre-swap fees and/or apply post-swap fees.\ninterface ISwapHook {\n  /*////////////////////////////////////////////////////////////\n                              STRUCTS\n  ////////////////////////////////////////////////////////////*/\n\n  /// @notice Swap context passed to hook entry points.\n  /// @param caller `msg.sender` address that initiated the swap.\n  /// @param recipient Recipient of the swap output.\n  /// @param zeroForOne True for token0 -> token1 swaps, false otherwise.\n  /// @param amountSpecified The exact amount specified by the swapper (either input or output).\n  /// @param sqrtPriceLimitX96 Swap price limit.\n  /// @param data Optional calldata supplied to the swap call.\n  /// @param sqrtPriceX96 Square root price of the pool:\n  ///        In {beforeSwap} represents a PRE-SWAP sqrt price.\n  ///        In {afterSwap} represents a POST-SWAP sqrt price.\n  /// @param tick Tick of the pool:\n  ///        In {beforeSwap} represents a PRE-SWAP tick.\n  ///        In {afterSwap} represents a POST-SWAP tick.\n  struct SwapParams {\n    address caller;\n    address recipient;\n    bool zeroForOne;\n    int256 amountSpecified;\n    uint160 sqrtPriceLimitX96;\n    bytes data;\n    uint160 sqrtPriceX96;\n    int24 tick;\n  }\n\n  /// @notice Post-swap state passed to the {afterSwap} entry-point.\n  /// @param amountSpecifiedRemaining Remaining specified amount after the swap loop conclusion.\n  /// @param amountCalculated Amount computed by the swap loop before any post-swap fee adjustment.\n  /// @param fee The fee applied during the swap loop.\n  /// @param hasUpdatedFees Whether swap fees were updated during execution.\n  /// @param feeGrowthGlobalX128 The global fee growth of the input token after the swap loop.\n  /// @param gaugeFee Fee amount paid to staked liquidity.\n  /// @param liquidity In-range liquidity at the end of the swap loop.\n  /// @param stakedLiquidity In-range staked liquidity at the end of the swap loop.\n  /// @param tickCumulative The post-swap value of the tick accumulator, computed only if an initialized tick is crossed.\n  /// @param secondsPerLiquidityCumulativeX128 The post-swap value of the seconds per liquidity\n  ///        accumulator, computed only if an initialized tick is crossed.\n  /// @param computedLatestObservation Whether the latest observation was computed during the swap.\n  struct AfterSwapParams {\n    int256 amountSpecifiedRemaining;\n    int256 amountCalculated;\n    uint24 fee;\n    bool hasUpdatedFees;\n    uint256 feeGrowthGlobalX128;\n    uint128 gaugeFee;\n    uint128 liquidity;\n    uint128 stakedLiquidity;\n    int56 tickCumulative;\n    uint160 secondsPerLiquidityCumulativeX128;\n    bool computedLatestObservation;\n  }\n\n  /// @notice Call context of `flash` function.\n  /// @param caller `msg.sender` address that initiated flash execution.\n  /// @param recipient Recipient of the flash loaned tokens.\n  /// @param amount0 Amount of token0 to flash loan.\n  /// @param amount1 Amount of token1 to flash loan.\n  /// @param data Optional calldata supplied to the flash call.\n  struct FlashParams {\n    address caller;\n    address recipient;\n    uint256 amount0;\n    uint256 amount1;\n    bytes data;\n  }\n\n  /*////////////////////////////////////////////////////////////\n                              VIEW FUNCTIONS\n  ////////////////////////////////////////////////////////////*/\n\n  /// @notice Queries the swap fee that the hook would charge in the swap loop.\n  /// @param _pool Address of the pool making the query.\n  /// @param _swapParams Swap context and pre-swap pool state.\n  /// @return _fee The fee that would be applied in the swap loop, in pips.\n  function getBeforeSwapFee(address _pool, SwapParams memory _swapParams) external view returns (uint24 _fee);\n\n  /// @notice Queries the swap fee that the hook would charge after the swap loop.\n  /// @param _pool Address of the pool making the query.\n  /// @param _swapParams Swap context and post-swap pool state.\n  /// @param _afterSwapParams Post-swap execution state and oracle/liquidity context.\n  /// @return _fee The fee that would be applied after the swap loop, in pips.\n  function getAfterSwapFee(\n    address _pool,\n    SwapParams memory _swapParams,\n    AfterSwapParams memory _afterSwapParams\n  ) external view returns (uint24 _fee);\n\n  /// @notice Queries the flash loan fee that the hook would charge for a given flash context.\n  /// @param _pool Address of the pool making the query.\n  /// @param _flashParams Arguments passed to the flash function.\n  /// @return _fee The fee that would be applied to flash loaned amounts, in pips.\n  function getFlashFee(address _pool, FlashParams memory _flashParams) external view returns (uint24 _fee);\n\n  /*////////////////////////////////////////////////////////////\n                              WRITE FUNCTIONS\n  ////////////////////////////////////////////////////////////*/\n\n  /// @notice Returns the fee to apply inside the swap loop.\n  /// @param _swapParams Swap context and PRE-SWAP pool state.\n  /// @return _fee The fee to apply throughout the swap loop.\n  function beforeSwap(SwapParams memory _swapParams) external returns (uint24 _fee);\n\n  /// @notice Returns the pips fee to apply after the swap loop conclusion.\n  /// @dev The fee is redirected exclusively to the Gauge.\n  /// @param _swapParams Swap context and POST-SWAP pool state.\n  /// @param _afterSwapParams POST-SWAP execution state and oracle/liquidity context.\n  /// @return _fee A post-swap fee to apply to the non-exact input/output part\n  ///         of the swap that's credited to the gauge.\n  function afterSwap(\n    SwapParams memory _swapParams,\n    AfterSwapParams memory _afterSwapParams\n  ) external returns (uint24 _fee);\n\n  /// @notice Returns the fee to apply to `amount0/1` in `flash` function.\n  /// @param _flashParams Arguments passed to the `flash` function.\n  /// @return _fee Fee to apply to flash loaned amounts.\n  function beforeFlash(FlashParams memory _flashParams) external returns (uint24 _fee);\n}\n"},"contracts/core/interfaces/pool/ICLPoolActions.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Permissionless pool actions\n/// @notice Contains pool methods that can be called by anyone\ninterface ICLPoolActions {\n  /// @notice Initialize function used in proxy deployment\n  /// @dev Can be called once only\n  /// Price is represented as a sqrt(amountToken1/amountToken0) Q64.96 value\n  /// @dev not locked because it initializes unlocked\n  /// @param _factory The CL factory contract address\n  /// @param _token0 The first token of the pool by address sort order\n  /// @param _token1 The second token of the pool by address sort order\n  /// @param _tickSpacing The pool tick spacing\n  /// @param _factoryRegistry The address of the factory registry managing the pool factory\n  /// @param _sqrtPriceX96 The initial sqrt price of the pool, as a Q64.96\n  function initialize(\n    address _factory,\n    address _token0,\n    address _token1,\n    int24 _tickSpacing,\n    address _factoryRegistry,\n    uint160 _sqrtPriceX96\n  ) external;\n\n  /// @notice Initialize gauge and nft manager\n  /// @dev Callable only once, by the gauge factory\n  /// @param _gauge The gauge corresponding to this pool\n  /// @param _nft The position manager used for position management\n  function setGaugeAndPositionManager(address _gauge, address _nft) external;\n\n  /// @notice Adds liquidity for the given recipient/tickLower/tickUpper position\n  /// @dev The caller of this method receives a callback in the form of ICLMintCallback#uniswapV3MintCallback\n  /// in which they must pay any token0 or token1 owed for the liquidity. The amount of token0/token1 due depends\n  /// on tickLower, tickUpper, the amount of liquidity, and the current price.\n  /// @param recipient The address for which the liquidity will be created\n  /// @param tickLower The lower tick of the position in which to add liquidity\n  /// @param tickUpper The upper tick of the position in which to add liquidity\n  /// @param amount The amount of liquidity to mint\n  /// @param data Any data that should be passed through to the callback\n  /// @return amount0 The amount of token0 that was paid to mint the given amount of liquidity. Matches the value in the callback\n  /// @return amount1 The amount of token1 that was paid to mint the given amount of liquidity. Matches the value in the callback\n  function mint(\n    address recipient,\n    int24 tickLower,\n    int24 tickUpper,\n    uint128 amount,\n    bytes calldata data\n  ) external returns (uint256 amount0, uint256 amount1);\n\n  /// @notice Collects tokens owed to a position\n  /// @dev Does not recompute fees earned, which must be done either via mint or burn of any amount of liquidity.\n  /// Collect must be called by the position owner. To withdraw only token0 or only token1, amount0Requested or\n  /// amount1Requested may be set to zero. To withdraw all tokens owed, caller may pass any value greater than the\n  /// actual tokens owed, e.g. type(uint128).max. Tokens owed may be from accumulated swap fees or burned liquidity.\n  /// @param recipient The address which should receive the fees collected\n  /// @param tickLower The lower tick of the position for which to collect fees\n  /// @param tickUpper The upper tick of the position for which to collect fees\n  /// @param amount0Requested How much token0 should be withdrawn from the fees owed\n  /// @param amount1Requested How much token1 should be withdrawn from the fees owed\n  /// @return amount0 The amount of fees collected in token0\n  /// @return amount1 The amount of fees collected in token1\n  function collect(\n    address recipient,\n    int24 tickLower,\n    int24 tickUpper,\n    uint128 amount0Requested,\n    uint128 amount1Requested\n  ) external returns (uint128 amount0, uint128 amount1);\n\n  /// @notice Collects tokens owed to a position\n  /// @dev Does not recompute fees earned, which must be done either via mint or burn of any amount of liquidity.\n  /// Collect must be called by the position owner. To withdraw only token0 or only token1, amount0Requested or\n  /// amount1Requested may be set to zero. To withdraw all tokens owed, caller may pass any value greater than the\n  /// actual tokens owed, e.g. type(uint128).max. Tokens owed may be from accumulated swap fees or burned liquidity.\n  /// @param recipient The address which should receive the fees collected\n  /// @param tickLower The lower tick of the position for which to collect fees\n  /// @param tickUpper The upper tick of the position for which to collect fees\n  /// @param amount0Requested How much token0 should be withdrawn from the fees owed\n  /// @param amount1Requested How much token1 should be withdrawn from the fees owed\n  /// @param owner Owner of the position in the pool (nft manager or gauge)\n  /// @return amount0 The amount of fees collected in token0\n  /// @return amount1 The amount of fees collected in token1\n  function collect(\n    address recipient,\n    int24 tickLower,\n    int24 tickUpper,\n    uint128 amount0Requested,\n    uint128 amount1Requested,\n    address owner\n  ) external returns (uint128 amount0, uint128 amount1);\n\n  /// @notice Burn liquidity from the sender and account tokens owed for the liquidity to the position\n  /// @dev Can be used to trigger a recalculation of fees owed to a position by calling with an amount of 0\n  /// @dev Fees must be collected separately via a call to #collect\n  /// @param tickLower The lower tick of the position for which to burn liquidity\n  /// @param tickUpper The upper tick of the position for which to burn liquidity\n  /// @param amount How much liquidity to burn\n  /// @return amount0 The amount of token0 sent to the recipient\n  /// @return amount1 The amount of token1 sent to the recipient\n  function burn(int24 tickLower, int24 tickUpper, uint128 amount) external returns (uint256 amount0, uint256 amount1);\n\n  /// @notice Burn liquidity from the supplied owner and account tokens owed for the liquidity to the position\n  /// @dev Can be used to trigger a recalculation of fees owed to a position by calling with an amount of 0\n  /// @dev Fees must be collected separately via a call to #collect\n  /// @param tickLower The lower tick of the position for which to burn liquidity\n  /// @param tickUpper The upper tick of the position for which to burn liquidity\n  /// @param amount How much liquidity to burn\n  /// @param owner Owner of the position in the pool (nft manager or gauge)\n  /// @return amount0 The amount of token0 sent to the recipient\n  /// @return amount1 The amount of token1 sent to the recipient\n  function burn(\n    int24 tickLower,\n    int24 tickUpper,\n    uint128 amount,\n    address owner\n  ) external returns (uint256 amount0, uint256 amount1);\n\n  /// @notice Convert existing liquidity into staked liquidity\n  /// @notice Only callable by the gauge associated with this pool\n  /// @param stakedLiquidityDelta The amount by which to increase or decrease the staked liquidity\n  /// @param tickLower The lower tick of the position for which to stake liquidity\n  /// @param tickUpper The upper tick of the position for which to stake liquidity\n  function stake(int128 stakedLiquidityDelta, int24 tickLower, int24 tickUpper) external;\n\n  /// @notice Swap token0 for token1, or token1 for token0\n  /// @dev The caller of this method receives a callback in the form of ICLSwapCallback#uniswapV3SwapCallback\n  /// @param recipient The address to receive the output of the swap\n  /// @param zeroForOne The direction of the swap, true for token0 to token1, false for token1 to token0\n  /// @param amountSpecified The amount of the swap, which implicitly configures the swap as exact input (positive), or exact output (negative)\n  /// @param sqrtPriceLimitX96 The Q64.96 sqrt price limit. If zero for one, the price cannot be less than this\n  /// value after the swap. If one for zero, the price cannot be greater than this value after the swap\n  /// @param data Any data to be passed through to the callback\n  /// @return amount0 The delta of the balance of token0 of the pool, exact when negative, minimum when positive\n  /// @return amount1 The delta of the balance of token1 of the pool, exact when negative, minimum when positive\n  function swap(\n    address recipient,\n    bool zeroForOne,\n    int256 amountSpecified,\n    uint160 sqrtPriceLimitX96,\n    bytes calldata data\n  ) external returns (int256 amount0, int256 amount1);\n\n  /// @notice Receive token0 and/or token1 and pay it back, plus a fee, in the callback\n  /// @dev The caller of this method receives a callback in the form of ICLFlashCallback#uniswapV3FlashCallback\n  /// @dev Can be used to donate underlying tokens pro-rata to currently in-range liquidity providers by calling\n  /// with 0 amount{0,1} and sending the donation amount(s) from the callback\n  /// @param recipient The address which will receive the token0 and token1 amounts\n  /// @param amount0 The amount of token0 to send\n  /// @param amount1 The amount of token1 to send\n  /// @param data Any data to be passed through to the callback\n  function flash(address recipient, uint256 amount0, uint256 amount1, bytes calldata data) external;\n\n  /// @notice Increase the maximum number of price and liquidity observations that this pool will store\n  /// @dev This method is no-op if the pool already has an observationCardinalityNext greater than or equal to\n  /// the input observationCardinalityNext.\n  /// @param observationCardinalityNext The desired minimum number of observations for the pool to store\n  function increaseObservationCardinalityNext(uint16 observationCardinalityNext) external;\n\n  /// @notice Settles the pool's reward growth to the current block timestamp and returns the accrued rollover\n  /// @dev Only callable by the gauge. Pulls the emissions accrued since the last settlement through the gauge.\n  /// @return _rollover the emissions accumulated while no staked liquidity was in range. Reset to 0 after this call.\n  function settleToBlock() external returns (uint256 _rollover);\n}\n"},"contracts/core/interfaces/pool/ICLPoolConstants.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Pool state that never changes\n/// @notice These parameters are not defined as immutable (due to proxy pattern) but are effectively immutable.\n/// @notice i.e., the methods will always return the same values\ninterface ICLPoolConstants {\n  /// @notice The contract that deployed the pool, which must adhere to the ICLFactory interface\n  /// @return The contract address\n  function factory() external view returns (address);\n\n  /// @notice The first of the two tokens of the pool, sorted by address\n  /// @return The token contract address\n  function token0() external view returns (address);\n\n  /// @notice The second of the two tokens of the pool, sorted by address\n  /// @return The token contract address\n  function token1() external view returns (address);\n\n  /// @notice The gauge corresponding to this pool\n  /// @return The gauge contract address\n  function gauge() external view returns (address);\n\n  /// @notice The nft manager\n  /// @return The nft manager contract address\n  function nft() external view returns (address);\n\n  /// @notice The factory registry that manages pool <> gauge <> reward factory relationships\n  /// @return The factory registry contract address\n  function factoryRegistry() external view returns (address);\n\n  /// @notice The pool tick spacing\n  /// @dev Ticks can only be used at multiples of this value, minimum of 1 and always positive\n  /// e.g.: a tickSpacing of 3 means ticks can be initialized every 3rd tick, i.e., ..., -6, -3, 0, 3, 6, ...\n  /// This value is an int24 to avoid casting even though it is always positive.\n  /// @return The tick spacing\n  function tickSpacing() external view returns (int24);\n\n  /// @notice The maximum amount of position liquidity that can use any tick in the range\n  /// @dev This parameter is enforced per tick to prevent liquidity from overflowing a uint128 at any point, and\n  /// also prevents out-of-range liquidity from being used to prevent adding in-range liquidity to a pool\n  /// @return The max amount of liquidity per tick\n  function maxLiquidityPerTick() external view returns (uint128);\n\n  /// @notice The ceiling applied to the before/after swap fee.\n  /// @return The swap fee ceiling value in pips.\n  function SWAP_FEE_CEIL() external view returns (uint256);\n\n  /// @notice The denominator used for fees computation.\n  /// @return The denominator value in pips.\n  function DENOMINATOR() external view returns (uint256);\n\n  /// @notice The pool type identifier\n  /// @return The pool type label to be able to identify the type of pool\n  function POOL_TYPE() external view returns (bytes32);\n}\n"},"contracts/core/interfaces/pool/ICLPoolDerivedState.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Pool state that is not stored\n/// @notice Contains view functions to provide information about the pool that is computed rather than stored on the\n/// blockchain. The functions here may have variable gas costs.\ninterface ICLPoolDerivedState {\n  /// @notice Returns the cumulative tick and liquidity as of each timestamp `secondsAgo` from the current block timestamp\n  /// @dev To get a time weighted average tick or liquidity-in-range, you must call this with two values, one representing\n  /// the beginning of the period and another for the end of the period. E.g., to get the last hour time-weighted average tick,\n  /// you must call it with secondsAgos = [3600, 0].\n  /// @dev The time weighted average tick represents the geometric time weighted average price of the pool, in\n  /// log base sqrt(1.0001) of token1 / token0. The TickMath library can be used to go from a tick value to a ratio.\n  /// @param secondsAgos From how long ago each cumulative tick and liquidity value should be returned\n  /// @return tickCumulatives Cumulative tick values as of each `secondsAgos` from the current block timestamp\n  /// @return secondsPerLiquidityCumulativeX128s Cumulative seconds per liquidity-in-range value as of each `secondsAgos` from the current block\n  /// timestamp\n  function observe(uint32[] calldata secondsAgos)\n    external\n    view\n    returns (int56[] memory tickCumulatives, uint160[] memory secondsPerLiquidityCumulativeX128s);\n\n  /// @notice Returns a snapshot of the tick cumulative, seconds per liquidity and seconds inside a tick range\n  /// @dev Snapshots must only be compared to other snapshots, taken over a period for which a position existed.\n  /// I.e., snapshots cannot be compared if a position is not held for the entire period between when the first\n  /// snapshot is taken and the second snapshot is taken.\n  /// @param tickLower The lower tick of the range\n  /// @param tickUpper The upper tick of the range\n  /// @return tickCumulativeInside The snapshot of the tick accumulator for the range\n  /// @return secondsPerLiquidityInsideX128 The snapshot of seconds per liquidity for the range\n  /// @return secondsInside The snapshot of seconds per liquidity for the range\n  function snapshotCumulativesInside(\n    int24 tickLower,\n    int24 tickUpper\n  ) external view returns (int56 tickCumulativeInside, uint160 secondsPerLiquidityInsideX128, uint32 secondsInside);\n\n  /// @notice The seconds per staked liquidity cumulative projected to the current block timestamp\n  /// @return The Q128.128 seconds per staked liquidity cumulative as of the current block\n  function getSecondsPerStakedLiquidityCumulativeX128() external view returns (uint160);\n}\n"},"contracts/core/interfaces/pool/ICLPoolEvents.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Events emitted by a pool\n/// @notice Contains all events emitted by the pool\ninterface ICLPoolEvents {\n  /// @notice Emitted exactly once by a pool when #initialize is first called on the pool\n  /// @dev Mint/Burn/Swap cannot be emitted by the pool before Initialize\n  /// @param sqrtPriceX96 The initial sqrt price of the pool, as a Q64.96\n  /// @param tick The initial tick of the pool, i.e. log base 1.0001 of the starting price of the pool\n  event Initialize(uint160 sqrtPriceX96, int24 tick);\n\n  /// @notice Emitted when liquidity is minted for a given position\n  /// @param sender The address that minted the liquidity\n  /// @param owner The owner of the position and recipient of any minted liquidity\n  /// @param tickLower The lower tick of the position\n  /// @param tickUpper The upper tick of the position\n  /// @param amount The amount of liquidity minted to the position range\n  /// @param amount0 How much token0 was required for the minted liquidity\n  /// @param amount1 How much token1 was required for the minted liquidity\n  event Mint(\n    address sender,\n    address indexed owner,\n    int24 indexed tickLower,\n    int24 indexed tickUpper,\n    uint128 amount,\n    uint256 amount0,\n    uint256 amount1\n  );\n\n  /// @notice Emitted when fees are collected by the owner of a position\n  /// @dev Collect events may be emitted with zero amount0 and amount1 when the caller chooses not to collect fees\n  /// @param owner The owner of the position for which fees are collected\n  /// @param tickLower The lower tick of the position\n  /// @param tickUpper The upper tick of the position\n  /// @param amount0 The amount of token0 fees collected\n  /// @param amount1 The amount of token1 fees collected\n  event Collect(\n    address indexed owner,\n    address recipient,\n    int24 indexed tickLower,\n    int24 indexed tickUpper,\n    uint128 amount0,\n    uint128 amount1\n  );\n\n  /// @notice Emitted when a position's liquidity is removed\n  /// @dev Does not withdraw any fees earned by the liquidity position, which must be withdrawn via #collect\n  /// @param owner The owner of the position for which liquidity is removed\n  /// @param tickLower The lower tick of the position\n  /// @param tickUpper The upper tick of the position\n  /// @param amount The amount of liquidity to remove\n  /// @param amount0 The amount of token0 withdrawn\n  /// @param amount1 The amount of token1 withdrawn\n  event Burn(\n    address indexed owner,\n    int24 indexed tickLower,\n    int24 indexed tickUpper,\n    uint128 amount,\n    uint256 amount0,\n    uint256 amount1\n  );\n\n  /// @notice Emitted by the pool for any swaps between token0 and token1\n  /// @param sender The address that initiated the swap call, and that received the callback\n  /// @param recipient The address that received the output of the swap\n  /// @param amount0 The delta of the token0 balance of the pool\n  /// @param amount1 The delta of the token1 balance of the pool\n  /// @param sqrtPriceX96 The sqrt(price) of the pool after the swap, as a Q64.96\n  /// @param liquidity The liquidity of the pool after the swap\n  /// @param tick The log base 1.0001 of price of the pool after the swap\n  event Swap(\n    address indexed sender,\n    address indexed recipient,\n    int256 amount0,\n    int256 amount1,\n    uint160 sqrtPriceX96,\n    uint128 liquidity,\n    int24 tick\n  );\n\n  /// @notice Emitted by the pool for any flashes of token0/token1\n  /// @param sender The address that initiated the swap call, and that received the callback\n  /// @param recipient The address that received the tokens from flash\n  /// @param amount0 The amount of token0 that was flashed\n  /// @param amount1 The amount of token1 that was flashed\n  /// @param paid0 The amount of token0 paid for the flash, which can exceed the amount0 plus the fee\n  /// @param paid1 The amount of token1 paid for the flash, which can exceed the amount1 plus the fee\n  event Flash(\n    address indexed sender, address indexed recipient, uint256 amount0, uint256 amount1, uint256 paid0, uint256 paid1\n  );\n\n  /// @notice Emitted by the pool for increases to the number of observations that can be stored\n  /// @dev observationCardinalityNext is not the observation cardinality until an observation is written at the index\n  /// just before a mint/swap/burn.\n  /// @param observationCardinalityNextOld The previous value of the next observation cardinality\n  /// @param observationCardinalityNextNew The updated value of the next observation cardinality\n  event IncreaseObservationCardinalityNext(uint16 observationCardinalityNextOld, uint16 observationCardinalityNextNew);\n\n  /// @notice Emitted when the protocol fee is changed by the pool\n  /// @param feeProtocol0Old The previous value of the token0 protocol fee\n  /// @param feeProtocol1Old The previous value of the token1 protocol fee\n  /// @param feeProtocol0New The updated value of the token0 protocol fee\n  /// @param feeProtocol1New The updated value of the token1 protocol fee\n  event SetFeeProtocol(uint8 feeProtocol0Old, uint8 feeProtocol1Old, uint8 feeProtocol0New, uint8 feeProtocol1New);\n\n  /// @notice Emitted when the collected protocol fees are withdrawn by the gauge\n  /// @param recipient The address that receives the collected protocol fees\n  /// @param amount0 The amount of token0 protocol fees that is withdrawn\n  /// @param amount0 The amount of token1 protocol fees that is withdrawn\n  event CollectFees(address indexed recipient, uint128 amount0, uint128 amount1);\n}\n"},"contracts/core/interfaces/pool/ICLPoolOwnerActions.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Permissioned pool actions\n/// @notice Contains pool methods that may only be called by the factory owner\ninterface ICLPoolOwnerActions {\n  /// @notice Collect the gauge fee accrued to the pool\n  /// @param recipient The address that receives the claimed gauge fees\n  /// @return amount0 The gauge fee collected in token0\n  /// @return amount1 The gauge fee collected in token1\n  function collectFees(address recipient) external returns (uint128 amount0, uint128 amount1);\n}\n"},"contracts/core/interfaces/pool/ICLPoolState.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\npragma abicoder v2;\n\nimport {ISwapHook} from '../hook/ISwapHook.sol';\n\n/// @title Pool state that can change\n/// @notice These methods compose the pool's state, and can change with any frequency including multiple times\n/// per transaction\ninterface ICLPoolState {\n  /// @notice The 0th storage slot in the pool stores many values, and is exposed as a single method to save gas\n  /// when accessed externally.\n  /// @return sqrtPriceX96 The current price of the pool as a sqrt(token1/token0) Q64.96 value\n  /// tick The current tick of the pool, i.e. according to the last tick transition that was run.\n  /// This value may not always be equal to SqrtTickMath.getTickAtSqrtRatio(sqrtPriceX96) if the price is on a tick\n  /// boundary.\n  /// observationIndex The index of the last oracle observation that was written,\n  /// observationCardinality The current maximum number of observations stored in the pool,\n  /// observationCardinalityNext The next maximum number of observations, to be updated when the observation.\n  /// unlocked Whether the pool is currently locked to reentrancy\n  function slot0()\n    external\n    view\n    returns (\n      uint160 sqrtPriceX96,\n      int24 tick,\n      uint16 observationIndex,\n      uint16 observationCardinality,\n      uint16 observationCardinalityNext,\n      bool unlocked\n    );\n\n  /// @notice The pool's pre-swap swap fee in pips, i.e. 1e-6\n  /// @param _swapParams Swap context and pre-swap pool state.\n  /// @return The pre-swap fee.\n  function beforeSwapFee(ISwapHook.SwapParams memory _swapParams) external view returns (uint24);\n\n  /// @notice The pool's post-swap swap fee in pips, i.e. 1e-6\n  /// @param _swapParams Swap context and post-swap pool state.\n  /// @param _afterSwapParams Post-swap execution state and oracle/liquidity context.\n  /// @return The post-swap fee.\n  function afterSwapFee(\n    ISwapHook.SwapParams memory _swapParams,\n    ISwapHook.AfterSwapParams memory _afterSwapParams\n  ) external view returns (uint24);\n\n  /// @notice The pool's flash fee in pips, i.e. 1e-6\n  /// @param _flashParams Arguments passed to the flash function.\n  /// @return The flash fee.\n  function flashFee(ISwapHook.FlashParams memory _flashParams) external view returns (uint24);\n\n  /// @notice The pool's swap fee in pips, i.e. 1e-6\n  /// @return The swap fee.\n  function fee() external view returns (uint24);\n\n  /// @notice The pool's unstaked fee in pips, i.e. 1e-6\n  /// @dev Can be modified in PoolFactory on a pool basis or upgraded to be dynamic.\n  /// @return The unstaked fee\n  function unstakedFee() external view returns (uint24);\n\n  /// @notice The fee growth as a Q128.128 fees of token0 collected per unit of liquidity for the entire life of the pool\n  /// @dev This value can overflow the uint256\n  function feeGrowthGlobal0X128() external view returns (uint256);\n\n  /// @notice The fee growth as a Q128.128 fees of token1 collected per unit of liquidity for the entire life of the pool\n  /// @dev This value can overflow the uint256\n  function feeGrowthGlobal1X128() external view returns (uint256);\n\n  /// @notice The reward growth as a Q128.128 rewards of emission collected per unit of liquidity for the entire life of the pool\n  /// @dev This value can overflow the uint256\n  function rewardGrowthGlobalX128() external view returns (uint256);\n\n  /// @notice The cumulative seconds per unit of in-range staked liquidity as of lastUpdated\n  /// @return The Q128.128 stored seconds per staked liquidity cumulative\n  function secondsPerStakedLiquidityCumulativeX128() external view returns (uint160);\n\n  /// @notice The amounts of token0 and token1 that are owed to the gauge\n  /// @dev Gauge fees will never exceed uint128 max in either token\n  function gaugeFees() external view returns (uint128 token0, uint128 token1);\n\n  /// @notice Last time the pool reward growth was advanced\n  function lastUpdated() external view returns (uint48);\n\n  /// @notice Emissions accrued while no staked liquidity was in range\n  function rollover() external view returns (uint256);\n\n  /// @notice The currently in range liquidity available to the pool\n  /// @dev This value has no relationship to the total liquidity across all ticks\n  /// @dev This value includes staked liquidity\n  function liquidity() external view returns (uint128);\n\n  /// @notice The currently in range staked liquidity available to the pool\n  /// @dev This value has no relationship to the total staked liquidity across all ticks\n  function stakedLiquidity() external view returns (uint128);\n\n  /// @notice Look up information about a specific tick in the pool\n  /// @param tick The tick to look up\n  /// @return liquidityGross the total amount of position liquidity that uses the pool either as tick lower or\n  /// tick upper,\n  /// liquidityNet how much liquidity changes when the pool price crosses the tick,\n  /// stakedLiquidityNet how much staked liquidity changes when the pool price crosses the tick,\n  /// feeGrowthOutside0X128 the fee growth on the other side of the tick from the current tick in token0,\n  /// feeGrowthOutside1X128 the fee growth on the other side of the tick from the current tick in token1,\n  /// rewardGrowthOutsideX128 the reward growth on the other side of the tick from the current tick in emission token\n  /// tickCumulativeOutside the cumulative tick value on the other side of the tick from the current tick\n  /// secondsPerLiquidityOutsideX128 the seconds spent per liquidity on the other side of the tick from the current tick,\n  /// secondsOutside the seconds spent on the other side of the tick from the current tick,\n  /// initialized Set to true if the tick is initialized, i.e. liquidityGross is greater than 0, otherwise equal to false.\n  /// Outside values can only be used if the tick is initialized, i.e. if liquidityGross is greater than 0.\n  /// In addition, these values are only relative and must be used only in comparison to previous snapshots for\n  /// a specific position.\n  function ticks(int24 tick)\n    external\n    view\n    returns (\n      uint128 liquidityGross,\n      int128 liquidityNet,\n      int128 stakedLiquidityNet,\n      uint256 feeGrowthOutside0X128,\n      uint256 feeGrowthOutside1X128,\n      uint256 rewardGrowthOutsideX128,\n      int56 tickCumulativeOutside,\n      uint160 secondsPerLiquidityOutsideX128,\n      uint32 secondsOutside,\n      bool initialized\n    );\n\n  /// @notice Returns 256 packed tick initialized boolean values. See TickBitmap for more information\n  function tickBitmap(int16 wordPosition) external view returns (uint256);\n\n  /// @notice Returns the information about a position by the position's key\n  /// @param key The position's key is a hash of a preimage composed by the owner, tickLower and tickUpper\n  /// @return _liquidity The amount of liquidity in the position,\n  /// Returns feeGrowthInside0LastX128 fee growth of token0 inside the tick range as of the last mint/burn/poke,\n  /// Returns feeGrowthInside1LastX128 fee growth of token1 inside the tick range as of the last mint/burn/poke,\n  /// Returns tokensOwed0 the computed amount of token0 owed to the position as of the last mint/burn/poke,\n  /// Returns tokensOwed1 the computed amount of token1 owed to the position as of the last mint/burn/poke\n  function positions(bytes32 key)\n    external\n    view\n    returns (\n      uint128 _liquidity,\n      uint256 feeGrowthInside0LastX128,\n      uint256 feeGrowthInside1LastX128,\n      uint128 tokensOwed0,\n      uint128 tokensOwed1\n    );\n\n  /// @notice Returns data about a specific observation index\n  /// @param index The element of the observations array to fetch\n  /// @dev You most likely want to use #observe() instead of this method to get an observation as of some amount of time\n  /// ago, rather than at a specific index in the array.\n  /// @return blockTimestamp The timestamp of the observation,\n  /// Returns tickCumulative the tick multiplied by seconds elapsed for the life of the pool as of the observation timestamp,\n  /// Returns secondsPerLiquidityCumulativeX128 the seconds per in range liquidity for the life of the pool as of the observation timestamp,\n  /// Returns initialized whether the observation has been initialized and the values are safe to use\n  function observations(uint256 index)\n    external\n    view\n    returns (uint32 blockTimestamp, int56 tickCumulative, uint160 secondsPerLiquidityCumulativeX128, bool initialized);\n\n  /// @notice Returns data about reward growth within a tick range.\n  /// RewardGrowthGlobalX128 can be supplied as a parameter for claimable reward calculations.\n  /// @dev Used in gauge reward/earned calculations\n  /// @param tickLower The lower tick of the range\n  /// @param tickUpper The upper tick of the range\n  /// @param _rewardGrowthGlobalX128 a calculated rewardGrowthGlobalX128 or 0 (in case of 0 it means we use the rewardGrowthGlobalX128 from state)\n  /// @return rewardGrowthInsideX128 The reward growth in the range\n  function getRewardGrowthInside(\n    int24 tickLower,\n    int24 tickUpper,\n    uint256 _rewardGrowthGlobalX128\n  ) external view returns (uint256 rewardGrowthInsideX128);\n\n  /// @notice Returns data about fee growth within a tick range.\n  /// @param tickLower The lower tick of the range\n  /// @param tickUpper The upper tick of the range\n  /// @return feeGrowthInside0X128 The token0 fee growth in range.\n  /// @return feeGrowthInside1X128 The token1 fee growth in range.\n  function getFeeGrowthInside(\n    int24 tickLower,\n    int24 tickUpper\n  ) external view returns (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128);\n}\n"},"contracts/core/libraries/BitMath.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title BitMath\n/// @dev This library provides functionality for computing bit properties of an unsigned integer\nlibrary BitMath {\n  /// @notice Returns the index of the most significant bit of the number,\n  ///     where the least significant bit is at index 0 and the most significant bit is at index 255\n  /// @dev The function satisfies the property:\n  ///     x >= 2**mostSignificantBit(x) and x < 2**(mostSignificantBit(x)+1)\n  /// @param x the value for which to compute the most significant bit, must be greater than 0\n  /// @return r the index of the most significant bit\n  function mostSignificantBit(uint256 x) internal pure returns (uint8 r) {\n    require(x > 0);\n\n    if (x >= 0x100000000000000000000000000000000) {\n      x >>= 128;\n      r += 128;\n    }\n    if (x >= 0x10000000000000000) {\n      x >>= 64;\n      r += 64;\n    }\n    if (x >= 0x100000000) {\n      x >>= 32;\n      r += 32;\n    }\n    if (x >= 0x10000) {\n      x >>= 16;\n      r += 16;\n    }\n    if (x >= 0x100) {\n      x >>= 8;\n      r += 8;\n    }\n    if (x >= 0x10) {\n      x >>= 4;\n      r += 4;\n    }\n    if (x >= 0x4) {\n      x >>= 2;\n      r += 2;\n    }\n    if (x >= 0x2) r += 1;\n  }\n\n  /// @notice Returns the index of the least significant bit of the number,\n  ///     where the least significant bit is at index 0 and the most significant bit is at index 255\n  /// @dev The function satisfies the property:\n  ///     (x & 2**leastSignificantBit(x)) != 0 and (x & (2**(leastSignificantBit(x)) - 1)) == 0)\n  /// @param x the value for which to compute the least significant bit, must be greater than 0\n  /// @return r the index of the least significant bit\n  function leastSignificantBit(uint256 x) internal pure returns (uint8 r) {\n    require(x > 0);\n\n    r = 255;\n    if (x & type(uint128).max > 0) {\n      r -= 128;\n    } else {\n      x >>= 128;\n    }\n    if (x & type(uint64).max > 0) {\n      r -= 64;\n    } else {\n      x >>= 64;\n    }\n    if (x & type(uint32).max > 0) {\n      r -= 32;\n    } else {\n      x >>= 32;\n    }\n    if (x & type(uint16).max > 0) {\n      r -= 16;\n    } else {\n      x >>= 16;\n    }\n    if (x & type(uint8).max > 0) {\n      r -= 8;\n    } else {\n      x >>= 8;\n    }\n    if (x & 0xf > 0) {\n      r -= 4;\n    } else {\n      x >>= 4;\n    }\n    if (x & 0x3 > 0) {\n      r -= 2;\n    } else {\n      x >>= 2;\n    }\n    if (x & 0x1 > 0) r -= 1;\n  }\n}\n"},"contracts/core/libraries/CLPoolNonSwapPath.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity =0.7.6;\npragma abicoder v2;\n\nimport {FixedPoint128} from './FixedPoint128.sol';\nimport {FullMath} from './FullMath.sol';\nimport {LiquidityMath} from './LiquidityMath.sol';\nimport {LowGasSafeMath} from './LowGasSafeMath.sol';\nimport {Oracle} from './Oracle.sol';\nimport {Position} from './Position.sol';\nimport {SafeCast} from './SafeCast.sol';\nimport {SqrtPriceMath} from './SqrtPriceMath.sol';\nimport {Tick} from './Tick.sol';\nimport {TickBitmap} from './TickBitmap.sol';\nimport {TickMath} from './TickMath.sol';\nimport {TransferHelper} from './TransferHelper.sol';\nimport {SwapHookLib} from './hook/SwapHookLib.sol';\n\nimport {ICLFactory} from '../interfaces/ICLFactory.sol';\nimport {IERC20Minimal} from '../interfaces/IERC20Minimal.sol';\nimport {IFactoryRegistry} from '../interfaces/IFactoryRegistry.sol';\nimport {ICLFlashCallback} from '../interfaces/callback/ICLFlashCallback.sol';\nimport {ICLMintCallback} from '../interfaces/callback/ICLMintCallback.sol';\nimport {ISwapHook} from '../interfaces/hook/ISwapHook.sol';\n\nimport {CLPool} from '../CLPool.sol';\n\n/// @notice Externally linked implementations of non-swap CLPool paths.\n/// @dev CLPool keeps its public entry points and delegates only the function bodies declared here.\nlibrary CLPoolNonSwapPath {\n  using LowGasSafeMath for uint256;\n  using SafeCast for int256;\n  using Tick for mapping(int24 => Tick.Info);\n  using TickBitmap for mapping(int16 => uint256);\n  using Position for mapping(bytes32 => Position.Info);\n  using Position for Position.Info;\n  using Oracle for Oracle.Observation[65_535];\n  using SwapHookLib for address;\n\n  event Initialize(uint160 sqrtPriceX96, int24 tick);\n  event IncreaseObservationCardinalityNext(uint16 observationCardinalityNextOld, uint16 observationCardinalityNextNew);\n  event Flash(\n    address indexed sender, address indexed recipient, uint256 amount0, uint256 amount1, uint256 paid0, uint256 paid1\n  );\n  event Mint(\n    address sender,\n    address indexed owner,\n    int24 indexed tickLower,\n    int24 indexed tickUpper,\n    uint128 amount,\n    uint256 amount0,\n    uint256 amount1\n  );\n  event Burn(\n    address indexed owner,\n    int24 indexed tickLower,\n    int24 indexed tickUpper,\n    uint128 amount,\n    uint256 amount0,\n    uint256 amount1\n  );\n  event Collect(\n    address indexed owner,\n    address recipient,\n    int24 indexed tickLower,\n    int24 indexed tickUpper,\n    uint128 amount0,\n    uint128 amount1\n  );\n  event CollectFees(address indexed recipient, uint128 amount0, uint128 amount1);\n\n  struct FlashInput {\n    address token0;\n    address token1;\n    address factory;\n    int24 tickSpacing;\n    uint128 liquidity;\n    uint128 stakedLiquidity;\n    address recipient;\n    uint256 amount0;\n    uint256 amount1;\n  }\n\n  struct ModifyPositionInput {\n    address owner;\n    int24 tickLower;\n    int24 tickUpper;\n    uint128 liquidity;\n    uint128 maxLiquidityPerTick;\n    uint256 feeGrowthGlobal0X128;\n    uint256 feeGrowthGlobal1X128;\n    uint256 rewardGrowthGlobalX128;\n    address gauge;\n    int24 tickSpacing;\n    uint128 amount;\n  }\n\n  struct PositionObservation {\n    int56 tickCumulative;\n    uint160 secondsPerLiquidityCumulativeX128;\n    int24 currentTick;\n    int128 liquidityDelta;\n  }\n\n  struct StakeInput {\n    address nft;\n    int24 tickLower;\n    int24 tickUpper;\n    int24 tick;\n    int128 stakedLiquidityDelta;\n    uint256 feeGrowthGlobal0X128;\n    uint256 feeGrowthGlobal1X128;\n  }\n\n  struct SnapshotInput {\n    int24 tickLower;\n    int24 tickUpper;\n    int24 tick;\n    uint16 observationIndex;\n    uint16 observationCardinality;\n    uint128 liquidity;\n  }\n\n  function initializeSlot0(\n    CLPool.Slot0 storage slot0,\n    Oracle.Observation[65_535] storage observations,\n    uint160 sqrtPriceX96,\n    int24 tick,\n    int24 tickSpacing\n  ) external returns (uint128 maxLiquidityPerTick) {\n    (uint16 cardinality, uint16 cardinalityNext) = observations.initialize(uint32(block.timestamp));\n\n    slot0.sqrtPriceX96 = sqrtPriceX96;\n    slot0.tick = tick;\n    slot0.observationIndex = 0;\n    slot0.observationCardinality = cardinality;\n    slot0.observationCardinalityNext = cardinalityNext;\n    slot0.unlocked = true;\n\n    emit Initialize(sqrtPriceX96, tick);\n    return Tick.tickSpacingToMaxLiquidityPerTick(tickSpacing);\n  }\n\n  function flashFee(\n    ISwapHook.FlashParams memory flashParams,\n    address factory,\n    int24 tickSpacing\n  ) external view returns (uint24) {\n    address pool = address(this);\n    return ICLFactory(factory).getPoolSwapHook(pool).getFlashFee(pool, flashParams, factory, tickSpacing);\n  }\n\n  function beforeSwapFee(\n    ISwapHook.SwapParams memory swapParams,\n    address factory,\n    int24 tickSpacing\n  ) external view returns (uint24) {\n    address pool = address(this);\n    return ICLFactory(factory).getPoolSwapHook(pool).getBeforeSwapFee(pool, swapParams, factory, tickSpacing);\n  }\n\n  function afterSwapFee(\n    ISwapHook.SwapParams memory swapParams,\n    ISwapHook.AfterSwapParams memory afterSwapParams,\n    address factory\n  ) external view returns (uint24) {\n    address pool = address(this);\n    return ICLFactory(factory).getPoolSwapHook(pool).getAfterSwapFee(pool, swapParams, afterSwapParams);\n  }\n\n  function stakePositions(\n    mapping(bytes32 => Position.Info) storage positions,\n    mapping(int24 => Tick.Info) storage ticks,\n    address nft,\n    int24 tickLower,\n    int24 tickUpper,\n    int24 tick,\n    int128 stakedLiquidityDelta,\n    uint256 feeGrowthGlobal0X128,\n    uint256 feeGrowthGlobal1X128\n  ) external {\n    _stakePositions(\n      positions,\n      ticks,\n      StakeInput({\n        nft: nft,\n        tickLower: tickLower,\n        tickUpper: tickUpper,\n        tick: tick,\n        stakedLiquidityDelta: stakedLiquidityDelta,\n        feeGrowthGlobal0X128: feeGrowthGlobal0X128,\n        feeGrowthGlobal1X128: feeGrowthGlobal1X128\n      })\n    );\n  }\n\n  function _stakePositions(\n    mapping(bytes32 => Position.Info) storage positions,\n    mapping(int24 => Tick.Info) storage ticks,\n    StakeInput memory input\n  ) private {\n    Position.Info storage nftPosition = positions.get(input.nft, input.tickLower, input.tickUpper);\n    Position.Info storage gaugePosition = positions.get(msg.sender, input.tickLower, input.tickUpper);\n    (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128) = ticks.getFeeGrowthInside(\n      input.tickLower, input.tickUpper, input.tick, input.feeGrowthGlobal0X128, input.feeGrowthGlobal1X128\n    );\n    nftPosition.update(-input.stakedLiquidityDelta, feeGrowthInside0X128, feeGrowthInside1X128, false);\n    gaugePosition.update(input.stakedLiquidityDelta, feeGrowthInside0X128, feeGrowthInside1X128, true);\n    if (ticks[input.tickLower].initialized) ticks.updateStake(input.tickLower, input.stakedLiquidityDelta, false);\n    if (ticks[input.tickUpper].initialized) ticks.updateStake(input.tickUpper, input.stakedLiquidityDelta, true);\n  }\n\n  function snapshotCumulativesInside(\n    mapping(int24 => Tick.Info) storage ticks,\n    Oracle.Observation[65_535] storage observations,\n    int24 tickLower,\n    int24 tickUpper,\n    int24 tick,\n    uint16 observationIndex,\n    uint16 observationCardinality,\n    uint128 liquidity\n  ) external view returns (int56 tickCumulativeInside, uint160 secondsPerLiquidityInsideX128, uint32 secondsInside) {\n    return _snapshotCumulativesInside(\n      ticks,\n      observations,\n      SnapshotInput({\n        tickLower: tickLower,\n        tickUpper: tickUpper,\n        tick: tick,\n        observationIndex: observationIndex,\n        observationCardinality: observationCardinality,\n        liquidity: liquidity\n      })\n    );\n  }\n\n  function _snapshotCumulativesInside(\n    mapping(int24 => Tick.Info) storage ticks,\n    Oracle.Observation[65_535] storage observations,\n    SnapshotInput memory input\n  ) private view returns (int56 tickCumulativeInside, uint160 secondsPerLiquidityInsideX128, uint32 secondsInside) {\n    _checkTicks(input.tickLower, input.tickUpper);\n    Tick.Info storage lower = ticks[input.tickLower];\n    Tick.Info storage upper = ticks[input.tickUpper];\n    require(lower.initialized);\n    require(upper.initialized);\n\n    if (input.tick < input.tickLower) {\n      return (\n        lower.tickCumulativeOutside - upper.tickCumulativeOutside,\n        lower.secondsPerLiquidityOutsideX128 - upper.secondsPerLiquidityOutsideX128,\n        lower.secondsOutside - upper.secondsOutside\n      );\n    }\n    if (input.tick >= input.tickUpper) {\n      return (\n        upper.tickCumulativeOutside - lower.tickCumulativeOutside,\n        upper.secondsPerLiquidityOutsideX128 - lower.secondsPerLiquidityOutsideX128,\n        upper.secondsOutside - lower.secondsOutside\n      );\n    }\n    (int56 tickCumulative, uint160 secondsPerLiquidityCumulativeX128) = observations.observeSingle(\n      uint32(block.timestamp), 0, input.tick, input.observationIndex, input.liquidity, input.observationCardinality\n    );\n    return (\n      tickCumulative - lower.tickCumulativeOutside - upper.tickCumulativeOutside,\n      secondsPerLiquidityCumulativeX128 - lower.secondsPerLiquidityOutsideX128 - upper.secondsPerLiquidityOutsideX128,\n      uint32(block.timestamp) - lower.secondsOutside - upper.secondsOutside\n    );\n  }\n\n  function getFeeGrowthInside(\n    mapping(int24 => Tick.Info) storage ticks,\n    int24 tickLower,\n    int24 tickUpper,\n    int24 tickCurrent,\n    uint256 feeGrowthGlobal0X128,\n    uint256 feeGrowthGlobal1X128\n  ) external view returns (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128) {\n    _checkTicks(tickLower, tickUpper);\n    return ticks.getFeeGrowthInside(tickLower, tickUpper, tickCurrent, feeGrowthGlobal0X128, feeGrowthGlobal1X128);\n  }\n\n  function getRewardGrowthInside(\n    mapping(int24 => Tick.Info) storage ticks,\n    int24 tickLower,\n    int24 tickUpper,\n    int24 tickCurrent,\n    uint256 rewardGrowthGlobalX128,\n    uint256 storedRewardGrowthGlobalX128\n  ) external view returns (uint256 rewardGrowthInsideX128) {\n    _checkTicks(tickLower, tickUpper);\n    if (rewardGrowthGlobalX128 == 0) rewardGrowthGlobalX128 = storedRewardGrowthGlobalX128;\n    return ticks.getRewardGrowthInside(tickLower, tickUpper, tickCurrent, rewardGrowthGlobalX128);\n  }\n\n  function increaseObservationCardinalityNext(\n    Oracle.Observation[65_535] storage observations,\n    CLPool.Slot0 storage slot0,\n    uint16 observationCardinalityNext\n  ) external {\n    uint16 observationCardinalityNextOld = slot0.observationCardinalityNext;\n    uint16 observationCardinalityNextNew = observations.grow(observationCardinalityNextOld, observationCardinalityNext);\n    slot0.observationCardinalityNext = observationCardinalityNextNew;\n    if (observationCardinalityNextOld != observationCardinalityNextNew) {\n      emit IncreaseObservationCardinalityNext(observationCardinalityNextOld, observationCardinalityNextNew);\n    }\n  }\n\n  function _checkTicks(int24 tickLower, int24 tickUpper) private pure {\n    require(tickLower < tickUpper, 'TLU');\n    require(tickLower >= TickMath.MIN_TICK, 'TLM');\n    require(tickUpper <= TickMath.MAX_TICK, 'TUM');\n  }\n\n  function modifyPositionForMint(\n    mapping(bytes32 => Position.Info) storage positions,\n    mapping(int24 => Tick.Info) storage ticks,\n    mapping(int16 => uint256) storage tickBitmap,\n    Oracle.Observation[65_535] storage observations,\n    CLPool.Slot0 storage slot0,\n    ModifyPositionInput memory input\n  ) external returns (uint128 liquidityAfter, uint256 amount0, uint256 amount1) {\n    require(input.amount > 0);\n\n    int256 amount0Int;\n    int256 amount1Int;\n    (liquidityAfter, amount0Int, amount1Int) =\n      _modifyPosition(positions, ticks, tickBitmap, observations, slot0, input, int256(input.amount).toInt128());\n\n    amount0 = uint256(amount0Int);\n    amount1 = uint256(amount1Int);\n  }\n\n  function settleMint(\n    ModifyPositionInput memory input,\n    uint256 amount0,\n    uint256 amount1,\n    address token0,\n    address token1,\n    bytes calldata data\n  ) external {\n    uint256 balance0Before;\n    uint256 balance1Before;\n    if (amount0 > 0) balance0Before = _balance(token0);\n    if (amount1 > 0) balance1Before = _balance(token1);\n    ICLMintCallback(msg.sender).uniswapV3MintCallback(amount0, amount1, data);\n    if (amount0 > 0) require(balance0Before.add(amount0) <= _balance(token0), 'M0');\n    if (amount1 > 0) require(balance1Before.add(amount1) <= _balance(token1), 'M1');\n\n    emit Mint(msg.sender, input.owner, input.tickLower, input.tickUpper, input.amount, amount0, amount1);\n  }\n\n  function burn(\n    mapping(bytes32 => Position.Info) storage positions,\n    mapping(int24 => Tick.Info) storage ticks,\n    mapping(int16 => uint256) storage tickBitmap,\n    Oracle.Observation[65_535] storage observations,\n    CLPool.Slot0 storage slot0,\n    ModifyPositionInput memory input\n  ) external returns (uint128 liquidityAfter, uint256 amount0, uint256 amount1) {\n    int256 amount0Int;\n    int256 amount1Int;\n    (liquidityAfter, amount0Int, amount1Int) =\n      _modifyPosition(positions, ticks, tickBitmap, observations, slot0, input, -int256(input.amount).toInt128());\n\n    amount0 = uint256(-amount0Int);\n    amount1 = uint256(-amount1Int);\n\n    if (amount0 > 0 || amount1 > 0) {\n      _creditBurnedTokens(positions, input, uint128(amount0), uint128(amount1));\n    }\n\n    emit Burn(input.owner, input.tickLower, input.tickUpper, input.amount, amount0, amount1);\n  }\n\n  function _creditBurnedTokens(\n    mapping(bytes32 => Position.Info) storage positions,\n    ModifyPositionInput memory input,\n    uint128 amount0,\n    uint128 amount1\n  ) private {\n    Position.Info storage position = positions.get(input.owner, input.tickLower, input.tickUpper);\n    (position.tokensOwed0, position.tokensOwed1) = (position.tokensOwed0 + amount0, position.tokensOwed1 + amount1);\n  }\n\n  function collect(\n    mapping(bytes32 => Position.Info) storage positions,\n    address recipient,\n    int24 tickLower,\n    int24 tickUpper,\n    uint128 amount0Requested,\n    uint128 amount1Requested,\n    address owner,\n    address token0,\n    address token1\n  ) external returns (uint128 amount0, uint128 amount1) {\n    Position.Info storage position = positions.get(owner, tickLower, tickUpper);\n    amount0 = amount0Requested > position.tokensOwed0 ? position.tokensOwed0 : amount0Requested;\n    amount1 = amount1Requested > position.tokensOwed1 ? position.tokensOwed1 : amount1Requested;\n    if (amount0 > 0) {\n      position.tokensOwed0 -= amount0;\n      TransferHelper.safeTransfer(token0, recipient, amount0);\n    }\n    if (amount1 > 0) {\n      position.tokensOwed1 -= amount1;\n      TransferHelper.safeTransfer(token1, recipient, amount1);\n    }\n    emit Collect(owner, recipient, tickLower, tickUpper, amount0, amount1);\n  }\n\n  function collectFees(\n    CLPool.GaugeFees storage gaugeFees,\n    address recipient,\n    address token0,\n    address token1\n  ) external returns (uint128 amount0, uint128 amount1) {\n    amount0 = gaugeFees.token0;\n    amount1 = gaugeFees.token1;\n    if (amount0 > 1) {\n      gaugeFees.token0 = 1;\n      TransferHelper.safeTransfer(token0, recipient, --amount0);\n    } else {\n      amount0 = 0;\n    }\n    if (amount1 > 1) {\n      gaugeFees.token1 = 1;\n      TransferHelper.safeTransfer(token1, recipient, --amount1);\n    } else {\n      amount1 = 0;\n    }\n    emit CollectFees(recipient, amount0, amount1);\n  }\n\n  function _modifyPosition(\n    mapping(bytes32 => Position.Info) storage positions,\n    mapping(int24 => Tick.Info) storage ticks,\n    mapping(int16 => uint256) storage tickBitmap,\n    Oracle.Observation[65_535] storage observations,\n    CLPool.Slot0 storage slot0,\n    ModifyPositionInput memory input,\n    int128 liquidityDelta\n  ) private returns (uint128 liquidityAfter, int256 amount0, int256 amount1) {\n    _checkTicks(input.tickLower, input.tickUpper);\n\n    CLPool.Slot0 memory currentSlot0 = slot0;\n    _updatePosition(positions, ticks, tickBitmap, observations, currentSlot0, input, liquidityDelta);\n\n    liquidityAfter = input.liquidity;\n    if (liquidityDelta != 0) {\n      if (currentSlot0.tick < input.tickLower) {\n        amount0 = SqrtPriceMath.getAmount0Delta(\n          TickMath.getSqrtRatioAtTick(input.tickLower), TickMath.getSqrtRatioAtTick(input.tickUpper), liquidityDelta\n        );\n      } else if (currentSlot0.tick < input.tickUpper) {\n        (slot0.observationIndex, slot0.observationCardinality) = observations.write(\n          currentSlot0.observationIndex,\n          uint32(block.timestamp),\n          currentSlot0.tick,\n          input.liquidity,\n          currentSlot0.observationCardinality,\n          currentSlot0.observationCardinalityNext\n        );\n\n        amount0 = SqrtPriceMath.getAmount0Delta(\n          currentSlot0.sqrtPriceX96, TickMath.getSqrtRatioAtTick(input.tickUpper), liquidityDelta\n        );\n        amount1 = SqrtPriceMath.getAmount1Delta(\n          TickMath.getSqrtRatioAtTick(input.tickLower), currentSlot0.sqrtPriceX96, liquidityDelta\n        );\n\n        liquidityAfter = LiquidityMath.addDelta(input.liquidity, liquidityDelta);\n      } else {\n        amount1 = SqrtPriceMath.getAmount1Delta(\n          TickMath.getSqrtRatioAtTick(input.tickLower), TickMath.getSqrtRatioAtTick(input.tickUpper), liquidityDelta\n        );\n      }\n    }\n  }\n\n  function _updatePosition(\n    mapping(bytes32 => Position.Info) storage positions,\n    mapping(int24 => Tick.Info) storage ticks,\n    mapping(int16 => uint256) storage tickBitmap,\n    Oracle.Observation[65_535] storage observations,\n    CLPool.Slot0 memory currentSlot0,\n    ModifyPositionInput memory input,\n    int128 liquidityDelta\n  ) private {\n    bool flippedLower;\n    bool flippedUpper;\n    if (liquidityDelta != 0) {\n      PositionObservation memory observation;\n      observation.currentTick = currentSlot0.tick;\n      observation.liquidityDelta = liquidityDelta;\n      (observation.tickCumulative, observation.secondsPerLiquidityCumulativeX128) = observations.observeSingle(\n        uint32(block.timestamp),\n        0,\n        currentSlot0.tick,\n        currentSlot0.observationIndex,\n        input.liquidity,\n        currentSlot0.observationCardinality\n      );\n\n      flippedLower = _updateLowerTick(ticks, input, observation);\n      flippedUpper = _updateUpperTick(ticks, input, observation);\n\n      if (flippedLower) tickBitmap.flipTick(input.tickLower, input.tickSpacing);\n      if (flippedUpper) tickBitmap.flipTick(input.tickUpper, input.tickSpacing);\n    }\n\n    (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128) = ticks.getFeeGrowthInside(\n      input.tickLower, input.tickUpper, currentSlot0.tick, input.feeGrowthGlobal0X128, input.feeGrowthGlobal1X128\n    );\n\n    Position.Info storage position = positions.get(input.owner, input.tickLower, input.tickUpper);\n    bool staked = (input.owner == input.gauge) && (input.owner != address(0));\n    position.update(liquidityDelta, feeGrowthInside0X128, feeGrowthInside1X128, staked);\n\n    if (liquidityDelta < 0) {\n      if (flippedLower) ticks.clear(input.tickLower);\n      if (flippedUpper) ticks.clear(input.tickUpper);\n    }\n  }\n\n  function _updateLowerTick(\n    mapping(int24 => Tick.Info) storage ticks,\n    ModifyPositionInput memory input,\n    PositionObservation memory observation\n  ) private returns (bool) {\n    return ticks.update(\n      input.tickLower,\n      observation.currentTick,\n      observation.liquidityDelta,\n      input.feeGrowthGlobal0X128,\n      input.feeGrowthGlobal1X128,\n      input.rewardGrowthGlobalX128,\n      observation.secondsPerLiquidityCumulativeX128,\n      observation.tickCumulative,\n      uint32(block.timestamp),\n      false,\n      input.maxLiquidityPerTick\n    );\n  }\n\n  function _updateUpperTick(\n    mapping(int24 => Tick.Info) storage ticks,\n    ModifyPositionInput memory input,\n    PositionObservation memory observation\n  ) private returns (bool) {\n    return ticks.update(\n      input.tickUpper,\n      observation.currentTick,\n      observation.liquidityDelta,\n      input.feeGrowthGlobal0X128,\n      input.feeGrowthGlobal1X128,\n      input.rewardGrowthGlobalX128,\n      observation.secondsPerLiquidityCumulativeX128,\n      observation.tickCumulative,\n      uint32(block.timestamp),\n      true,\n      input.maxLiquidityPerTick\n    );\n  }\n\n  function validateGaugeFactory(address factoryRegistry, address factory) external view {\n    address gaugeFactory = IFactoryRegistry(factoryRegistry).targetFactoryToGaugeFactory(factory);\n    require(msg.sender == gaugeFactory, 'NGF');\n  }\n\n  function flash(\n    CLPool.GaugeFees storage gaugeFees,\n    FlashInput memory input,\n    bytes calldata data\n  ) external returns (uint256 feeGrowthDelta0, uint256 feeGrowthDelta1) {\n    require(input.liquidity > 0, 'L');\n\n    (uint256 fee0, uint256 fee1) = _flashFees(input, data);\n    uint256 balance0Before = _balance(input.token0);\n    uint256 balance1Before = _balance(input.token1);\n\n    if (input.amount0 > 0) TransferHelper.safeTransfer(input.token0, input.recipient, input.amount0);\n    if (input.amount1 > 0) TransferHelper.safeTransfer(input.token1, input.recipient, input.amount1);\n\n    ICLFlashCallback(msg.sender).uniswapV3FlashCallback(fee0, fee1, data);\n\n    uint256 paid0 = _paid(input.token0, balance0Before, fee0, 'F0');\n    uint256 paid1 = _paid(input.token1, balance1Before, fee1, 'F1');\n\n    feeGrowthDelta0 = _accrueGaugeFee(gaugeFees, input, paid0, true);\n    feeGrowthDelta1 = _accrueGaugeFee(gaugeFees, input, paid1, false);\n\n    emit Flash(msg.sender, input.recipient, input.amount0, input.amount1, paid0, paid1);\n  }\n\n  function _flashFees(FlashInput memory input, bytes memory data) private returns (uint256 fee0, uint256 fee1) {\n    uint24 feePips = ICLFactory(input.factory)\n      .getPoolSwapHook(address(this))\n      .beforeFlash(\n        ISwapHook.FlashParams({\n          caller: msg.sender, recipient: input.recipient, amount0: input.amount0, amount1: input.amount1, data: data\n        }),\n        input.factory,\n        input.tickSpacing\n      );\n    fee0 = FullMath.mulDivRoundingUp(input.amount0, feePips, SwapHookLib._DENOMINATOR);\n    fee1 = FullMath.mulDivRoundingUp(input.amount1, feePips, SwapHookLib._DENOMINATOR);\n  }\n\n  function _balance(address token) private view returns (uint256) {\n    (bool success, bytes memory data) =\n      token.staticcall(abi.encodeWithSelector(IERC20Minimal.balanceOf.selector, address(this)));\n    require(success && data.length >= 32);\n    return abi.decode(data, (uint256));\n  }\n\n  function _paid(\n    address token,\n    uint256 balanceBefore,\n    uint256 fee,\n    string memory error\n  ) private view returns (uint256) {\n    uint256 balanceAfter = _balance(token);\n    require(balanceBefore.add(fee) <= balanceAfter, error);\n    return balanceAfter - balanceBefore;\n  }\n\n  function _accrueGaugeFee(\n    CLPool.GaugeFees storage gaugeFees,\n    FlashInput memory input,\n    uint256 paid,\n    bool zeroForOne\n  ) private returns (uint256 feeGrowthDelta) {\n    if (paid == 0) return 0;\n\n    uint256 stakedFeeAmount;\n    (feeGrowthDelta, stakedFeeAmount) = _calculateFees(paid, input.liquidity, input.stakedLiquidity, input.factory);\n    if (uint128(stakedFeeAmount) > 0) {\n      if (zeroForOne) gaugeFees.token0 += uint128(stakedFeeAmount);\n      else gaugeFees.token1 += uint128(stakedFeeAmount);\n    }\n  }\n\n  function _calculateFees(\n    uint256 feeAmount,\n    uint128 liquidity,\n    uint128 stakedLiquidity,\n    address factory\n  ) private view returns (uint256 feeGrowthGlobalX128, uint256 stakedFeeAmount) {\n    if (liquidity == stakedLiquidity) {\n      stakedFeeAmount = feeAmount;\n    } else if (stakedLiquidity == 0) {\n      (uint256 unstakedFeeAmount, uint256 stakedFee) = _applyUnstakedFees(feeAmount, 0, factory);\n      feeGrowthGlobalX128 = FullMath.mulDiv(unstakedFeeAmount, FixedPoint128.Q128, liquidity);\n      stakedFeeAmount = stakedFee;\n    } else {\n      (uint256 unstakedFeeAmount, uint256 stakedFee) = _splitFees(feeAmount, liquidity, stakedLiquidity, factory);\n      feeGrowthGlobalX128 = FullMath.mulDiv(unstakedFeeAmount, FixedPoint128.Q128, liquidity - stakedLiquidity);\n      stakedFeeAmount = stakedFee;\n    }\n  }\n\n  function _splitFees(\n    uint256 feeAmount,\n    uint128 liquidity,\n    uint128 stakedLiquidity,\n    address factory\n  ) private view returns (uint256 unstakedFeeAmount, uint256 stakedFeeAmount) {\n    stakedFeeAmount = FullMath.mulDivRoundingUp(feeAmount, stakedLiquidity, liquidity);\n    return _applyUnstakedFees(feeAmount - stakedFeeAmount, stakedFeeAmount, factory);\n  }\n\n  function _applyUnstakedFees(\n    uint256 unstakedFeeAmount,\n    uint256 stakedFeeAmount,\n    address factory\n  ) private view returns (uint256, uint256) {\n    uint256 stakedFee = FullMath.mulDivRoundingUp(\n      unstakedFeeAmount, ICLFactory(factory).getUnstakedFee(address(this)), 1_000_000\n    );\n    return (unstakedFeeAmount - stakedFee, stakedFeeAmount + stakedFee);\n  }\n}\n"},"contracts/core/libraries/FixedPoint128.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.4.0;\n\n/// @title FixedPoint128\n/// @notice A library for handling binary fixed point numbers, see https://en.wikipedia.org/wiki/Q_(number_format)\nlibrary FixedPoint128 {\n  uint256 internal constant Q128 = 0x100000000000000000000000000000000;\n}\n"},"contracts/core/libraries/FixedPoint96.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.4.0;\n\n/// @title FixedPoint96\n/// @notice A library for handling binary fixed point numbers, see https://en.wikipedia.org/wiki/Q_(number_format)\n/// @dev Used in SqrtPriceMath.sol\nlibrary FixedPoint96 {\n  uint8 internal constant RESOLUTION = 96;\n  uint256 internal constant Q96 = 0x1000000000000000000000000;\n}\n"},"contracts/core/libraries/FullMath.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.4.0 <0.8.0;\n\n/// @title Contains 512-bit math functions\n/// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision\n/// @dev Handles \"phantom overflow\" i.e., allows multiplication and division where an intermediate value overflows 256 bits\nlibrary FullMath {\n  /// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n  /// @param a The multiplicand\n  /// @param b The multiplier\n  /// @param denominator The divisor\n  /// @return result The 256-bit result\n  /// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv\n  function mulDiv(uint256 a, uint256 b, uint256 denominator) internal pure returns (uint256 result) {\n    // 512-bit multiply [prod1 prod0] = a * b\n    // Compute the product mod 2**256 and mod 2**256 - 1\n    // then use the Chinese Remainder Theorem to reconstruct\n    // the 512 bit result. The result is stored in two 256\n    // variables such that product = prod1 * 2**256 + prod0\n    uint256 prod0; // Least significant 256 bits of the product\n    uint256 prod1; // Most significant 256 bits of the product\n    assembly {\n      let mm := mulmod(a, b, not(0))\n      prod0 := mul(a, b)\n      prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n    }\n\n    // Handle non-overflow cases, 256 by 256 division\n    if (prod1 == 0) {\n      require(denominator > 0);\n      assembly {\n        result := div(prod0, denominator)\n      }\n      return result;\n    }\n\n    // Make sure the result is less than 2**256.\n    // Also prevents denominator == 0\n    require(denominator > prod1);\n\n    ///////////////////////////////////////////////\n    // 512 by 256 division.\n    ///////////////////////////////////////////////\n\n    // Make division exact by subtracting the remainder from [prod1 prod0]\n    // Compute remainder using mulmod\n    uint256 remainder;\n    assembly {\n      remainder := mulmod(a, b, denominator)\n    }\n    // Subtract 256 bit number from 512 bit number\n    assembly {\n      prod1 := sub(prod1, gt(remainder, prod0))\n      prod0 := sub(prod0, remainder)\n    }\n\n    // Factor powers of two out of denominator\n    // Compute largest power of two divisor of denominator.\n    // Always >= 1.\n    uint256 twos = -denominator & denominator;\n    // Divide denominator by power of two\n    assembly {\n      denominator := div(denominator, twos)\n    }\n\n    // Divide [prod1 prod0] by the factors of two\n    assembly {\n      prod0 := div(prod0, twos)\n    }\n    // Shift in bits from prod1 into prod0. For this we need\n    // to flip `twos` such that it is 2**256 / twos.\n    // If twos is zero, then it becomes one\n    assembly {\n      twos := add(div(sub(0, twos), twos), 1)\n    }\n    prod0 |= prod1 * twos;\n\n    // Invert denominator mod 2**256\n    // Now that denominator is an odd number, it has an inverse\n    // modulo 2**256 such that denominator * inv = 1 mod 2**256.\n    // Compute the inverse by starting with a seed that is correct\n    // correct for four bits. That is, denominator * inv = 1 mod 2**4\n    uint256 inv = (3 * denominator) ^ 2;\n    // Now use Newton-Raphson iteration to improve the precision.\n    // Thanks to Hensel's lifting lemma, this also works in modular\n    // arithmetic, doubling the correct bits in each step.\n    inv *= 2 - denominator * inv; // inverse mod 2**8\n    inv *= 2 - denominator * inv; // inverse mod 2**16\n    inv *= 2 - denominator * inv; // inverse mod 2**32\n    inv *= 2 - denominator * inv; // inverse mod 2**64\n    inv *= 2 - denominator * inv; // inverse mod 2**128\n    inv *= 2 - denominator * inv; // inverse mod 2**256\n\n    // Because the division is now exact we can divide by multiplying\n    // with the modular inverse of denominator. This will give us the\n    // correct result modulo 2**256. Since the precoditions guarantee\n    // that the outcome is less than 2**256, this is the final result.\n    // We don't need to compute the high bits of the result and prod1\n    // is no longer required.\n    result = prod0 * inv;\n    return result;\n  }\n\n  /// @notice Calculates ceil(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n  /// @param a The multiplicand\n  /// @param b The multiplier\n  /// @param denominator The divisor\n  /// @return result The 256-bit result\n  function mulDivRoundingUp(uint256 a, uint256 b, uint256 denominator) internal pure returns (uint256 result) {\n    result = mulDiv(a, b, denominator);\n    if (mulmod(a, b, denominator) > 0) {\n      require(result < type(uint256).max);\n      result++;\n    }\n  }\n}\n"},"contracts/core/libraries/LiquidityMath.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Math library for liquidity\nlibrary LiquidityMath {\n  /// @notice Add a signed liquidity delta to liquidity and revert if it overflows or underflows\n  /// @param x The liquidity before change\n  /// @param y The delta by which liquidity should be changed\n  /// @return z The liquidity delta\n  function addDelta(uint128 x, int128 y) internal pure returns (uint128 z) {\n    if (y < 0) {\n      require((z = x - uint128(-y)) < x, 'LS');\n    } else {\n      require((z = x + uint128(y)) >= x, 'LA');\n    }\n  }\n}\n"},"contracts/core/libraries/LowGasSafeMath.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.7.0;\n\n/// @title Optimized overflow and underflow safe math operations\n/// @notice Contains methods for doing math operations that revert on overflow or underflow for minimal gas cost\nlibrary LowGasSafeMath {\n  /// @notice Returns x + y, reverts if sum overflows uint256\n  /// @param x The augend\n  /// @param y The addend\n  /// @return z The sum of x and y\n  function add(uint256 x, uint256 y) internal pure returns (uint256 z) {\n    require((z = x + y) >= x);\n  }\n\n  /// @notice Returns x - y, reverts if underflows\n  /// @param x The minuend\n  /// @param y The subtrahend\n  /// @return z The difference of x and y\n  function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {\n    require((z = x - y) <= x);\n  }\n\n  /// @notice Returns x * y, reverts if overflows\n  /// @param x The multiplicand\n  /// @param y The multiplier\n  /// @return z The product of x and y\n  function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {\n    require(x == 0 || (z = x * y) / x == y);\n  }\n\n  /// @notice Returns x + y, reverts if overflows or underflows\n  /// @param x The augend\n  /// @param y The addend\n  /// @return z The sum of x and y\n  function add(int256 x, int256 y) internal pure returns (int256 z) {\n    require((z = x + y) >= x == (y >= 0));\n  }\n\n  /// @notice Returns x - y, reverts if overflows or underflows\n  /// @param x The minuend\n  /// @param y The subtrahend\n  /// @return z The difference of x and y\n  function sub(int256 x, int256 y) internal pure returns (int256 z) {\n    require((z = x - y) <= x == (y >= 0));\n  }\n}\n"},"contracts/core/libraries/Oracle.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0 <0.8.0;\n\n/// @title Oracle\n/// @notice Provides price and liquidity data useful for a wide variety of system designs\n/// @dev Instances of stored oracle data, \"observations\", are collected in the oracle array\n/// Every pool is initialized with an oracle array length of 1. Anyone can pay the SSTOREs to increase the\n/// maximum length of the oracle array. New slots will be added when the array is fully populated.\n/// Observations are overwritten when the full length of the oracle array is populated.\n/// The most recent observation is available, independent of the length of the oracle array, by passing 0 to observe()\nlibrary Oracle {\n  struct Observation {\n    // the block timestamp of the observation\n    uint32 blockTimestamp;\n    // the tick accumulator, i.e. tick * time elapsed since the pool was first initialized\n    int56 tickCumulative;\n    // the seconds per liquidity, i.e. seconds elapsed / max(1, liquidity) since the pool was first initialized\n    uint160 secondsPerLiquidityCumulativeX128;\n    // whether or not the observation is initialized\n    bool initialized;\n  }\n\n  /// @notice Transforms a previous observation into a new observation, given the passage of time and the current tick and liquidity values\n  /// @dev blockTimestamp _must_ be chronologically equal to or greater than last.blockTimestamp, safe for 0 or 1 overflows\n  /// @param last The specified observation to be transformed\n  /// @param blockTimestamp The timestamp of the new observation\n  /// @param tick The active tick at the time of the new observation\n  /// @param liquidity The total in-range liquidity at the time of the new observation\n  /// @return Observation The newly populated observation\n  function transform(\n    Observation memory last,\n    uint32 blockTimestamp,\n    int24 tick,\n    uint128 liquidity\n  ) private pure returns (Observation memory) {\n    uint32 delta = blockTimestamp - last.blockTimestamp;\n    return Observation({\n      blockTimestamp: blockTimestamp,\n      tickCumulative: last.tickCumulative + int56(tick) * delta,\n      secondsPerLiquidityCumulativeX128: last.secondsPerLiquidityCumulativeX128\n        + ((uint160(delta) << 128) / (liquidity > 0 ? liquidity : 1)),\n      initialized: true\n    });\n  }\n\n  /// @notice Initialize the oracle array by writing the first slot. Called once for the lifecycle of the observations array\n  /// @param self The stored oracle array\n  /// @param time The time of the oracle initialization, via block.timestamp truncated to uint32\n  /// @return cardinality The number of populated elements in the oracle array\n  /// @return cardinalityNext The new length of the oracle array, independent of population\n  function initialize(\n    Observation[65_535] storage self,\n    uint32 time\n  ) internal returns (uint16 cardinality, uint16 cardinalityNext) {\n    self[0] = Observation({\n      blockTimestamp: time, tickCumulative: 0, secondsPerLiquidityCumulativeX128: 0, initialized: true\n    });\n    return (1, 1);\n  }\n\n  /// @notice Writes an oracle observation to the array\n  /// @dev Writable at most once per block. Index represents the most recently written element. cardinality and index must be tracked externally.\n  /// If the index is at the end of the allowable array length (according to cardinality), and the next cardinality\n  /// is greater than the current one, cardinality may be increased. This restriction is created to preserve ordering.\n  /// @param self The stored oracle array\n  /// @param index The index of the observation that was most recently written to the observations array\n  /// @param blockTimestamp The timestamp of the new observation\n  /// @param tick The active tick at the time of the new observation\n  /// @param liquidity The total in-range liquidity at the time of the new observation\n  /// @param cardinality The number of populated elements in the oracle array\n  /// @param cardinalityNext The new length of the oracle array, independent of population\n  /// @return indexUpdated The new index of the most recently written element in the oracle array\n  /// @return cardinalityUpdated The new cardinality of the oracle array\n  function write(\n    Observation[65_535] storage self,\n    uint16 index,\n    uint32 blockTimestamp,\n    int24 tick,\n    uint128 liquidity,\n    uint16 cardinality,\n    uint16 cardinalityNext\n  ) internal returns (uint16 indexUpdated, uint16 cardinalityUpdated) {\n    Observation memory last = self[index];\n\n    // early return if we've already written an observation this block\n    if (last.blockTimestamp == blockTimestamp) return (index, cardinality);\n\n    // if the conditions are right, we can bump the cardinality\n    if (cardinalityNext > cardinality && index == (cardinality - 1)) {\n      cardinalityUpdated = cardinalityNext;\n    } else {\n      cardinalityUpdated = cardinality;\n    }\n\n    indexUpdated = (index + 1) % cardinalityUpdated;\n    self[indexUpdated] = transform(last, blockTimestamp, tick, liquidity);\n  }\n\n  /// @notice Prepares the oracle array to store up to `next` observations\n  /// @param self The stored oracle array\n  /// @param current The current next cardinality of the oracle array\n  /// @param next The proposed next cardinality which will be populated in the oracle array\n  /// @return next The next cardinality which will be populated in the oracle array\n  function grow(Observation[65_535] storage self, uint16 current, uint16 next) internal returns (uint16) {\n    require(current > 0, 'I');\n    // no-op if the passed next value isn't greater than the current next value\n    if (next <= current) return current;\n    // store in each slot to prevent fresh SSTOREs in swaps\n    // this data will not be used because the initialized boolean is still false\n    for (uint16 i = current; i < next; i++) {\n      self[i].blockTimestamp = 1;\n    }\n    return next;\n  }\n\n  /// @notice comparator for 32-bit timestamps\n  /// @dev safe for 0 or 1 overflows, a and b _must_ be chronologically before or equal to time\n  /// @param time A timestamp truncated to 32 bits\n  /// @param a A comparison timestamp from which to determine the relative position of `time`\n  /// @param b From which to determine the relative position of `time`\n  /// @return bool Whether `a` is chronologically <= `b`\n  function lte(uint32 time, uint32 a, uint32 b) private pure returns (bool) {\n    // if there hasn't been overflow, no need to adjust\n    if (a <= time && b <= time) return a <= b;\n\n    uint256 aAdjusted = a > time ? a : a + 2 ** 32;\n    uint256 bAdjusted = b > time ? b : b + 2 ** 32;\n\n    return aAdjusted <= bAdjusted;\n  }\n\n  /// @notice Fetches the observations beforeOrAt and atOrAfter a target, i.e. where [beforeOrAt, atOrAfter] is satisfied.\n  /// The result may be the same observation, or adjacent observations.\n  /// @dev The answer must be contained in the array, used when the target is located within the stored observation\n  /// boundaries: older than the most recent observation and younger, or the same age as, the oldest observation\n  /// @param self The stored oracle array\n  /// @param time The current block.timestamp\n  /// @param target The timestamp at which the reserved observation should be for\n  /// @param index The index of the observation that was most recently written to the observations array\n  /// @param cardinality The number of populated elements in the oracle array\n  /// @return beforeOrAt The observation recorded before, or at, the target\n  /// @return atOrAfter The observation recorded at, or after, the target\n  function binarySearch(\n    Observation[65_535] storage self,\n    uint32 time,\n    uint32 target,\n    uint16 index,\n    uint16 cardinality\n  ) private view returns (Observation memory beforeOrAt, Observation memory atOrAfter) {\n    uint256 l = (index + 1) % cardinality; // oldest observation\n    uint256 r = l + cardinality - 1; // newest observation\n    uint256 i;\n    while (true) {\n      i = (l + r) / 2;\n\n      beforeOrAt = self[i % cardinality];\n\n      // we've landed on an uninitialized tick, keep searching higher (more recently)\n      if (!beforeOrAt.initialized) {\n        l = i + 1;\n        continue;\n      }\n\n      atOrAfter = self[(i + 1) % cardinality];\n\n      bool targetAtOrAfter = lte(time, beforeOrAt.blockTimestamp, target);\n\n      // check if we've found the answer!\n      if (targetAtOrAfter && lte(time, target, atOrAfter.blockTimestamp)) break;\n\n      if (!targetAtOrAfter) r = i - 1;\n      else l = i + 1;\n    }\n  }\n\n  /// @notice Fetches the observations beforeOrAt and atOrAfter a given target, i.e. where [beforeOrAt, atOrAfter] is satisfied\n  /// @dev Assumes there is at least 1 initialized observation.\n  /// Used by observeSingle() to compute the counterfactual accumulator values as of a given block timestamp.\n  /// @param self The stored oracle array\n  /// @param time The current block.timestamp\n  /// @param target The timestamp at which the reserved observation should be for\n  /// @param tick The active tick at the time of the returned or simulated observation\n  /// @param index The index of the observation that was most recently written to the observations array\n  /// @param liquidity The total pool liquidity at the time of the call\n  /// @param cardinality The number of populated elements in the oracle array\n  /// @return beforeOrAt The observation which occurred at, or before, the given timestamp\n  /// @return atOrAfter The observation which occurred at, or after, the given timestamp\n  function getSurroundingObservations(\n    Observation[65_535] storage self,\n    uint32 time,\n    uint32 target,\n    int24 tick,\n    uint16 index,\n    uint128 liquidity,\n    uint16 cardinality\n  ) private view returns (Observation memory beforeOrAt, Observation memory atOrAfter) {\n    // optimistically set before to the newest observation\n    beforeOrAt = self[index];\n\n    // if the target is chronologically at or after the newest observation, we can early return\n    if (lte(time, beforeOrAt.blockTimestamp, target)) {\n      if (beforeOrAt.blockTimestamp == target) {\n        // if newest observation equals target, we're in the same block, so we can ignore atOrAfter\n        return (beforeOrAt, atOrAfter);\n      } else {\n        // otherwise, we need to transform\n        return (beforeOrAt, transform(beforeOrAt, target, tick, liquidity));\n      }\n    }\n\n    // now, set before to the oldest observation\n    beforeOrAt = self[(index + 1) % cardinality];\n    if (!beforeOrAt.initialized) beforeOrAt = self[0];\n\n    // ensure that the target is chronologically at or after the oldest observation\n    require(lte(time, beforeOrAt.blockTimestamp, target), 'OLD');\n\n    // if we've reached this point, we have to binary search\n    return binarySearch(self, time, target, index, cardinality);\n  }\n\n  /// @dev Reverts if an observation at or before the desired observation timestamp does not exist.\n  /// 0 may be passed as `secondsAgo' to return the current cumulative values.\n  /// If called with a timestamp falling between two observations, returns the counterfactual accumulator values\n  /// at exactly the timestamp between the two observations.\n  /// @param self The stored oracle array\n  /// @param time The current block timestamp\n  /// @param secondsAgo The amount of time to look back, in seconds, at which point to return an observation\n  /// @param tick The current tick\n  /// @param index The index of the observation that was most recently written to the observations array\n  /// @param liquidity The current in-range pool liquidity\n  /// @param cardinality The number of populated elements in the oracle array\n  /// @return tickCumulative The tick * time elapsed since the pool was first initialized, as of `secondsAgo`\n  /// @return secondsPerLiquidityCumulativeX128 The time elapsed / max(1, liquidity) since the pool was first initialized, as of `secondsAgo`\n  function observeSingle(\n    Observation[65_535] storage self,\n    uint32 time,\n    uint32 secondsAgo,\n    int24 tick,\n    uint16 index,\n    uint128 liquidity,\n    uint16 cardinality\n  ) internal view returns (int56 tickCumulative, uint160 secondsPerLiquidityCumulativeX128) {\n    if (secondsAgo == 0) {\n      Observation memory last = self[index];\n      if (last.blockTimestamp != time) last = transform(last, time, tick, liquidity);\n      return (last.tickCumulative, last.secondsPerLiquidityCumulativeX128);\n    }\n\n    uint32 target = time - secondsAgo;\n\n    (Observation memory beforeOrAt, Observation memory atOrAfter) =\n      getSurroundingObservations(self, time, target, tick, index, liquidity, cardinality);\n\n    if (target == beforeOrAt.blockTimestamp) {\n      // we're at the left boundary\n      return (beforeOrAt.tickCumulative, beforeOrAt.secondsPerLiquidityCumulativeX128);\n    } else if (target == atOrAfter.blockTimestamp) {\n      // we're at the right boundary\n      return (atOrAfter.tickCumulative, atOrAfter.secondsPerLiquidityCumulativeX128);\n    } else {\n      // we're in the middle\n      uint32 observationTimeDelta = atOrAfter.blockTimestamp - beforeOrAt.blockTimestamp;\n      uint32 targetDelta = target - beforeOrAt.blockTimestamp;\n      return (\n        beforeOrAt.tickCumulative + ((atOrAfter.tickCumulative - beforeOrAt.tickCumulative) / observationTimeDelta)\n          * targetDelta,\n        beforeOrAt.secondsPerLiquidityCumulativeX128\n          + uint160(\n            (uint256(atOrAfter.secondsPerLiquidityCumulativeX128 - beforeOrAt.secondsPerLiquidityCumulativeX128)\n                * targetDelta) / observationTimeDelta\n          )\n      );\n    }\n  }\n\n  /// @notice Returns the accumulator values as of each time seconds ago from the given time in the array of `secondsAgos`\n  /// @dev Reverts if `secondsAgos` > oldest observation\n  /// @param self The stored oracle array\n  /// @param time The current block.timestamp\n  /// @param secondsAgos Each amount of time to look back, in seconds, at which point to return an observation\n  /// @param tick The current tick\n  /// @param index The index of the observation that was most recently written to the observations array\n  /// @param liquidity The current in-range pool liquidity\n  /// @param cardinality The number of populated elements in the oracle array\n  /// @return tickCumulatives The tick * time elapsed since the pool was first initialized, as of each `secondsAgo`\n  /// @return secondsPerLiquidityCumulativeX128s The cumulative seconds / max(1, liquidity) since the pool was first initialized, as of each `secondsAgo`\n  function observe(\n    Observation[65_535] storage self,\n    uint32 time,\n    uint32[] memory secondsAgos,\n    int24 tick,\n    uint16 index,\n    uint128 liquidity,\n    uint16 cardinality\n  ) internal view returns (int56[] memory tickCumulatives, uint160[] memory secondsPerLiquidityCumulativeX128s) {\n    require(cardinality > 0, 'I');\n\n    tickCumulatives = new int56[](secondsAgos.length);\n    secondsPerLiquidityCumulativeX128s = new uint160[](secondsAgos.length);\n    for (uint256 i = 0; i < secondsAgos.length; i++) {\n      (tickCumulatives[i], secondsPerLiquidityCumulativeX128s[i]) =\n        observeSingle(self, time, secondsAgos[i], tick, index, liquidity, cardinality);\n    }\n  }\n}\n"},"contracts/core/libraries/Position.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0 <0.8.0;\n\nimport './FixedPoint128.sol';\nimport './FullMath.sol';\nimport './LiquidityMath.sol';\n\n/// @title Position\n/// @notice Positions represent an owner address' liquidity between a lower and upper tick boundary\n/// @dev Positions store additional state for tracking fees owed to the position\nlibrary Position {\n  // info stored for each user's position\n  struct Info {\n    // the amount of liquidity owned by this position\n    uint128 liquidity;\n    // fee growth per unit of liquidity as of the last update to liquidity or fees owed\n    uint256 feeGrowthInside0LastX128;\n    uint256 feeGrowthInside1LastX128;\n    // the fees owed to the position owner in token0/token1\n    uint128 tokensOwed0;\n    uint128 tokensOwed1;\n  }\n\n  /// @notice Returns the Info struct of a position, given an owner and position boundaries\n  /// @param self The mapping containing all user positions\n  /// @param owner The address of the position owner\n  /// @param tickLower The lower tick boundary of the position\n  /// @param tickUpper The upper tick boundary of the position\n  /// @return position The position info struct of the given owners' position\n  function get(\n    mapping(bytes32 => Info) storage self,\n    address owner,\n    int24 tickLower,\n    int24 tickUpper\n  ) internal view returns (Position.Info storage position) {\n    position = self[keccak256(abi.encodePacked(owner, tickLower, tickUpper))];\n  }\n\n  /// @notice Credits accumulated fees to a user's position\n  /// @param self The individual position to update\n  /// @param liquidityDelta The change in pool liquidity as a result of the position update\n  /// @param feeGrowthInside0X128 The all-time fee growth in token0, per unit of liquidity, inside the position's tick boundaries\n  /// @param feeGrowthInside1X128 The all-time fee growth in token1, per unit of liquidity, inside the position's tick boundaries\n  /// @param staked Signifies if the position is staked in the gauge or not\n  function update(\n    Info storage self,\n    int128 liquidityDelta,\n    uint256 feeGrowthInside0X128,\n    uint256 feeGrowthInside1X128,\n    bool staked\n  ) internal {\n    Info memory _self = self;\n\n    uint128 liquidityNext;\n    if (liquidityDelta == 0) {\n      require(_self.liquidity > 0, 'NP'); // disallow pokes for 0 liquidity positions\n      liquidityNext = _self.liquidity;\n    } else {\n      liquidityNext = LiquidityMath.addDelta(_self.liquidity, liquidityDelta);\n    }\n\n    uint128 tokensOwed0;\n    uint128 tokensOwed1;\n    if (!staked) {\n      // calculate accumulated fees\n      tokensOwed0 = uint128(\n        FullMath.mulDiv(feeGrowthInside0X128 - _self.feeGrowthInside0LastX128, _self.liquidity, FixedPoint128.Q128)\n      );\n      tokensOwed1 = uint128(\n        FullMath.mulDiv(feeGrowthInside1X128 - _self.feeGrowthInside1LastX128, _self.liquidity, FixedPoint128.Q128)\n      );\n    }\n\n    // update the position\n    if (liquidityDelta != 0) self.liquidity = liquidityNext;\n    self.feeGrowthInside0LastX128 = feeGrowthInside0X128;\n    self.feeGrowthInside1LastX128 = feeGrowthInside1X128;\n    if (tokensOwed0 > 0 || tokensOwed1 > 0) {\n      // overflow is acceptable, have to withdraw before you hit type(uint128).max fees\n      self.tokensOwed0 += tokensOwed0;\n      self.tokensOwed1 += tokensOwed1;\n    }\n  }\n}\n"},"contracts/core/libraries/SafeCast.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Safe casting methods\n/// @notice Contains methods for safely casting between types\nlibrary SafeCast {\n  /// @notice Cast a uint256 to a uint160, revert on overflow\n  /// @param y The uint256 to be downcasted\n  /// @return z The downcasted integer, now type uint160\n  function toUint160(uint256 y) internal pure returns (uint160 z) {\n    require((z = uint160(y)) == y);\n  }\n\n  /// @notice Cast a int256 to a int128, revert on overflow or underflow\n  /// @param y The int256 to be downcasted\n  /// @return z The downcasted integer, now type int128\n  function toInt128(int256 y) internal pure returns (int128 z) {\n    require((z = int128(y)) == y);\n  }\n\n  /// @notice Cast a uint256 to a int256, revert on overflow\n  /// @param y The uint256 to be casted\n  /// @return z The casted integer, now type int256\n  function toInt256(uint256 y) internal pure returns (int256 z) {\n    require(y < 2 ** 255);\n    z = int256(y);\n  }\n}\n"},"contracts/core/libraries/SqrtPriceMath.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\nimport './LowGasSafeMath.sol';\nimport './SafeCast.sol';\n\nimport './FixedPoint96.sol';\nimport './FullMath.sol';\nimport './UnsafeMath.sol';\n\n/// @title Functions based on Q64.96 sqrt price and liquidity\n/// @notice Contains the math that uses square root of price as a Q64.96 and liquidity to compute deltas\nlibrary SqrtPriceMath {\n  using LowGasSafeMath for uint256;\n  using SafeCast for uint256;\n\n  /// @notice Gets the next sqrt price given a delta of token0\n  /// @dev Always rounds up, because in the exact output case (increasing price) we need to move the price at least\n  /// far enough to get the desired output amount, and in the exact input case (decreasing price) we need to move the\n  /// price less in order to not send too much output.\n  /// The most precise formula for this is liquidity * sqrtPX96 / (liquidity +- amount * sqrtPX96),\n  /// if this is impossible because of overflow, we calculate liquidity / (liquidity / sqrtPX96 +- amount).\n  /// @param sqrtPX96 The starting price, i.e. before accounting for the token0 delta\n  /// @param liquidity The amount of usable liquidity\n  /// @param amount How much of token0 to add or remove from virtual reserves\n  /// @param add Whether to add or remove the amount of token0\n  /// @return The price after adding or removing amount, depending on add\n  function getNextSqrtPriceFromAmount0RoundingUp(\n    uint160 sqrtPX96,\n    uint128 liquidity,\n    uint256 amount,\n    bool add\n  ) internal pure returns (uint160) {\n    // we short circuit amount == 0 because the result is otherwise not guaranteed to equal the input price\n    if (amount == 0) return sqrtPX96;\n    uint256 numerator1 = uint256(liquidity) << FixedPoint96.RESOLUTION;\n\n    if (add) {\n      uint256 product;\n      if ((product = amount * sqrtPX96) / amount == sqrtPX96) {\n        uint256 denominator = numerator1 + product;\n        if (denominator >= numerator1) {\n          // always fits in 160 bits\n          return uint160(FullMath.mulDivRoundingUp(numerator1, sqrtPX96, denominator));\n        }\n      }\n\n      return uint160(UnsafeMath.divRoundingUp(numerator1, (numerator1 / sqrtPX96).add(amount)));\n    } else {\n      uint256 product;\n      // if the product overflows, we know the denominator underflows\n      // in addition, we must check that the denominator does not underflow\n      require((product = amount * sqrtPX96) / amount == sqrtPX96 && numerator1 > product);\n      uint256 denominator = numerator1 - product;\n      return FullMath.mulDivRoundingUp(numerator1, sqrtPX96, denominator).toUint160();\n    }\n  }\n\n  /// @notice Gets the next sqrt price given a delta of token1\n  /// @dev Always rounds down, because in the exact output case (decreasing price) we need to move the price at least\n  /// far enough to get the desired output amount, and in the exact input case (increasing price) we need to move the\n  /// price less in order to not send too much output.\n  /// The formula we compute is within <1 wei of the lossless version: sqrtPX96 +- amount / liquidity\n  /// @param sqrtPX96 The starting price, i.e., before accounting for the token1 delta\n  /// @param liquidity The amount of usable liquidity\n  /// @param amount How much of token1 to add, or remove, from virtual reserves\n  /// @param add Whether to add, or remove, the amount of token1\n  /// @return The price after adding or removing `amount`\n  function getNextSqrtPriceFromAmount1RoundingDown(\n    uint160 sqrtPX96,\n    uint128 liquidity,\n    uint256 amount,\n    bool add\n  ) internal pure returns (uint160) {\n    // if we're adding (subtracting), rounding down requires rounding the quotient down (up)\n    // in both cases, avoid a mulDiv for most inputs\n    if (add) {\n      uint256 quotient =\n        (amount <= type(uint160).max\n          ? (amount << FixedPoint96.RESOLUTION) / liquidity\n          : FullMath.mulDiv(amount, FixedPoint96.Q96, liquidity));\n\n      return uint256(sqrtPX96).add(quotient).toUint160();\n    } else {\n      uint256 quotient =\n        (amount <= type(uint160).max\n          ? UnsafeMath.divRoundingUp(amount << FixedPoint96.RESOLUTION, liquidity)\n          : FullMath.mulDivRoundingUp(amount, FixedPoint96.Q96, liquidity));\n\n      require(sqrtPX96 > quotient);\n      // always fits 160 bits\n      return uint160(sqrtPX96 - quotient);\n    }\n  }\n\n  /// @notice Gets the next sqrt price given an input amount of token0 or token1\n  /// @dev Throws if price or liquidity are 0, or if the next price is out of bounds\n  /// @param sqrtPX96 The starting price, i.e., before accounting for the input amount\n  /// @param liquidity The amount of usable liquidity\n  /// @param amountIn How much of token0, or token1, is being swapped in\n  /// @param zeroForOne Whether the amount in is token0 or token1\n  /// @return sqrtQX96 The price after adding the input amount to token0 or token1\n  function getNextSqrtPriceFromInput(\n    uint160 sqrtPX96,\n    uint128 liquidity,\n    uint256 amountIn,\n    bool zeroForOne\n  ) internal pure returns (uint160 sqrtQX96) {\n    require(sqrtPX96 > 0);\n    require(liquidity > 0);\n\n    // round to make sure that we don't pass the target price\n    return zeroForOne\n      ? getNextSqrtPriceFromAmount0RoundingUp(sqrtPX96, liquidity, amountIn, true)\n      : getNextSqrtPriceFromAmount1RoundingDown(sqrtPX96, liquidity, amountIn, true);\n  }\n\n  /// @notice Gets the next sqrt price given an output amount of token0 or token1\n  /// @dev Throws if price or liquidity are 0 or the next price is out of bounds\n  /// @param sqrtPX96 The starting price before accounting for the output amount\n  /// @param liquidity The amount of usable liquidity\n  /// @param amountOut How much of token0, or token1, is being swapped out\n  /// @param zeroForOne Whether the amount out is token0 or token1\n  /// @return sqrtQX96 The price after removing the output amount of token0 or token1\n  function getNextSqrtPriceFromOutput(\n    uint160 sqrtPX96,\n    uint128 liquidity,\n    uint256 amountOut,\n    bool zeroForOne\n  ) internal pure returns (uint160 sqrtQX96) {\n    require(sqrtPX96 > 0);\n    require(liquidity > 0);\n\n    // round to make sure that we pass the target price\n    return zeroForOne\n      ? getNextSqrtPriceFromAmount1RoundingDown(sqrtPX96, liquidity, amountOut, false)\n      : getNextSqrtPriceFromAmount0RoundingUp(sqrtPX96, liquidity, amountOut, false);\n  }\n\n  /// @notice Gets the amount0 delta between two prices\n  /// @dev Calculates liquidity / sqrt(lower) - liquidity / sqrt(upper),\n  /// i.e. liquidity * (sqrt(upper) - sqrt(lower)) / (sqrt(upper) * sqrt(lower))\n  /// @param sqrtRatioAX96 A sqrt price\n  /// @param sqrtRatioBX96 Another sqrt price\n  /// @param liquidity The amount of usable liquidity\n  /// @param roundUp Whether to round the amount up or down\n  /// @return amount0 Amount of token0 required to cover a position of size liquidity between the two passed prices\n  function getAmount0Delta(\n    uint160 sqrtRatioAX96,\n    uint160 sqrtRatioBX96,\n    uint128 liquidity,\n    bool roundUp\n  ) internal pure returns (uint256 amount0) {\n    if (sqrtRatioAX96 > sqrtRatioBX96) (sqrtRatioAX96, sqrtRatioBX96) = (sqrtRatioBX96, sqrtRatioAX96);\n\n    uint256 numerator1 = uint256(liquidity) << FixedPoint96.RESOLUTION;\n    uint256 numerator2 = sqrtRatioBX96 - sqrtRatioAX96;\n\n    require(sqrtRatioAX96 > 0);\n\n    return roundUp\n      ? UnsafeMath.divRoundingUp(FullMath.mulDivRoundingUp(numerator1, numerator2, sqrtRatioBX96), sqrtRatioAX96)\n      : FullMath.mulDiv(numerator1, numerator2, sqrtRatioBX96) / sqrtRatioAX96;\n  }\n\n  /// @notice Gets the amount1 delta between two prices\n  /// @dev Calculates liquidity * (sqrt(upper) - sqrt(lower))\n  /// @param sqrtRatioAX96 A sqrt price\n  /// @param sqrtRatioBX96 Another sqrt price\n  /// @param liquidity The amount of usable liquidity\n  /// @param roundUp Whether to round the amount up, or down\n  /// @return amount1 Amount of token1 required to cover a position of size liquidity between the two passed prices\n  function getAmount1Delta(\n    uint160 sqrtRatioAX96,\n    uint160 sqrtRatioBX96,\n    uint128 liquidity,\n    bool roundUp\n  ) internal pure returns (uint256 amount1) {\n    if (sqrtRatioAX96 > sqrtRatioBX96) (sqrtRatioAX96, sqrtRatioBX96) = (sqrtRatioBX96, sqrtRatioAX96);\n\n    return roundUp\n      ? FullMath.mulDivRoundingUp(liquidity, sqrtRatioBX96 - sqrtRatioAX96, FixedPoint96.Q96)\n      : FullMath.mulDiv(liquidity, sqrtRatioBX96 - sqrtRatioAX96, FixedPoint96.Q96);\n  }\n\n  /// @notice Helper that gets signed token0 delta\n  /// @param sqrtRatioAX96 A sqrt price\n  /// @param sqrtRatioBX96 Another sqrt price\n  /// @param liquidity The change in liquidity for which to compute the amount0 delta\n  /// @return amount0 Amount of token0 corresponding to the passed liquidityDelta between the two prices\n  function getAmount0Delta(\n    uint160 sqrtRatioAX96,\n    uint160 sqrtRatioBX96,\n    int128 liquidity\n  ) internal pure returns (int256 amount0) {\n    return liquidity < 0\n      ? -getAmount0Delta(sqrtRatioAX96, sqrtRatioBX96, uint128(-liquidity), false).toInt256()\n      : getAmount0Delta(sqrtRatioAX96, sqrtRatioBX96, uint128(liquidity), true).toInt256();\n  }\n\n  /// @notice Helper that gets signed token1 delta\n  /// @param sqrtRatioAX96 A sqrt price\n  /// @param sqrtRatioBX96 Another sqrt price\n  /// @param liquidity The change in liquidity for which to compute the amount1 delta\n  /// @return amount1 Amount of token1 corresponding to the passed liquidityDelta between the two prices\n  function getAmount1Delta(\n    uint160 sqrtRatioAX96,\n    uint160 sqrtRatioBX96,\n    int128 liquidity\n  ) internal pure returns (int256 amount1) {\n    return liquidity < 0\n      ? -getAmount1Delta(sqrtRatioAX96, sqrtRatioBX96, uint128(-liquidity), false).toInt256()\n      : getAmount1Delta(sqrtRatioAX96, sqrtRatioBX96, uint128(liquidity), true).toInt256();\n  }\n}\n"},"contracts/core/libraries/SwapMath.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\nimport './FullMath.sol';\nimport './SqrtPriceMath.sol';\n\n/// @title Computes the result of a swap within ticks\n/// @notice Contains methods for computing the result of a swap within a single tick price range, i.e., a single tick.\nlibrary SwapMath {\n  /// @notice Computes the result of swapping some amount in, or amount out, given the parameters of the swap\n  /// @dev The fee, plus the amount in, will never exceed the amount remaining if the swap's `amountSpecified` is positive\n  /// @param sqrtRatioCurrentX96 The current sqrt price of the pool\n  /// @param sqrtRatioTargetX96 The price that cannot be exceeded, from which the direction of the swap is inferred\n  /// @param liquidity The usable liquidity\n  /// @param amountRemaining How much input or output amount is remaining to be swapped in/out\n  /// @param feePips The fee taken from the input amount, expressed in pips\n  /// @return sqrtRatioNextX96 The price after swapping the amount in/out, not to exceed the price target\n  /// @return amountIn The amount to be swapped in, of either token0 or token1, based on the direction of the swap\n  /// @return amountOut The amount to be received, of either token0 or token1, based on the direction of the swap\n  /// @return feeAmount The amount of input that will be taken as a fee\n  function computeSwapStep(\n    uint160 sqrtRatioCurrentX96,\n    uint160 sqrtRatioTargetX96,\n    uint128 liquidity,\n    int256 amountRemaining,\n    uint24 feePips\n  ) internal pure returns (uint160 sqrtRatioNextX96, uint256 amountIn, uint256 amountOut, uint256 feeAmount) {\n    bool zeroForOne = sqrtRatioCurrentX96 >= sqrtRatioTargetX96;\n    bool exactIn = amountRemaining >= 0;\n\n    if (exactIn) {\n      uint256 amountRemainingLessFee = FullMath.mulDiv(uint256(amountRemaining), 1e6 - feePips, 1e6);\n      amountIn = zeroForOne\n        ? SqrtPriceMath.getAmount0Delta(sqrtRatioTargetX96, sqrtRatioCurrentX96, liquidity, true)\n        : SqrtPriceMath.getAmount1Delta(sqrtRatioCurrentX96, sqrtRatioTargetX96, liquidity, true);\n      if (amountRemainingLessFee >= amountIn) {\n        sqrtRatioNextX96 = sqrtRatioTargetX96;\n      } else {\n        sqrtRatioNextX96 =\n          SqrtPriceMath.getNextSqrtPriceFromInput(sqrtRatioCurrentX96, liquidity, amountRemainingLessFee, zeroForOne);\n      }\n    } else {\n      amountOut = zeroForOne\n        ? SqrtPriceMath.getAmount1Delta(sqrtRatioTargetX96, sqrtRatioCurrentX96, liquidity, false)\n        : SqrtPriceMath.getAmount0Delta(sqrtRatioCurrentX96, sqrtRatioTargetX96, liquidity, false);\n      if (uint256(-amountRemaining) >= amountOut) {\n        sqrtRatioNextX96 = sqrtRatioTargetX96;\n      } else {\n        sqrtRatioNextX96 = SqrtPriceMath.getNextSqrtPriceFromOutput(\n          sqrtRatioCurrentX96, liquidity, uint256(-amountRemaining), zeroForOne\n        );\n      }\n    }\n\n    bool max = sqrtRatioTargetX96 == sqrtRatioNextX96;\n\n    // get the input/output amounts\n    if (zeroForOne) {\n      amountIn = max && exactIn\n        ? amountIn\n        : SqrtPriceMath.getAmount0Delta(sqrtRatioNextX96, sqrtRatioCurrentX96, liquidity, true);\n      amountOut = max && !exactIn\n        ? amountOut\n        : SqrtPriceMath.getAmount1Delta(sqrtRatioNextX96, sqrtRatioCurrentX96, liquidity, false);\n    } else {\n      amountIn = max && exactIn\n        ? amountIn\n        : SqrtPriceMath.getAmount1Delta(sqrtRatioCurrentX96, sqrtRatioNextX96, liquidity, true);\n      amountOut = max && !exactIn\n        ? amountOut\n        : SqrtPriceMath.getAmount0Delta(sqrtRatioCurrentX96, sqrtRatioNextX96, liquidity, false);\n    }\n\n    // cap the output amount to not exceed the remaining output amount\n    if (!exactIn && amountOut > uint256(-amountRemaining)) {\n      amountOut = uint256(-amountRemaining);\n    }\n\n    if (exactIn && sqrtRatioNextX96 != sqrtRatioTargetX96) {\n      // we didn't reach the target, so take the remainder of the maximum input as fee\n      feeAmount = uint256(amountRemaining) - amountIn;\n    } else {\n      feeAmount = FullMath.mulDivRoundingUp(amountIn, feePips, 1e6 - feePips);\n    }\n  }\n}\n"},"contracts/core/libraries/Tick.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0 <0.8.0;\n\nimport './LowGasSafeMath.sol';\nimport './SafeCast.sol';\n\nimport './LiquidityMath.sol';\nimport './TickMath.sol';\n\n/// @title Tick\n/// @notice Contains functions for managing tick processes and relevant calculations\nlibrary Tick {\n  using LowGasSafeMath for int256;\n  using SafeCast for int256;\n\n  // info stored for each initialized individual tick\n  struct Info {\n    // the total position liquidity that references this tick\n    // includes both staked and unstaked liquidity\n    uint128 liquidityGross;\n    // amount of net liquidity added (subtracted) when tick is crossed from left to right (right to left)\n    // includes both staked and unstaked liquidity\n    int128 liquidityNet;\n    // amount of net staked liquidity added (subtracted) when tick is crossed from left to right (right to left)\n    int128 stakedLiquidityNet;\n    // fee growth per unit of liquidity on the _other_ side of this tick (relative to the current tick)\n    // only has relative meaning, not absolute — the value depends on when the tick is initialized\n    uint256 feeGrowthOutside0X128;\n    uint256 feeGrowthOutside1X128;\n    // reward growth per unit of liquidity on the _other_ side of this tick (relative to the current tick)\n    // only has relative meaning, not absolute — the value depends on when the tick is initialized\n    uint256 rewardGrowthOutsideX128;\n    // the cumulative tick value on the other side of the tick\n    int56 tickCumulativeOutside;\n    // the seconds per unit of liquidity on the _other_ side of this tick (relative to the current tick)\n    // only has relative meaning, not absolute — the value depends on when the tick is initialized\n    uint160 secondsPerLiquidityOutsideX128;\n    // the seconds spent on the other side of the tick (relative to the current tick)\n    // only has relative meaning, not absolute — the value depends on when the tick is initialized\n    uint32 secondsOutside;\n    // true iff the tick is initialized, i.e. the value is exactly equivalent to the expression liquidityGross != 0\n    // these 8 bits are set to prevent fresh sstores when crossing newly initialized ticks\n    bool initialized;\n  }\n\n  struct LiquidityNets {\n    int128 liquidityNet;\n    int128 stakedLiquidityNet;\n  }\n\n  /// @notice Derives max liquidity per tick from given tick spacing\n  /// @dev Executed within the pool constructor\n  /// @param tickSpacing The amount of required tick separation, realized in multiples of `tickSpacing`\n  ///     e.g., a tickSpacing of 3 requires ticks to be initialized every 3rd tick i.e., ..., -6, -3, 0, 3, 6, ...\n  /// @return The max liquidity per tick\n  function tickSpacingToMaxLiquidityPerTick(int24 tickSpacing) internal pure returns (uint128) {\n    int24 minTick = (TickMath.MIN_TICK / tickSpacing) * tickSpacing;\n    int24 maxTick = (TickMath.MAX_TICK / tickSpacing) * tickSpacing;\n    uint24 numTicks = uint24((maxTick - minTick) / tickSpacing) + 1;\n    return type(uint128).max / numTicks;\n  }\n\n  /// @notice Retrieves fee growth data\n  /// @param self The mapping containing all tick information for initialized ticks\n  /// @param tickLower The lower tick boundary of the position\n  /// @param tickUpper The upper tick boundary of the position\n  /// @param tickCurrent The current tick\n  /// @param feeGrowthGlobal0X128 The all-time global fee growth, per unit of liquidity, in token0\n  /// @param feeGrowthGlobal1X128 The all-time global fee growth, per unit of liquidity, in token1\n  /// @return feeGrowthInside0X128 The all-time fee growth in token0, per unit of liquidity, inside the position's tick boundaries\n  /// @return feeGrowthInside1X128 The all-time fee growth in token1, per unit of liquidity, inside the position's tick boundaries\n  function getFeeGrowthInside(\n    mapping(int24 => Tick.Info) storage self,\n    int24 tickLower,\n    int24 tickUpper,\n    int24 tickCurrent,\n    uint256 feeGrowthGlobal0X128,\n    uint256 feeGrowthGlobal1X128\n  ) internal view returns (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128) {\n    Info storage lower = self[tickLower];\n    Info storage upper = self[tickUpper];\n\n    // calculate fee growth below\n    uint256 feeGrowthBelow0X128;\n    uint256 feeGrowthBelow1X128;\n    if (tickCurrent >= tickLower) {\n      feeGrowthBelow0X128 = lower.feeGrowthOutside0X128;\n      feeGrowthBelow1X128 = lower.feeGrowthOutside1X128;\n    } else {\n      feeGrowthBelow0X128 = feeGrowthGlobal0X128 - lower.feeGrowthOutside0X128;\n      feeGrowthBelow1X128 = feeGrowthGlobal1X128 - lower.feeGrowthOutside1X128;\n    }\n\n    // calculate fee growth above\n    uint256 feeGrowthAbove0X128;\n    uint256 feeGrowthAbove1X128;\n    if (tickCurrent < tickUpper) {\n      feeGrowthAbove0X128 = upper.feeGrowthOutside0X128;\n      feeGrowthAbove1X128 = upper.feeGrowthOutside1X128;\n    } else {\n      feeGrowthAbove0X128 = feeGrowthGlobal0X128 - upper.feeGrowthOutside0X128;\n      feeGrowthAbove1X128 = feeGrowthGlobal1X128 - upper.feeGrowthOutside1X128;\n    }\n\n    feeGrowthInside0X128 = feeGrowthGlobal0X128 - feeGrowthBelow0X128 - feeGrowthAbove0X128;\n    feeGrowthInside1X128 = feeGrowthGlobal1X128 - feeGrowthBelow1X128 - feeGrowthAbove1X128;\n  }\n\n  function getRewardGrowthInside(\n    mapping(int24 => Tick.Info) storage self,\n    int24 tickLower,\n    int24 tickUpper,\n    int24 tickCurrent,\n    uint256 rewardGrowthGlobalX128\n  ) internal view returns (uint256 rewardGrowthInsideX128) {\n    Info storage lower = self[tickLower];\n    Info storage upper = self[tickUpper];\n\n    // calculate reward growth below\n    uint256 rewardGrowthBelowX128;\n    if (tickCurrent >= tickLower) {\n      rewardGrowthBelowX128 = lower.rewardGrowthOutsideX128;\n    } else {\n      rewardGrowthBelowX128 = rewardGrowthGlobalX128 - lower.rewardGrowthOutsideX128;\n    }\n\n    // calculate reward growth above\n    uint256 rewardGrowthAboveX128;\n    if (tickCurrent < tickUpper) {\n      rewardGrowthAboveX128 = upper.rewardGrowthOutsideX128;\n    } else {\n      rewardGrowthAboveX128 = rewardGrowthGlobalX128 - upper.rewardGrowthOutsideX128;\n    }\n\n    rewardGrowthInsideX128 = rewardGrowthGlobalX128 - rewardGrowthBelowX128 - rewardGrowthAboveX128;\n  }\n\n  /// @notice Updates a tick and returns true if the tick was flipped from initialized to uninitialized, or vice versa\n  /// @param self The mapping containing all tick information for initialized ticks\n  /// @param tick The tick that will be updated\n  /// @param tickCurrent The current tick\n  /// @param liquidityDelta A new amount of liquidity to be added (subtracted) when tick is crossed from left to right (right to left)\n  /// @param feeGrowthGlobal0X128 The all-time global fee growth, per unit of liquidity, in token0\n  /// @param feeGrowthGlobal1X128 The all-time global fee growth, per unit of liquidity, in token1\n  /// @param rewardGrowthGlobalX128 The all-time global reward growth, per unit of liquidity\n  /// @param secondsPerLiquidityCumulativeX128 The all-time seconds per max(1, liquidity) of the pool\n  /// @param tickCumulative The tick * time elapsed since the pool was first initialized\n  /// @param time The current block timestamp cast to a uint32\n  /// @param upper true for updating a position's upper tick, or false for updating a position's lower tick\n  /// @param maxLiquidity The maximum liquidity allocation for a single tick\n  /// @return flipped Whether the tick was flipped from initialized to uninitialized, or vice versa\n  function update(\n    mapping(int24 => Tick.Info) storage self,\n    int24 tick,\n    int24 tickCurrent,\n    int128 liquidityDelta,\n    uint256 feeGrowthGlobal0X128,\n    uint256 feeGrowthGlobal1X128,\n    uint256 rewardGrowthGlobalX128,\n    uint160 secondsPerLiquidityCumulativeX128,\n    int56 tickCumulative,\n    uint32 time,\n    bool upper,\n    uint128 maxLiquidity\n  ) internal returns (bool flipped) {\n    Tick.Info storage info = self[tick];\n\n    uint128 liquidityGrossBefore = info.liquidityGross;\n    uint128 liquidityGrossAfter = LiquidityMath.addDelta(liquidityGrossBefore, liquidityDelta);\n\n    require(liquidityGrossAfter <= maxLiquidity, 'LO');\n\n    flipped = (liquidityGrossAfter == 0) != (liquidityGrossBefore == 0);\n\n    if (liquidityGrossBefore == 0) {\n      // by convention, we assume that all growth before a tick was initialized happened _below_ the tick\n      if (tick <= tickCurrent) {\n        info.feeGrowthOutside0X128 = feeGrowthGlobal0X128;\n        info.feeGrowthOutside1X128 = feeGrowthGlobal1X128;\n        info.rewardGrowthOutsideX128 = rewardGrowthGlobalX128;\n        info.secondsPerLiquidityOutsideX128 = secondsPerLiquidityCumulativeX128;\n        info.tickCumulativeOutside = tickCumulative;\n        info.secondsOutside = time;\n      }\n      info.initialized = true;\n    }\n\n    info.liquidityGross = liquidityGrossAfter;\n\n    // when the lower (upper) tick is crossed left to right (right to left), liquidity must be added (removed)\n    info.liquidityNet = upper\n      ? int256(info.liquidityNet).sub(liquidityDelta).toInt128()\n      : int256(info.liquidityNet).add(liquidityDelta).toInt128();\n  }\n\n  /// @notice Updates the staked liquidity component of a tick. Assumes tick is already initialized with an existing position.\n  /// @notice We reuse existing liquidity for staking, so there is no change in liquidity\n  /// @param self The mapping containing all tick information for initialized ticks\n  /// @param tick The tick that will be updated\n  /// @param stakedLiquidityDelta The amount of staked liquidity to be added (subtracted) when tick is crossed from left to right (right to left)\n  /// @param upper true for updating a position's upper tick, or false for updating a position's lower tick\n  function updateStake(\n    mapping(int24 => Tick.Info) storage self,\n    int24 tick,\n    int128 stakedLiquidityDelta,\n    bool upper\n  ) internal {\n    Tick.Info storage info = self[tick];\n    // when the lower (upper) tick is crossed left to right (right to left), staked liquidity must be added (removed)\n    info.stakedLiquidityNet = upper\n      ? int256(info.stakedLiquidityNet).sub(stakedLiquidityDelta).toInt128()\n      : int256(info.stakedLiquidityNet).add(stakedLiquidityDelta).toInt128();\n  }\n\n  /// @notice Clears tick data\n  /// @param self The mapping containing all initialized tick information for initialized ticks\n  /// @param tick The tick that will be cleared\n  function clear(mapping(int24 => Tick.Info) storage self, int24 tick) internal {\n    delete self[tick];\n  }\n\n  /// @notice Transitions to next tick as needed by price movement\n  /// @param self The mapping containing all tick information for initialized ticks\n  /// @param tick The destination tick of the transition\n  /// @param feeGrowthGlobal0X128 The all-time global fee growth, per unit of liquidity, in token0\n  /// @param feeGrowthGlobal1X128 The all-time global fee growth, per unit of liquidity, in token1\n  /// @param secondsPerLiquidityCumulativeX128 The current seconds per liquidity\n  /// @param tickCumulative The tick * time elapsed since the pool was first initialized\n  /// @param time The current block.timestamp\n  /// @param rewardGrowthGlobalX128 The all-time global reward growth, per unit of liquidity\n  /// @return nets The amount of liquidity and staked liquidity added (subtracted) when tick is crossed from left to right (right to left)\n  function cross(\n    mapping(int24 => Tick.Info) storage self,\n    int24 tick,\n    uint256 feeGrowthGlobal0X128,\n    uint256 feeGrowthGlobal1X128,\n    uint160 secondsPerLiquidityCumulativeX128,\n    int56 tickCumulative,\n    uint32 time,\n    uint256 rewardGrowthGlobalX128\n  ) internal returns (LiquidityNets memory nets) {\n    Tick.Info storage info = self[tick];\n    info.feeGrowthOutside0X128 = feeGrowthGlobal0X128 - info.feeGrowthOutside0X128;\n    info.feeGrowthOutside1X128 = feeGrowthGlobal1X128 - info.feeGrowthOutside1X128;\n    info.rewardGrowthOutsideX128 = rewardGrowthGlobalX128 - info.rewardGrowthOutsideX128;\n    info.secondsPerLiquidityOutsideX128 = secondsPerLiquidityCumulativeX128 - info.secondsPerLiquidityOutsideX128;\n    info.tickCumulativeOutside = tickCumulative - info.tickCumulativeOutside;\n    info.secondsOutside = time - info.secondsOutside;\n    nets.liquidityNet = info.liquidityNet;\n    nets.stakedLiquidityNet = info.stakedLiquidityNet;\n  }\n}\n"},"contracts/core/libraries/TickBitmap.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\nimport './BitMath.sol';\n\n/// @title Packed tick initialized state library\n/// @notice Stores a packed mapping of tick index to its initialized state\n/// @dev The mapping uses int16 for keys since ticks are represented as int24 and there are 256 (2^8) values per word.\nlibrary TickBitmap {\n  /// @notice Computes the position in the mapping where the initialized bit for a tick lives\n  /// @param tick The tick for which to compute the position\n  /// @return wordPos The key in the mapping containing the word in which the bit is stored\n  /// @return bitPos The bit position in the word where the flag is stored\n  function position(int24 tick) private pure returns (int16 wordPos, uint8 bitPos) {\n    wordPos = int16(tick >> 8);\n    bitPos = uint8(tick % 256);\n  }\n\n  /// @notice Flips the initialized state for a given tick from false to true, or vice versa\n  /// @param self The mapping in which to flip the tick\n  /// @param tick The tick to flip\n  /// @param tickSpacing The spacing between usable ticks\n  function flipTick(mapping(int16 => uint256) storage self, int24 tick, int24 tickSpacing) internal {\n    require(tick % tickSpacing == 0); // ensure that the tick is spaced\n    (int16 wordPos, uint8 bitPos) = position(tick / tickSpacing);\n    uint256 mask = 1 << bitPos;\n    self[wordPos] ^= mask;\n  }\n\n  /// @notice Returns the next initialized tick contained in the same word (or adjacent word) as the tick that is either\n  /// to the left (less than or equal to) or right (greater than) of the given tick\n  /// @param self The mapping in which to compute the next initialized tick\n  /// @param tick The starting tick\n  /// @param tickSpacing The spacing between usable ticks\n  /// @param lte Whether to search for the next initialized tick to the left (less than or equal to the starting tick)\n  /// @return next The next initialized or uninitialized tick up to 256 ticks away from the current tick\n  /// @return initialized Whether the next tick is initialized, as the function only searches within up to 256 ticks\n  function nextInitializedTickWithinOneWord(\n    mapping(int16 => uint256) storage self,\n    int24 tick,\n    int24 tickSpacing,\n    bool lte\n  ) internal view returns (int24 next, bool initialized) {\n    int24 compressed = tick / tickSpacing;\n    if (tick < 0 && tick % tickSpacing != 0) compressed--; // round towards negative infinity\n\n    if (lte) {\n      (int16 wordPos, uint8 bitPos) = position(compressed);\n      // all the 1s at or to the right of the current bitPos\n      uint256 mask = (1 << bitPos) - 1 + (1 << bitPos);\n      uint256 masked = self[wordPos] & mask;\n\n      // if there are no initialized ticks to the right of or at the current tick, return rightmost in the word\n      initialized = masked != 0;\n      // overflow/underflow is possible, but prevented externally by limiting both tickSpacing and tick\n      next = initialized\n        ? (compressed - int24(bitPos - BitMath.mostSignificantBit(masked))) * tickSpacing\n        : (compressed - int24(bitPos)) * tickSpacing;\n    } else {\n      // start from the word of the next tick, since the current tick state doesn't matter\n      (int16 wordPos, uint8 bitPos) = position(compressed + 1);\n      // all the 1s at or to the left of the bitPos\n      uint256 mask = ~((1 << bitPos) - 1);\n      uint256 masked = self[wordPos] & mask;\n\n      // if there are no initialized ticks to the left of the current tick, return leftmost in the word\n      initialized = masked != 0;\n      // overflow/underflow is possible, but prevented externally by limiting both tickSpacing and tick\n      next = initialized\n        ? (compressed + 1 + int24(BitMath.leastSignificantBit(masked) - bitPos)) * tickSpacing\n        : (compressed + 1 + int24(type(uint8).max - bitPos)) * tickSpacing;\n    }\n  }\n}\n"},"contracts/core/libraries/TickMath.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0 <0.8.0;\n\n/// @title Math library for computing sqrt prices from ticks and vice versa\n/// @notice Computes sqrt price for ticks of size 1.0001, i.e. sqrt(1.0001^tick) as fixed point Q64.96 numbers. Supports\n/// prices between 2**-128 and 2**128\nlibrary TickMath {\n  /// @dev The minimum tick that may be passed to #getSqrtRatioAtTick computed from log base 1.0001 of 2**-128\n  int24 internal constant MIN_TICK = -887_272;\n  /// @dev The maximum tick that may be passed to #getSqrtRatioAtTick computed from log base 1.0001 of 2**128\n  int24 internal constant MAX_TICK = -MIN_TICK;\n\n  /// @dev The minimum value that can be returned from #getSqrtRatioAtTick. Equivalent to getSqrtRatioAtTick(MIN_TICK)\n  uint160 internal constant MIN_SQRT_RATIO = 4_295_128_739;\n  /// @dev The maximum value that can be returned from #getSqrtRatioAtTick. Equivalent to getSqrtRatioAtTick(MAX_TICK)\n  uint160 internal constant MAX_SQRT_RATIO = 1_461_446_703_485_210_103_287_273_052_203_988_822_378_723_970_342;\n\n  /// @notice Calculates sqrt(1.0001^tick) * 2^96\n  /// @dev Throws if |tick| > max tick\n  /// @param tick The input tick for the above formula\n  /// @return sqrtPriceX96 A Fixed point Q64.96 number representing the sqrt of the ratio of the two assets (token1/token0)\n  /// at the given tick\n  function getSqrtRatioAtTick(int24 tick) internal pure returns (uint160 sqrtPriceX96) {\n    uint256 absTick = tick < 0 ? uint256(-int256(tick)) : uint256(int256(tick));\n    require(absTick <= uint256(MAX_TICK), 'T');\n\n    uint256 ratio = absTick & 0x1 != 0 ? 0xfffcb933bd6fad37aa2d162d1a594001 : 0x100000000000000000000000000000000;\n    if (absTick & 0x2 != 0) ratio = (ratio * 0xfff97272373d413259a46990580e213a) >> 128;\n    if (absTick & 0x4 != 0) ratio = (ratio * 0xfff2e50f5f656932ef12357cf3c7fdcc) >> 128;\n    if (absTick & 0x8 != 0) ratio = (ratio * 0xffe5caca7e10e4e61c3624eaa0941cd0) >> 128;\n    if (absTick & 0x10 != 0) ratio = (ratio * 0xffcb9843d60f6159c9db58835c926644) >> 128;\n    if (absTick & 0x20 != 0) ratio = (ratio * 0xff973b41fa98c081472e6896dfb254c0) >> 128;\n    if (absTick & 0x40 != 0) ratio = (ratio * 0xff2ea16466c96a3843ec78b326b52861) >> 128;\n    if (absTick & 0x80 != 0) ratio = (ratio * 0xfe5dee046a99a2a811c461f1969c3053) >> 128;\n    if (absTick & 0x100 != 0) ratio = (ratio * 0xfcbe86c7900a88aedcffc83b479aa3a4) >> 128;\n    if (absTick & 0x200 != 0) ratio = (ratio * 0xf987a7253ac413176f2b074cf7815e54) >> 128;\n    if (absTick & 0x400 != 0) ratio = (ratio * 0xf3392b0822b70005940c7a398e4b70f3) >> 128;\n    if (absTick & 0x800 != 0) ratio = (ratio * 0xe7159475a2c29b7443b29c7fa6e889d9) >> 128;\n    if (absTick & 0x1000 != 0) ratio = (ratio * 0xd097f3bdfd2022b8845ad8f792aa5825) >> 128;\n    if (absTick & 0x2000 != 0) ratio = (ratio * 0xa9f746462d870fdf8a65dc1f90e061e5) >> 128;\n    if (absTick & 0x4000 != 0) ratio = (ratio * 0x70d869a156d2a1b890bb3df62baf32f7) >> 128;\n    if (absTick & 0x8000 != 0) ratio = (ratio * 0x31be135f97d08fd981231505542fcfa6) >> 128;\n    if (absTick & 0x10000 != 0) ratio = (ratio * 0x9aa508b5b7a84e1c677de54f3e99bc9) >> 128;\n    if (absTick & 0x20000 != 0) ratio = (ratio * 0x5d6af8dedb81196699c329225ee604) >> 128;\n    if (absTick & 0x40000 != 0) ratio = (ratio * 0x2216e584f5fa1ea926041bedfe98) >> 128;\n    if (absTick & 0x80000 != 0) ratio = (ratio * 0x48a170391f7dc42444e8fa2) >> 128;\n\n    if (tick > 0) ratio = type(uint256).max / ratio;\n\n    // this divides by 1<<32 rounding up to go from a Q128.128 to a Q128.96.\n    // we then downcast because we know the result always fits within 160 bits due to our tick input constraint\n    // we round up in the division so getTickAtSqrtRatio of the output price is always consistent\n    sqrtPriceX96 = uint160((ratio >> 32) + (ratio % (1 << 32) == 0 ? 0 : 1));\n  }\n\n  /// @notice Calculates the greatest tick value such that getRatioAtTick(tick) <= ratio\n  /// @dev Throws in case sqrtPriceX96 < MIN_SQRT_RATIO, as MIN_SQRT_RATIO is the lowest value getRatioAtTick may\n  /// ever return.\n  /// @param sqrtPriceX96 The sqrt ratio for which to compute the tick as a Q64.96\n  /// @return tick The greatest tick for which the ratio is less than or equal to the input ratio\n  function getTickAtSqrtRatio(uint160 sqrtPriceX96) internal pure returns (int24 tick) {\n    // second inequality must be < because the price can never reach the price at the max tick\n    require(sqrtPriceX96 >= MIN_SQRT_RATIO && sqrtPriceX96 < MAX_SQRT_RATIO, 'R');\n    uint256 ratio = uint256(sqrtPriceX96) << 32;\n\n    uint256 r = ratio;\n    uint256 msb = 0;\n\n    assembly {\n      let f := shl(7, gt(r, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF))\n      msb := or(msb, f)\n      r := shr(f, r)\n    }\n    assembly {\n      let f := shl(6, gt(r, 0xFFFFFFFFFFFFFFFF))\n      msb := or(msb, f)\n      r := shr(f, r)\n    }\n    assembly {\n      let f := shl(5, gt(r, 0xFFFFFFFF))\n      msb := or(msb, f)\n      r := shr(f, r)\n    }\n    assembly {\n      let f := shl(4, gt(r, 0xFFFF))\n      msb := or(msb, f)\n      r := shr(f, r)\n    }\n    assembly {\n      let f := shl(3, gt(r, 0xFF))\n      msb := or(msb, f)\n      r := shr(f, r)\n    }\n    assembly {\n      let f := shl(2, gt(r, 0xF))\n      msb := or(msb, f)\n      r := shr(f, r)\n    }\n    assembly {\n      let f := shl(1, gt(r, 0x3))\n      msb := or(msb, f)\n      r := shr(f, r)\n    }\n    assembly {\n      let f := gt(r, 0x1)\n      msb := or(msb, f)\n    }\n\n    if (msb >= 128) r = ratio >> (msb - 127);\n    else r = ratio << (127 - msb);\n\n    int256 log_2 = (int256(msb) - 128) << 64;\n\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(63, f))\n      r := shr(f, r)\n    }\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(62, f))\n      r := shr(f, r)\n    }\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(61, f))\n      r := shr(f, r)\n    }\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(60, f))\n      r := shr(f, r)\n    }\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(59, f))\n      r := shr(f, r)\n    }\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(58, f))\n      r := shr(f, r)\n    }\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(57, f))\n      r := shr(f, r)\n    }\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(56, f))\n      r := shr(f, r)\n    }\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(55, f))\n      r := shr(f, r)\n    }\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(54, f))\n      r := shr(f, r)\n    }\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(53, f))\n      r := shr(f, r)\n    }\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(52, f))\n      r := shr(f, r)\n    }\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(51, f))\n      r := shr(f, r)\n    }\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(50, f))\n    }\n\n    int256 log_sqrt10001 = log_2 * 255_738_958_999_603_826_347_141; // 128.128 number\n\n    int24 tickLow = int24((log_sqrt10001 - 3_402_992_956_809_132_418_596_140_100_660_247_210) >> 128);\n    int24 tickHi = int24((log_sqrt10001 + 291_339_464_771_989_622_907_027_621_153_398_088_495) >> 128);\n\n    tick = tickLow == tickHi ? tickLow : getSqrtRatioAtTick(tickHi) <= sqrtPriceX96 ? tickHi : tickLow;\n  }\n}\n"},"contracts/core/libraries/TransferHelper.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.6.0;\n\nimport '../interfaces/IERC20Minimal.sol';\n\n/// @title TransferHelper\n/// @notice Contains helper methods for interacting with ERC20 tokens that do not consistently return true/false\nlibrary TransferHelper {\n  /// @notice Transfers tokens from msg.sender to a recipient\n  /// @dev Calls transfer on token contract, errors with TF if transfer fails\n  /// @param token The contract address of the token which will be transferred\n  /// @param to The recipient of the transfer\n  /// @param value The value of the transfer\n  function safeTransfer(address token, address to, uint256 value) internal {\n    (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20Minimal.transfer.selector, to, value));\n    require(success && (data.length == 0 || abi.decode(data, (bool))), 'TF');\n  }\n}\n"},"contracts/core/libraries/UnsafeMath.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Math functions that do not check inputs or outputs\n/// @notice Contains methods that perform common math functions but do not do any overflow or underflow checks\nlibrary UnsafeMath {\n  /// @notice Returns ceil(x / y)\n  /// @dev division by 0 has unspecified behavior, and must be checked externally\n  /// @param x The dividend\n  /// @param y The divisor\n  /// @return z The quotient, ceil(x / y)\n  function divRoundingUp(uint256 x, uint256 y) internal pure returns (uint256 z) {\n    assembly {\n      z := add(div(x, y), gt(mod(x, y), 0))\n    }\n  }\n}\n"},"contracts/core/libraries/hook/SwapHookLib.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity =0.7.6;\npragma abicoder v2;\n\nimport {FullMath} from '../FullMath.sol';\n\nimport {ICLFactory} from 'contracts/core/interfaces/ICLFactory.sol';\nimport {ISwapHook} from 'contracts/core/interfaces/hook/ISwapHook.sol';\n\nimport {CLPool} from 'contracts/core/CLPool.sol';\n\n/// @notice Helper library for invoking swap hook methods and translating pool swap state into hook inputs.\nlibrary SwapHookLib {\n  using SwapHookLib for CLPool.SwapState;\n  using FullMath for uint256;\n\n  /*////////////////////////////////////////////////////////////\n                              CONSTANTS\n  ////////////////////////////////////////////////////////////*/\n\n  /// @dev A pips denominator.\n  uint256 internal constant _DENOMINATOR = 1e6;\n\n  /// @dev A ceil that fees returned from hook methods can not exceed.\n  uint24 internal constant _SWAP_FEE_CEIL = 100_000;\n\n  /*////////////////////////////////////////////////////////////\n                              VIEW FUNCTIONS\n  ////////////////////////////////////////////////////////////*/\n\n  /// @notice Calls the hook's `getBeforeSwapFee` entry point. Falls back to the pool's tick-spacing fee\n  ///         when: swap hook is zero address; returned fee is zero.\n  /// @param _swapHook Address of the hook contract.\n  /// @param _pool Address of the pool making the query.\n  /// @param _swapParams Swap context and PRE-SWAP pool state.\n  /// @param _factory Pool factory used to obtain the default tick-spacing fee.\n  /// @param _tickSpacing Pool's tick spacing.\n  /// @return The swap fee applied in the swap loop.\n  function getBeforeSwapFee(\n    address _swapHook,\n    address _pool,\n    ISwapHook.SwapParams memory _swapParams,\n    address _factory,\n    int24 _tickSpacing\n  ) internal view returns (uint24) {\n    if (_swapHook != address(0)) {\n      uint24 _fee = ISwapHook(_swapHook).getBeforeSwapFee(_pool, _swapParams);\n      if (_fee > 0) return cap(_fee);\n    }\n\n    return ICLFactory(_factory).tickSpacingToFee(_tickSpacing);\n  }\n\n  /// @notice Calls the hook's `getAfterSwapFee` entry point.\n  /// @param _swapHook Address of the hook contract.\n  /// @param _pool Address of the pool making the query.\n  /// @param _swapParams Swap context and POST-SWAP pool state.\n  /// @param _afterSwapParams POST-SWAP execution state and oracle/liquidity context.\n  /// @return The swap fee applied after the swap loop.\n  function getAfterSwapFee(\n    address _swapHook,\n    address _pool,\n    ISwapHook.SwapParams memory _swapParams,\n    ISwapHook.AfterSwapParams memory _afterSwapParams\n  ) internal view returns (uint24) {\n    if (_swapHook != address(0)) {\n      uint24 _fee = ISwapHook(_swapHook).getAfterSwapFee(_pool, _swapParams, _afterSwapParams);\n      if (_fee > 0) return cap(_fee);\n    }\n  }\n\n  /// @notice Calls the hook's `getFlashFee` entry point. Falls back to the pool's tick-spacing fee\n  ///         when: swap hook is zero address.\n  /// @param _swapHook Address of the hook contract.\n  /// @param _pool Address of the pool making the query.\n  /// @param _flashParams Arguments passed to the {CLPool.flash} function.\n  /// @param _factory Pool factory used to obtain the default tick-spacing fee.\n  /// @param _tickSpacing Pool's tick spacing.\n  /// @return The flash fee.\n  function getFlashFee(\n    address _swapHook,\n    address _pool,\n    ISwapHook.FlashParams memory _flashParams,\n    address _factory,\n    int24 _tickSpacing\n  ) internal view returns (uint24) {\n    if (_swapHook != address(0)) {\n      uint24 _fee = ISwapHook(_swapHook).getFlashFee(_pool, _flashParams);\n      return cap(_fee);\n    }\n\n    return ICLFactory(_factory).tickSpacingToFee(_tickSpacing);\n  }\n\n  /*////////////////////////////////////////////////////////////\n                              WRITE FUNCTIONS\n  ////////////////////////////////////////////////////////////*/\n\n  /// @notice Calls the hook's `beforeSwap` entry point. Falls back to the pool's tick-spacing fee\n  ///         when: swap hook is zero address; returned fee is zero.\n  /// @param _swapHook Address of the hook contract.\n  /// @param _swapParams Swap context passed to the hook.\n  /// @param _factory Pool factory used to obtain the default tick-spacing fee.\n  /// @param _tickSpacing Pool's tick spacing.\n  /// @return The fee to apply throughout the swap loop.\n  function beforeSwap(\n    address _swapHook,\n    ISwapHook.SwapParams memory _swapParams,\n    address _factory,\n    int24 _tickSpacing\n  ) internal returns (uint24) {\n    if (_swapHook != address(0)) {\n      uint24 _fee = ISwapHook(_swapHook).beforeSwap(_swapParams);\n      if (_fee > 0) return cap(_fee);\n    }\n\n    return ICLFactory(_factory).tickSpacingToFee(_tickSpacing);\n  }\n\n  /// @notice Calls the hook's `afterSwap` entry point and credits any returned post-swap fee to gauge fees.\n  /// @param _swapHook Address of the hook contract.\n  /// @param _swapParams Swap context passed to the hook.\n  /// @param _state Mutable swap state used to derive the post-swap adjustment.\n  /// @param _cache Swap cache used to derive the post-swap hook parameters.\n  /// @param gaugeFees Storage gauge fee accumulator updated with any computed post-swap fee.\n  function afterSwap(\n    address _swapHook,\n    ISwapHook.SwapParams memory _swapParams,\n    CLPool.SwapState memory _state,\n    CLPool.SwapCache memory _cache,\n    CLPool.GaugeFees storage gaugeFees\n  ) internal {\n    if (_swapHook == address(0)) return;\n\n    uint24 _fee = ISwapHook(_swapHook).afterSwap(_swapParams, _state.toAfterSwapParams(_cache));\n    if (_fee == 0) return;\n\n    _fee = cap(_fee);\n\n    bool _exactInput = _swapParams.amountSpecified > 0;\n\n    // 1. Get the abs amount of the token that was swapped.\n    //    exactInput  (output token)\n    //    exactOutput (input token)\n    uint256 _swapAmount = _exactInput ? uint256(-_state.amountCalculated) : uint256(_state.amountCalculated);\n\n    // 2. Compute fee in token units.\n    uint256 _feeAmount = _swapAmount.mulDivRoundingUp(_fee, _DENOMINATOR);\n\n    // 3. Apply the fee directly to amountCalculated.\n    //    exactInput:  amountCalculated is negative => adding a fee to it\n    //                 decreases the output the swapper receives.\n    //    exactOutput: amountCalculated is positive => adding a fee to it\n    //                 increases the input taken from the swapper.\n    _state.amountCalculated += int256(_feeAmount);\n\n    // 4. Credit the fee difference to the gauge.\n    //    We can't mutate \"exact\" amount, hence\n    //    we're mutating calculated parts of the swap.\n    if (_exactInput) {\n      // Credit OUTPUT token difference to the gauge.\n      if (_swapParams.zeroForOne) gaugeFees.token1 += uint128(_feeAmount);\n      else gaugeFees.token0 += uint128(_feeAmount);\n    } else {\n      // Credit INPUT token difference to the gauge.\n      if (_swapParams.zeroForOne) gaugeFees.token0 += uint128(_feeAmount);\n      else gaugeFees.token1 += uint128(_feeAmount);\n    }\n  }\n\n  /// @notice Calls the hook's `beforeFlash` entry point. Falls back to the pool's tick-spacing fee\n  ///         when swap hook is zero address.\n  /// @param _swapHook Address of the hook contract.\n  /// @param _flashParams Arguments passed to the {CLPool.flash} function.\n  /// @param _factory Pool factory used to obtain the default tick-spacing fee.\n  /// @param _tickSpacing Pool's tick spacing.\n  /// @return The fee to apply to flash loaned amounts.\n  function beforeFlash(\n    address _swapHook,\n    ISwapHook.FlashParams memory _flashParams,\n    address _factory,\n    int24 _tickSpacing\n  ) internal returns (uint24) {\n    if (_swapHook != address(0)) {\n      uint24 _fee = ISwapHook(_swapHook).beforeFlash(_flashParams);\n      return cap(_fee);\n    }\n\n    return ICLFactory(_factory).tickSpacingToFee(_tickSpacing);\n  }\n\n  /*////////////////////////////////////////////////////////////\n                              HELPERS\n  ////////////////////////////////////////////////////////////*/\n\n  /// @notice Converts pool swap state and cache values into the hook's after-swap parameter struct.\n  /// @param _state Current swap state.\n  /// @param _cache Current swap cache.\n  /// @return _afterSwapParams Converted state and cache of the swap.\n  function toAfterSwapParams(\n    CLPool.SwapState memory _state,\n    CLPool.SwapCache memory _cache\n  ) internal pure returns (ISwapHook.AfterSwapParams memory _afterSwapParams) {\n    _afterSwapParams = ISwapHook.AfterSwapParams({\n      amountSpecifiedRemaining: _state.amountSpecifiedRemaining,\n      amountCalculated: _state.amountCalculated,\n      fee: _state.fee,\n      hasUpdatedFees: _state.hasUpdatedFees,\n      feeGrowthGlobalX128: _state.feeGrowthGlobalX128,\n      gaugeFee: _state.gaugeFee,\n      liquidity: _state.liquidity,\n      stakedLiquidity: _state.stakedLiquidity,\n      tickCumulative: _cache.tickCumulative,\n      secondsPerLiquidityCumulativeX128: _cache.secondsPerLiquidityCumulativeX128,\n      computedLatestObservation: _cache.computedLatestObservation\n    });\n  }\n\n  /// @notice Caps the provided `_fee` with `_SWAP_FEE_CEIL`.\n  /// @param _fee The fee returned from the hook method.\n  /// @return _cappedFee Capped fee: min(_fee, _SWAP_FEE_CEIL)\n  function cap(uint24 _fee) internal pure returns (uint24 _cappedFee) {\n    _cappedFee = _fee < _SWAP_FEE_CEIL ? _fee : _SWAP_FEE_CEIL;\n  }\n}\n"},"contracts/gauge/interfaces/IAccessControl.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.7.6;\n\ninterface IAccessControl {\n  function hasRole(bytes32 _role, address _account) external view returns (bool);\n  function getRoleAdmin(bytes32 _role) external view returns (bytes32);\n  function getRoleMemberCount(bytes32 _role) external view returns (uint256);\n  function getRoleMember(bytes32 _role, uint256 _index) external view returns (address);\n  function grantRole(bytes32 _role, address _account) external;\n  function revokeRole(bytes32 _role, address _account) external;\n  function renounceRole(bytes32 _role, address _account) external;\n}\n"},"contracts/gauge/interfaces/ICLGauge.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity =0.7.6;\n\nimport {ICLPool} from 'contracts/gauge/interfaces/ICLPool.sol';\nimport {IGauge} from 'contracts/gauge/interfaces/IGauge.sol';\nimport {INonfungiblePositionManager} from 'contracts/gauge/interfaces/INonfungiblePositionManager.sol';\n\ninterface ICLGauge is IGauge {\n  /**\n   * @notice Emitted when a position is deposited into the gauge.\n   * @param _caller The address that deposited the position.\n   * @param _user The address credited as the staked owner.\n   * @param _tokenId The tokenId of the deposited position.\n   * @param _liquidityToStake The amount of liquidity staked in the pool.\n   */\n  event Deposit(address indexed _caller, address indexed _user, uint256 indexed _tokenId, uint128 _liquidityToStake);\n\n  /**\n   * @notice Emitted when a position is withdrawn from the gauge.\n   * @param _caller The address that withdrew the position.\n   * @param _user The address whose stake was withdrawn.\n   * @param _tokenId The tokenId of the withdrawn position.\n   * @param _liquidityToStake The amount of liquidity unstaked from the pool.\n   */\n  event Withdraw(address indexed _caller, address indexed _user, uint256 indexed _tokenId, uint128 _liquidityToStake);\n\n  /**\n   * @notice Emitted when accrued emissions are claimed for a staked position.\n   * @param _account The address of the LP staker whose emissions were claimed.\n   * @param _tokenId The tokenId of the staked position.\n   * @param _recipient The recipient of the claimed emissions.\n   * @param _rewardAmount The amount of emissions paid to the recipient.\n   */\n  event EmissionsClaimed(\n    address indexed _account, uint256 indexed _tokenId, address indexed _recipient, uint256 _rewardAmount\n  );\n\n  /**\n   * @notice Emitted when accrued emissions are stored instead of claimed during withdrawal.\n   * @param _account The address of the LP staker credited with the deferred emissions.\n   * @param _tokenId The tokenId whose emissions were stored.\n   * @param _rewardAmount The post-penalty, post-referral emissions added to the account's deferred balance.\n   */\n  event EmissionsDeferred(address indexed _account, uint256 indexed _tokenId, uint256 _rewardAmount);\n\n  /**\n   * @notice Emitted when a position's referral emissions are stored for a later claim.\n   * @param _account The address of the LP staker whose emissions paid the referral.\n   * @param _tokenId The tokenId of the staked position.\n   * @param _referral The referral address credited with the emissions.\n   * @param _amount The referral emissions added to the referral's deferred balance.\n   */\n  event ReferralEmissionsDeferred(\n    address indexed _account, uint256 indexed _tokenId, address indexed _referral, uint256 _amount\n  );\n\n  /**\n   * @notice Emitted when an account's deferred emissions are claimed.\n   * @param _account The account whose deferred emissions were claimed.\n   * @param _recipient The recipient of the claimed emissions.\n   * @param _amount The deferred emissions paid to the recipient after referral.\n   */\n  event DeferredEmissionsClaimed(address indexed _account, address indexed _recipient, uint256 _amount);\n\n  /**\n   * @notice Emitted when an early withdrawal penalty is applied to a position's accrued emissions.\n   * @param _from The address of the LP staker whose emissions were penalized.\n   * @param _tokenId The tokenId of the staked position.\n   * @param _penalty The amount of emissions forfeited as the penalty.\n   */\n  event EarlyWithdrawPenalty(address indexed _from, uint256 indexed _tokenId, uint256 _penalty);\n\n  /**\n   * @notice Emitted when a per-tokenId withdrawal approval is set or cleared\n   * @param _owner The position owner\n   * @param _operator The approved operator (address(0) if cleared)\n   * @param _tokenId The approved token ID\n   */\n  event Approval(address indexed _owner, address indexed _operator, uint256 indexed _tokenId);\n\n  /**\n   * @notice Emitted when the gauge settles emissions accrued in the LeafVoter\n   * @dev Not emitted when a settlement accrues no new emissions\n   * @param _cumulativeRewardShare The LeafVoter's cumulative reward share at this settlement\n   * @param _delta The emissions accrued since the previous settlement\n   */\n  event GaugeSettled(uint256 _cumulativeRewardShare, uint256 _delta);\n\n  /**\n   * @notice Emitted when a position is withdrawn through emergency withdraw.\n   * @param _user The staked owner.\n   * @param _tokenId The withdrawn position.\n   * @param _liquidityToStake The liquidity unstaked from the pool.\n   */\n  event EmergencyWithdraw(address indexed _user, uint256 indexed _tokenId, uint128 _liquidityToStake);\n\n  /**\n   * @notice Called on gauge creation by CLGaugeFactory\n   * @dev Only callable by the gauge factory\n   * @param _pool The address of the pool\n   * @param _votingRewardsManager The address of the voting rewards manager contract\n   * @param _token0 The address of token0 of the pool\n   * @param _token1 The address of token1 of the pool\n   * @param _tickSpacing The tick spacing of the pool\n   * @param _isPool Whether the attached pool is a real pool or not\n   */\n  function initialize(\n    address _pool,\n    address _votingRewardsManager,\n    address _token0,\n    address _token1,\n    int24 _tickSpacing,\n    bool _isPool\n  ) external;\n\n  /**\n   * @notice Settle the gauge in the LeafVoter and return the emissions accrued since the last settlement\n   * @dev Only callable by the corresponding pool\n   * @dev Pulls the gauge's cumulative reward share from the LeafVoter and advances the gauge's cursor\n   * @dev Reports the settle to the gauge tape through the factory: a full report when the cursor\n   *      advances, a refresh when it holds at a nonzero level, nothing on a regression\n   * @dev Returns zero without calling the LeafVoter during an emergency withdraw's unstake\n   * @return _delta The emissions accrued since the gauge's last settlement\n   */\n  function settleGauge() external returns (uint256 _delta);\n\n  /**\n   * @notice Withdraw a staked position owned by the caller without touching the LeafVoter\n   * @dev Only while emergency withdraw is on. Emissions accrued since the last action are lost;\n   *      deferred emissions stay claimable\n   * @param _tokenId The staked position to withdraw\n   */\n  function emergencyWithdraw(uint256 _tokenId) external;\n\n  /**\n   * @notice Settle the pool and forfeit any accumulated rollover back to the LeafVoter\n   * @dev Permissionless. Emissions accrued while no staked liquidity is in range are banked in the\n   *      pool as rollover and normally forfeited during claims; an idle gauge with no staked\n   *      positions has no claims, so this entrypoint returns them to the voter directly.\n   */\n  function forfeitRollover() external;\n\n  /**\n   * @notice Claim the LP's accrued emissions across the given positions\n   * @dev Also claims all account-level deferred LP emissions regardless of the requested positions\n   * @param _account The address of the LP staker whose emissions are being claimed\n   * @param _recipient The recipient of the claimed emissions\n   * @param _tokenIds The staked positions to claim\n   */\n  function claimEmissions(address _account, address _recipient, uint256[] calldata _tokenIds) external;\n\n  /**\n   * @notice NonfungiblePositionManager used to create nfts accepted by this gauge.\n   * @return The address of the NonfungiblePositionManager.\n   */\n  function nft() external view returns (INonfungiblePositionManager);\n\n  /**\n   * @notice Address of the CL pool linked to the gauge.\n   * @return The address of the CL pool.\n   */\n  function pool() external view returns (ICLPool);\n\n  /**\n   * @notice Cached address of token0, corresponding to token0 of the pool.\n   * @return The address of token0.\n   */\n  function token0() external view returns (address);\n\n  /**\n   * @notice Cached address of token1, corresponding to token1 of the pool.\n   * @return The address of token1.\n   */\n  function token1() external view returns (address);\n\n  /**\n   * @notice Cached tick spacing of the pool.\n   * @return The tick spacing of the pool.\n   */\n  function tickSpacing() external view returns (int24);\n\n  /**\n   * @notice Returns the rewardGrowthInside of the position at the last user action (deposit, withdraw, claimEmissions)\n   * @param _tokenId The tokenId of the position\n   * @return The rewardGrowthInside for the position\n   */\n  function rewardGrowthInside(uint256 _tokenId) external view returns (uint256);\n\n  /**\n   * @notice Returns the block number at which a position was deposited\n   * @param _tokenId The tokenId of the position\n   * @return The deposit block for the position\n   */\n  function depositBlock(uint256 _tokenId) external view returns (uint256);\n\n  /**\n   * @notice Returns net LP emissions stored for an account when emission minting fails during withdrawal\n   * @param _account The account credited with the deferred emissions\n   * @return The post-penalty, post-referral deferred LP emissions\n   */\n  function deferredEmissions(address _account) external view returns (uint256);\n\n  /**\n   * @notice Estimates the claimable emissions for a given account across the requested positions\n   * @dev Assumes _tokenIds contains no duplicates\n   * @dev Rewards accrued since the last settlement are an estimate\n   * @dev Includes the account-level deferred LP emissions\n   * @param _account The address of the LP staker\n   * @param _tokenIds The staked positions\n   * @return The estimated claimable amount\n   */\n  function earned(address _account, uint256[] memory _tokenIds) external view returns (uint256);\n\n  /**\n   * @notice Returns the operator approved to withdraw a specific staked position\n   * @param _tokenId The staked NFT token ID\n   * @return The approved operator, or address(0) if none\n   */\n  function getApproved(uint256 _tokenId) external view returns (address);\n\n  /**\n   * @notice Fetch all tokenIds staked by a given account\n   * @param _depositor The address of the user\n   * @return The tokenIds of the staked positions\n   */\n  function stakedValues(address _depositor) external view returns (uint256[] memory);\n\n  /**\n   * @notice Fetch a staked tokenId by index\n   * @param _depositor The address of the user\n   * @param _index The index of the staked tokenId\n   * @return The tokenId of the staked position\n   */\n  function stakedByIndex(address _depositor, uint256 _index) external view returns (uint256);\n\n  /**\n   * @notice Check whether a position is staked in the gauge by a certain user\n   * @param _depositor The address of the user\n   * @param _tokenId The tokenId of the position\n   * @return Whether the position is staked in the gauge\n   */\n  function stakedContains(address _depositor, uint256 _tokenId) external view returns (bool);\n\n  /**\n   * @notice The amount of positions staked in the gauge by a certain user\n   * @param _depositor The address of the user\n   * @return The amount of positions staked in the gauge\n   */\n  function stakedLength(address _depositor) external view returns (uint256);\n}\n"},"contracts/gauge/interfaces/ICLPool.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity =0.7.6;\n\n/// @title Minimal CLPool interface\n/// @notice Used to support the integration with the core implementation\n/// @dev For full context, please review the Uniswap implementation under GPL license.\ninterface ICLPool {\n  function token0() external view returns (address);\n\n  function token1() external view returns (address);\n\n  function tickSpacing() external view returns (int24);\n\n  /// @notice The reward growth as a Q128.128 rewards of emission collected per unit of liquidity for the entire life of the pool\n  /// @dev This value can overflow the uint256\n  function rewardGrowthGlobalX128() external view returns (uint256);\n\n  /// @notice The currently in range staked liquidity available to the pool\n  /// @dev This value has no relationship to the total staked liquidity across all ticks\n  function stakedLiquidity() external view returns (uint128);\n\n  /// @notice The amounts of token0 and token1 that are owed to the gauge\n  /// @dev Gauge fees will never exceed uint128 max in either token\n  function gaugeFees() external view returns (uint128 amount0, uint128 amount1);\n\n  /// @notice Returns data about reward growth within a tick range.\n  /// RewardGrowthGlobalX128 can be supplied as a parameter for claimable reward calculations.\n  /// @dev Used in gauge reward/earned calculations\n  /// @param tickLower The lower tick of the range\n  /// @param tickUpper The upper tick of the range\n  /// @param _rewardGrowthGlobalX128 a calculated rewardGrowthGlobalX128 or 0 (in case of 0 it means we use the rewardGrowthGlobalX128 from state)\n  /// @return rewardGrowthInsideX128 The reward growth in the range\n  function getRewardGrowthInside(\n    int24 tickLower,\n    int24 tickUpper,\n    uint256 _rewardGrowthGlobalX128\n  ) external view returns (uint256 rewardGrowthInsideX128);\n\n  /// @notice Initialize gauge and nft manager\n  /// @dev Callable only once, by the gauge factory\n  /// @param _gauge The gauge corresponding to this pool\n  /// @param _nft The position manager used for position management\n  function setGaugeAndPositionManager(address _gauge, address _nft) external;\n\n  /// @notice Convert existing liquidity into staked liquidity\n  /// @notice Only callable by the gauge associated with this pool\n  /// @param stakedLiquidityDelta The amount by which to increase or decrease the staked liquidity\n  /// @param tickLower The lower tick of the position for which to stake liquidity\n  /// @param tickUpper The upper tick of the position for which to stake liquidity\n  function stake(int128 stakedLiquidityDelta, int24 tickLower, int24 tickUpper) external;\n\n  /// @notice Settle the pool's reward growth to the current block timestamp and return the accrued rollover\n  /// @return _rollover Emissions accrued while no staked liquidity was in range. Reset to 0 after this call.\n  function settleToBlock() external returns (uint256 _rollover);\n\n  /// @notice Collect the gauge fee accrued to the pool\n  /// @param recipient The address that receives the claimed gauge fees\n  /// @return amount0 The gauge fee collected in token0\n  /// @return amount1 The gauge fee collected in token1\n  function collectFees(address recipient) external returns (uint128 amount0, uint128 amount1);\n}\n"},"contracts/gauge/interfaces/IGauge.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity =0.7.6;\n\ninterface IGauge {\n  /**\n   * @notice Emitted when the gauge collects pool fees through the VotingRewardsManager.\n   * @param _caller The address that triggered fee collection.\n   * @param _claimed0 The amount of token0 fees collected.\n   * @param _claimed1 The amount of token1 fees collected.\n   */\n  event ClaimFees(address indexed _caller, uint256 _claimed0, uint256 _claimed1);\n\n  /**\n   * @notice Emitted when an account grants or revokes claim approval for an operator\n   * @param _account The account whose approval state changed\n   * @param _operator The operator being approved or revoked\n   * @param _approved The new approval state\n   */\n  event ClaimApproval(address indexed _account, address indexed _operator, bool _approved);\n\n  /**\n   * @notice Emitted when an owner grants or revokes blanket withdrawal approval for an operator\n   * @param _owner The owner whose approval changed\n   * @param _operator The operator being approved or revoked\n   * @param _approved The new approval state\n   */\n  event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);\n\n  /**\n   * @notice Emitted when a referral's deferred emissions are claimed.\n   * @param _referral The referral address whose deferred emissions were claimed.\n   * @param _recipient The recipient of the claimed emissions.\n   * @param _amount The deferred referral emissions paid to the recipient.\n   */\n  event ReferralEmissionsClaimed(address indexed _referral, address indexed _recipient, uint256 _amount);\n\n  /**\n   * @notice Deposit a staked position\n   * @param _lp A token amount for V2 gauges or an NFT token ID for CL gauges\n   */\n  function deposit(uint256 _lp) external;\n\n  /**\n   * @notice Deposit a staked position on behalf of an owner\n   * @dev For V2 gauges, approved MetaRouters are trusted to restrict `_owner` to the account that authorized the\n   *      routed deposit; otherwise, they could reset another account's early-unstake penalty timer.\n   * @param _lp A token amount for V2 gauges or an NFT token ID for CL gauges\n   * @param _owner The address credited as the staked owner\n   */\n  function depositFor(uint256 _lp, address _owner) external;\n\n  /**\n   * @notice Withdraw a staked position owned by the caller\n   * @param _lp A token amount for V2 gauges or an NFT token ID for CL gauges\n   */\n  function withdraw(uint256 _lp) external;\n\n  /**\n   * @notice Withdraw a staked position on behalf of an account\n   * @param _lp A token amount for V2 gauges or an NFT token ID for CL gauges\n   * @param _account The position owner\n   */\n  function withdrawFrom(uint256 _lp, address _account) external;\n\n  /**\n   * @notice Claim accrued emissions\n   * @dev Requires the caller to be the LP or an operator with claim approval\n   * @dev For CL gauges, the account-wide claim also includes account-level deferred LP emissions\n   * @param _account The address of the LP staker whose emissions are being claimed\n   * @param _recipient The recipient of the claimed emissions\n   */\n  function claimEmissions(address _account, address _recipient) external;\n\n  /**\n   * @notice Claims a referral's deferred emissions.\n   * @dev Requires the caller to be the referral or an operator with claim approval.\n   * @dev Contract referrals must be able to call this function or approve an operator to call it on their behalf.\n   * @param _referral The referral address whose deferred emissions are being claimed.\n   * @param _recipient The recipient of the claimed emissions.\n   */\n  function claimReferralEmissions(address _referral, address _recipient) external;\n\n  /**\n   * @notice Grant or revoke an operator's approval to claim emissions on behalf of the caller\n   * @param _operator The operator to approve or revoke\n   * @param _approved True to approve, false to revoke\n   */\n  function approveForClaim(address _operator, bool _approved) external;\n\n  /**\n   * @notice Grant or revoke blanket withdrawal authorization for an operator over all staked positions\n   * @param _operator The operator to authorize or revoke\n   * @param _approved True to grant blanket approval, false to revoke\n   */\n  function setApprovalForAll(address _operator, bool _approved) external;\n\n  /**\n   * @notice Approve an operator to withdraw a staked position\n   * @param _operator The operator to authorize\n   * @param _lp A token amount for V2 gauges or an NFT token ID for CL gauges\n   */\n  function approve(address _operator, uint256 _lp) external;\n\n  /**\n   * @notice Collect currently claimable pool fees directly to the VotingRewardsManager.\n   * @dev Only callable by the VotingRewardsManager.\n   * @return _amount0 The token0 fees collected.\n   * @return _amount1 The token1 fees collected.\n   */\n  function collectFees() external returns (uint256 _amount0, uint256 _amount1);\n\n  /**\n   * @notice LeafVoter contract used for gauge settlement.\n   * @return The address of the LeafVoter.\n   */\n  function voter() external view returns (address);\n\n  /**\n   * @notice Address of the factory that created this gauge.\n   * @return The address of the gauge factory.\n   */\n  function gaugeFactory() external view returns (address);\n\n  /**\n   * @notice Address of the VotingRewardsManager contract linked to the gauge.\n   * @return The address of the VotingRewardsManager.\n   */\n  function votingRewardsManager() external view returns (address);\n\n  /**\n   * @notice Returns if gauge is linked to a legitimate pool.\n   * @return Whether the gauge is linked to a legitimate pool.\n   */\n  function isPool() external view returns (bool);\n\n  /**\n   * @notice The gauge's cursor into the LeafVoter's cumulative reward share accumulator\n   * @return The cumulative reward share at the gauge's last settlement\n   */\n  function lastCumulativeRewardShare() external view returns (uint256);\n\n  /**\n   * @notice Estimates the claimable emissions for a given account\n   * @dev Rewards accrued since the last settlement are an estimate\n   * @dev For CL gauges, includes the account's net deferred LP emissions\n   * @param _account The address of the LP staker\n   * @return The estimated claimable amount\n   */\n  function earned(address _account) external view returns (uint256);\n\n  /**\n   * @notice Whether an operator is approved to claim emissions on behalf of an account\n   * @param _account The account that granted the approval\n   * @param _operator The operator being queried\n   * @return True if the operator is approved\n   */\n  function approvedForClaim(address _account, address _operator) external view returns (bool);\n\n  /**\n   * @notice Returns deferred emissions stored for a referral address\n   * @param _referral The referral address credited with the emissions\n   * @return The deferred referral emissions\n   */\n  function deferredReferralEmissions(address _referral) external view returns (uint256);\n\n  /**\n   * @notice Returns whether an operator has blanket withdrawal authorization for an owner's positions\n   * @param _owner The staked position owner\n   * @param _operator The candidate operator\n   * @return True if blanket approval is active\n   */\n  function isApprovedForAll(address _owner, address _operator) external view returns (bool);\n\n  /**\n   * @notice Return currently claimable pool fees without moving tokens or mutating state.\n   * @return _amount0 The currently pending token0 fees.\n   * @return _amount1 The currently pending token1 fees.\n   */\n  function pendingFees() external view returns (uint256 _amount0, uint256 _amount1);\n}\n"},"contracts/gauge/interfaces/ILeafVoter.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.7.6;\npragma abicoder v2;\n\nimport {IAccessControl} from './IAccessControl.sol';\n\ninterface ILeafVoter is IAccessControl {\n  /**\n   * @notice Aggregated voting power of a gauge at a point in time.\n   * @param bias Decaying voting power at `ts`.\n   * @param slope Per-second decay of `bias`.\n   * @param ts Timestamp the point was resolved at.\n   * @param permanentStakeBalance Non-decaying voting power from permanent stakes.\n   */\n  struct Point {\n    int128 bias;\n    int128 slope;\n    uint48 ts;\n    uint128 permanentStakeBalance;\n  }\n\n  /**\n   * @notice Permissionless settle entrypoint for a registered gauge.\n   *         Settles the chain index to `block.timestamp`, settles `_gauge`, and\n   *         returns the gauge's cumulative reward share. The return value is\n   *         monotonically increasing; a call against an unregistered gauge\n   *         returns 0 without settling, so the function never reverts for any\n   *         input address.\n   * @param _gauge The gauge to settle.\n   * @return _cumulativeRewardShare The gauge's settled cumulative reward share.\n   */\n  function settleGauge(address _gauge) external returns (uint256 _cumulativeRewardShare);\n\n  /**\n   * @notice Read-only twin of `settleGauge`. Projects the gauge's cumulative\n   *         reward share at the current timestamp without writing state.\n   *         `projectedCumulativeRewardShare(_gauge)` equals the value a\n   *         `settleGauge(_gauge)` in this block would return.\n   * @param _gauge The gauge to project.\n   * @return _cumulativeRewardShare The gauge's projected cumulative reward share.\n   */\n  function projectedCumulativeRewardShare(address _gauge) external view returns (uint256 _cumulativeRewardShare);\n\n  /**\n   * @notice Mints `ReceiptToken` to the registered `EmissionsHandler` and calls it back per recipient.\n   * @dev Reverts with `GaugeNotRegistered` for an unregistered caller and `CeilingExceeded` when the claim exceeds the\n   * gauge's claimable headroom, `ceiling - claimed - surplus`. The claim is added to the gauge's `claimed` before the\n   * mint, so all state effects complete before the handler callback fires. Callbacks MUST NOT rely on further\n   * `LeafVoter` state changes. Emits `EmissionsMinted`.\n   * @param _recipients Recipients for the per-leg delivery (LP, referral).\n   * @param _amounts Per-leg amounts of `ReceiptToken`.\n   */\n  function mintEmissions(address[] calldata _recipients, uint128[] calldata _amounts) external;\n\n  /**\n   * @notice Gauge-only entrypoint for forfeiting surplus emissions the gauge\n   *         cannot distribute, covering the Idle Gauge and Early Exit cases.\n   *         Clamps `_amount` to the gauge's claimable headroom\n   *         (`ceiling - claimed - surplus`), flushes the clamped amount into\n   *         the gauge's `surplus` and the chain-level `surplusAccrued`, and\n   *         emits `EmissionsForfeited` with the accrued amount. Reverts with\n   *         `GaugeNotRegistered` when the caller is not a registered gauge.\n   * @param _amount The surplus the calling gauge is forfeiting.\n   */\n  function forfeitEmissions(uint128 _amount) external;\n\n  /**\n   * @notice Whether a gauge is activated for direct allocation routing.\n   * @param _gauge Gauge address to query.\n   * @return Whether the gauge is activated.\n   */\n  function isActivated(address _gauge) external view returns (bool);\n\n  /**\n   * @notice Canonical per-gauge settlement state.\n   * @param _gauge Gauge address to query.\n   * @return _ceiling Cumulative effective share credited to the gauge.\n   * @return _claimed Cumulative emissions minted to recipients by the claim flow.\n   * @return _lastSettlement Timestamp of the gauge's last settlement.\n   * @return _isRegistered Whether the gauge was produced by an approved factory.\n   * @return _isActivated Whether the gauge is activated for direct allocation routing.\n   * @return _surplus Cumulative surplus attributed to the gauge.\n   * @return _lastIndex Snapshot of the chain index at the gauge's last settlement.\n   * @return _lastTimeIndex Snapshot of the chain time index at the gauge's last settlement.\n   * @return _point Decaying weight of the gauge.\n   */\n  function gaugeStates(address _gauge)\n    external\n    view\n    returns (\n      uint128 _ceiling,\n      uint128 _claimed,\n      uint48 _lastSettlement,\n      bool _isRegistered,\n      bool _isActivated,\n      uint128 _surplus,\n      uint256 _lastIndex,\n      uint256 _lastTimeIndex,\n      Point memory _point\n    );\n}\n"},"contracts/gauge/interfaces/INonfungiblePositionManager.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity =0.7.6;\npragma abicoder v2;\n\nimport {IERC721} from '@openzeppelin/contracts/token/ERC721/IERC721.sol';\n\n/// @title Minimal NonfungiblePositionManager interface\n/// @notice Used to support the integration with the core implementation\n/// @dev For full context, please review the Uniswap implementation under GPL license.\ninterface INonfungiblePositionManager is IERC721 {\n  function positions(uint256 tokenId)\n    external\n    view\n    returns (\n      uint96 nonce,\n      address operator,\n      address token0,\n      address token1,\n      int24 tickSpacing,\n      int24 tickLower,\n      int24 tickUpper,\n      uint128 liquidity,\n      uint256 feeGrowthInside0LastX128,\n      uint256 feeGrowthInside1LastX128,\n      uint128 tokensOwed0,\n      uint128 tokensOwed1\n    );\n\n  struct CollectParams {\n    uint256 tokenId;\n    address recipient;\n    uint128 amount0Max;\n    uint128 amount1Max;\n  }\n\n  function collect(CollectParams calldata params) external payable returns (uint256 amount0, uint256 amount1);\n}\n"},"node_modules/@openzeppelin/contracts/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.7.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.7.0;\n\nimport \"../../introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC721 compliant contract.\n */\ninterface IERC721 is IERC165 {\n    /**\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n    /**\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\n     */\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n    /**\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\n     */\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n    /**\n     * @dev Returns the number of tokens in ``owner``'s account.\n     */\n    function balanceOf(address owner) external view returns (uint256 balance);\n\n    /**\n     * @dev Returns the owner of the `tokenId` token.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     */\n    function ownerOf(uint256 tokenId) external view returns (address owner);\n\n    /**\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must exist and be owned by `from`.\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\n\n    /**\n     * @dev Transfers `tokenId` token from `from` to `to`.\n     *\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must be owned by `from`.\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 tokenId) external;\n\n    /**\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\n     * The approval is cleared when the token is transferred.\n     *\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n     *\n     * Requirements:\n     *\n     * - The caller must own the token or be an approved operator.\n     * - `tokenId` must exist.\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address to, uint256 tokenId) external;\n\n    /**\n     * @dev Returns the account approved for `tokenId` token.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     */\n    function getApproved(uint256 tokenId) external view returns (address operator);\n\n    /**\n     * @dev Approve or remove `operator` as an operator for the caller.\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n     *\n     * Requirements:\n     *\n     * - The `operator` cannot be the caller.\n     *\n     * Emits an {ApprovalForAll} event.\n     */\n    function setApprovalForAll(address operator, bool _approved) external;\n\n    /**\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n     *\n     * See {setApprovalForAll}\n     */\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\n\n    /**\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\n      *\n      * Requirements:\n      *\n      * - `from` cannot be the zero address.\n      * - `to` cannot be the zero address.\n      * - `tokenId` token must exist and be owned by `from`.\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n      *\n      * Emits a {Transfer} event.\n      */\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\n}\n"}},"compilation":{"language":"Solidity","compiler":"solc","compilerVersion":"0.7.6+commit.7338295f","compilerSettings":{"metadata":{"bytecodeHash":"ipfs"},"libraries":{"contracts/core/CLPool.sol":{"CLPoolNonSwapPath":"0x1ad7a8703ebff81c0d753190938f228672ec7e42"}},"optimizer":{"runs":200,"enabled":true},"evmVersion":"istanbul","remappings":["/Users/acx/code/dromos/metadex-slipstream/node_modules/@hyperlane-xyz/:@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable-v4/","/Users/acx/code/dromos/metadex-slipstream/node_modules/@hyperlane-xyz/:@openzeppelin/contracts/=node_modules/@openzeppelin/contracts-v4/","/Users/acx/code/dromos/metadex-slipstream/node_modules/metadex/:@hyperlane/contracts/=node_modules/@hyperlane-xyz/core/contracts/","/Users/acx/code/dromos/metadex-slipstream/node_modules/metadex/:@nomad-xyz/src/=node_modules/metadex/node_modules/@nomad-xyz/excessively-safe-call/src/","/Users/acx/code/dromos/metadex-slipstream/node_modules/metadex/:@openzeppelin/contracts/=node_modules/metadex/node_modules/@openzeppelin/contracts/","/Users/acx/code/dromos/metadex-slipstream/node_modules/metadex/:@solady/=node_modules/solady/src/","/Users/acx/code/dromos/metadex-slipstream/test/invariants/fuzz/:@openzeppelin/contracts/=node_modules/metadex/node_modules/@openzeppelin/contracts/",":@hyperlane-v11/contracts/=node_modules/@hyperlane-xyz/core-v11/contracts/",":@hyperlane/contracts/=node_modules/@hyperlane-xyz/core/contracts/",":@nomad-xyz/excessively-safe-call/=node_modules/@nomad-xyz/excessively-safe-call/",":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/",":@solady/=node_modules/solady/src/",":@uniswap/lib/=node_modules/@uniswap/lib/",":V3-script/=node_modules/metadex/V3/script/",":V3-test/=node_modules/metadex/V3/test/",":V3/=node_modules/metadex/V3/src/",":base64-sol/=node_modules/base64-sol/",":forge-std/=node_modules/forge-std/src/","node_modules/@hyperlane-xyz/:@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable-v4/","node_modules/@hyperlane-xyz/:@openzeppelin/contracts/=node_modules/@openzeppelin/contracts-v4/","node_modules/metadex/:@hyperlane/contracts/=node_modules/@hyperlane-xyz/core/contracts/","node_modules/metadex/:@nomad-xyz/src/=node_modules/metadex/node_modules/@nomad-xyz/excessively-safe-call/src/","node_modules/metadex/:@openzeppelin/contracts/=node_modules/metadex/node_modules/@openzeppelin/contracts/","node_modules/metadex/:@solady/=node_modules/solady/src/","test/invariants/fuzz/:@openzeppelin/contracts/=node_modules/metadex/node_modules/@openzeppelin/contracts/"]},"name":"CLPool","fullyQualifiedName":"contracts/core/CLPool.sol:CLPool"},"abi":[{"name":"Burn","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"tickLower","type":"int24","indexed":true,"internalType":"int24"},{"name":"tickUpper","type":"int24","indexed":true,"internalType":"int24"},{"name":"amount","type":"uint128","indexed":false,"internalType":"uint128"},{"name":"amount0","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"amount1","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Collect","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"recipient","type":"address","indexed":false,"internalType":"address"},{"name":"tickLower","type":"int24","indexed":true,"internalType":"int24"},{"name":"tickUpper","type":"int24","indexed":true,"internalType":"int24"},{"name":"amount0","type":"uint128","indexed":false,"internalType":"uint128"},{"name":"amount1","type":"uint128","indexed":false,"internalType":"uint128"}],"anonymous":false},{"name":"CollectFees","type":"event","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount0","type":"uint128","indexed":false,"internalType":"uint128"},{"name":"amount1","type":"uint128","indexed":false,"internalType":"uint128"}],"anonymous":false},{"name":"Flash","type":"event","inputs":[{"name":"sender","type":"address","indexed":true,"internalType":"address"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount0","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"amount1","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"paid0","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"paid1","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"IncreaseObservationCardinalityNext","type":"event","inputs":[{"name":"observationCardinalityNextOld","type":"uint16","indexed":false,"internalType":"uint16"},{"name":"observationCardinalityNextNew","type":"uint16","indexed":false,"internalType":"uint16"}],"anonymous":false},{"name":"Initialize","type":"event","inputs":[{"name":"sqrtPriceX96","type":"uint160","indexed":false,"internalType":"uint160"},{"name":"tick","type":"int24","indexed":false,"internalType":"int24"}],"anonymous":false},{"name":"Mint","type":"event","inputs":[{"name":"sender","type":"address","indexed":false,"internalType":"address"},{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"tickLower","type":"int24","indexed":true,"internalType":"int24"},{"name":"tickUpper","type":"int24","indexed":true,"internalType":"int24"},{"name":"amount","type":"uint128","indexed":false,"internalType":"uint128"},{"name":"amount0","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"amount1","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"SetFeeProtocol","type":"event","inputs":[{"name":"feeProtocol0Old","type":"uint8","indexed":false,"internalType":"uint8"},{"name":"feeProtocol1Old","type":"uint8","indexed":false,"internalType":"uint8"},{"name":"feeProtocol0New","type":"uint8","indexed":false,"internalType":"uint8"},{"name":"feeProtocol1New","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"name":"Swap","type":"event","inputs":[{"name":"sender","type":"address","indexed":true,"internalType":"address"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount0","type":"int256","indexed":false,"internalType":"int256"},{"name":"amount1","type":"int256","indexed":false,"internalType":"int256"},{"name":"sqrtPriceX96","type":"uint160","indexed":false,"internalType":"uint160"},{"name":"liquidity","type":"uint128","indexed":false,"internalType":"uint128"},{"name":"tick","type":"int24","indexed":false,"internalType":"int24"}],"anonymous":false},{"name":"DENOMINATOR","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"POOL_TYPE","type":"function","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"SWAP_FEE_CEIL","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"afterSwapFee","type":"function","inputs":[{"name":"_swapParams","type":"tuple","components":[{"name":"caller","type":"address","internalType":"address"},{"name":"recipient","type":"address","internalType":"address"},{"name":"zeroForOne","type":"bool","internalType":"bool"},{"name":"amountSpecified","type":"int256","internalType":"int256"},{"name":"sqrtPriceLimitX96","type":"uint160","internalType":"uint160"},{"name":"data","type":"bytes","internalType":"bytes"},{"name":"sqrtPriceX96","type":"uint160","internalType":"uint160"},{"name":"tick","type":"int24","internalType":"int24"}],"internalType":"struct ISwapHook.SwapParams"},{"name":"_afterSwapParams","type":"tuple","components":[{"name":"amountSpecifiedRemaining","type":"int256","internalType":"int256"},{"name":"amountCalculated","type":"int256","internalType":"int256"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"hasUpdatedFees","type":"bool","internalType":"bool"},{"name":"feeGrowthGlobalX128","type":"uint256","internalType":"uint256"},{"name":"gaugeFee","type":"uint128","internalType":"uint128"},{"name":"liquidity","type":"uint128","internalType":"uint128"},{"name":"stakedLiquidity","type":"uint128","internalType":"uint128"},{"name":"tickCumulative","type":"int56","internalType":"int56"},{"name":"secondsPerLiquidityCumulativeX128","type":"uint160","internalType":"uint160"},{"name":"computedLatestObservation","type":"bool","internalType":"bool"}],"internalType":"struct ISwapHook.AfterSwapParams"}],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"beforeSwapFee","type":"function","inputs":[{"name":"_swapParams","type":"tuple","components":[{"name":"caller","type":"address","internalType":"address"},{"name":"recipient","type":"address","internalType":"address"},{"name":"zeroForOne","type":"bool","internalType":"bool"},{"name":"amountSpecified","type":"int256","internalType":"int256"},{"name":"sqrtPriceLimitX96","type":"uint160","internalType":"uint160"},{"name":"data","type":"bytes","internalType":"bytes"},{"name":"sqrtPriceX96","type":"uint160","internalType":"uint160"},{"name":"tick","type":"int24","internalType":"int24"}],"internalType":"struct ISwapHook.SwapParams"}],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"burn","type":"function","inputs":[{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"amount","type":"uint128","internalType":"uint128"},{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"amount0","type":"uint256","internalType":"uint256"},{"name":"amount1","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"burn","type":"function","inputs":[{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"amount","type":"uint128","internalType":"uint128"}],"outputs":[{"name":"amount0","type":"uint256","internalType":"uint256"},{"name":"amount1","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"collect","type":"function","inputs":[{"name":"recipient","type":"address","internalType":"address"},{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"amount0Requested","type":"uint128","internalType":"uint128"},{"name":"amount1Requested","type":"uint128","internalType":"uint128"},{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"amount0","type":"uint128","internalType":"uint128"},{"name":"amount1","type":"uint128","internalType":"uint128"}],"stateMutability":"nonpayable"},{"name":"collect","type":"function","inputs":[{"name":"recipient","type":"address","internalType":"address"},{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"amount0Requested","type":"uint128","internalType":"uint128"},{"name":"amount1Requested","type":"uint128","internalType":"uint128"}],"outputs":[{"name":"amount0","type":"uint128","internalType":"uint128"},{"name":"amount1","type":"uint128","internalType":"uint128"}],"stateMutability":"nonpayable"},{"name":"collectFees","type":"function","inputs":[{"name":"recipient","type":"address","internalType":"address"}],"outputs":[{"name":"amount0","type":"uint128","internalType":"uint128"},{"name":"amount1","type":"uint128","internalType":"uint128"}],"stateMutability":"nonpayable"},{"name":"factory","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"factoryRegistry","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"fee","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"feeGrowthGlobal0X128","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"feeGrowthGlobal1X128","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"flash","type":"function","inputs":[{"name":"recipient","type":"address","internalType":"address"},{"name":"amount0","type":"uint256","internalType":"uint256"},{"name":"amount1","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"flashFee","type":"function","inputs":[{"name":"_flashParams","type":"tuple","components":[{"name":"caller","type":"address","internalType":"address"},{"name":"recipient","type":"address","internalType":"address"},{"name":"amount0","type":"uint256","internalType":"uint256"},{"name":"amount1","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}],"internalType":"struct ISwapHook.FlashParams"}],"outputs":[{"name":"_fee","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"gauge","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"gaugeFees","type":"function","inputs":[],"outputs":[{"name":"token0","type":"uint128","internalType":"uint128"},{"name":"token1","type":"uint128","internalType":"uint128"}],"stateMutability":"view"},{"name":"getFeeGrowthInside","type":"function","inputs":[{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"}],"outputs":[{"name":"feeGrowthInside0X128","type":"uint256","internalType":"uint256"},{"name":"feeGrowthInside1X128","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getRewardGrowthInside","type":"function","inputs":[{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"_rewardGrowthGlobalX128","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"rewardGrowthInside","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getSecondsPerStakedLiquidityCumulativeX128","type":"function","inputs":[],"outputs":[{"name":"_cumulative","type":"uint160","internalType":"uint160"}],"stateMutability":"view"},{"name":"increaseObservationCardinalityNext","type":"function","inputs":[{"name":"observationCardinalityNext","type":"uint16","internalType":"uint16"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"initialize","type":"function","inputs":[{"name":"_factory","type":"address","internalType":"address"},{"name":"_token0","type":"address","internalType":"address"},{"name":"_token1","type":"address","internalType":"address"},{"name":"_tickSpacing","type":"int24","internalType":"int24"},{"name":"_factoryRegistry","type":"address","internalType":"address"},{"name":"_sqrtPriceX96","type":"uint160","internalType":"uint160"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"lastUpdated","type":"function","inputs":[],"outputs":[{"name":"","type":"uint48","internalType":"uint48"}],"stateMutability":"view"},{"name":"liquidity","type":"function","inputs":[],"outputs":[{"name":"","type":"uint128","internalType":"uint128"}],"stateMutability":"view"},{"name":"maxLiquidityPerTick","type":"function","inputs":[],"outputs":[{"name":"","type":"uint128","internalType":"uint128"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[{"name":"recipient","type":"address","internalType":"address"},{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"amount","type":"uint128","internalType":"uint128"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"amount0","type":"uint256","internalType":"uint256"},{"name":"amount1","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"nft","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"observations","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"blockTimestamp","type":"uint32","internalType":"uint32"},{"name":"tickCumulative","type":"int56","internalType":"int56"},{"name":"secondsPerLiquidityCumulativeX128","type":"uint160","internalType":"uint160"},{"name":"initialized","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"observe","type":"function","inputs":[{"name":"secondsAgos","type":"uint32[]","internalType":"uint32[]"}],"outputs":[{"name":"tickCumulatives","type":"int56[]","internalType":"int56[]"},{"name":"secondsPerLiquidityCumulativeX128s","type":"uint160[]","internalType":"uint160[]"}],"stateMutability":"view"},{"name":"positions","type":"function","inputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"liquidity","type":"uint128","internalType":"uint128"},{"name":"feeGrowthInside0LastX128","type":"uint256","internalType":"uint256"},{"name":"feeGrowthInside1LastX128","type":"uint256","internalType":"uint256"},{"name":"tokensOwed0","type":"uint128","internalType":"uint128"},{"name":"tokensOwed1","type":"uint128","internalType":"uint128"}],"stateMutability":"view"},{"name":"rewardGrowthGlobalX128","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"rollover","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"secondsPerStakedLiquidityCumulativeX128","type":"function","inputs":[],"outputs":[{"name":"","type":"uint160","internalType":"uint160"}],"stateMutability":"view"},{"name":"setGaugeAndPositionManager","type":"function","inputs":[{"name":"_gauge","type":"address","internalType":"address"},{"name":"_nft","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"settleToBlock","type":"function","inputs":[],"outputs":[{"name":"_rollover","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"slot0","type":"function","inputs":[],"outputs":[{"name":"sqrtPriceX96","type":"uint160","internalType":"uint160"},{"name":"tick","type":"int24","internalType":"int24"},{"name":"observationIndex","type":"uint16","internalType":"uint16"},{"name":"observationCardinality","type":"uint16","internalType":"uint16"},{"name":"observationCardinalityNext","type":"uint16","internalType":"uint16"},{"name":"unlocked","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"snapshotCumulativesInside","type":"function","inputs":[{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"}],"outputs":[{"name":"tickCumulativeInside","type":"int56","internalType":"int56"},{"name":"secondsPerLiquidityInsideX128","type":"uint160","internalType":"uint160"},{"name":"secondsInside","type":"uint32","internalType":"uint32"}],"stateMutability":"view"},{"name":"stake","type":"function","inputs":[{"name":"stakedLiquidityDelta","type":"int128","internalType":"int128"},{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"stakedLiquidity","type":"function","inputs":[],"outputs":[{"name":"","type":"uint128","internalType":"uint128"}],"stateMutability":"view"},{"name":"swap","type":"function","inputs":[{"name":"recipient","type":"address","internalType":"address"},{"name":"zeroForOne","type":"bool","internalType":"bool"},{"name":"amountSpecified","type":"int256","internalType":"int256"},{"name":"sqrtPriceLimitX96","type":"uint160","internalType":"uint160"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"amount0","type":"int256","internalType":"int256"},{"name":"amount1","type":"int256","internalType":"int256"}],"stateMutability":"nonpayable"},{"name":"tickBitmap","type":"function","inputs":[{"name":"","type":"int16","internalType":"int16"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"tickSpacing","type":"function","inputs":[],"outputs":[{"name":"","type":"int24","internalType":"int24"}],"stateMutability":"view"},{"name":"ticks","type":"function","inputs":[{"name":"","type":"int24","internalType":"int24"}],"outputs":[{"name":"liquidityGross","type":"uint128","internalType":"uint128"},{"name":"liquidityNet","type":"int128","internalType":"int128"},{"name":"stakedLiquidityNet","type":"int128","internalType":"int128"},{"name":"feeGrowthOutside0X128","type":"uint256","internalType":"uint256"},{"name":"feeGrowthOutside1X128","type":"uint256","internalType":"uint256"},{"name":"rewardGrowthOutsideX128","type":"uint256","internalType":"uint256"},{"name":"tickCumulativeOutside","type":"int56","internalType":"int56"},{"name":"secondsPerLiquidityOutsideX128","type":"uint160","internalType":"uint160"},{"name":"secondsOutside","type":"uint32","internalType":"uint32"},{"name":"initialized","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"token0","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"token1","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"unstakedFee","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"}],"metadata":{"compiler":{"version":"0.7.6+commit.7338295f"},"language":"Solidity","output":{"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"int24","name":"tickLower","type":"int24"},{"indexed":true,"internalType":"int24","name":"tickUpper","type":"int24"},{"indexed":false,"internalType":"uint128","name":"amount","type":"uint128"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":true,"internalType":"int24","name":"tickLower","type":"int24"},{"indexed":true,"internalType":"int24","name":"tickUpper","type":"int24"},{"indexed":false,"internalType":"uint128","name":"amount0","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"amount1","type":"uint128"}],"name":"Collect","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint128","name":"amount0","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"amount1","type":"uint128"}],"name":"CollectFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paid0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paid1","type":"uint256"}],"name":"Flash","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"observationCardinalityNextOld","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"observationCardinalityNextNew","type":"uint16"}],"name":"IncreaseObservationCardinalityNext","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint160","name":"sqrtPriceX96","type":"uint160"},{"indexed":false,"internalType":"int24","name":"tick","type":"int24"}],"name":"Initialize","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"int24","name":"tickLower","type":"int24"},{"indexed":true,"internalType":"int24","name":"tickUpper","type":"int24"},{"indexed":false,"internalType":"uint128","name":"amount","type":"uint128"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"feeProtocol0Old","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"feeProtocol1Old","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"feeProtocol0New","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"feeProtocol1New","type":"uint8"}],"name":"SetFeeProtocol","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"int256","name":"amount0","type":"int256"},{"indexed":false,"internalType":"int256","name":"amount1","type":"int256"},{"indexed":false,"internalType":"uint160","name":"sqrtPriceX96","type":"uint160"},{"indexed":false,"internalType":"uint128","name":"liquidity","type":"uint128"},{"indexed":false,"internalType":"int24","name":"tick","type":"int24"}],"name":"Swap","type":"event"},{"inputs":[],"name":"DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL_TYPE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SWAP_FEE_CEIL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bool","name":"zeroForOne","type":"bool"},{"internalType":"int256","name":"amountSpecified","type":"int256"},{"internalType":"uint160","name":"sqrtPriceLimitX96","type":"uint160"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint160","name":"sqrtPriceX96","type":"uint160"},{"internalType":"int24","name":"tick","type":"int24"}],"internalType":"struct ISwapHook.SwapParams","name":"_swapParams","type":"tuple"},{"components":[{"internalType":"int256","name":"amountSpecifiedRemaining","type":"int256"},{"internalType":"int256","name":"amountCalculated","type":"int256"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"bool","name":"hasUpdatedFees","type":"bool"},{"internalType":"uint256","name":"feeGrowthGlobalX128","type":"uint256"},{"internalType":"uint128","name":"gaugeFee","type":"uint128"},{"internalType":"uint128","name":"liquidity","type":"uint128"},{"internalType":"uint128","name":"stakedLiquidity","type":"uint128"},{"internalType":"int56","name":"tickCumulative","type":"int56"},{"internalType":"uint160","name":"secondsPerLiquidityCumulativeX128","type":"uint160"},{"internalType":"bool","name":"computedLatestObservation","type":"bool"}],"internalType":"struct ISwapHook.AfterSwapParams","name":"_afterSwapParams","type":"tuple"}],"name":"afterSwapFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bool","name":"zeroForOne","type":"bool"},{"internalType":"int256","name":"amountSpecified","type":"int256"},{"internalType":"uint160","name":"sqrtPriceLimitX96","type":"uint160"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint160","name":"sqrtPriceX96","type":"uint160"},{"internalType":"int24","name":"tick","type":"int24"}],"internalType":"struct ISwapHook.SwapParams","name":"_swapParams","type":"tuple"}],"name":"beforeSwapFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"address","name":"owner","type":"address"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint128","name":"amount","type":"uint128"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint128","name":"amount0Requested","type":"uint128"},{"internalType":"uint128","name":"amount1Requested","type":"uint128"},{"internalType":"address","name":"owner","type":"address"}],"name":"collect","outputs":[{"internalType":"uint128","name":"amount0","type":"uint128"},{"internalType":"uint128","name":"amount1","type":"uint128"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint128","name":"amount0Requested","type":"uint128"},{"internalType":"uint128","name":"amount1Requested","type":"uint128"}],"name":"collect","outputs":[{"internalType":"uint128","name":"amount0","type":"uint128"},{"internalType":"uint128","name":"amount1","type":"uint128"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"collectFees","outputs":[{"internalType":"uint128","name":"amount0","type":"uint128"},{"internalType":"uint128","name":"amount1","type":"uint128"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factoryRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeGrowthGlobal0X128","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeGrowthGlobal1X128","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"flash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct ISwapHook.FlashParams","name":"_flashParams","type":"tuple"}],"name":"flashFee","outputs":[{"internalType":"uint24","name":"_fee","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gauge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gaugeFees","outputs":[{"internalType":"uint128","name":"token0","type":"uint128"},{"internalType":"uint128","name":"token1","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"}],"name":"getFeeGrowthInside","outputs":[{"internalType":"uint256","name":"feeGrowthInside0X128","type":"uint256"},{"internalType":"uint256","name":"feeGrowthInside1X128","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint256","name":"_rewardGrowthGlobalX128","type":"uint256"}],"name":"getRewardGrowthInside","outputs":[{"internalType":"uint256","name":"rewardGrowthInside","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSecondsPerStakedLiquidityCumulativeX128","outputs":[{"internalType":"uint160","name":"_cumulative","type":"uint160"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"observationCardinalityNext","type":"uint16"}],"name":"increaseObservationCardinalityNext","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"int24","name":"_tickSpacing","type":"int24"},{"internalType":"address","name":"_factoryRegistry","type":"address"},{"internalType":"uint160","name":"_sqrtPriceX96","type":"uint160"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastUpdated","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidity","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxLiquidityPerTick","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mint","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nft","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"observations","outputs":[{"internalType":"uint32","name":"blockTimestamp","type":"uint32"},{"internalType":"int56","name":"tickCumulative","type":"int56"},{"internalType":"uint160","name":"secondsPerLiquidityCumulativeX128","type":"uint160"},{"internalType":"bool","name":"initialized","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32[]","name":"secondsAgos","type":"uint32[]"}],"name":"observe","outputs":[{"internalType":"int56[]","name":"tickCumulatives","type":"int56[]"},{"internalType":"uint160[]","name":"secondsPerLiquidityCumulativeX128s","type":"uint160[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"positions","outputs":[{"internalType":"uint128","name":"liquidity","type":"uint128"},{"internalType":"uint256","name":"feeGrowthInside0LastX128","type":"uint256"},{"internalType":"uint256","name":"feeGrowthInside1LastX128","type":"uint256"},{"internalType":"uint128","name":"tokensOwed0","type":"uint128"},{"internalType":"uint128","name":"tokensOwed1","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardGrowthGlobalX128","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rollover","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"secondsPerStakedLiquidityCumulativeX128","outputs":[{"internalType":"uint160","name":"","type":"uint160"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"address","name":"_nft","type":"address"}],"name":"setGaugeAndPositionManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"settleToBlock","outputs":[{"internalType":"uint256","name":"_rollover","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"slot0","outputs":[{"internalType":"uint160","name":"sqrtPriceX96","type":"uint160"},{"internalType":"int24","name":"tick","type":"int24"},{"internalType":"uint16","name":"observationIndex","type":"uint16"},{"internalType":"uint16","name":"observationCardinality","type":"uint16"},{"internalType":"uint16","name":"observationCardinalityNext","type":"uint16"},{"internalType":"bool","name":"unlocked","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"}],"name":"snapshotCumulativesInside","outputs":[{"internalType":"int56","name":"tickCumulativeInside","type":"int56"},{"internalType":"uint160","name":"secondsPerLiquidityInsideX128","type":"uint160"},{"internalType":"uint32","name":"secondsInside","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int128","name":"stakedLiquidityDelta","type":"int128"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakedLiquidity","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bool","name":"zeroForOne","type":"bool"},{"internalType":"int256","name":"amountSpecified","type":"int256"},{"internalType":"uint160","name":"sqrtPriceLimitX96","type":"uint160"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[{"internalType":"int256","name":"amount0","type":"int256"},{"internalType":"int256","name":"amount1","type":"int256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int16","name":"","type":"int16"}],"name":"tickBitmap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tickSpacing","outputs":[{"internalType":"int24","name":"","type":"int24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int24","name":"","type":"int24"}],"name":"ticks","outputs":[{"internalType":"uint128","name":"liquidityGross","type":"uint128"},{"internalType":"int128","name":"liquidityNet","type":"int128"},{"internalType":"int128","name":"stakedLiquidityNet","type":"int128"},{"internalType":"uint256","name":"feeGrowthOutside0X128","type":"uint256"},{"internalType":"uint256","name":"feeGrowthOutside1X128","type":"uint256"},{"internalType":"uint256","name":"rewardGrowthOutsideX128","type":"uint256"},{"internalType":"int56","name":"tickCumulativeOutside","type":"int56"},{"internalType":"uint160","name":"secondsPerLiquidityOutsideX128","type":"uint160"},{"internalType":"uint32","name":"secondsOutside","type":"uint32"},{"internalType":"bool","name":"initialized","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unstakedFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"}],"devdoc":{"kind":"dev","methods":{"afterSwapFee((address,address,bool,int256,uint160,bytes,uint160,int24),(int256,int256,uint24,bool,uint256,uint128,uint128,uint128,int56,uint160,bool))":{"params":{"_afterSwapParams":"Post-swap execution state and oracle/liquidity context.","_swapParams":"Swap context and post-swap pool state."},"returns":{"_0":"The post-swap fee."}},"beforeSwapFee((address,address,bool,int256,uint160,bytes,uint160,int24))":{"params":{"_swapParams":"Swap context and pre-swap pool state."},"returns":{"_0":"The pre-swap fee."}},"burn(int24,int24,uint128)":{"details":"Can be used to trigger a recalculation of fees owed to a position by calling with an amount of 0Fees must be collected separately via a call to #collect","params":{"amount":"How much liquidity to burn","tickLower":"The lower tick of the position for which to burn liquidity","tickUpper":"The upper tick of the position for which to burn liquidity"},"returns":{"amount0":"The amount of token0 sent to the recipient","amount1":"The amount of token1 sent to the recipient"}},"burn(int24,int24,uint128,address)":{"details":"Can be used to trigger a recalculation of fees owed to a position by calling with an amount of 0Fees must be collected separately via a call to #collect","params":{"amount":"How much liquidity to burn","owner":"Owner of the position in the pool (nft manager or gauge)","tickLower":"The lower tick of the position for which to burn liquidity","tickUpper":"The upper tick of the position for which to burn liquidity"},"returns":{"amount0":"The amount of token0 sent to the recipient","amount1":"The amount of token1 sent to the recipient"}},"collect(address,int24,int24,uint128,uint128)":{"details":"Does not recompute fees earned, which must be done either via mint or burn of any amount of liquidity. Collect must be called by the position owner. To withdraw only token0 or only token1, amount0Requested or amount1Requested may be set to zero. To withdraw all tokens owed, caller may pass any value greater than the actual tokens owed, e.g. type(uint128).max. Tokens owed may be from accumulated swap fees or burned liquidity.","params":{"amount0Requested":"How much token0 should be withdrawn from the fees owed","amount1Requested":"How much token1 should be withdrawn from the fees owed","recipient":"The address which should receive the fees collected","tickLower":"The lower tick of the position for which to collect fees","tickUpper":"The upper tick of the position for which to collect fees"},"returns":{"amount0":"The amount of fees collected in token0","amount1":"The amount of fees collected in token1"}},"collect(address,int24,int24,uint128,uint128,address)":{"details":"Does not recompute fees earned, which must be done either via mint or burn of any amount of liquidity. Collect must be called by the position owner. To withdraw only token0 or only token1, amount0Requested or amount1Requested may be set to zero. To withdraw all tokens owed, caller may pass any value greater than the actual tokens owed, e.g. type(uint128).max. Tokens owed may be from accumulated swap fees or burned liquidity.","params":{"amount0Requested":"How much token0 should be withdrawn from the fees owed","amount1Requested":"How much token1 should be withdrawn from the fees owed","owner":"Owner of the position in the pool (nft manager or gauge)","recipient":"The address which should receive the fees collected","tickLower":"The lower tick of the position for which to collect fees","tickUpper":"The upper tick of the position for which to collect fees"},"returns":{"amount0":"The amount of fees collected in token0","amount1":"The amount of fees collected in token1"}},"collectFees(address)":{"params":{"recipient":"The address that receives the claimed gauge fees"},"returns":{"amount0":"The gauge fee collected in token0","amount1":"The gauge fee collected in token1"}},"fee()":{"details":"This method can be used for \"legacy\" swap fee modules.","returns":{"_0":"The swap fee."}},"flash(address,uint256,uint256,bytes)":{"details":"The caller of this method receives a callback in the form of ICLFlashCallback#uniswapV3FlashCallbackCan be used to donate underlying tokens pro-rata to currently in-range liquidity providers by calling with 0 amount{0,1} and sending the donation amount(s) from the callback","params":{"amount0":"The amount of token0 to send","amount1":"The amount of token1 to send","data":"Any data to be passed through to the callback","recipient":"The address which will receive the token0 and token1 amounts"}},"flashFee((address,address,uint256,uint256,bytes))":{"params":{"_flashParams":"Arguments passed to the flash function."},"returns":{"_fee":"The flash fee."}},"getFeeGrowthInside(int24,int24)":{"params":{"tickLower":"The lower tick of the range","tickUpper":"The upper tick of the range"},"returns":{"feeGrowthInside0X128":"The token0 fee growth in range.","feeGrowthInside1X128":"The token1 fee growth in range."}},"getRewardGrowthInside(int24,int24,uint256)":{"details":"Used in gauge reward/earned calculations","params":{"_rewardGrowthGlobalX128":"a calculated rewardGrowthGlobalX128 or 0 (in case of 0 it means we use the rewardGrowthGlobalX128 from state)","tickLower":"The lower tick of the range","tickUpper":"The upper tick of the range"},"returns":{"rewardGrowthInside":"The reward growth in the range"}},"getSecondsPerStakedLiquidityCumulativeX128()":{"returns":{"_cumulative":"The Q128.128 seconds per staked liquidity cumulative as of the current block"}},"increaseObservationCardinalityNext(uint16)":{"details":"This method is no-op if the pool already has an observationCardinalityNext greater than or equal to the input observationCardinalityNext.","params":{"observationCardinalityNext":"The desired minimum number of observations for the pool to store"}},"initialize(address,address,address,int24,address,uint160)":{"details":"Can be called once only Price is represented as a sqrt(amountToken1/amountToken0) Q64.96 valuenot locked because it initializes unlocked","params":{"_factory":"The CL factory contract address","_factoryRegistry":"The address of the factory registry managing the pool factory","_sqrtPriceX96":"The initial sqrt price of the pool, as a Q64.96","_tickSpacing":"The pool tick spacing","_token0":"The first token of the pool by address sort order","_token1":"The second token of the pool by address sort order"}},"mint(address,int24,int24,uint128,bytes)":{"details":"The caller of this method receives a callback in the form of ICLMintCallback#uniswapV3MintCallback in which they must pay any token0 or token1 owed for the liquidity. The amount of token0/token1 due depends on tickLower, tickUpper, the amount of liquidity, and the current price.","params":{"amount":"The amount of liquidity to mint","data":"Any data that should be passed through to the callback","recipient":"The address for which the liquidity will be created","tickLower":"The lower tick of the position in which to add liquidity","tickUpper":"The upper tick of the position in which to add liquidity"},"returns":{"amount0":"The amount of token0 that was paid to mint the given amount of liquidity. Matches the value in the callback","amount1":"The amount of token1 that was paid to mint the given amount of liquidity. Matches the value in the callback"}},"observe(uint32[])":{"details":"To get a time weighted average tick or liquidity-in-range, you must call this with two values, one representing the beginning of the period and another for the end of the period. E.g., to get the last hour time-weighted average tick, you must call it with secondsAgos = [3600, 0].The time weighted average tick represents the geometric time weighted average price of the pool, in log base sqrt(1.0001) of token1 / token0. The TickMath library can be used to go from a tick value to a ratio.","params":{"secondsAgos":"From how long ago each cumulative tick and liquidity value should be returned"},"returns":{"secondsPerLiquidityCumulativeX128s":"Cumulative seconds per liquidity-in-range value as of each `secondsAgos` from the current block timestamp","tickCumulatives":"Cumulative tick values as of each `secondsAgos` from the current block timestamp"}},"setGaugeAndPositionManager(address,address)":{"details":"Callable only once, by the gauge factory","params":{"_gauge":"The gauge corresponding to this pool","_nft":"The position manager used for position management"}},"settleToBlock()":{"details":"Only callable by the gauge. Pulls the emissions accrued since the last settlement through the gauge.","returns":{"_rollover":"the emissions accumulated while no staked liquidity was in range. Reset to 0 after this call."}},"snapshotCumulativesInside(int24,int24)":{"details":"Snapshots must only be compared to other snapshots, taken over a period for which a position existed. I.e., snapshots cannot be compared if a position is not held for the entire period between when the first snapshot is taken and the second snapshot is taken.","params":{"tickLower":"The lower tick of the range","tickUpper":"The upper tick of the range"},"returns":{"secondsInside":"The snapshot of seconds per liquidity for the range","secondsPerLiquidityInsideX128":"The snapshot of seconds per liquidity for the range","tickCumulativeInside":"The snapshot of the tick accumulator for the range"}},"stake(int128,int24,int24)":{"params":{"stakedLiquidityDelta":"The amount by which to increase or decrease the staked liquidity","tickLower":"The lower tick of the position for which to stake liquidity","tickUpper":"The upper tick of the position for which to stake liquidity"}},"swap(address,bool,int256,uint160,bytes)":{"details":"The caller of this method receives a callback in the form of ICLSwapCallback#uniswapV3SwapCallback","params":{"amountSpecified":"The amount of the swap, which implicitly configures the swap as exact input (positive), or exact output (negative)","data":"Any data to be passed through to the callback","recipient":"The address to receive the output of the swap","sqrtPriceLimitX96":"The Q64.96 sqrt price limit. If zero for one, the price cannot be less than this value after the swap. If one for zero, the price cannot be greater than this value after the swap","zeroForOne":"The direction of the swap, true for token0 to token1, false for token1 to token0"},"returns":{"amount0":"The delta of the balance of token0 of the pool, exact when negative, minimum when positive","amount1":"The delta of the balance of token1 of the pool, exact when negative, minimum when positive"}},"unstakedFee()":{"details":"Can be modified in PoolFactory on a pool basis or upgraded to be dynamic.","returns":{"_0":"The unstaked fee"}}},"stateVariables":{"DENOMINATOR":{"return":"The denominator value in pips."},"POOL_TYPE":{"return":"The pool type label to be able to identify the type of pool"},"SWAP_FEE_CEIL":{"return":"The swap fee ceiling value in pips."},"factory":{"return":"The contract address"},"factoryRegistry":{"return":"The factory registry contract address"},"feeGrowthGlobal0X128":{"details":"This value can overflow the uint256"},"feeGrowthGlobal1X128":{"details":"This value can overflow the uint256"},"gauge":{"return":"The gauge contract address"},"gaugeFees":{"details":"Gauge fees will never exceed uint128 max in either token"},"liquidity":{"details":"This value has no relationship to the total liquidity across all ticksThis value includes staked liquidity"},"maxLiquidityPerTick":{"details":"This parameter is enforced per tick to prevent liquidity from overflowing a uint128 at any point, and also prevents out-of-range liquidity from being used to prevent adding in-range liquidity to a pool","return":"The max amount of liquidity per tick"},"nft":{"return":"The nft manager contract address"},"observations":{"details":"You most likely want to use #observe() instead of this method to get an observation as of some amount of time ago, rather than at a specific index in the array.","params":{"index":"The element of the observations array to fetch"},"return":"blockTimestamp The timestamp of the observation, Returns tickCumulative the tick multiplied by seconds elapsed for the life of the pool as of the observation timestamp, Returns secondsPerLiquidityCumulativeX128 the seconds per in range liquidity for the life of the pool as of the observation timestamp, Returns initialized whether the observation has been initialized and the values are safe to use"},"positions":{"params":{"key":"The position's key is a hash of a preimage composed by the owner, tickLower and tickUpper"},"return":"_liquidity The amount of liquidity in the position, Returns feeGrowthInside0LastX128 fee growth of token0 inside the tick range as of the last mint/burn/poke, Returns feeGrowthInside1LastX128 fee growth of token1 inside the tick range as of the last mint/burn/poke, Returns tokensOwed0 the computed amount of token0 owed to the position as of the last mint/burn/poke, Returns tokensOwed1 the computed amount of token1 owed to the position as of the last mint/burn/poke"},"rewardGrowthGlobalX128":{"details":"This value can overflow the uint256"},"secondsPerStakedLiquidityCumulativeX128":{"return":"The Q128.128 stored seconds per staked liquidity cumulative"},"slot0":{"return":"sqrtPriceX96 The current price of the pool as a sqrt(token1/token0) Q64.96 value tick The current tick of the pool, i.e. according to the last tick transition that was run. This value may not always be equal to SqrtTickMath.getTickAtSqrtRatio(sqrtPriceX96) if the price is on a tick boundary. observationIndex The index of the last oracle observation that was written, observationCardinality The current maximum number of observations stored in the pool, observationCardinalityNext The next maximum number of observations, to be updated when the observation. unlocked Whether the pool is currently locked to reentrancy"},"stakedLiquidity":{"details":"This value has no relationship to the total staked liquidity across all ticks"},"tickSpacing":{"details":"Ticks can only be used at multiples of this value, minimum of 1 and always positive e.g.: a tickSpacing of 3 means ticks can be initialized every 3rd tick, i.e., ..., -6, -3, 0, 3, 6, ... This value is an int24 to avoid casting even though it is always positive.","return":"The tick spacing"},"ticks":{"params":{"tick":"The tick to look up"},"return":"liquidityGross the total amount of position liquidity that uses the pool either as tick lower or tick upper, liquidityNet how much liquidity changes when the pool price crosses the tick, stakedLiquidityNet how much staked liquidity changes when the pool price crosses the tick, feeGrowthOutside0X128 the fee growth on the other side of the tick from the current tick in token0, feeGrowthOutside1X128 the fee growth on the other side of the tick from the current tick in token1, rewardGrowthOutsideX128 the reward growth on the other side of the tick from the current tick in emission token tickCumulativeOutside the cumulative tick value on the other side of the tick from the current tick secondsPerLiquidityOutsideX128 the seconds spent per liquidity on the other side of the tick from the current tick, secondsOutside the seconds spent on the other side of the tick from the current tick, initialized Set to true if the tick is initialized, i.e. liquidityGross is greater than 0, otherwise equal to false. Outside values can only be used if the tick is initialized, i.e. if liquidityGross is greater than 0. In addition, these values are only relative and must be used only in comparison to previous snapshots for a specific position."},"token0":{"return":"The token contract address"},"token1":{"return":"The token contract address"}},"version":1},"userdoc":{"events":{"Burn(address,int24,int24,uint128,uint256,uint256)":{"notice":"Emitted when a position's liquidity is removed"},"Collect(address,address,int24,int24,uint128,uint128)":{"notice":"Emitted when fees are collected by the owner of a position"},"CollectFees(address,uint128,uint128)":{"notice":"Emitted when the collected protocol fees are withdrawn by the gauge"},"Flash(address,address,uint256,uint256,uint256,uint256)":{"notice":"Emitted by the pool for any flashes of token0/token1"},"IncreaseObservationCardinalityNext(uint16,uint16)":{"notice":"Emitted by the pool for increases to the number of observations that can be stored"},"Initialize(uint160,int24)":{"notice":"Emitted exactly once by a pool when #initialize is first called on the pool"},"Mint(address,address,int24,int24,uint128,uint256,uint256)":{"notice":"Emitted when liquidity is minted for a given position"},"SetFeeProtocol(uint8,uint8,uint8,uint8)":{"notice":"Emitted when the protocol fee is changed by the pool"},"Swap(address,address,int256,int256,uint160,uint128,int24)":{"notice":"Emitted by the pool for any swaps between token0 and token1"}},"kind":"user","methods":{"DENOMINATOR()":{"notice":"The denominator used for fees computation."},"POOL_TYPE()":{"notice":"The pool type identifier"},"SWAP_FEE_CEIL()":{"notice":"The ceiling applied to the before/after swap fee."},"afterSwapFee((address,address,bool,int256,uint160,bytes,uint160,int24),(int256,int256,uint24,bool,uint256,uint128,uint128,uint128,int56,uint160,bool))":{"notice":"The pool's post-swap swap fee in pips, i.e. 1e-6"},"beforeSwapFee((address,address,bool,int256,uint160,bytes,uint160,int24))":{"notice":"The pool's pre-swap swap fee in pips, i.e. 1e-6"},"burn(int24,int24,uint128)":{"notice":"Burn liquidity from the sender and account tokens owed for the liquidity to the position"},"burn(int24,int24,uint128,address)":{"notice":"Burn liquidity from the supplied owner and account tokens owed for the liquidity to the position"},"collect(address,int24,int24,uint128,uint128)":{"notice":"Collects tokens owed to a position"},"collect(address,int24,int24,uint128,uint128,address)":{"notice":"Collects tokens owed to a position"},"collectFees(address)":{"notice":"Collect the gauge fee accrued to the pool"},"factory()":{"notice":"The contract that deployed the pool, which must adhere to the ICLFactory interface"},"factoryRegistry()":{"notice":"The factory registry that manages pool <> gauge <> reward factory relationships"},"fee()":{"notice":"The pool's swap fee in pips, i.e. 1e-6"},"feeGrowthGlobal0X128()":{"notice":"The fee growth as a Q128.128 fees of token0 collected per unit of liquidity for the entire life of the pool"},"feeGrowthGlobal1X128()":{"notice":"The fee growth as a Q128.128 fees of token1 collected per unit of liquidity for the entire life of the pool"},"flash(address,uint256,uint256,bytes)":{"notice":"Receive token0 and/or token1 and pay it back, plus a fee, in the callback"},"flashFee((address,address,uint256,uint256,bytes))":{"notice":"The pool's flash fee in pips, i.e. 1e-6"},"gauge()":{"notice":"The gauge corresponding to this pool"},"gaugeFees()":{"notice":"The amounts of token0 and token1 that are owed to the gauge"},"getFeeGrowthInside(int24,int24)":{"notice":"Returns data about fee growth within a tick range."},"getRewardGrowthInside(int24,int24,uint256)":{"notice":"Returns data about reward growth within a tick range. RewardGrowthGlobalX128 can be supplied as a parameter for claimable reward calculations."},"getSecondsPerStakedLiquidityCumulativeX128()":{"notice":"The seconds per staked liquidity cumulative projected to the current block timestamp"},"increaseObservationCardinalityNext(uint16)":{"notice":"Increase the maximum number of price and liquidity observations that this pool will store"},"initialize(address,address,address,int24,address,uint160)":{"notice":"Initialize function used in proxy deployment"},"lastUpdated()":{"notice":"Last time the pool reward growth was advanced"},"liquidity()":{"notice":"The currently in range liquidity available to the pool"},"maxLiquidityPerTick()":{"notice":"The maximum amount of position liquidity that can use any tick in the range"},"mint(address,int24,int24,uint128,bytes)":{"notice":"Adds liquidity for the given recipient/tickLower/tickUpper position"},"nft()":{"notice":"The nft manager"},"observations(uint256)":{"notice":"Returns data about a specific observation index"},"observe(uint32[])":{"notice":"Returns the cumulative tick and liquidity as of each timestamp `secondsAgo` from the current block timestamp"},"positions(bytes32)":{"notice":"Returns the information about a position by the position's key"},"rewardGrowthGlobalX128()":{"notice":"The reward growth as a Q128.128 rewards of emission collected per unit of liquidity for the entire life of the pool"},"rollover()":{"notice":"Emissions accrued while no staked liquidity was in range"},"secondsPerStakedLiquidityCumulativeX128()":{"notice":"The cumulative seconds per unit of in-range staked liquidity as of lastUpdated"},"setGaugeAndPositionManager(address,address)":{"notice":"Initialize gauge and nft manager"},"settleToBlock()":{"notice":"Settles the pool's reward growth to the current block timestamp and returns the accrued rollover"},"slot0()":{"notice":"The 0th storage slot in the pool stores many values, and is exposed as a single method to save gas when accessed externally."},"snapshotCumulativesInside(int24,int24)":{"notice":"Returns a snapshot of the tick cumulative, seconds per liquidity and seconds inside a tick range"},"stake(int128,int24,int24)":{"notice":"Convert existing liquidity into staked liquidityOnly callable by the gauge associated with this pool"},"stakedLiquidity()":{"notice":"The currently in range staked liquidity available to the pool"},"swap(address,bool,int256,uint160,bytes)":{"notice":"Swap token0 for token1, or token1 for token0"},"tickBitmap(int16)":{"notice":"Returns 256 packed tick initialized boolean values. See TickBitmap for more information"},"tickSpacing()":{"notice":"The pool tick spacing"},"ticks(int24)":{"notice":"Look up information about a specific tick in the pool"},"token0()":{"notice":"The first of the two tokens of the pool, sorted by address"},"token1()":{"notice":"The second of the two tokens of the pool, sorted by address"},"unstakedFee()":{"notice":"The pool's unstaked fee in pips, i.e. 1e-6"}},"version":1}},"settings":{"compilationTarget":{"contracts/core/CLPool.sol":"CLPool"},"evmVersion":"istanbul","libraries":{"contracts/core/CLPool.sol:CLPoolNonSwapPath":"0x1ad7a8703ebff81c0d753190938f228672ec7e42"},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":["/Users/acx/code/dromos/metadex-slipstream/node_modules/@hyperlane-xyz/:@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable-v4/","/Users/acx/code/dromos/metadex-slipstream/node_modules/@hyperlane-xyz/:@openzeppelin/contracts/=node_modules/@openzeppelin/contracts-v4/","/Users/acx/code/dromos/metadex-slipstream/node_modules/metadex/:@hyperlane/contracts/=node_modules/@hyperlane-xyz/core/contracts/","/Users/acx/code/dromos/metadex-slipstream/node_modules/metadex/:@nomad-xyz/src/=node_modules/metadex/node_modules/@nomad-xyz/excessively-safe-call/src/","/Users/acx/code/dromos/metadex-slipstream/node_modules/metadex/:@openzeppelin/contracts/=node_modules/metadex/node_modules/@openzeppelin/contracts/","/Users/acx/code/dromos/metadex-slipstream/node_modules/metadex/:@solady/=node_modules/solady/src/","/Users/acx/code/dromos/metadex-slipstream/test/invariants/fuzz/:@openzeppelin/contracts/=node_modules/metadex/node_modules/@openzeppelin/contracts/",":@hyperlane-v11/contracts/=node_modules/@hyperlane-xyz/core-v11/contracts/",":@hyperlane/contracts/=node_modules/@hyperlane-xyz/core/contracts/",":@nomad-xyz/excessively-safe-call/=node_modules/@nomad-xyz/excessively-safe-call/",":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/",":@solady/=node_modules/solady/src/",":@uniswap/lib/=node_modules/@uniswap/lib/",":V3-script/=node_modules/metadex/V3/script/",":V3-test/=node_modules/metadex/V3/test/",":V3/=node_modules/metadex/V3/src/",":base64-sol/=node_modules/base64-sol/",":forge-std/=node_modules/forge-std/src/","node_modules/@hyperlane-xyz/:@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable-v4/","node_modules/@hyperlane-xyz/:@openzeppelin/contracts/=node_modules/@openzeppelin/contracts-v4/","node_modules/metadex/:@hyperlane/contracts/=node_modules/@hyperlane-xyz/core/contracts/","node_modules/metadex/:@nomad-xyz/src/=node_modules/metadex/node_modules/@nomad-xyz/excessively-safe-call/src/","node_modules/metadex/:@openzeppelin/contracts/=node_modules/metadex/node_modules/@openzeppelin/contracts/","node_modules/metadex/:@solady/=node_modules/solady/src/","test/invariants/fuzz/:@openzeppelin/contracts/=node_modules/metadex/node_modules/@openzeppelin/contracts/"]},"sources":{"contracts/core/CLPool.sol":{"keccak256":"0x21952d180e6b072173e06e54a21f832b0417b4cb26e6e63c19c2b7a16e716405","license":"GPL-2.0-or-later","urls":["bzz-raw://be7ccacefe6ea2da27b33c4f226ad10b737a874aba9dae6327714c78eac67610","dweb:/ipfs/QmW7eszThYGkS3y9GZEkJvueVkNeAVcN9HDUWXPRVBMVkW"]},"contracts/core/interfaces/ICLFactory.sol":{"keccak256":"0x6b01a592afa921d9200147b2b48b8245ef0448a5857618157a10deb567773b95","license":"GPL-2.0-or-later","urls":["bzz-raw://39c0ce02aba69bfa68340c5da95369e25f8b9c7aae109687b6944f48bd0d92f5","dweb:/ipfs/QmcKhrU7wsp2zp27yMr7sK4cejSZqE9a7mLn3WuS77o5Fg"]},"contracts/core/interfaces/ICLPool.sol":{"keccak256":"0x142a7b4607c241a8273cc4595f69194907ebe23b0776c0b35b8a32c1bb1085ae","license":"GPL-2.0-or-later","urls":["bzz-raw://16464b911c254cf1323a3a905d4dd70c4d927796980020363d9eea5eb53e09b5","dweb:/ipfs/QmXhrbfamQYxw7iRuYWwp5Ha7VDD73ofjWdfr5Z96kBokg"]},"contracts/core/interfaces/IERC20Minimal.sol":{"keccak256":"0x00108fbf3411855a1b5e7f20a267bcf26884d61ed389ba4d0bcbb5dc2255dc7d","license":"GPL-2.0-or-later","urls":["bzz-raw://6b366c535920373b2f6fb3d8e78ceac0af42f6daa5a337d0c758074ed904a47b","dweb:/ipfs/QmaFgAttscSGNy9e2acyoAB3azT1YCcouotu7uvZYMHuci"]},"contracts/core/interfaces/IFactoryRegistry.sol":{"keccak256":"0x2e421d5169239b98f359cf7d0a63d7211d1c89b6d1a1d08834af44a253d8a19b","license":"MIT","urls":["bzz-raw://d06bd38918b48ba8425568989020336def562bc525c4ece6bdabe41b6e33b71c","dweb:/ipfs/QmcJkL2EVEMCbfK7g7Bo8Qpz58frKxeDeTvPFJPMAmCqJR"]},"contracts/core/interfaces/callback/ICLFlashCallback.sol":{"keccak256":"0x6c23a765e14f8b7bdf27c7c65768714e32a70ad71061a69870b034929af59712","license":"GPL-2.0-or-later","urls":["bzz-raw://556e520d0e08ea9965edf6936d89d41251968ae53f310668bf8f1918eb3e7a63","dweb:/ipfs/QmefdyHuxQo2kj19YWWJyMPiMxGZaMS8tsvBQCei3SKyay"]},"contracts/core/interfaces/callback/ICLMintCallback.sol":{"keccak256":"0x5b7db3791cfdca4e550ea4c619564d62691983989d29f7a4a6b75d6d97ec8a1c","license":"GPL-2.0-or-later","urls":["bzz-raw://b578c7a7f228fa5fcb61a52461cbfed428ba9a8b55ad5f274f1c38f901caf8b1","dweb:/ipfs/Qmf6vVwCq7CztbGWsoxf98zedTW5iHs5HuYFU3qctaR7zw"]},"contracts/core/interfaces/callback/ICLSwapCallback.sol":{"keccak256":"0x87ec24dc94b3bbaf641695a1bc03836be342776ffc04b6fe04791c5f53d7f093","license":"GPL-2.0-or-later","urls":["bzz-raw://06a58dcc2f54152868a7ce8d54c4dabee3cb6153b49e820fc4ded04bf22f1f10","dweb:/ipfs/QmYKvLJLrWHVdsK9KHz364waBQXsrdvvzrv1RZ7GPZpJdY"]},"contracts/core/interfaces/hook/ISwapHook.sol":{"keccak256":"0xc74295f27ce01f19a09eb6f16f99eac4af519e2d0393a544e9f3b1a34520e8a3","license":"MIT","urls":["bzz-raw://b4825d93936c9381034a8ef2dde7af5d8b0045339398a994137e71d34eb0f04a","dweb:/ipfs/QmUE3kxAt4eqaxvpAou9HohfLJJHAN9TDsQru5GcevP7mV"]},"contracts/core/interfaces/pool/ICLPoolActions.sol":{"keccak256":"0xdf23dde2b776abfdbd7cd1d4f4c41482e7f871c43b28cbefd926819b5ba526ac","license":"GPL-2.0-or-later","urls":["bzz-raw://6df58f44b34ed212b4867ade7ed2cc0568b708c211d4d358612eaf1fcfabe8ad","dweb:/ipfs/QmTny5q14RVeCtKWHEzn61mH5ME3juKetSwWKzhjPVRsFv"]},"contracts/core/interfaces/pool/ICLPoolConstants.sol":{"keccak256":"0xd850ffa73045e1df8c292ea8573a5c3b71cf12fb79db37aadfb5002d118f3184","license":"GPL-2.0-or-later","urls":["bzz-raw://b8471603ee45b3c60d76b2b3d81e2beb889cbcb0012959de57c329ddde6b0a8f","dweb:/ipfs/QmewP8DPRNhDFryaTQvY7HDMboJpr5b8JEafd9RAcWCUpi"]},"contracts/core/interfaces/pool/ICLPoolDerivedState.sol":{"keccak256":"0x31a97d3e2ac1cc70ed5ef57d9fd9054f112311e9459340860fe0d8d01d6d29c3","license":"GPL-2.0-or-later","urls":["bzz-raw://0d91ad8e6884f0de2bed81067ae8db881180d72b76e148587e97dafa676e3f76","dweb:/ipfs/QmVXQERqhnRWGRmoV7z3iBFb5SbnHQiAr5X3nhwA4rY57X"]},"contracts/core/interfaces/pool/ICLPoolEvents.sol":{"keccak256":"0x51a30a3b2e298c62fa80a8679a1e50c3991babcea42bcab2d1e96e173b48fff7","license":"GPL-2.0-or-later","urls":["bzz-raw://522018342062fbef4fba4c64ec2ab97aa75d57f9fb9466c7dc06333271bbd2c9","dweb:/ipfs/QmWQhgYhmawcpKuC6GHJeoSv7eUHYAAAMS7brr5PxMDGDD"]},"contracts/core/interfaces/pool/ICLPoolOwnerActions.sol":{"keccak256":"0xcd81b763e236fc198c42040990f7ce053638e8e5b74f94be89d90e31b2b8f4c1","license":"GPL-2.0-or-later","urls":["bzz-raw://4915b8e08201bede11c3776749890ccd135fc1760bd24fe4a98b689d32192320","dweb:/ipfs/QmadoRNBUZyAFQysms1GT6gzm6Jk9vZuhjUGQEc49n5nZR"]},"contracts/core/interfaces/pool/ICLPoolState.sol":{"keccak256":"0x673671315af9174aa03f8c992a710deef960b6433b5cd5e981071f6240e14147","license":"GPL-2.0-or-later","urls":["bzz-raw://aeccf5e446164201ac9e991cd05c837ebe0ece98a63c46106d8675635ee273f0","dweb:/ipfs/QmULkmq54XED1butftsUrrrF7dzgepvGtm43aDySTjNoT1"]},"contracts/core/libraries/BitMath.sol":{"keccak256":"0x04cb72e8761b2ed72457fbf5cad848654f0ff695e9d92e9132541acdbf95a3e6","license":"GPL-2.0-or-later","urls":["bzz-raw://289546abac263d328a617c8b8d89b7edea7c0c5e3d4f47ab70f1683edecc1655","dweb:/ipfs/QmfRCemeVDNKtT2QU4ANzs5ZiW7met1ZoFthAS6hzEHx4T"]},"contracts/core/libraries/CLPoolNonSwapPath.sol":{"keccak256":"0x91239f1f6f96adbc3ee4ac8c0b226792f48ba2348dd02573b0f7bb38b30ae8b9","license":"GPL-2.0-or-later","urls":["bzz-raw://41ad55c3bd113808ecde1b5604ba2fe07b911ccbd15e66fc6d7fadff4247673c","dweb:/ipfs/QmboT2SKrZpZLsf8piLpyprh46rPC23F4jB6YzruVseM6V"]},"contracts/core/libraries/FixedPoint128.sol":{"keccak256":"0xe9861d501114fbce92ac0648419ff864de0538a902e2439b0861dda25ba4dd72","license":"GPL-2.0-or-later","urls":["bzz-raw://1ca8c2928f2cecf5223c97ae2e6a32990aa43d430da00cd2964da080432678ba","dweb:/ipfs/QmT1HKsnp4eHZVPKSmXQLGHyjQLXSA8qLv7V346CyF2uv7"]},"contracts/core/libraries/FixedPoint96.sol":{"keccak256":"0xed854d4a675a82b8288bfe99d096b459fecfdf96d844a5568389e21b6e7161e0","license":"GPL-2.0-or-later","urls":["bzz-raw://3d6ce8fe6be435a4b7e4245959dc2f93878435ba4a9ffa725014573bda34a117","dweb:/ipfs/Qmay3HJKUbsC6GNFC3HGz69JpZzNuixgYGjH4VatVzwxRB"]},"contracts/core/libraries/FullMath.sol":{"keccak256":"0xbd25ef2d1a953c4edf6233772e736583d3c5a70575150e5b330ba15bc481170d","license":"MIT","urls":["bzz-raw://101c3c3729b16cd493c47aa710056c5758444ce1d33e3110dfb88fdd6101cc67","dweb:/ipfs/QmUpNgbBmrFqZABt5n88feCL8jmpbP7B4u6r6cXcTVbFhJ"]},"contracts/core/libraries/LiquidityMath.sol":{"keccak256":"0x0bfa12a450f79bf5867da99ebdec70fa716343bf5a4ee86df74029b67120361d","license":"GPL-2.0-or-later","urls":["bzz-raw://25cbb3b5a49afadfbdd173a0858ed5346a20d1007ce4df313ec0d0a1d8810f33","dweb:/ipfs/QmYXyvK23dzf2HNCDjUU8Ch2QPQaJG5SdSFpciriVFu5Qm"]},"contracts/core/libraries/LowGasSafeMath.sol":{"keccak256":"0x847c3e470efae92dc75e28b7a4ac4e9b3fd58d570e8d57932870d2a05f6620d5","license":"GPL-2.0-or-later","urls":["bzz-raw://3c7d17dae5e25e7f645a1b001509827ff07468ed6ef1cf3ef87ef8cc9d0d90c9","dweb:/ipfs/QmQwgMYPZZsB9Cu6ET7MGoGBmZMqJumFfSXAU2UXw5VkNX"]},"contracts/core/libraries/Oracle.sol":{"keccak256":"0x9f9fd24362ff09a31f0da08ea8649f2a7ad2f0eb9cccd7db931831e2d5e3f481","license":"GPL-2.0-or-later","urls":["bzz-raw://12820a34a4174fa3bc437e7349fb2a344ad0a3dc1aac9600bd5fcd10115f8972","dweb:/ipfs/QmXB3NXCoyagoaSGzq1Yo6nYFRL66jSr6kHyEs6nQVo75a"]},"contracts/core/libraries/Position.sol":{"keccak256":"0x475bb30389f36945eca9fb80b539e23af9425105aa42c01f3d1714173e7016bd","license":"GPL-2.0-or-later","urls":["bzz-raw://640ca7bff6eae93a2d91d2d73758450f75280870e823fdd80c85ce6306d473d6","dweb:/ipfs/QmZeyJ8YgY8UigD4DVVkKahWi1cZ7MHVWB1WK8jZnEu423"]},"contracts/core/libraries/SafeCast.sol":{"keccak256":"0x0a26ddda2349cc6f3dd7fa9fa2c015d3b2bac6aeaaee7b09800102d175b63969","license":"GPL-2.0-or-later","urls":["bzz-raw://d171f3a4cb585a6c406b9ba83cfb1b0874556fe4769961589ea7ba293c834b00","dweb:/ipfs/QmVVECqgQgJTLBt1tHVwX9jpk6uTetAJpJ26i8TqDt2KxV"]},"contracts/core/libraries/SqrtPriceMath.sol":{"keccak256":"0xb8c4035f18a407dffa04c548bd1673aba3e291f245919168738ac7851c91b3f0","license":"GPL-2.0-or-later","urls":["bzz-raw://c19af61b971f5e8c3ea7ca8fb22ce0c4fd666321c392e84143a31e78c2b09c6c","dweb:/ipfs/QmUqwBie1x569fWS13m63kZMra4gxAMZ3EXmE7M2gd89LV"]},"contracts/core/libraries/SwapMath.sol":{"keccak256":"0x7744e7ba8ff04df7e96c073873c15b44c805f4092690bf788dd8c77e4d8b3377","license":"GPL-2.0-or-later","urls":["bzz-raw://5dbe8c04ccedc67287b7f4dee544c7d70a065cb21fa9b4e3c1f3712efa16f930","dweb:/ipfs/QmV4P3jHgA4gR1q9XdqZJLkhfjNfDpfYiz16gVS7yeu67T"]},"contracts/core/libraries/Tick.sol":{"keccak256":"0x2412036eecd028e96f7fff76a036483b7e5d8214c1dcf8d692f6c111a21bbc49","license":"GPL-2.0-or-later","urls":["bzz-raw://16e559bc5e4284e4d889c3f357f86f5bfeedc60dd6296de02ae833726e8b5bdb","dweb:/ipfs/QmdEAWPpFWDhi1qCzCxQsSTeoWoCc1Vb8LCxi51hKyDTG8"]},"contracts/core/libraries/TickBitmap.sol":{"keccak256":"0x43558a4e7ab1996d74d607b0218e56ea30c3ce2da2286f3b92e68d777d6da8da","license":"GPL-2.0-or-later","urls":["bzz-raw://b40288735028577f8d32b3fe633d97eed9aa1c8679144c537e9e8209622eebda","dweb:/ipfs/Qmb6aLQtRqJnXZzkKfTyBmcGwjrKM2yfNgHPtLHrBXWutB"]},"contracts/core/libraries/TickMath.sol":{"keccak256":"0x0ed939ab05e4119fee43b50d7736259844f7e2c8cc76ff898fb2219d147c9353","license":"GPL-2.0-or-later","urls":["bzz-raw://49b5287bf19e005c05c3f659df6af89b78503b45fba7d0dc270d52a167757c21","dweb:/ipfs/QmXU5Uh8JZWW3D47aH8nYnSbZrE8Ud2JkJqqYFMEuyNMPT"]},"contracts/core/libraries/TransferHelper.sol":{"keccak256":"0xefca27b33aa4b5356e67ad3e7a9907527b507c5a95bc18bf8e1a2393c3ab2e09","license":"GPL-2.0-or-later","urls":["bzz-raw://bbbb873aabb20a9e039fc825fa93135ac90754068af6608bd9a542cd0a17fabe","dweb:/ipfs/QmWQL5U3N9wZcXCpMgm7HZgk6w8McRTycPdxYCm6jNuokc"]},"contracts/core/libraries/UnsafeMath.sol":{"keccak256":"0x49299b9b0fa2eb3efca394ced75eff752eea35873651400d5ebb62bcff63599d","license":"GPL-2.0-or-later","urls":["bzz-raw://dd45ec0ae9bfa2ec416dcf9ca30caa39b3f6b4fa1c2ceb8ef6594bb85c1e9cad","dweb:/ipfs/QmZSG5JSgZPaGNypbt9W1KbmWMicZRsU1fZM6YA7MG6Un4"]},"contracts/core/libraries/hook/SwapHookLib.sol":{"keccak256":"0xaf64fcb60d4db67048c1cfad33faa1534e0836b215bae2f059bb11793c9c718f","license":"GPL-2.0-or-later","urls":["bzz-raw://87ccb10c095badc5a08cf41f7901fefc7266453e10c1238aee8acb867a2b4581","dweb:/ipfs/QmRdrPwNUQDyEyYast3uKxGmqTCdTDcKLxZxzrutrkoahd"]},"contracts/gauge/interfaces/IAccessControl.sol":{"keccak256":"0x1acc7d3204768e4bb7ffb83cae6365eab247e391e2bf14970a1d5ce5bf3f0a31","license":"MIT","urls":["bzz-raw://273264c70046286f3f01579c67eaa7b518fdc435d6e287a9c6794e2894e03816","dweb:/ipfs/QmZyCw9BC46SK7Vi2TxZmNrC9RNrYTqfHq5tj5NfQmbCpg"]},"contracts/gauge/interfaces/ICLGauge.sol":{"keccak256":"0x8270510758896dc6f215d1ffb423a48fc39a36c8ba3c3ea257ec4f213c7f7207","license":"MIT","urls":["bzz-raw://2986b201b790ca8de028b8990e2b244ba9eb28601a9101f3d13ff1097cff18a0","dweb:/ipfs/QmfRPhGorqjJRU3GFSfsnKYwwFELys5ehqx4kb6VaSwnve"]},"contracts/gauge/interfaces/ICLPool.sol":{"keccak256":"0xf18a0a917c5dcfcfc39af164d074acdccd13dc8239ebdc440a3945cee880ba10","license":"MIT","urls":["bzz-raw://0c531fe5b14791332c90b18332772153770d72277e589077565d021cbbf36364","dweb:/ipfs/QmQ8KnXvdMBGzakc96pXv5KdZA9MAbCssZ1hXVEdfKFKHq"]},"contracts/gauge/interfaces/IGauge.sol":{"keccak256":"0xa245be631b4cfd042d50644c869ce3e7be73f733ccc13b117c2906b49bb3f07d","license":"MIT","urls":["bzz-raw://12c55ff36627ce63ff9fa1a8b7b453254542e3eabff79bc157fcc6657bd0662b","dweb:/ipfs/QmahwvsEas3M4Y9pLNoCXrbrRjCgtpGyJLt2dcYLaNAUCs"]},"contracts/gauge/interfaces/ILeafVoter.sol":{"keccak256":"0x2847199f9328b17d1b0639a1bb9d4fa3c84ad7051bc7d6d4215503e9a3203e27","license":"MIT","urls":["bzz-raw://7dc83fb2f6fcd1b3d0508fbb28531b2a72d4f086174517cc15548726c2d93977","dweb:/ipfs/QmaZAtSxzLaNHeo4oEr9aMVtMG6Ch9ZWWrnGNrw8eJMch9"]},"contracts/gauge/interfaces/INonfungiblePositionManager.sol":{"keccak256":"0x3a2fca2f7e9a69d984fb5a4faa21659ce75e9d120d1c650d87c197d0e764d2e0","license":"MIT","urls":["bzz-raw://77bf112d6209de3f3e86aa1bc621103b8171c4e6625a03672210460d0c37dbb1","dweb:/ipfs/QmNU9EQhECApot9mpmFQtueGbYfA57GZPGrrPv7dk2dhwu"]},"node_modules/@openzeppelin/contracts/introspection/IERC165.sol":{"keccak256":"0xd2f30fad5b24c4120f96dbac83aacdb7993ee610a9092bc23c44463da292bf8d","license":"MIT","urls":["bzz-raw://e3d4e72409e392c7694b6405a0136cf073d8da016df33ef8f9ad195f724ebfea","dweb:/ipfs/QmPGcddKq6CgsiKnxUUif2q76wRqP3dmdQ6bKuHCLmb8Wa"]},"node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol":{"keccak256":"0xb11597841d47f7a773bca63ca323c76f804cb5d944788de0327db5526319dc82","license":"MIT","urls":["bzz-raw://930d2da1934886a1098753be4173dd89c45ca0b306a1930accd37e00b1af4aaf","dweb:/ipfs/QmVSXnvEV41d43k8cfpANHoTYMKgBDBL8iCbxkLfEtQZBe"]}},"version":1},"storageLayout":{"types":{"t_bool":{"label":"bool","encoding":"inplace","numberOfBytes":"1"},"t_int16":{"label":"int16","encoding":"inplace","numberOfBytes":"2"},"t_int24":{"label":"int24","encoding":"inplace","numberOfBytes":"3"},"t_int56":{"label":"int56","encoding":"inplace","numberOfBytes":"7"},"t_int128":{"label":"int128","encoding":"inplace","numberOfBytes":"16"},"t_uint16":{"label":"uint16","encoding":"inplace","numberOfBytes":"2"},"t_uint32":{"label":"uint32","encoding":"inplace","numberOfBytes":"4"},"t_uint48":{"label":"uint48","encoding":"inplace","numberOfBytes":"6"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_bytes32":{"label":"bytes32","encoding":"inplace","numberOfBytes":"32"},"t_uint128":{"label":"uint128","encoding":"inplace","numberOfBytes":"16"},"t_uint160":{"label":"uint160","encoding":"inplace","numberOfBytes":"20"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_struct(Info)7471_storage":{"label":"struct Position.Info","members":[{"slot":"0","type":"t_uint128","astId":7462,"label":"liquidity","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"1","type":"t_uint256","astId":7464,"label":"feeGrowthInside0LastX128","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"2","type":"t_uint256","astId":7466,"label":"feeGrowthInside1LastX128","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"3","type":"t_uint128","astId":7468,"label":"tokensOwed0","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"3","type":"t_uint128","astId":7470,"label":"tokensOwed1","offset":16,"contract":"contracts/core/CLPool.sol:CLPool"}],"encoding":"inplace","numberOfBytes":"128"},"t_struct(Info)8525_storage":{"label":"struct Tick.Info","members":[{"slot":"0","type":"t_uint128","astId":8506,"label":"liquidityGross","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"0","type":"t_int128","astId":8508,"label":"liquidityNet","offset":16,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"1","type":"t_int128","astId":8510,"label":"stakedLiquidityNet","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"2","type":"t_uint256","astId":8512,"label":"feeGrowthOutside0X128","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"3","type":"t_uint256","astId":8514,"label":"feeGrowthOutside1X128","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"4","type":"t_uint256","astId":8516,"label":"rewardGrowthOutsideX128","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"5","type":"t_int56","astId":8518,"label":"tickCumulativeOutside","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"5","type":"t_uint160","astId":8520,"label":"secondsPerLiquidityOutsideX128","offset":7,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"5","type":"t_uint32","astId":8522,"label":"secondsOutside","offset":27,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"5","type":"t_bool","astId":8524,"label":"initialized","offset":31,"contract":"contracts/core/CLPool.sol:CLPool"}],"encoding":"inplace","numberOfBytes":"192"},"t_struct(Slot0)102_storage":{"label":"struct CLPool.Slot0","members":[{"slot":"0","type":"t_uint160","astId":91,"label":"sqrtPriceX96","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"0","type":"t_int24","astId":93,"label":"tick","offset":20,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"0","type":"t_uint16","astId":95,"label":"observationIndex","offset":23,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"0","type":"t_uint16","astId":97,"label":"observationCardinality","offset":25,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"0","type":"t_uint16","astId":99,"label":"observationCardinalityNext","offset":27,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"0","type":"t_bool","astId":101,"label":"unlocked","offset":29,"contract":"contracts/core/CLPool.sol:CLPool"}],"encoding":"inplace","numberOfBytes":"32"},"t_mapping(t_int16,t_uint256)":{"key":"t_int16","label":"mapping(int16 => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_struct(GaugeFees)123_storage":{"label":"struct CLPool.GaugeFees","members":[{"slot":"0","type":"t_uint128","astId":120,"label":"token0","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"0","type":"t_uint128","astId":122,"label":"token1","offset":16,"contract":"contracts/core/CLPool.sol:CLPool"}],"encoding":"inplace","numberOfBytes":"32"},"t_struct(Observation)6730_storage":{"label":"struct Oracle.Observation","members":[{"slot":"0","type":"t_uint32","astId":6723,"label":"blockTimestamp","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"0","type":"t_int56","astId":6725,"label":"tickCumulative","offset":4,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"0","type":"t_uint160","astId":6727,"label":"secondsPerLiquidityCumulativeX128","offset":11,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"0","type":"t_bool","astId":6729,"label":"initialized","offset":31,"contract":"contracts/core/CLPool.sol:CLPool"}],"encoding":"inplace","numberOfBytes":"32"},"t_mapping(t_int24,t_struct(Info)8525_storage)":{"key":"t_int24","label":"mapping(int24 => struct Tick.Info)","value":"t_struct(Info)8525_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_bytes32,t_struct(Info)7471_storage)":{"key":"t_bytes32","label":"mapping(bytes32 => struct Position.Info)","value":"t_struct(Info)7471_storage","encoding":"mapping","numberOfBytes":"32"},"t_array(t_struct(Observation)6730_storage)65535_storage":{"base":"t_struct(Observation)6730_storage","label":"struct Oracle.Observation[65535]","encoding":"inplace","numberOfBytes":"2097120"}},"storage":[{"slot":"0","type":"t_address","astId":69,"label":"factory","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"1","type":"t_address","astId":73,"label":"token0","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"2","type":"t_address","astId":77,"label":"token1","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"3","type":"t_address","astId":81,"label":"gauge","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"4","type":"t_address","astId":85,"label":"nft","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"5","type":"t_address","astId":89,"label":"factoryRegistry","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"6","type":"t_struct(Slot0)102_storage","astId":106,"label":"slot0","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"7","type":"t_uint256","astId":110,"label":"feeGrowthGlobal0X128","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"8","type":"t_uint256","astId":114,"label":"feeGrowthGlobal1X128","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"9","type":"t_uint256","astId":118,"label":"rewardGrowthGlobalX128","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"10","type":"t_struct(GaugeFees)123_storage","astId":127,"label":"gaugeFees","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"11","type":"t_uint256","astId":131,"label":"rollover","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"12","type":"t_uint128","astId":135,"label":"stakedLiquidity","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"12","type":"t_uint48","astId":139,"label":"lastUpdated","offset":16,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"12","type":"t_int24","astId":143,"label":"tickSpacing","offset":22,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"13","type":"t_uint128","astId":147,"label":"liquidity","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"13","type":"t_uint128","astId":151,"label":"maxLiquidityPerTick","offset":16,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"14","type":"t_mapping(t_int24,t_struct(Info)8525_storage)","astId":157,"label":"ticks","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"15","type":"t_mapping(t_int16,t_uint256)","astId":163,"label":"tickBitmap","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"16","type":"t_mapping(t_bytes32,t_struct(Info)7471_storage)","astId":169,"label":"positions","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"17","type":"t_array(t_struct(Observation)6730_storage)65535_storage","astId":175,"label":"observations","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"65552","type":"t_uint160","astId":179,"label":"secondsPerStakedLiquidityCumulativeX128","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"}]},"transientStorageLayout":null,"userdoc":{"kind":"user","events":{"Initialize(uint160,int24)":{"notice":"Emitted exactly once by a pool when #initialize is first called on the pool"},"CollectFees(address,uint128,uint128)":{"notice":"Emitted when the collected protocol fees are withdrawn by the gauge"},"SetFeeProtocol(uint8,uint8,uint8,uint8)":{"notice":"Emitted when the protocol fee is changed by the pool"},"Burn(address,int24,int24,uint128,uint256,uint256)":{"notice":"Emitted when a position's liquidity is removed"},"IncreaseObservationCardinalityNext(uint16,uint16)":{"notice":"Emitted by the pool for increases to the number of observations that can be stored"},"Collect(address,address,int24,int24,uint128,uint128)":{"notice":"Emitted when fees are collected by the owner of a position"},"Flash(address,address,uint256,uint256,uint256,uint256)":{"notice":"Emitted by the pool for any flashes of token0/token1"},"Mint(address,address,int24,int24,uint128,uint256,uint256)":{"notice":"Emitted when liquidity is minted for a given position"},"Swap(address,address,int256,int256,uint160,uint128,int24)":{"notice":"Emitted by the pool for any swaps between token0 and token1"}},"methods":{"fee()":{"notice":"The pool's swap fee in pips, i.e. 1e-6"},"nft()":{"notice":"The nft manager"},"gauge()":{"notice":"The gauge corresponding to this pool"},"slot0()":{"notice":"The 0th storage slot in the pool stores many values, and is exposed as a single method to save gas when accessed externally."},"token0()":{"notice":"The first of the two tokens of the pool, sorted by address"},"token1()":{"notice":"The second of the two tokens of the pool, sorted by address"},"factory()":{"notice":"The contract that deployed the pool, which must adhere to the ICLFactory interface"},"rollover()":{"notice":"Emissions accrued while no staked liquidity was in range"},"POOL_TYPE()":{"notice":"The pool type identifier"},"gaugeFees()":{"notice":"The amounts of token0 and token1 that are owed to the gauge"},"liquidity()":{"notice":"The currently in range liquidity available to the pool"},"ticks(int24)":{"notice":"Look up information about a specific tick in the pool"},"DENOMINATOR()":{"notice":"The denominator used for fees computation."},"lastUpdated()":{"notice":"Last time the pool reward growth was advanced"},"tickSpacing()":{"notice":"The pool tick spacing"},"unstakedFee()":{"notice":"The pool's unstaked fee in pips, i.e. 1e-6"},"SWAP_FEE_CEIL()":{"notice":"The ceiling applied to the before/after swap fee."},"settleToBlock()":{"notice":"Settles the pool's reward growth to the current block timestamp and returns the accrued rollover"},"factoryRegistry()":{"notice":"The factory registry that manages pool <> gauge <> reward factory relationships"},"observe(uint32[])":{"notice":"Returns the cumulative tick and liquidity as of each timestamp `secondsAgo` from the current block timestamp"},"stakedLiquidity()":{"notice":"The currently in range staked liquidity available to the pool"},"tickBitmap(int16)":{"notice":"Returns 256 packed tick initialized boolean values. See TickBitmap for more information"},"positions(bytes32)":{"notice":"Returns the information about a position by the position's key"},"collectFees(address)":{"notice":"Collect the gauge fee accrued to the pool"},"maxLiquidityPerTick()":{"notice":"The maximum amount of position liquidity that can use any tick in the range"},"observations(uint256)":{"notice":"Returns data about a specific observation index"},"feeGrowthGlobal0X128()":{"notice":"The fee growth as a Q128.128 fees of token0 collected per unit of liquidity for the entire life of the pool"},"feeGrowthGlobal1X128()":{"notice":"The fee growth as a Q128.128 fees of token1 collected per unit of liquidity for the entire life of the pool"},"rewardGrowthGlobalX128()":{"notice":"The reward growth as a Q128.128 rewards of emission collected per unit of liquidity for the entire life of the pool"},"burn(int24,int24,uint128)":{"notice":"Burn liquidity from the sender and account tokens owed for the liquidity to the position"},"stake(int128,int24,int24)":{"notice":"Convert existing liquidity into staked liquidityOnly callable by the gauge associated with this pool"},"getFeeGrowthInside(int24,int24)":{"notice":"Returns data about fee growth within a tick range."},"burn(int24,int24,uint128,address)":{"notice":"Burn liquidity from the supplied owner and account tokens owed for the liquidity to the position"},"flash(address,uint256,uint256,bytes)":{"notice":"Receive token0 and/or token1 and pay it back, plus a fee, in the callback"},"snapshotCumulativesInside(int24,int24)":{"notice":"Returns a snapshot of the tick cumulative, seconds per liquidity and seconds inside a tick range"},"mint(address,int24,int24,uint128,bytes)":{"notice":"Adds liquidity for the given recipient/tickLower/tickUpper position"},"swap(address,bool,int256,uint160,bytes)":{"notice":"Swap token0 for token1, or token1 for token0"},"secondsPerStakedLiquidityCumulativeX128()":{"notice":"The cumulative seconds per unit of in-range staked liquidity as of lastUpdated"},"getRewardGrowthInside(int24,int24,uint256)":{"notice":"Returns data about reward growth within a tick range. RewardGrowthGlobalX128 can be supplied as a parameter for claimable reward calculations."},"increaseObservationCardinalityNext(uint16)":{"notice":"Increase the maximum number of price and liquidity observations that this pool will store"},"setGaugeAndPositionManager(address,address)":{"notice":"Initialize gauge and nft manager"},"collect(address,int24,int24,uint128,uint128)":{"notice":"Collects tokens owed to a position"},"getSecondsPerStakedLiquidityCumulativeX128()":{"notice":"The seconds per staked liquidity cumulative projected to the current block timestamp"},"flashFee((address,address,uint256,uint256,bytes))":{"notice":"The pool's flash fee in pips, i.e. 1e-6"},"collect(address,int24,int24,uint128,uint128,address)":{"notice":"Collects tokens owed to a position"},"initialize(address,address,address,int24,address,uint160)":{"notice":"Initialize function used in proxy deployment"},"beforeSwapFee((address,address,bool,int256,uint160,bytes,uint160,int24))":{"notice":"The pool's pre-swap swap fee in pips, i.e. 1e-6"},"afterSwapFee((address,address,bool,int256,uint160,bytes,uint160,int24),(int256,int256,uint24,bool,uint256,uint128,uint128,uint128,int56,uint160,bool))":{"notice":"The pool's post-swap swap fee in pips, i.e. 1e-6"}},"version":1},"devdoc":{"kind":"dev","methods":{"fee()":{"details":"This method can be used for \"legacy\" swap fee modules.","returns":{"_0":"The swap fee."}},"unstakedFee()":{"details":"Can be modified in PoolFactory on a pool basis or upgraded to be dynamic.","returns":{"_0":"The unstaked fee"}},"settleToBlock()":{"details":"Only callable by the gauge. Pulls the emissions accrued since the last settlement through the gauge.","returns":{"_rollover":"the emissions accumulated while no staked liquidity was in range. Reset to 0 after this call."}},"observe(uint32[])":{"params":{"secondsAgos":"From how long ago each cumulative tick and liquidity value should be returned"},"details":"To get a time weighted average tick or liquidity-in-range, you must call this with two values, one representing the beginning of the period and another for the end of the period. E.g., to get the last hour time-weighted average tick, you must call it with secondsAgos = [3600, 0].The time weighted average tick represents the geometric time weighted average price of the pool, in log base sqrt(1.0001) of token1 / token0. The TickMath library can be used to go from a tick value to a ratio.","returns":{"tickCumulatives":"Cumulative tick values as of each `secondsAgos` from the current block timestamp","secondsPerLiquidityCumulativeX128s":"Cumulative seconds per liquidity-in-range value as of each `secondsAgos` from the current block timestamp"}},"collectFees(address)":{"params":{"recipient":"The address that receives the claimed gauge fees"},"returns":{"amount0":"The gauge fee collected in token0","amount1":"The gauge fee collected in token1"}},"burn(int24,int24,uint128)":{"params":{"amount":"How much liquidity to burn","tickLower":"The lower tick of the position for which to burn liquidity","tickUpper":"The upper tick of the position for which to burn liquidity"},"details":"Can be used to trigger a recalculation of fees owed to a position by calling with an amount of 0Fees must be collected separately via a call to #collect","returns":{"amount0":"The amount of token0 sent to the recipient","amount1":"The amount of token1 sent to the recipient"}},"stake(int128,int24,int24)":{"params":{"tickLower":"The lower tick of the position for which to stake liquidity","tickUpper":"The upper tick of the position for which to stake liquidity","stakedLiquidityDelta":"The amount by which to increase or decrease the staked liquidity"}},"getFeeGrowthInside(int24,int24)":{"params":{"tickLower":"The lower tick of the range","tickUpper":"The upper tick of the range"},"returns":{"feeGrowthInside0X128":"The token0 fee growth in range.","feeGrowthInside1X128":"The token1 fee growth in range."}},"burn(int24,int24,uint128,address)":{"params":{"owner":"Owner of the position in the pool (nft manager or gauge)","amount":"How much liquidity to burn","tickLower":"The lower tick of the position for which to burn liquidity","tickUpper":"The upper tick of the position for which to burn liquidity"},"details":"Can be used to trigger a recalculation of fees owed to a position by calling with an amount of 0Fees must be collected separately via a call to #collect","returns":{"amount0":"The amount of token0 sent to the recipient","amount1":"The amount of token1 sent to the recipient"}},"flash(address,uint256,uint256,bytes)":{"params":{"data":"Any data to be passed through to the callback","amount0":"The amount of token0 to send","amount1":"The amount of token1 to send","recipient":"The address which will receive the token0 and token1 amounts"},"details":"The caller of this method receives a callback in the form of ICLFlashCallback#uniswapV3FlashCallbackCan be used to donate underlying tokens pro-rata to currently in-range liquidity providers by calling with 0 amount{0,1} and sending the donation amount(s) from the callback"},"snapshotCumulativesInside(int24,int24)":{"params":{"tickLower":"The lower tick of the range","tickUpper":"The upper tick of the range"},"details":"Snapshots must only be compared to other snapshots, taken over a period for which a position existed. I.e., snapshots cannot be compared if a position is not held for the entire period between when the first snapshot is taken and the second snapshot is taken.","returns":{"secondsInside":"The snapshot of seconds per liquidity for the range","tickCumulativeInside":"The snapshot of the tick accumulator for the range","secondsPerLiquidityInsideX128":"The snapshot of seconds per liquidity for the range"}},"mint(address,int24,int24,uint128,bytes)":{"params":{"data":"Any data that should be passed through to the callback","amount":"The amount of liquidity to mint","recipient":"The address for which the liquidity will be created","tickLower":"The lower tick of the position in which to add liquidity","tickUpper":"The upper tick of the position in which to add liquidity"},"details":"The caller of this method receives a callback in the form of ICLMintCallback#uniswapV3MintCallback in which they must pay any token0 or token1 owed for the liquidity. The amount of token0/token1 due depends on tickLower, tickUpper, the amount of liquidity, and the current price.","returns":{"amount0":"The amount of token0 that was paid to mint the given amount of liquidity. Matches the value in the callback","amount1":"The amount of token1 that was paid to mint the given amount of liquidity. Matches the value in the callback"}},"swap(address,bool,int256,uint160,bytes)":{"params":{"data":"Any data to be passed through to the callback","recipient":"The address to receive the output of the swap","zeroForOne":"The direction of the swap, true for token0 to token1, false for token1 to token0","amountSpecified":"The amount of the swap, which implicitly configures the swap as exact input (positive), or exact output (negative)","sqrtPriceLimitX96":"The Q64.96 sqrt price limit. If zero for one, the price cannot be less than this value after the swap. If one for zero, the price cannot be greater than this value after the swap"},"details":"The caller of this method receives a callback in the form of ICLSwapCallback#uniswapV3SwapCallback","returns":{"amount0":"The delta of the balance of token0 of the pool, exact when negative, minimum when positive","amount1":"The delta of the balance of token1 of the pool, exact when negative, minimum when positive"}},"getRewardGrowthInside(int24,int24,uint256)":{"params":{"tickLower":"The lower tick of the range","tickUpper":"The upper tick of the range","_rewardGrowthGlobalX128":"a calculated rewardGrowthGlobalX128 or 0 (in case of 0 it means we use the rewardGrowthGlobalX128 from state)"},"details":"Used in gauge reward/earned calculations","returns":{"rewardGrowthInside":"The reward growth in the range"}},"increaseObservationCardinalityNext(uint16)":{"params":{"observationCardinalityNext":"The desired minimum number of observations for the pool to store"},"details":"This method is no-op if the pool already has an observationCardinalityNext greater than or equal to the input observationCardinalityNext."},"setGaugeAndPositionManager(address,address)":{"params":{"_nft":"The position manager used for position management","_gauge":"The gauge corresponding to this pool"},"details":"Callable only once, by the gauge factory"},"collect(address,int24,int24,uint128,uint128)":{"params":{"recipient":"The address which should receive the fees collected","tickLower":"The lower tick of the position for which to collect fees","tickUpper":"The upper tick of the position for which to collect fees","amount0Requested":"How much token0 should be withdrawn from the fees owed","amount1Requested":"How much token1 should be withdrawn from the fees owed"},"details":"Does not recompute fees earned, which must be done either via mint or burn of any amount of liquidity. Collect must be called by the position owner. To withdraw only token0 or only token1, amount0Requested or amount1Requested may be set to zero. To withdraw all tokens owed, caller may pass any value greater than the actual tokens owed, e.g. type(uint128).max. Tokens owed may be from accumulated swap fees or burned liquidity.","returns":{"amount0":"The amount of fees collected in token0","amount1":"The amount of fees collected in token1"}},"getSecondsPerStakedLiquidityCumulativeX128()":{"returns":{"_cumulative":"The Q128.128 seconds per staked liquidity cumulative as of the current block"}},"flashFee((address,address,uint256,uint256,bytes))":{"params":{"_flashParams":"Arguments passed to the flash function."},"returns":{"_fee":"The flash fee."}},"collect(address,int24,int24,uint128,uint128,address)":{"params":{"owner":"Owner of the position in the pool (nft manager or gauge)","recipient":"The address which should receive the fees collected","tickLower":"The lower tick of the position for which to collect fees","tickUpper":"The upper tick of the position for which to collect fees","amount0Requested":"How much token0 should be withdrawn from the fees owed","amount1Requested":"How much token1 should be withdrawn from the fees owed"},"details":"Does not recompute fees earned, which must be done either via mint or burn of any amount of liquidity. Collect must be called by the position owner. To withdraw only token0 or only token1, amount0Requested or amount1Requested may be set to zero. To withdraw all tokens owed, caller may pass any value greater than the actual tokens owed, e.g. type(uint128).max. Tokens owed may be from accumulated swap fees or burned liquidity.","returns":{"amount0":"The amount of fees collected in token0","amount1":"The amount of fees collected in token1"}},"initialize(address,address,address,int24,address,uint160)":{"params":{"_token0":"The first token of the pool by address sort order","_token1":"The second token of the pool by address sort order","_factory":"The CL factory contract address","_tickSpacing":"The pool tick spacing","_sqrtPriceX96":"The initial sqrt price of the pool, as a Q64.96","_factoryRegistry":"The address of the factory registry managing the pool factory"},"details":"Can be called once only Price is represented as a sqrt(amountToken1/amountToken0) Q64.96 valuenot locked because it initializes unlocked"},"beforeSwapFee((address,address,bool,int256,uint160,bytes,uint160,int24))":{"params":{"_swapParams":"Swap context and pre-swap pool state."},"returns":{"_0":"The pre-swap fee."}},"afterSwapFee((address,address,bool,int256,uint160,bytes,uint160,int24),(int256,int256,uint24,bool,uint256,uint128,uint128,uint128,int56,uint160,bool))":{"params":{"_swapParams":"Swap context and post-swap pool state.","_afterSwapParams":"Post-swap execution state and oracle/liquidity context."},"returns":{"_0":"The post-swap fee."}}},"version":1,"stateVariables":{"nft":{"return":"The nft manager contract address"},"gauge":{"return":"The gauge contract address"},"slot0":{"return":"sqrtPriceX96 The current price of the pool as a sqrt(token1/token0) Q64.96 value tick The current tick of the pool, i.e. according to the last tick transition that was run. This value may not always be equal to SqrtTickMath.getTickAtSqrtRatio(sqrtPriceX96) if the price is on a tick boundary. observationIndex The index of the last oracle observation that was written, observationCardinality The current maximum number of observations stored in the pool, observationCardinalityNext The next maximum number of observations, to be updated when the observation. unlocked Whether the pool is currently locked to reentrancy"},"ticks":{"params":{"tick":"The tick to look up"},"return":"liquidityGross the total amount of position liquidity that uses the pool either as tick lower or tick upper, liquidityNet how much liquidity changes when the pool price crosses the tick, stakedLiquidityNet how much staked liquidity changes when the pool price crosses the tick, feeGrowthOutside0X128 the fee growth on the other side of the tick from the current tick in token0, feeGrowthOutside1X128 the fee growth on the other side of the tick from the current tick in token1, rewardGrowthOutsideX128 the reward growth on the other side of the tick from the current tick in emission token tickCumulativeOutside the cumulative tick value on the other side of the tick from the current tick secondsPerLiquidityOutsideX128 the seconds spent per liquidity on the other side of the tick from the current tick, secondsOutside the seconds spent on the other side of the tick from the current tick, initialized Set to true if the tick is initialized, i.e. liquidityGross is greater than 0, otherwise equal to false. Outside values can only be used if the tick is initialized, i.e. if liquidityGross is greater than 0. In addition, these values are only relative and must be used only in comparison to previous snapshots for a specific position."},"token0":{"return":"The token contract address"},"token1":{"return":"The token contract address"},"factory":{"return":"The contract address"},"POOL_TYPE":{"return":"The pool type label to be able to identify the type of pool"},"gaugeFees":{"details":"Gauge fees will never exceed uint128 max in either token"},"liquidity":{"details":"This value has no relationship to the total liquidity across all ticksThis value includes staked liquidity"},"positions":{"params":{"key":"The position's key is a hash of a preimage composed by the owner, tickLower and tickUpper"},"return":"_liquidity The amount of liquidity in the position, Returns feeGrowthInside0LastX128 fee growth of token0 inside the tick range as of the last mint/burn/poke, Returns feeGrowthInside1LastX128 fee growth of token1 inside the tick range as of the last mint/burn/poke, Returns tokensOwed0 the computed amount of token0 owed to the position as of the last mint/burn/poke, Returns tokensOwed1 the computed amount of token1 owed to the position as of the last mint/burn/poke"},"DENOMINATOR":{"return":"The denominator value in pips."},"tickSpacing":{"return":"The tick spacing","details":"Ticks can only be used at multiples of this value, minimum of 1 and always positive e.g.: a tickSpacing of 3 means ticks can be initialized every 3rd tick, i.e., ..., -6, -3, 0, 3, 6, ... This value is an int24 to avoid casting even though it is always positive."},"observations":{"params":{"index":"The element of the observations array to fetch"},"return":"blockTimestamp The timestamp of the observation, Returns tickCumulative the tick multiplied by seconds elapsed for the life of the pool as of the observation timestamp, Returns secondsPerLiquidityCumulativeX128 the seconds per in range liquidity for the life of the pool as of the observation timestamp, Returns initialized whether the observation has been initialized and the values are safe to use","details":"You most likely want to use #observe() instead of this method to get an observation as of some amount of time ago, rather than at a specific index in the array."},"SWAP_FEE_CEIL":{"return":"The swap fee ceiling value in pips."},"factoryRegistry":{"return":"The factory registry contract address"},"stakedLiquidity":{"details":"This value has no relationship to the total staked liquidity across all ticks"},"maxLiquidityPerTick":{"return":"The max amount of liquidity per tick","details":"This parameter is enforced per tick to prevent liquidity from overflowing a uint128 at any point, and also prevents out-of-range liquidity from being used to prevent adding in-range liquidity to a pool"},"feeGrowthGlobal0X128":{"details":"This value can overflow the uint256"},"feeGrowthGlobal1X128":{"details":"This value can overflow the uint256"},"rewardGrowthGlobalX128":{"details":"This value can overflow the uint256"},"secondsPerStakedLiquidityCumulativeX128":{"return":"The Q128.128 stored seconds per staked liquidity cumulative"}}},"sourceIds":{"contracts/core/CLPool.sol":{"id":0},"contracts/core/libraries/Tick.sol":{"id":27},"contracts/core/libraries/Oracle.sol":{"id":22},"contracts/core/libraries/BitMath.sol":{"id":15},"contracts/core/interfaces/ICLPool.sol":{"id":2},"contracts/core/libraries/FullMath.sol":{"id":19},"contracts/core/libraries/Position.sol":{"id":23},"contracts/core/libraries/SafeCast.sol":{"id":24},"contracts/core/libraries/SwapMath.sol":{"id":26},"contracts/core/libraries/TickMath.sol":{"id":29},"contracts/gauge/interfaces/IGauge.sol":{"id":36},"contracts/gauge/interfaces/ICLPool.sol":{"id":35},"contracts/core/libraries/TickBitmap.sol":{"id":28},"contracts/core/libraries/UnsafeMath.sol":{"id":31},"contracts/gauge/interfaces/ICLGauge.sol":{"id":34},"contracts/core/interfaces/ICLFactory.sol":{"id":1},"contracts/core/libraries/FixedPoint96.sol":{"id":18},"contracts/gauge/interfaces/ILeafVoter.sol":{"id":37},"contracts/core/libraries/FixedPoint128.sol":{"id":17},"contracts/core/libraries/LiquidityMath.sol":{"id":20},"contracts/core/libraries/SqrtPriceMath.sol":{"id":25},"contracts/core/interfaces/IERC20Minimal.sol":{"id":3},"contracts/core/libraries/LowGasSafeMath.sol":{"id":21},"contracts/core/libraries/TransferHelper.sol":{"id":30},"contracts/core/interfaces/hook/ISwapHook.sol":{"id":8},"contracts/core/libraries/hook/SwapHookLib.sol":{"id":32},"contracts/gauge/interfaces/IAccessControl.sol":{"id":33},"contracts/core/interfaces/IFactoryRegistry.sol":{"id":4},"contracts/core/libraries/CLPoolNonSwapPath.sol":{"id":16},"contracts/core/interfaces/pool/ICLPoolState.sol":{"id":14},"contracts/core/interfaces/pool/ICLPoolEvents.sol":{"id":12},"contracts/core/interfaces/pool/ICLPoolActions.sol":{"id":9},"contracts/core/interfaces/pool/ICLPoolConstants.sol":{"id":10},"contracts/core/interfaces/callback/ICLMintCallback.sol":{"id":6},"contracts/core/interfaces/callback/ICLSwapCallback.sol":{"id":7},"contracts/core/interfaces/pool/ICLPoolDerivedState.sol":{"id":11},"contracts/core/interfaces/pool/ICLPoolOwnerActions.sol":{"id":13},"contracts/core/interfaces/callback/ICLFlashCallback.sol":{"id":5},"contracts/gauge/interfaces/INonfungiblePositionManager.sol":{"id":38},"node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol":{"id":40},"node_modules/@openzeppelin/contracts/introspection/IERC165.sol":{"id":39}},"additionalInput":null,"stdJsonInput":{"sources":{"contracts/core/CLPool.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity =0.7.6;\npragma abicoder v2;\n\nimport './interfaces/ICLPool.sol';\n\nimport './libraries/LowGasSafeMath.sol';\nimport './libraries/Oracle.sol';\nimport './libraries/Position.sol';\nimport './libraries/SafeCast.sol';\nimport './libraries/Tick.sol';\nimport './libraries/TickBitmap.sol';\n\nimport {CLPoolNonSwapPath as CL} from './libraries/CLPoolNonSwapPath.sol';\nimport './libraries/FixedPoint128.sol';\nimport './libraries/FullMath.sol';\nimport './libraries/LiquidityMath.sol';\nimport './libraries/SwapMath.sol';\nimport './libraries/TickMath.sol';\nimport './libraries/TransferHelper.sol';\nimport './libraries/hook/SwapHookLib.sol';\n\nimport './interfaces/ICLFactory.sol';\nimport './interfaces/IERC20Minimal.sol';\nimport './interfaces/IFactoryRegistry.sol';\nimport './interfaces/callback/ICLSwapCallback.sol';\nimport './interfaces/hook/ISwapHook.sol';\nimport {ICLGauge} from 'contracts/gauge/interfaces/ICLGauge.sol';\n\ncontract CLPool is ICLPool {\n  using LowGasSafeMath for uint256;\n  using LowGasSafeMath for int256;\n  using SafeCast for uint256;\n  using SafeCast for int256;\n  using Tick for mapping(int24 => Tick.Info);\n  using TickBitmap for mapping(int16 => uint256);\n  using Position for mapping(bytes32 => Position.Info);\n  using Position for Position.Info;\n  using Oracle for Oracle.Observation[65_535];\n  using SwapHookLib for address;\n\n  /// @inheritdoc ICLPoolConstants\n  address public override factory;\n  /// @inheritdoc ICLPoolConstants\n  address public override token0;\n  /// @inheritdoc ICLPoolConstants\n  address public override token1;\n  /// @inheritdoc ICLPoolConstants\n  address public override gauge;\n  /// @inheritdoc ICLPoolConstants\n  address public override nft;\n  /// @inheritdoc ICLPoolConstants\n  address public override factoryRegistry;\n\n  struct Slot0 {\n    // the current price\n    uint160 sqrtPriceX96;\n    // the current tick\n    int24 tick;\n    // the most-recently updated index of the observations array\n    uint16 observationIndex;\n    // the current maximum number of observations that are being stored\n    uint16 observationCardinality;\n    // the next maximum number of observations to store, triggered in observations.write\n    uint16 observationCardinalityNext;\n    // whether the pool is locked\n    bool unlocked;\n  }\n\n  /// @inheritdoc ICLPoolState\n  Slot0 public override slot0;\n\n  /// @inheritdoc ICLPoolState\n  uint256 public override feeGrowthGlobal0X128;\n  /// @inheritdoc ICLPoolState\n  uint256 public override feeGrowthGlobal1X128;\n\n  /// @inheritdoc ICLPoolState\n  uint256 public override rewardGrowthGlobalX128;\n\n  // accumulated gauge fees in token0/token1 units\n  struct GaugeFees {\n    uint128 token0;\n    uint128 token1;\n  }\n\n  /// @inheritdoc ICLPoolState\n  GaugeFees public override gaugeFees;\n\n  /// @inheritdoc ICLPoolState\n  uint256 public override rollover;\n\n  /// @inheritdoc ICLPoolState\n  uint128 public override stakedLiquidity;\n  /// @inheritdoc ICLPoolState\n  uint48 public override lastUpdated;\n  /// @inheritdoc ICLPoolConstants\n  int24 public override tickSpacing;\n\n  /// @inheritdoc ICLPoolState\n  uint128 public override liquidity;\n  /// @inheritdoc ICLPoolConstants\n  uint128 public override maxLiquidityPerTick;\n\n  /// @inheritdoc ICLPoolState\n  mapping(int24 => Tick.Info) public override ticks;\n  /// @inheritdoc ICLPoolState\n  mapping(int16 => uint256) public override tickBitmap;\n  /// @inheritdoc ICLPoolState\n  mapping(bytes32 => Position.Info) public override positions;\n  /// @inheritdoc ICLPoolState\n  Oracle.Observation[65_535] public override observations;\n\n  /// @inheritdoc ICLPoolState\n  uint160 public override secondsPerStakedLiquidityCumulativeX128;\n\n  /// @inheritdoc ICLPoolConstants\n  uint256 public constant override SWAP_FEE_CEIL = 100_000;\n  /// @inheritdoc ICLPoolConstants\n  uint256 public constant override DENOMINATOR = 1_000_000;\n  /// @inheritdoc ICLPoolConstants\n  bytes32 public constant override POOL_TYPE = 'CL';\n\n  /// @dev Mutually exclusive reentrancy protection into the pool to/from a method. This method also prevents entrance\n  /// to a function before the pool is initialized. The reentrancy guard is required throughout the contract because\n  /// we use balance checks to determine the payment status of interactions such as mint, swap and flash.\n  function _lock() private {\n    _require(slot0.unlocked, 'LOK');\n    slot0.unlocked = false;\n  }\n\n  function _unlock() private {\n    slot0.unlocked = true;\n  }\n\n  function _require(bool condition, string memory error) private pure {\n    require(condition, error);\n  }\n\n  /// @dev Prevents calling a function from anyone except the gauge associated with this pool\n  function _onlyGauge() private view {\n    _require(msg.sender == gauge, 'NG');\n  }\n\n  /// @dev Prevents calling a function from anyone except the nft manager\n  function _onlyNftManager() private view {\n    _require(msg.sender == nft, 'NNFT');\n  }\n\n  /// @inheritdoc ICLPoolActions\n  function initialize(\n    address _factory,\n    address _token0,\n    address _token1,\n    int24 _tickSpacing,\n    address _factoryRegistry,\n    uint160 _sqrtPriceX96\n  ) external override {\n    require(factory == address(0) && _factory != address(0));\n    factory = _factory;\n    token0 = _token0;\n    token1 = _token1;\n    tickSpacing = _tickSpacing;\n    factoryRegistry = _factoryRegistry;\n\n    maxLiquidityPerTick =\n      CL.initializeSlot0(slot0, observations, _sqrtPriceX96, TickMath.getTickAtSqrtRatio(_sqrtPriceX96), _tickSpacing);\n  }\n\n  /// @inheritdoc ICLPoolState\n  function beforeSwapFee(ISwapHook.SwapParams memory _swapParams) public view override returns (uint24) {\n    return CL.beforeSwapFee(_swapParams, factory, tickSpacing);\n  }\n\n  /// @inheritdoc ICLPoolState\n  function afterSwapFee(\n    ISwapHook.SwapParams memory _swapParams,\n    ISwapHook.AfterSwapParams memory _afterSwapParams\n  ) external view override returns (uint24) {\n    return CL.afterSwapFee(_swapParams, _afterSwapParams, factory);\n  }\n\n  /// @inheritdoc ICLPoolState\n  function flashFee(ISwapHook.FlashParams memory _flashParams) external view override returns (uint24 _fee) {\n    return CL.flashFee(_flashParams, factory, tickSpacing);\n  }\n\n  /// @inheritdoc ICLPoolState\n  /// @dev This method can be used for \"legacy\" swap fee modules.\n  function fee() external view override returns (uint24) {\n    ISwapHook.SwapParams memory _swapParams;\n    _swapParams.caller = msg.sender;\n    return beforeSwapFee(_swapParams);\n  }\n\n  /// @inheritdoc ICLPoolState\n  function unstakedFee() public view override returns (uint24) {\n    return ICLFactory(factory).getUnstakedFee(address(this));\n  }\n\n  /// @dev Common checks for valid tick inputs.\n  function checkTicks(int24 tickLower, int24 tickUpper) private pure {\n    require(tickLower < tickUpper, 'TLU');\n    require(tickLower >= TickMath.MIN_TICK, 'TLM');\n    require(tickUpper <= TickMath.MAX_TICK, 'TUM');\n  }\n\n  /// @dev Get the pool's balance of token0\n  /// @dev This function is gas optimized to avoid a redundant extcodesize check in addition to the returndatasize\n  /// check\n  function balance0() private view returns (uint256) {\n    return IERC20Minimal(token0).balanceOf(address(this));\n  }\n\n  /// @dev Get the pool's balance of token1\n  /// @dev This function is gas optimized to avoid a redundant extcodesize check in addition to the returndatasize\n  /// check\n  function balance1() private view returns (uint256) {\n    return IERC20Minimal(token1).balanceOf(address(this));\n  }\n\n  /// @inheritdoc ICLPoolDerivedState\n  function snapshotCumulativesInside(\n    int24 tickLower,\n    int24 tickUpper\n  )\n    external\n    view\n    override\n    returns (int56 tickCumulativeInside, uint160 secondsPerLiquidityInsideX128, uint32 secondsInside)\n  {\n    Slot0 memory currentSlot0 = slot0;\n    return CL.snapshotCumulativesInside(\n      ticks,\n      observations,\n      tickLower,\n      tickUpper,\n      currentSlot0.tick,\n      currentSlot0.observationIndex,\n      currentSlot0.observationCardinality,\n      liquidity\n    );\n  }\n\n  /// @inheritdoc ICLPoolDerivedState\n  function observe(uint32[] calldata secondsAgos)\n    external\n    view\n    override\n    returns (int56[] memory tickCumulatives, uint160[] memory secondsPerLiquidityCumulativeX128s)\n  {\n    return observations.observe(\n      uint32(block.timestamp), secondsAgos, slot0.tick, slot0.observationIndex, liquidity, slot0.observationCardinality\n    );\n  }\n\n  /// @inheritdoc ICLPoolDerivedState\n  function getSecondsPerStakedLiquidityCumulativeX128() external view override returns (uint160 _cumulative) {\n    _cumulative = secondsPerStakedLiquidityCumulativeX128;\n    uint128 _stakedLiquidity = stakedLiquidity;\n    if (_stakedLiquidity > 0) {\n      _cumulative += _secondsPerStakedLiquidityDelta(block.timestamp - lastUpdated, _stakedLiquidity);\n    }\n  }\n\n  /// @inheritdoc ICLPoolActions\n  function increaseObservationCardinalityNext(uint16 observationCardinalityNext) external override {\n    _lock();\n    CL.increaseObservationCardinalityNext(observations, slot0, observationCardinalityNext);\n    _unlock();\n  }\n\n  /// @inheritdoc ICLPoolState\n  function getFeeGrowthInside(\n    int24 tickLower,\n    int24 tickUpper\n  ) external view override returns (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128) {\n    return CL.getFeeGrowthInside(ticks, tickLower, tickUpper, slot0.tick, feeGrowthGlobal0X128, feeGrowthGlobal1X128);\n  }\n\n  function _modifyPositionInput(\n    address owner,\n    int24 tickLower,\n    int24 tickUpper\n  ) private view returns (CL.ModifyPositionInput memory input) {\n    input = CL.ModifyPositionInput({\n      owner: owner,\n      tickLower: tickLower,\n      tickUpper: tickUpper,\n      liquidity: liquidity,\n      maxLiquidityPerTick: maxLiquidityPerTick,\n      feeGrowthGlobal0X128: feeGrowthGlobal0X128,\n      feeGrowthGlobal1X128: feeGrowthGlobal1X128,\n      rewardGrowthGlobalX128: rewardGrowthGlobalX128,\n      gauge: gauge,\n      tickSpacing: tickSpacing,\n      amount: 0\n    });\n  }\n\n  /// @inheritdoc ICLPoolActions\n  function mint(\n    address recipient,\n    int24 tickLower,\n    int24 tickUpper,\n    uint128 amount,\n    bytes calldata data\n  ) external override returns (uint256 amount0, uint256 amount1) {\n    _lock();\n    CL.ModifyPositionInput memory input = _modifyPositionInput(recipient, tickLower, tickUpper);\n    input.amount = amount;\n    (uint128 liquidityAfter, uint256 amount0Out, uint256 amount1Out) =\n      CL.modifyPositionForMint(positions, ticks, tickBitmap, observations, slot0, input);\n    liquidity = liquidityAfter;\n    CL.settleMint(input, amount0Out, amount1Out, token0, token1, data);\n    _unlock();\n    return (amount0Out, amount1Out);\n  }\n\n  /// @inheritdoc ICLPoolActions\n  function collect(\n    address recipient,\n    int24 tickLower,\n    int24 tickUpper,\n    uint128 amount0Requested,\n    uint128 amount1Requested\n  ) external override returns (uint128 amount0, uint128 amount1) {\n    _lock();\n    (amount0, amount1) = _collect({\n      recipient: recipient,\n      tickLower: tickLower,\n      tickUpper: tickUpper,\n      amount0Requested: amount0Requested,\n      amount1Requested: amount1Requested,\n      owner: msg.sender\n    });\n    _unlock();\n  }\n\n  /// @inheritdoc ICLPoolActions\n  function collect(\n    address recipient,\n    int24 tickLower,\n    int24 tickUpper,\n    uint128 amount0Requested,\n    uint128 amount1Requested,\n    address owner\n  ) external override returns (uint128 amount0, uint128 amount1) {\n    _lock();\n    _onlyNftManager();\n    (amount0, amount1) = _collect({\n      recipient: recipient,\n      tickLower: tickLower,\n      tickUpper: tickUpper,\n      amount0Requested: amount0Requested,\n      amount1Requested: amount1Requested,\n      owner: owner\n    });\n    _unlock();\n  }\n\n  function _collect(\n    address recipient,\n    int24 tickLower,\n    int24 tickUpper,\n    uint128 amount0Requested,\n    uint128 amount1Requested,\n    address owner\n  ) private returns (uint128 amount0, uint128 amount1) {\n    return CL.collect(\n      positions, recipient, tickLower, tickUpper, amount0Requested, amount1Requested, owner, token0, token1\n    );\n  }\n\n  /// @inheritdoc ICLPoolActions\n  function burn(\n    int24 tickLower,\n    int24 tickUpper,\n    uint128 amount\n  ) external override returns (uint256 amount0, uint256 amount1) {\n    _lock();\n    (amount0, amount1) = _burn({tickLower: tickLower, tickUpper: tickUpper, amount: amount, owner: msg.sender});\n    _unlock();\n  }\n\n  /// @inheritdoc ICLPoolActions\n  function burn(\n    int24 tickLower,\n    int24 tickUpper,\n    uint128 amount,\n    address owner\n  ) external override returns (uint256 amount0, uint256 amount1) {\n    _lock();\n    _onlyNftManager();\n    (amount0, amount1) = _burn({tickLower: tickLower, tickUpper: tickUpper, amount: amount, owner: owner});\n    _unlock();\n  }\n\n  function _burn(\n    int24 tickLower,\n    int24 tickUpper,\n    uint128 amount,\n    address owner\n  ) private returns (uint256 amount0, uint256 amount1) {\n    CL.ModifyPositionInput memory input = _modifyPositionInput(owner, tickLower, tickUpper);\n    input.amount = amount;\n    (uint128 liquidityAfter, uint256 amount0Out, uint256 amount1Out) =\n      CL.burn(positions, ticks, tickBitmap, observations, slot0, input);\n    liquidity = liquidityAfter;\n    return (amount0Out, amount1Out);\n  }\n\n  /// @inheritdoc ICLPoolActions\n  function stake(int128 stakedLiquidityDelta, int24 tickLower, int24 tickUpper) external override {\n    _lock();\n    _onlyGauge();\n    int24 tick = slot0.tick;\n    // Increase staked liquidity in the current tick\n    if (tick >= tickLower && tick < tickUpper) {\n      _settleToBlock();\n      stakedLiquidity = LiquidityMath.addDelta(stakedLiquidity, stakedLiquidityDelta);\n    }\n\n    CL.stakePositions(\n      positions,\n      ticks,\n      nft,\n      tickLower,\n      tickUpper,\n      tick,\n      stakedLiquidityDelta,\n      feeGrowthGlobal0X128,\n      feeGrowthGlobal1X128\n    );\n    _unlock();\n  }\n\n  struct SwapCache {\n    // liquidity at the beginning of the swap\n    uint128 liquidityStart;\n    // staked liquidity at the beginning of the swap\n    uint128 stakedLiquidityStart;\n    // the timestamp of the current block\n    uint32 blockTimestamp;\n    // the current value of the tick accumulator, computed only if we cross an initialized tick\n    int56 tickCumulative;\n    // the current value of seconds per liquidity accumulator, computed only if we cross an initialized tick\n    uint160 secondsPerLiquidityCumulativeX128;\n    // whether we've computed and cached the above two accumulators\n    bool computedLatestObservation;\n    // global swap hook used to call beforeSwap/afterSwap methods.\n    address swapHook;\n  }\n\n  // the top level state of the swap, the results of which are recorded in storage at the end\n  struct SwapState {\n    // the amount remaining to be swapped in/out of the input/output asset\n    int256 amountSpecifiedRemaining;\n    // the amount already swapped out/in of the output/input asset\n    int256 amountCalculated;\n    // current sqrt(price)\n    uint160 sqrtPriceX96;\n    // the tick associated with the current price\n    int24 tick;\n    // the fee associated with the pool\n    uint24 fee;\n    // wether we've updated the fees in the current swap\n    bool hasUpdatedFees;\n    // the global fee growth of the input token\n    uint256 feeGrowthGlobalX128;\n    // amount of input token paid as gauge fee\n    uint128 gaugeFee;\n    // the current liquidity in range\n    uint128 liquidity;\n    // the current staked liquidity in range\n    uint128 stakedLiquidity;\n  }\n\n  struct StepComputations {\n    // the price at the beginning of the step\n    uint160 sqrtPriceStartX96;\n    // the next tick to swap to from the current tick in the swap direction\n    int24 tickNext;\n    // whether tickNext is initialized or not\n    bool initialized;\n    // sqrt(price) for the next tick (1/0)\n    uint160 sqrtPriceNextX96;\n    // how much is being swapped in in this step\n    uint256 amountIn;\n    // how much is being swapped out\n    uint256 amountOut;\n    // how much fee is being paid in\n    uint256 feeAmount;\n  }\n\n  /// @inheritdoc ICLPoolActions\n  function swap(\n    address recipient,\n    bool zeroForOne,\n    int256 amountSpecified,\n    uint160 sqrtPriceLimitX96,\n    bytes calldata data\n  ) external override returns (int256 amount0, int256 amount1) {\n    _require(amountSpecified != 0, 'AS');\n\n    Slot0 memory slot0Start = slot0;\n\n    _require(slot0Start.unlocked, 'LOK');\n    _require(\n      zeroForOne\n        ? sqrtPriceLimitX96 < slot0Start.sqrtPriceX96 && sqrtPriceLimitX96 > TickMath.MIN_SQRT_RATIO\n        : sqrtPriceLimitX96 > slot0Start.sqrtPriceX96 && sqrtPriceLimitX96 < TickMath.MAX_SQRT_RATIO,\n      'SPL'\n    );\n\n    slot0.unlocked = false;\n\n    SwapCache memory cache = SwapCache({\n      liquidityStart: liquidity,\n      stakedLiquidityStart: stakedLiquidity,\n      blockTimestamp: uint32(block.timestamp),\n      secondsPerLiquidityCumulativeX128: 0,\n      tickCumulative: 0,\n      computedLatestObservation: false,\n      swapHook: ICLFactory(factory).getPoolSwapHook(address(this))\n    });\n\n    bool exactInput = amountSpecified > 0;\n\n    SwapState memory state = SwapState({\n      amountSpecifiedRemaining: amountSpecified,\n      amountCalculated: 0,\n      sqrtPriceX96: slot0Start.sqrtPriceX96,\n      tick: slot0Start.tick,\n      fee: 0, // set below\n      hasUpdatedFees: false,\n      feeGrowthGlobalX128: zeroForOne ? feeGrowthGlobal0X128 : feeGrowthGlobal1X128,\n      gaugeFee: 0,\n      liquidity: cache.liquidityStart,\n      stakedLiquidity: cache.stakedLiquidityStart\n    });\n\n    state.fee = cache.swapHook\n      .beforeSwap(\n        ISwapHook.SwapParams({\n          caller: msg.sender,\n          recipient: recipient,\n          zeroForOne: zeroForOne,\n          amountSpecified: amountSpecified,\n          sqrtPriceLimitX96: sqrtPriceLimitX96,\n          data: data,\n          sqrtPriceX96: slot0Start.sqrtPriceX96,\n          tick: slot0Start.tick\n        }),\n        factory,\n        tickSpacing\n      );\n\n    // continue swapping as long as we haven't used the entire input/output and haven't reached the price limit\n    while (state.amountSpecifiedRemaining != 0 && state.sqrtPriceX96 != sqrtPriceLimitX96) {\n      StepComputations memory step;\n\n      step.sqrtPriceStartX96 = state.sqrtPriceX96;\n\n      (step.tickNext, step.initialized) =\n        tickBitmap.nextInitializedTickWithinOneWord(state.tick, tickSpacing, zeroForOne);\n\n      // ensure that we do not overshoot the min/max tick, as the tick bitmap is not aware of these bounds\n      if (step.tickNext < TickMath.MIN_TICK) {\n        step.tickNext = TickMath.MIN_TICK;\n      } else if (step.tickNext > TickMath.MAX_TICK) {\n        step.tickNext = TickMath.MAX_TICK;\n      }\n\n      // get the price for the next tick\n      step.sqrtPriceNextX96 = TickMath.getSqrtRatioAtTick(step.tickNext);\n\n      // compute values to swap to the target tick, price limit, or point where input/output amount is exhausted\n      (state.sqrtPriceX96, step.amountIn, step.amountOut, step.feeAmount) = SwapMath.computeSwapStep(\n        state.sqrtPriceX96,\n        (zeroForOne ? step.sqrtPriceNextX96 < sqrtPriceLimitX96 : step.sqrtPriceNextX96 > sqrtPriceLimitX96)\n          ? sqrtPriceLimitX96\n          : step.sqrtPriceNextX96,\n        state.liquidity,\n        state.amountSpecifiedRemaining,\n        state.fee\n      );\n\n      if (exactInput) {\n        state.amountSpecifiedRemaining -= (step.amountIn + step.feeAmount).toInt256();\n        state.amountCalculated = state.amountCalculated.sub(step.amountOut.toInt256());\n      } else {\n        state.amountSpecifiedRemaining += step.amountOut.toInt256();\n        state.amountCalculated = state.amountCalculated.add((step.amountIn + step.feeAmount).toInt256());\n      }\n\n      // update global fee tracker and gauge fee\n      if (state.liquidity > 0) {\n        (uint256 _feeGrowthGlobalX128, uint256 _stakedFeeAmount) =\n          calculateFees(step.feeAmount, state.liquidity, state.stakedLiquidity);\n\n        state.feeGrowthGlobalX128 += _feeGrowthGlobalX128;\n        state.gaugeFee += uint128(_stakedFeeAmount);\n      }\n\n      // shift tick if we reached the next price\n      if (state.sqrtPriceX96 == step.sqrtPriceNextX96) {\n        // if the tick is initialized, run the tick transition\n        if (step.initialized) {\n          // check for the placeholder value, which we replace with the actual value the first time the swap\n          // crosses an initialized tick\n          if (!cache.computedLatestObservation) {\n            (cache.tickCumulative, cache.secondsPerLiquidityCumulativeX128) = observations.observeSingle(\n              cache.blockTimestamp,\n              0,\n              slot0Start.tick,\n              slot0Start.observationIndex,\n              cache.liquidityStart,\n              slot0Start.observationCardinality\n            );\n            cache.computedLatestObservation = true;\n          }\n          if (!state.hasUpdatedFees) {\n            _settleToBlock();\n            state.hasUpdatedFees = true;\n          }\n          Tick.LiquidityNets memory nets = ticks.cross(\n            step.tickNext,\n            (zeroForOne ? state.feeGrowthGlobalX128 : feeGrowthGlobal0X128),\n            (zeroForOne ? feeGrowthGlobal1X128 : state.feeGrowthGlobalX128),\n            cache.secondsPerLiquidityCumulativeX128,\n            cache.tickCumulative,\n            cache.blockTimestamp,\n            rewardGrowthGlobalX128\n          );\n          // if we're moving leftward, we interpret liquidityNet & stakedLiquidityNet as the opposite sign\n          // safe because liquidityNet & stakedLiquidityNet cannot be type(int128).min\n          if (zeroForOne) {\n            nets.liquidityNet = -nets.liquidityNet;\n            nets.stakedLiquidityNet = -nets.stakedLiquidityNet;\n          }\n\n          state.liquidity = LiquidityMath.addDelta(state.liquidity, nets.liquidityNet);\n          state.stakedLiquidity = LiquidityMath.addDelta(state.stakedLiquidity, nets.stakedLiquidityNet);\n        }\n\n        state.tick = zeroForOne ? step.tickNext - 1 : step.tickNext;\n      } else if (state.sqrtPriceX96 != step.sqrtPriceStartX96) {\n        // recompute unless we're on a lower tick boundary (i.e. already transitioned ticks), and haven't moved\n        state.tick = TickMath.getTickAtSqrtRatio(state.sqrtPriceX96);\n      }\n    }\n\n    /// @dev This function is able to mutate `gaugeFees` storage variable.\n    cache.swapHook\n      .afterSwap(\n        ISwapHook.SwapParams({\n          caller: msg.sender,\n          recipient: recipient,\n          zeroForOne: zeroForOne,\n          amountSpecified: amountSpecified,\n          sqrtPriceLimitX96: sqrtPriceLimitX96,\n          data: data,\n          sqrtPriceX96: state.sqrtPriceX96,\n          tick: state.tick\n        }),\n        state,\n        cache,\n        gaugeFees\n      );\n\n    // update tick and write an oracle entry if the tick change\n    if (state.tick != slot0Start.tick) {\n      (uint16 observationIndex, uint16 observationCardinality) = observations.write(\n        slot0Start.observationIndex,\n        cache.blockTimestamp,\n        slot0Start.tick,\n        cache.liquidityStart,\n        slot0Start.observationCardinality,\n        slot0Start.observationCardinalityNext\n      );\n      (slot0.sqrtPriceX96, slot0.tick, slot0.observationIndex, slot0.observationCardinality) =\n      (state.sqrtPriceX96, state.tick, observationIndex, observationCardinality);\n    } else {\n      // otherwise just update the price\n      slot0.sqrtPriceX96 = state.sqrtPriceX96;\n    }\n\n    // update liquidity and stakedLiquidity if it changed\n    if (cache.liquidityStart != state.liquidity) liquidity = state.liquidity;\n    if (cache.stakedLiquidityStart != state.stakedLiquidity) stakedLiquidity = state.stakedLiquidity;\n\n    // update fee growth global and, if necessary, gauge fees\n    // overflow is acceptable, protocol has to withdraw before it hits type(uint128).max fees\n    if (zeroForOne) {\n      feeGrowthGlobal0X128 = state.feeGrowthGlobalX128;\n      if (state.gaugeFee > 0) gaugeFees.token0 += state.gaugeFee;\n    } else {\n      feeGrowthGlobal1X128 = state.feeGrowthGlobalX128;\n      if (state.gaugeFee > 0) gaugeFees.token1 += state.gaugeFee;\n    }\n\n    (amount0, amount1) = zeroForOne == exactInput\n      ? (amountSpecified - state.amountSpecifiedRemaining, state.amountCalculated)\n      : (state.amountCalculated, amountSpecified - state.amountSpecifiedRemaining);\n\n    // do the transfers and collect payment\n    if (zeroForOne) {\n      if (amount1 < 0) TransferHelper.safeTransfer(token1, recipient, uint256(-amount1));\n\n      uint256 balance0Before = balance0();\n      ICLSwapCallback(msg.sender).uniswapV3SwapCallback(amount0, amount1, data);\n      _require(balance0Before.add(uint256(amount0)) <= balance0(), 'IIA');\n    } else {\n      if (amount0 < 0) TransferHelper.safeTransfer(token0, recipient, uint256(-amount0));\n\n      uint256 balance1Before = balance1();\n      ICLSwapCallback(msg.sender).uniswapV3SwapCallback(amount0, amount1, data);\n      _require(balance1Before.add(uint256(amount1)) <= balance1(), 'IIA');\n    }\n\n    emit Swap(msg.sender, recipient, amount0, amount1, state.sqrtPriceX96, state.liquidity, state.tick);\n    slot0.unlocked = true;\n  }\n\n  /// @inheritdoc ICLPoolActions\n  function flash(address recipient, uint256 amount0, uint256 amount1, bytes calldata data) external override {\n    _lock();\n\n    /// @dev The internal call credits part of the paid fee to gauge's token0/1.\n    ///      And thus changes the original sequence of fee updates from:\n    ///       1) getUnstakedFee() -> feeGrowthGlobal0X128 += x  -> gaugeFees.token0 += y\n    ///       2) getUnstakedFee() -> feeGrowthGlobal1X128 += x' -> gaugeFees.token1 += y'\n    ///      to:\n    ///       1) getUnstakedFee() -> gaugeFees.token0 += y\n    ///       2) getUnstakedFee() -> gaugeFees.token1 += y'\n    ///       3) feeGrowthGlobal0X128 += x\n    ///       4) feeGrowthGlobal1X128 += x'\n    (uint256 feeGrowthDelta0, uint256 feeGrowthDelta1) = CL.flash(\n      gaugeFees,\n      CL.FlashInput({\n        token0: token0,\n        token1: token1,\n        factory: factory,\n        tickSpacing: tickSpacing,\n        liquidity: liquidity,\n        stakedLiquidity: stakedLiquidity,\n        recipient: recipient,\n        amount0: amount0,\n        amount1: amount1\n      }),\n      data\n    );\n    if (feeGrowthDelta0 > 0) feeGrowthGlobal0X128 += feeGrowthDelta0;\n    if (feeGrowthDelta1 > 0) feeGrowthGlobal1X128 += feeGrowthDelta1;\n    _unlock();\n  }\n\n  /// @inheritdoc ICLPoolState\n  function getRewardGrowthInside(\n    int24 tickLower,\n    int24 tickUpper,\n    uint256 _rewardGrowthGlobalX128\n  ) external view override returns (uint256 rewardGrowthInside) {\n    return CL.getRewardGrowthInside(\n      ticks, tickLower, tickUpper, slot0.tick, _rewardGrowthGlobalX128, rewardGrowthGlobalX128\n    );\n  }\n\n  /// @dev Seconds elapsed converted into X128 seconds per unit of staked liquidity.\n  function _secondsPerStakedLiquidityDelta(uint256 _elapsed, uint128 _stakedLiquidity) internal pure returns (uint160) {\n    return uint160((_elapsed << 128) / _stakedLiquidity);\n  }\n\n  /// @dev Credits realized emissions to the accumulator when staked liquidity is in range, otherwise banks\n  ///      them into rollover, then advances the settlement timestamp. Both settlement paths terminate here.\n  function _updateRewardsGrowthGlobal(uint256 _rewardsToDistribute, uint48 _now, uint48 _lastUpdated) internal {\n    uint128 _stakedLiquidity = stakedLiquidity;\n    if (_stakedLiquidity > 0) {\n      rewardGrowthGlobalX128 += FullMath.mulDiv(_rewardsToDistribute, FixedPoint128.Q128, _stakedLiquidity);\n      secondsPerStakedLiquidityCumulativeX128 += _secondsPerStakedLiquidityDelta(_now - _lastUpdated, _stakedLiquidity);\n    } else {\n      rollover += _rewardsToDistribute;\n    }\n    lastUpdated = _now;\n  }\n\n  /// @dev Realizes rewards up to the current block by pulling the emissions accrued since the last\n  /// settlement through the gauge. Calls {_updateRewardsGrowthGlobal} to update the rewards to\n  /// distribute and lastUpdated. The LeafVoter's settlement is permissionless and returns 0 for\n  /// unregistered gauges, so the gauge pull reverts in exactly one case: the gauge's factory relays\n  /// the settle to the gauge tape inside a gas-capped call, and the caller funded the settle but\n  /// not that capped subcall.\n  function _settleToBlock() internal {\n    uint48 _timestamp = uint48(block.timestamp);\n    uint48 _lastUpdated = lastUpdated;\n    if (_timestamp == _lastUpdated) return;\n\n    address _gauge = gauge;\n    if (_gauge == address(0)) return;\n\n    uint256 _rewardsToDistribute = ICLGauge(_gauge).settleGauge();\n    _updateRewardsGrowthGlobal(_rewardsToDistribute, _timestamp, _lastUpdated);\n  }\n\n  /// @inheritdoc ICLPoolActions\n  function settleToBlock() external override returns (uint256 _rollover) {\n    _lock();\n    _onlyGauge();\n    _settleToBlock();\n    _rollover = rollover;\n    delete rollover;\n    _unlock();\n  }\n\n  /// @notice Calculates the fees owed to staked liquidity, then calculates fee levied on unstaked liquidity\n  /// @param feeAmount Total fees\n  /// @param _liquidity Current liquidity in active tick\n  /// @param _stakedLiquidity Current staked liquidity in active tick\n  /// @return unstakedFeeAmount Fee amount for unstaked LPs after accounting for staked liquidity contribution and unstaked fee\n  /// @return stakedFeeAmount Fee amount for staked LPs consisting of staked liquidity contribution and unstaked fee\n  function splitFees(\n    uint256 feeAmount,\n    uint128 _liquidity,\n    uint128 _stakedLiquidity\n  ) internal view returns (uint256 unstakedFeeAmount, uint256 stakedFeeAmount) {\n    stakedFeeAmount = FullMath.mulDivRoundingUp(feeAmount, _stakedLiquidity, _liquidity);\n    (unstakedFeeAmount, stakedFeeAmount) = applyUnstakedFees(feeAmount - stakedFeeAmount, stakedFeeAmount);\n  }\n\n  /// @notice Calculates fee for levied on unstaked liquidity only\n  /// @param _unstakedFeeAmount Fee amount for unstaked LPs net of staked liquidity contribution\n  /// @param _stakedFeeAmount Fee amount for staked LPs consisting of staked liquidity contribution\n  /// @return unstakedFeeAmount Fee amount for unstaked LPs after accounting for staked liquidity contribution and unstaked fee\n  /// @return stakedFeeAmount Fee amount for staked LPs consisting of staked liquidity contribution and unstaked fee\n  function applyUnstakedFees(\n    uint256 _unstakedFeeAmount,\n    uint256 _stakedFeeAmount\n  ) internal view returns (uint256 unstakedFeeAmount, uint256 stakedFeeAmount) {\n    uint256 _stakedFee = FullMath.mulDivRoundingUp(_unstakedFeeAmount, unstakedFee(), 1_000_000);\n    unstakedFeeAmount = _unstakedFeeAmount - _stakedFee;\n    stakedFeeAmount = _stakedFeeAmount + _stakedFee;\n  }\n\n  // calculates the fee growths for unstaked liquidity and returns it with the staked fee amount\n  function calculateFees(\n    uint256 feeAmount,\n    uint128 _liquidity,\n    uint128 _stakedLiquidity\n  ) internal view returns (uint256 feeGrowthGlobalX128, uint256 stakedFeeAmount) {\n    // if there is only staked liquidity\n    if (_liquidity == _stakedLiquidity) {\n      stakedFeeAmount = feeAmount;\n    }\n    // if there is only unstaked liquidity\n    else if (_stakedLiquidity == 0) {\n      (uint256 unstakedFeeAmount, uint256 _stakedFeeAmount) = applyUnstakedFees(feeAmount, 0);\n      feeGrowthGlobalX128 = FullMath.mulDiv(unstakedFeeAmount, FixedPoint128.Q128, _liquidity);\n      stakedFeeAmount = _stakedFeeAmount;\n    }\n    // if there are staked and unstaked liquidities\n    else {\n      (uint256 unstakedFeeAmount, uint256 _stakedFeeAmount) = splitFees(feeAmount, _liquidity, _stakedLiquidity);\n      feeGrowthGlobalX128 = FullMath.mulDiv(unstakedFeeAmount, FixedPoint128.Q128, _liquidity - _stakedLiquidity);\n      stakedFeeAmount = _stakedFeeAmount;\n    }\n  }\n\n  /// @inheritdoc ICLPoolOwnerActions\n  function collectFees(address recipient) external override returns (uint128 amount0, uint128 amount1) {\n    _lock();\n    _onlyGauge();\n    (amount0, amount1) = CL.collectFees(gaugeFees, recipient, token0, token1);\n    _unlock();\n  }\n\n  /// @inheritdoc ICLPoolActions\n  function setGaugeAndPositionManager(address _gauge, address _nft) external override {\n    _lock();\n    CL.validateGaugeFactory(factoryRegistry, factory);\n    require(gauge == address(0));\n    gauge = _gauge;\n    nft = _nft;\n    // Pull any emissions the voter accrued before the gauge was connected. No liquidity can be\n    // staked yet, so the accrual banks into rollover instead of crediting future stakers, and the\n    // gauge's settlement cursor is initialized in the same call.\n    uint256 _rewardsToDistribute = ICLGauge(_gauge).settleGauge();\n    _updateRewardsGrowthGlobal(_rewardsToDistribute, uint48(block.timestamp), lastUpdated);\n    _unlock();\n  }\n}\n"},"contracts/core/libraries/Tick.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0 <0.8.0;\n\nimport './LowGasSafeMath.sol';\nimport './SafeCast.sol';\n\nimport './LiquidityMath.sol';\nimport './TickMath.sol';\n\n/// @title Tick\n/// @notice Contains functions for managing tick processes and relevant calculations\nlibrary Tick {\n  using LowGasSafeMath for int256;\n  using SafeCast for int256;\n\n  // info stored for each initialized individual tick\n  struct Info {\n    // the total position liquidity that references this tick\n    // includes both staked and unstaked liquidity\n    uint128 liquidityGross;\n    // amount of net liquidity added (subtracted) when tick is crossed from left to right (right to left)\n    // includes both staked and unstaked liquidity\n    int128 liquidityNet;\n    // amount of net staked liquidity added (subtracted) when tick is crossed from left to right (right to left)\n    int128 stakedLiquidityNet;\n    // fee growth per unit of liquidity on the _other_ side of this tick (relative to the current tick)\n    // only has relative meaning, not absolute — the value depends on when the tick is initialized\n    uint256 feeGrowthOutside0X128;\n    uint256 feeGrowthOutside1X128;\n    // reward growth per unit of liquidity on the _other_ side of this tick (relative to the current tick)\n    // only has relative meaning, not absolute — the value depends on when the tick is initialized\n    uint256 rewardGrowthOutsideX128;\n    // the cumulative tick value on the other side of the tick\n    int56 tickCumulativeOutside;\n    // the seconds per unit of liquidity on the _other_ side of this tick (relative to the current tick)\n    // only has relative meaning, not absolute — the value depends on when the tick is initialized\n    uint160 secondsPerLiquidityOutsideX128;\n    // the seconds spent on the other side of the tick (relative to the current tick)\n    // only has relative meaning, not absolute — the value depends on when the tick is initialized\n    uint32 secondsOutside;\n    // true iff the tick is initialized, i.e. the value is exactly equivalent to the expression liquidityGross != 0\n    // these 8 bits are set to prevent fresh sstores when crossing newly initialized ticks\n    bool initialized;\n  }\n\n  struct LiquidityNets {\n    int128 liquidityNet;\n    int128 stakedLiquidityNet;\n  }\n\n  /// @notice Derives max liquidity per tick from given tick spacing\n  /// @dev Executed within the pool constructor\n  /// @param tickSpacing The amount of required tick separation, realized in multiples of `tickSpacing`\n  ///     e.g., a tickSpacing of 3 requires ticks to be initialized every 3rd tick i.e., ..., -6, -3, 0, 3, 6, ...\n  /// @return The max liquidity per tick\n  function tickSpacingToMaxLiquidityPerTick(int24 tickSpacing) internal pure returns (uint128) {\n    int24 minTick = (TickMath.MIN_TICK / tickSpacing) * tickSpacing;\n    int24 maxTick = (TickMath.MAX_TICK / tickSpacing) * tickSpacing;\n    uint24 numTicks = uint24((maxTick - minTick) / tickSpacing) + 1;\n    return type(uint128).max / numTicks;\n  }\n\n  /// @notice Retrieves fee growth data\n  /// @param self The mapping containing all tick information for initialized ticks\n  /// @param tickLower The lower tick boundary of the position\n  /// @param tickUpper The upper tick boundary of the position\n  /// @param tickCurrent The current tick\n  /// @param feeGrowthGlobal0X128 The all-time global fee growth, per unit of liquidity, in token0\n  /// @param feeGrowthGlobal1X128 The all-time global fee growth, per unit of liquidity, in token1\n  /// @return feeGrowthInside0X128 The all-time fee growth in token0, per unit of liquidity, inside the position's tick boundaries\n  /// @return feeGrowthInside1X128 The all-time fee growth in token1, per unit of liquidity, inside the position's tick boundaries\n  function getFeeGrowthInside(\n    mapping(int24 => Tick.Info) storage self,\n    int24 tickLower,\n    int24 tickUpper,\n    int24 tickCurrent,\n    uint256 feeGrowthGlobal0X128,\n    uint256 feeGrowthGlobal1X128\n  ) internal view returns (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128) {\n    Info storage lower = self[tickLower];\n    Info storage upper = self[tickUpper];\n\n    // calculate fee growth below\n    uint256 feeGrowthBelow0X128;\n    uint256 feeGrowthBelow1X128;\n    if (tickCurrent >= tickLower) {\n      feeGrowthBelow0X128 = lower.feeGrowthOutside0X128;\n      feeGrowthBelow1X128 = lower.feeGrowthOutside1X128;\n    } else {\n      feeGrowthBelow0X128 = feeGrowthGlobal0X128 - lower.feeGrowthOutside0X128;\n      feeGrowthBelow1X128 = feeGrowthGlobal1X128 - lower.feeGrowthOutside1X128;\n    }\n\n    // calculate fee growth above\n    uint256 feeGrowthAbove0X128;\n    uint256 feeGrowthAbove1X128;\n    if (tickCurrent < tickUpper) {\n      feeGrowthAbove0X128 = upper.feeGrowthOutside0X128;\n      feeGrowthAbove1X128 = upper.feeGrowthOutside1X128;\n    } else {\n      feeGrowthAbove0X128 = feeGrowthGlobal0X128 - upper.feeGrowthOutside0X128;\n      feeGrowthAbove1X128 = feeGrowthGlobal1X128 - upper.feeGrowthOutside1X128;\n    }\n\n    feeGrowthInside0X128 = feeGrowthGlobal0X128 - feeGrowthBelow0X128 - feeGrowthAbove0X128;\n    feeGrowthInside1X128 = feeGrowthGlobal1X128 - feeGrowthBelow1X128 - feeGrowthAbove1X128;\n  }\n\n  function getRewardGrowthInside(\n    mapping(int24 => Tick.Info) storage self,\n    int24 tickLower,\n    int24 tickUpper,\n    int24 tickCurrent,\n    uint256 rewardGrowthGlobalX128\n  ) internal view returns (uint256 rewardGrowthInsideX128) {\n    Info storage lower = self[tickLower];\n    Info storage upper = self[tickUpper];\n\n    // calculate reward growth below\n    uint256 rewardGrowthBelowX128;\n    if (tickCurrent >= tickLower) {\n      rewardGrowthBelowX128 = lower.rewardGrowthOutsideX128;\n    } else {\n      rewardGrowthBelowX128 = rewardGrowthGlobalX128 - lower.rewardGrowthOutsideX128;\n    }\n\n    // calculate reward growth above\n    uint256 rewardGrowthAboveX128;\n    if (tickCurrent < tickUpper) {\n      rewardGrowthAboveX128 = upper.rewardGrowthOutsideX128;\n    } else {\n      rewardGrowthAboveX128 = rewardGrowthGlobalX128 - upper.rewardGrowthOutsideX128;\n    }\n\n    rewardGrowthInsideX128 = rewardGrowthGlobalX128 - rewardGrowthBelowX128 - rewardGrowthAboveX128;\n  }\n\n  /// @notice Updates a tick and returns true if the tick was flipped from initialized to uninitialized, or vice versa\n  /// @param self The mapping containing all tick information for initialized ticks\n  /// @param tick The tick that will be updated\n  /// @param tickCurrent The current tick\n  /// @param liquidityDelta A new amount of liquidity to be added (subtracted) when tick is crossed from left to right (right to left)\n  /// @param feeGrowthGlobal0X128 The all-time global fee growth, per unit of liquidity, in token0\n  /// @param feeGrowthGlobal1X128 The all-time global fee growth, per unit of liquidity, in token1\n  /// @param rewardGrowthGlobalX128 The all-time global reward growth, per unit of liquidity\n  /// @param secondsPerLiquidityCumulativeX128 The all-time seconds per max(1, liquidity) of the pool\n  /// @param tickCumulative The tick * time elapsed since the pool was first initialized\n  /// @param time The current block timestamp cast to a uint32\n  /// @param upper true for updating a position's upper tick, or false for updating a position's lower tick\n  /// @param maxLiquidity The maximum liquidity allocation for a single tick\n  /// @return flipped Whether the tick was flipped from initialized to uninitialized, or vice versa\n  function update(\n    mapping(int24 => Tick.Info) storage self,\n    int24 tick,\n    int24 tickCurrent,\n    int128 liquidityDelta,\n    uint256 feeGrowthGlobal0X128,\n    uint256 feeGrowthGlobal1X128,\n    uint256 rewardGrowthGlobalX128,\n    uint160 secondsPerLiquidityCumulativeX128,\n    int56 tickCumulative,\n    uint32 time,\n    bool upper,\n    uint128 maxLiquidity\n  ) internal returns (bool flipped) {\n    Tick.Info storage info = self[tick];\n\n    uint128 liquidityGrossBefore = info.liquidityGross;\n    uint128 liquidityGrossAfter = LiquidityMath.addDelta(liquidityGrossBefore, liquidityDelta);\n\n    require(liquidityGrossAfter <= maxLiquidity, 'LO');\n\n    flipped = (liquidityGrossAfter == 0) != (liquidityGrossBefore == 0);\n\n    if (liquidityGrossBefore == 0) {\n      // by convention, we assume that all growth before a tick was initialized happened _below_ the tick\n      if (tick <= tickCurrent) {\n        info.feeGrowthOutside0X128 = feeGrowthGlobal0X128;\n        info.feeGrowthOutside1X128 = feeGrowthGlobal1X128;\n        info.rewardGrowthOutsideX128 = rewardGrowthGlobalX128;\n        info.secondsPerLiquidityOutsideX128 = secondsPerLiquidityCumulativeX128;\n        info.tickCumulativeOutside = tickCumulative;\n        info.secondsOutside = time;\n      }\n      info.initialized = true;\n    }\n\n    info.liquidityGross = liquidityGrossAfter;\n\n    // when the lower (upper) tick is crossed left to right (right to left), liquidity must be added (removed)\n    info.liquidityNet = upper\n      ? int256(info.liquidityNet).sub(liquidityDelta).toInt128()\n      : int256(info.liquidityNet).add(liquidityDelta).toInt128();\n  }\n\n  /// @notice Updates the staked liquidity component of a tick. Assumes tick is already initialized with an existing position.\n  /// @notice We reuse existing liquidity for staking, so there is no change in liquidity\n  /// @param self The mapping containing all tick information for initialized ticks\n  /// @param tick The tick that will be updated\n  /// @param stakedLiquidityDelta The amount of staked liquidity to be added (subtracted) when tick is crossed from left to right (right to left)\n  /// @param upper true for updating a position's upper tick, or false for updating a position's lower tick\n  function updateStake(\n    mapping(int24 => Tick.Info) storage self,\n    int24 tick,\n    int128 stakedLiquidityDelta,\n    bool upper\n  ) internal {\n    Tick.Info storage info = self[tick];\n    // when the lower (upper) tick is crossed left to right (right to left), staked liquidity must be added (removed)\n    info.stakedLiquidityNet = upper\n      ? int256(info.stakedLiquidityNet).sub(stakedLiquidityDelta).toInt128()\n      : int256(info.stakedLiquidityNet).add(stakedLiquidityDelta).toInt128();\n  }\n\n  /// @notice Clears tick data\n  /// @param self The mapping containing all initialized tick information for initialized ticks\n  /// @param tick The tick that will be cleared\n  function clear(mapping(int24 => Tick.Info) storage self, int24 tick) internal {\n    delete self[tick];\n  }\n\n  /// @notice Transitions to next tick as needed by price movement\n  /// @param self The mapping containing all tick information for initialized ticks\n  /// @param tick The destination tick of the transition\n  /// @param feeGrowthGlobal0X128 The all-time global fee growth, per unit of liquidity, in token0\n  /// @param feeGrowthGlobal1X128 The all-time global fee growth, per unit of liquidity, in token1\n  /// @param secondsPerLiquidityCumulativeX128 The current seconds per liquidity\n  /// @param tickCumulative The tick * time elapsed since the pool was first initialized\n  /// @param time The current block.timestamp\n  /// @param rewardGrowthGlobalX128 The all-time global reward growth, per unit of liquidity\n  /// @return nets The amount of liquidity and staked liquidity added (subtracted) when tick is crossed from left to right (right to left)\n  function cross(\n    mapping(int24 => Tick.Info) storage self,\n    int24 tick,\n    uint256 feeGrowthGlobal0X128,\n    uint256 feeGrowthGlobal1X128,\n    uint160 secondsPerLiquidityCumulativeX128,\n    int56 tickCumulative,\n    uint32 time,\n    uint256 rewardGrowthGlobalX128\n  ) internal returns (LiquidityNets memory nets) {\n    Tick.Info storage info = self[tick];\n    info.feeGrowthOutside0X128 = feeGrowthGlobal0X128 - info.feeGrowthOutside0X128;\n    info.feeGrowthOutside1X128 = feeGrowthGlobal1X128 - info.feeGrowthOutside1X128;\n    info.rewardGrowthOutsideX128 = rewardGrowthGlobalX128 - info.rewardGrowthOutsideX128;\n    info.secondsPerLiquidityOutsideX128 = secondsPerLiquidityCumulativeX128 - info.secondsPerLiquidityOutsideX128;\n    info.tickCumulativeOutside = tickCumulative - info.tickCumulativeOutside;\n    info.secondsOutside = time - info.secondsOutside;\n    nets.liquidityNet = info.liquidityNet;\n    nets.stakedLiquidityNet = info.stakedLiquidityNet;\n  }\n}\n"},"contracts/core/libraries/Oracle.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0 <0.8.0;\n\n/// @title Oracle\n/// @notice Provides price and liquidity data useful for a wide variety of system designs\n/// @dev Instances of stored oracle data, \"observations\", are collected in the oracle array\n/// Every pool is initialized with an oracle array length of 1. Anyone can pay the SSTOREs to increase the\n/// maximum length of the oracle array. New slots will be added when the array is fully populated.\n/// Observations are overwritten when the full length of the oracle array is populated.\n/// The most recent observation is available, independent of the length of the oracle array, by passing 0 to observe()\nlibrary Oracle {\n  struct Observation {\n    // the block timestamp of the observation\n    uint32 blockTimestamp;\n    // the tick accumulator, i.e. tick * time elapsed since the pool was first initialized\n    int56 tickCumulative;\n    // the seconds per liquidity, i.e. seconds elapsed / max(1, liquidity) since the pool was first initialized\n    uint160 secondsPerLiquidityCumulativeX128;\n    // whether or not the observation is initialized\n    bool initialized;\n  }\n\n  /// @notice Transforms a previous observation into a new observation, given the passage of time and the current tick and liquidity values\n  /// @dev blockTimestamp _must_ be chronologically equal to or greater than last.blockTimestamp, safe for 0 or 1 overflows\n  /// @param last The specified observation to be transformed\n  /// @param blockTimestamp The timestamp of the new observation\n  /// @param tick The active tick at the time of the new observation\n  /// @param liquidity The total in-range liquidity at the time of the new observation\n  /// @return Observation The newly populated observation\n  function transform(\n    Observation memory last,\n    uint32 blockTimestamp,\n    int24 tick,\n    uint128 liquidity\n  ) private pure returns (Observation memory) {\n    uint32 delta = blockTimestamp - last.blockTimestamp;\n    return Observation({\n      blockTimestamp: blockTimestamp,\n      tickCumulative: last.tickCumulative + int56(tick) * delta,\n      secondsPerLiquidityCumulativeX128: last.secondsPerLiquidityCumulativeX128\n        + ((uint160(delta) << 128) / (liquidity > 0 ? liquidity : 1)),\n      initialized: true\n    });\n  }\n\n  /// @notice Initialize the oracle array by writing the first slot. Called once for the lifecycle of the observations array\n  /// @param self The stored oracle array\n  /// @param time The time of the oracle initialization, via block.timestamp truncated to uint32\n  /// @return cardinality The number of populated elements in the oracle array\n  /// @return cardinalityNext The new length of the oracle array, independent of population\n  function initialize(\n    Observation[65_535] storage self,\n    uint32 time\n  ) internal returns (uint16 cardinality, uint16 cardinalityNext) {\n    self[0] = Observation({\n      blockTimestamp: time, tickCumulative: 0, secondsPerLiquidityCumulativeX128: 0, initialized: true\n    });\n    return (1, 1);\n  }\n\n  /// @notice Writes an oracle observation to the array\n  /// @dev Writable at most once per block. Index represents the most recently written element. cardinality and index must be tracked externally.\n  /// If the index is at the end of the allowable array length (according to cardinality), and the next cardinality\n  /// is greater than the current one, cardinality may be increased. This restriction is created to preserve ordering.\n  /// @param self The stored oracle array\n  /// @param index The index of the observation that was most recently written to the observations array\n  /// @param blockTimestamp The timestamp of the new observation\n  /// @param tick The active tick at the time of the new observation\n  /// @param liquidity The total in-range liquidity at the time of the new observation\n  /// @param cardinality The number of populated elements in the oracle array\n  /// @param cardinalityNext The new length of the oracle array, independent of population\n  /// @return indexUpdated The new index of the most recently written element in the oracle array\n  /// @return cardinalityUpdated The new cardinality of the oracle array\n  function write(\n    Observation[65_535] storage self,\n    uint16 index,\n    uint32 blockTimestamp,\n    int24 tick,\n    uint128 liquidity,\n    uint16 cardinality,\n    uint16 cardinalityNext\n  ) internal returns (uint16 indexUpdated, uint16 cardinalityUpdated) {\n    Observation memory last = self[index];\n\n    // early return if we've already written an observation this block\n    if (last.blockTimestamp == blockTimestamp) return (index, cardinality);\n\n    // if the conditions are right, we can bump the cardinality\n    if (cardinalityNext > cardinality && index == (cardinality - 1)) {\n      cardinalityUpdated = cardinalityNext;\n    } else {\n      cardinalityUpdated = cardinality;\n    }\n\n    indexUpdated = (index + 1) % cardinalityUpdated;\n    self[indexUpdated] = transform(last, blockTimestamp, tick, liquidity);\n  }\n\n  /// @notice Prepares the oracle array to store up to `next` observations\n  /// @param self The stored oracle array\n  /// @param current The current next cardinality of the oracle array\n  /// @param next The proposed next cardinality which will be populated in the oracle array\n  /// @return next The next cardinality which will be populated in the oracle array\n  function grow(Observation[65_535] storage self, uint16 current, uint16 next) internal returns (uint16) {\n    require(current > 0, 'I');\n    // no-op if the passed next value isn't greater than the current next value\n    if (next <= current) return current;\n    // store in each slot to prevent fresh SSTOREs in swaps\n    // this data will not be used because the initialized boolean is still false\n    for (uint16 i = current; i < next; i++) {\n      self[i].blockTimestamp = 1;\n    }\n    return next;\n  }\n\n  /// @notice comparator for 32-bit timestamps\n  /// @dev safe for 0 or 1 overflows, a and b _must_ be chronologically before or equal to time\n  /// @param time A timestamp truncated to 32 bits\n  /// @param a A comparison timestamp from which to determine the relative position of `time`\n  /// @param b From which to determine the relative position of `time`\n  /// @return bool Whether `a` is chronologically <= `b`\n  function lte(uint32 time, uint32 a, uint32 b) private pure returns (bool) {\n    // if there hasn't been overflow, no need to adjust\n    if (a <= time && b <= time) return a <= b;\n\n    uint256 aAdjusted = a > time ? a : a + 2 ** 32;\n    uint256 bAdjusted = b > time ? b : b + 2 ** 32;\n\n    return aAdjusted <= bAdjusted;\n  }\n\n  /// @notice Fetches the observations beforeOrAt and atOrAfter a target, i.e. where [beforeOrAt, atOrAfter] is satisfied.\n  /// The result may be the same observation, or adjacent observations.\n  /// @dev The answer must be contained in the array, used when the target is located within the stored observation\n  /// boundaries: older than the most recent observation and younger, or the same age as, the oldest observation\n  /// @param self The stored oracle array\n  /// @param time The current block.timestamp\n  /// @param target The timestamp at which the reserved observation should be for\n  /// @param index The index of the observation that was most recently written to the observations array\n  /// @param cardinality The number of populated elements in the oracle array\n  /// @return beforeOrAt The observation recorded before, or at, the target\n  /// @return atOrAfter The observation recorded at, or after, the target\n  function binarySearch(\n    Observation[65_535] storage self,\n    uint32 time,\n    uint32 target,\n    uint16 index,\n    uint16 cardinality\n  ) private view returns (Observation memory beforeOrAt, Observation memory atOrAfter) {\n    uint256 l = (index + 1) % cardinality; // oldest observation\n    uint256 r = l + cardinality - 1; // newest observation\n    uint256 i;\n    while (true) {\n      i = (l + r) / 2;\n\n      beforeOrAt = self[i % cardinality];\n\n      // we've landed on an uninitialized tick, keep searching higher (more recently)\n      if (!beforeOrAt.initialized) {\n        l = i + 1;\n        continue;\n      }\n\n      atOrAfter = self[(i + 1) % cardinality];\n\n      bool targetAtOrAfter = lte(time, beforeOrAt.blockTimestamp, target);\n\n      // check if we've found the answer!\n      if (targetAtOrAfter && lte(time, target, atOrAfter.blockTimestamp)) break;\n\n      if (!targetAtOrAfter) r = i - 1;\n      else l = i + 1;\n    }\n  }\n\n  /// @notice Fetches the observations beforeOrAt and atOrAfter a given target, i.e. where [beforeOrAt, atOrAfter] is satisfied\n  /// @dev Assumes there is at least 1 initialized observation.\n  /// Used by observeSingle() to compute the counterfactual accumulator values as of a given block timestamp.\n  /// @param self The stored oracle array\n  /// @param time The current block.timestamp\n  /// @param target The timestamp at which the reserved observation should be for\n  /// @param tick The active tick at the time of the returned or simulated observation\n  /// @param index The index of the observation that was most recently written to the observations array\n  /// @param liquidity The total pool liquidity at the time of the call\n  /// @param cardinality The number of populated elements in the oracle array\n  /// @return beforeOrAt The observation which occurred at, or before, the given timestamp\n  /// @return atOrAfter The observation which occurred at, or after, the given timestamp\n  function getSurroundingObservations(\n    Observation[65_535] storage self,\n    uint32 time,\n    uint32 target,\n    int24 tick,\n    uint16 index,\n    uint128 liquidity,\n    uint16 cardinality\n  ) private view returns (Observation memory beforeOrAt, Observation memory atOrAfter) {\n    // optimistically set before to the newest observation\n    beforeOrAt = self[index];\n\n    // if the target is chronologically at or after the newest observation, we can early return\n    if (lte(time, beforeOrAt.blockTimestamp, target)) {\n      if (beforeOrAt.blockTimestamp == target) {\n        // if newest observation equals target, we're in the same block, so we can ignore atOrAfter\n        return (beforeOrAt, atOrAfter);\n      } else {\n        // otherwise, we need to transform\n        return (beforeOrAt, transform(beforeOrAt, target, tick, liquidity));\n      }\n    }\n\n    // now, set before to the oldest observation\n    beforeOrAt = self[(index + 1) % cardinality];\n    if (!beforeOrAt.initialized) beforeOrAt = self[0];\n\n    // ensure that the target is chronologically at or after the oldest observation\n    require(lte(time, beforeOrAt.blockTimestamp, target), 'OLD');\n\n    // if we've reached this point, we have to binary search\n    return binarySearch(self, time, target, index, cardinality);\n  }\n\n  /// @dev Reverts if an observation at or before the desired observation timestamp does not exist.\n  /// 0 may be passed as `secondsAgo' to return the current cumulative values.\n  /// If called with a timestamp falling between two observations, returns the counterfactual accumulator values\n  /// at exactly the timestamp between the two observations.\n  /// @param self The stored oracle array\n  /// @param time The current block timestamp\n  /// @param secondsAgo The amount of time to look back, in seconds, at which point to return an observation\n  /// @param tick The current tick\n  /// @param index The index of the observation that was most recently written to the observations array\n  /// @param liquidity The current in-range pool liquidity\n  /// @param cardinality The number of populated elements in the oracle array\n  /// @return tickCumulative The tick * time elapsed since the pool was first initialized, as of `secondsAgo`\n  /// @return secondsPerLiquidityCumulativeX128 The time elapsed / max(1, liquidity) since the pool was first initialized, as of `secondsAgo`\n  function observeSingle(\n    Observation[65_535] storage self,\n    uint32 time,\n    uint32 secondsAgo,\n    int24 tick,\n    uint16 index,\n    uint128 liquidity,\n    uint16 cardinality\n  ) internal view returns (int56 tickCumulative, uint160 secondsPerLiquidityCumulativeX128) {\n    if (secondsAgo == 0) {\n      Observation memory last = self[index];\n      if (last.blockTimestamp != time) last = transform(last, time, tick, liquidity);\n      return (last.tickCumulative, last.secondsPerLiquidityCumulativeX128);\n    }\n\n    uint32 target = time - secondsAgo;\n\n    (Observation memory beforeOrAt, Observation memory atOrAfter) =\n      getSurroundingObservations(self, time, target, tick, index, liquidity, cardinality);\n\n    if (target == beforeOrAt.blockTimestamp) {\n      // we're at the left boundary\n      return (beforeOrAt.tickCumulative, beforeOrAt.secondsPerLiquidityCumulativeX128);\n    } else if (target == atOrAfter.blockTimestamp) {\n      // we're at the right boundary\n      return (atOrAfter.tickCumulative, atOrAfter.secondsPerLiquidityCumulativeX128);\n    } else {\n      // we're in the middle\n      uint32 observationTimeDelta = atOrAfter.blockTimestamp - beforeOrAt.blockTimestamp;\n      uint32 targetDelta = target - beforeOrAt.blockTimestamp;\n      return (\n        beforeOrAt.tickCumulative + ((atOrAfter.tickCumulative - beforeOrAt.tickCumulative) / observationTimeDelta)\n          * targetDelta,\n        beforeOrAt.secondsPerLiquidityCumulativeX128\n          + uint160(\n            (uint256(atOrAfter.secondsPerLiquidityCumulativeX128 - beforeOrAt.secondsPerLiquidityCumulativeX128)\n                * targetDelta) / observationTimeDelta\n          )\n      );\n    }\n  }\n\n  /// @notice Returns the accumulator values as of each time seconds ago from the given time in the array of `secondsAgos`\n  /// @dev Reverts if `secondsAgos` > oldest observation\n  /// @param self The stored oracle array\n  /// @param time The current block.timestamp\n  /// @param secondsAgos Each amount of time to look back, in seconds, at which point to return an observation\n  /// @param tick The current tick\n  /// @param index The index of the observation that was most recently written to the observations array\n  /// @param liquidity The current in-range pool liquidity\n  /// @param cardinality The number of populated elements in the oracle array\n  /// @return tickCumulatives The tick * time elapsed since the pool was first initialized, as of each `secondsAgo`\n  /// @return secondsPerLiquidityCumulativeX128s The cumulative seconds / max(1, liquidity) since the pool was first initialized, as of each `secondsAgo`\n  function observe(\n    Observation[65_535] storage self,\n    uint32 time,\n    uint32[] memory secondsAgos,\n    int24 tick,\n    uint16 index,\n    uint128 liquidity,\n    uint16 cardinality\n  ) internal view returns (int56[] memory tickCumulatives, uint160[] memory secondsPerLiquidityCumulativeX128s) {\n    require(cardinality > 0, 'I');\n\n    tickCumulatives = new int56[](secondsAgos.length);\n    secondsPerLiquidityCumulativeX128s = new uint160[](secondsAgos.length);\n    for (uint256 i = 0; i < secondsAgos.length; i++) {\n      (tickCumulatives[i], secondsPerLiquidityCumulativeX128s[i]) =\n        observeSingle(self, time, secondsAgos[i], tick, index, liquidity, cardinality);\n    }\n  }\n}\n"},"contracts/core/libraries/BitMath.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title BitMath\n/// @dev This library provides functionality for computing bit properties of an unsigned integer\nlibrary BitMath {\n  /// @notice Returns the index of the most significant bit of the number,\n  ///     where the least significant bit is at index 0 and the most significant bit is at index 255\n  /// @dev The function satisfies the property:\n  ///     x >= 2**mostSignificantBit(x) and x < 2**(mostSignificantBit(x)+1)\n  /// @param x the value for which to compute the most significant bit, must be greater than 0\n  /// @return r the index of the most significant bit\n  function mostSignificantBit(uint256 x) internal pure returns (uint8 r) {\n    require(x > 0);\n\n    if (x >= 0x100000000000000000000000000000000) {\n      x >>= 128;\n      r += 128;\n    }\n    if (x >= 0x10000000000000000) {\n      x >>= 64;\n      r += 64;\n    }\n    if (x >= 0x100000000) {\n      x >>= 32;\n      r += 32;\n    }\n    if (x >= 0x10000) {\n      x >>= 16;\n      r += 16;\n    }\n    if (x >= 0x100) {\n      x >>= 8;\n      r += 8;\n    }\n    if (x >= 0x10) {\n      x >>= 4;\n      r += 4;\n    }\n    if (x >= 0x4) {\n      x >>= 2;\n      r += 2;\n    }\n    if (x >= 0x2) r += 1;\n  }\n\n  /// @notice Returns the index of the least significant bit of the number,\n  ///     where the least significant bit is at index 0 and the most significant bit is at index 255\n  /// @dev The function satisfies the property:\n  ///     (x & 2**leastSignificantBit(x)) != 0 and (x & (2**(leastSignificantBit(x)) - 1)) == 0)\n  /// @param x the value for which to compute the least significant bit, must be greater than 0\n  /// @return r the index of the least significant bit\n  function leastSignificantBit(uint256 x) internal pure returns (uint8 r) {\n    require(x > 0);\n\n    r = 255;\n    if (x & type(uint128).max > 0) {\n      r -= 128;\n    } else {\n      x >>= 128;\n    }\n    if (x & type(uint64).max > 0) {\n      r -= 64;\n    } else {\n      x >>= 64;\n    }\n    if (x & type(uint32).max > 0) {\n      r -= 32;\n    } else {\n      x >>= 32;\n    }\n    if (x & type(uint16).max > 0) {\n      r -= 16;\n    } else {\n      x >>= 16;\n    }\n    if (x & type(uint8).max > 0) {\n      r -= 8;\n    } else {\n      x >>= 8;\n    }\n    if (x & 0xf > 0) {\n      r -= 4;\n    } else {\n      x >>= 4;\n    }\n    if (x & 0x3 > 0) {\n      r -= 2;\n    } else {\n      x >>= 2;\n    }\n    if (x & 0x1 > 0) r -= 1;\n  }\n}\n"},"contracts/core/interfaces/ICLPool.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\npragma abicoder v2;\n\nimport './pool/ICLPoolActions.sol';\nimport './pool/ICLPoolConstants.sol';\nimport './pool/ICLPoolDerivedState.sol';\nimport './pool/ICLPoolEvents.sol';\nimport './pool/ICLPoolOwnerActions.sol';\nimport './pool/ICLPoolState.sol';\n\n/// @title The interface for a CL Pool\n/// @notice A CL pool facilitates swapping and automated market making between any two assets that strictly conform\n/// to the ERC20 specification\n/// @dev The pool interface is broken up into many smaller pieces\ninterface ICLPool is\n  ICLPoolConstants,\n  ICLPoolState,\n  ICLPoolDerivedState,\n  ICLPoolActions,\n  ICLPoolEvents,\n  ICLPoolOwnerActions\n{}\n"},"contracts/core/libraries/FullMath.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.4.0 <0.8.0;\n\n/// @title Contains 512-bit math functions\n/// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision\n/// @dev Handles \"phantom overflow\" i.e., allows multiplication and division where an intermediate value overflows 256 bits\nlibrary FullMath {\n  /// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n  /// @param a The multiplicand\n  /// @param b The multiplier\n  /// @param denominator The divisor\n  /// @return result The 256-bit result\n  /// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv\n  function mulDiv(uint256 a, uint256 b, uint256 denominator) internal pure returns (uint256 result) {\n    // 512-bit multiply [prod1 prod0] = a * b\n    // Compute the product mod 2**256 and mod 2**256 - 1\n    // then use the Chinese Remainder Theorem to reconstruct\n    // the 512 bit result. The result is stored in two 256\n    // variables such that product = prod1 * 2**256 + prod0\n    uint256 prod0; // Least significant 256 bits of the product\n    uint256 prod1; // Most significant 256 bits of the product\n    assembly {\n      let mm := mulmod(a, b, not(0))\n      prod0 := mul(a, b)\n      prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n    }\n\n    // Handle non-overflow cases, 256 by 256 division\n    if (prod1 == 0) {\n      require(denominator > 0);\n      assembly {\n        result := div(prod0, denominator)\n      }\n      return result;\n    }\n\n    // Make sure the result is less than 2**256.\n    // Also prevents denominator == 0\n    require(denominator > prod1);\n\n    ///////////////////////////////////////////////\n    // 512 by 256 division.\n    ///////////////////////////////////////////////\n\n    // Make division exact by subtracting the remainder from [prod1 prod0]\n    // Compute remainder using mulmod\n    uint256 remainder;\n    assembly {\n      remainder := mulmod(a, b, denominator)\n    }\n    // Subtract 256 bit number from 512 bit number\n    assembly {\n      prod1 := sub(prod1, gt(remainder, prod0))\n      prod0 := sub(prod0, remainder)\n    }\n\n    // Factor powers of two out of denominator\n    // Compute largest power of two divisor of denominator.\n    // Always >= 1.\n    uint256 twos = -denominator & denominator;\n    // Divide denominator by power of two\n    assembly {\n      denominator := div(denominator, twos)\n    }\n\n    // Divide [prod1 prod0] by the factors of two\n    assembly {\n      prod0 := div(prod0, twos)\n    }\n    // Shift in bits from prod1 into prod0. For this we need\n    // to flip `twos` such that it is 2**256 / twos.\n    // If twos is zero, then it becomes one\n    assembly {\n      twos := add(div(sub(0, twos), twos), 1)\n    }\n    prod0 |= prod1 * twos;\n\n    // Invert denominator mod 2**256\n    // Now that denominator is an odd number, it has an inverse\n    // modulo 2**256 such that denominator * inv = 1 mod 2**256.\n    // Compute the inverse by starting with a seed that is correct\n    // correct for four bits. That is, denominator * inv = 1 mod 2**4\n    uint256 inv = (3 * denominator) ^ 2;\n    // Now use Newton-Raphson iteration to improve the precision.\n    // Thanks to Hensel's lifting lemma, this also works in modular\n    // arithmetic, doubling the correct bits in each step.\n    inv *= 2 - denominator * inv; // inverse mod 2**8\n    inv *= 2 - denominator * inv; // inverse mod 2**16\n    inv *= 2 - denominator * inv; // inverse mod 2**32\n    inv *= 2 - denominator * inv; // inverse mod 2**64\n    inv *= 2 - denominator * inv; // inverse mod 2**128\n    inv *= 2 - denominator * inv; // inverse mod 2**256\n\n    // Because the division is now exact we can divide by multiplying\n    // with the modular inverse of denominator. This will give us the\n    // correct result modulo 2**256. Since the precoditions guarantee\n    // that the outcome is less than 2**256, this is the final result.\n    // We don't need to compute the high bits of the result and prod1\n    // is no longer required.\n    result = prod0 * inv;\n    return result;\n  }\n\n  /// @notice Calculates ceil(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n  /// @param a The multiplicand\n  /// @param b The multiplier\n  /// @param denominator The divisor\n  /// @return result The 256-bit result\n  function mulDivRoundingUp(uint256 a, uint256 b, uint256 denominator) internal pure returns (uint256 result) {\n    result = mulDiv(a, b, denominator);\n    if (mulmod(a, b, denominator) > 0) {\n      require(result < type(uint256).max);\n      result++;\n    }\n  }\n}\n"},"contracts/core/libraries/Position.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0 <0.8.0;\n\nimport './FixedPoint128.sol';\nimport './FullMath.sol';\nimport './LiquidityMath.sol';\n\n/// @title Position\n/// @notice Positions represent an owner address' liquidity between a lower and upper tick boundary\n/// @dev Positions store additional state for tracking fees owed to the position\nlibrary Position {\n  // info stored for each user's position\n  struct Info {\n    // the amount of liquidity owned by this position\n    uint128 liquidity;\n    // fee growth per unit of liquidity as of the last update to liquidity or fees owed\n    uint256 feeGrowthInside0LastX128;\n    uint256 feeGrowthInside1LastX128;\n    // the fees owed to the position owner in token0/token1\n    uint128 tokensOwed0;\n    uint128 tokensOwed1;\n  }\n\n  /// @notice Returns the Info struct of a position, given an owner and position boundaries\n  /// @param self The mapping containing all user positions\n  /// @param owner The address of the position owner\n  /// @param tickLower The lower tick boundary of the position\n  /// @param tickUpper The upper tick boundary of the position\n  /// @return position The position info struct of the given owners' position\n  function get(\n    mapping(bytes32 => Info) storage self,\n    address owner,\n    int24 tickLower,\n    int24 tickUpper\n  ) internal view returns (Position.Info storage position) {\n    position = self[keccak256(abi.encodePacked(owner, tickLower, tickUpper))];\n  }\n\n  /// @notice Credits accumulated fees to a user's position\n  /// @param self The individual position to update\n  /// @param liquidityDelta The change in pool liquidity as a result of the position update\n  /// @param feeGrowthInside0X128 The all-time fee growth in token0, per unit of liquidity, inside the position's tick boundaries\n  /// @param feeGrowthInside1X128 The all-time fee growth in token1, per unit of liquidity, inside the position's tick boundaries\n  /// @param staked Signifies if the position is staked in the gauge or not\n  function update(\n    Info storage self,\n    int128 liquidityDelta,\n    uint256 feeGrowthInside0X128,\n    uint256 feeGrowthInside1X128,\n    bool staked\n  ) internal {\n    Info memory _self = self;\n\n    uint128 liquidityNext;\n    if (liquidityDelta == 0) {\n      require(_self.liquidity > 0, 'NP'); // disallow pokes for 0 liquidity positions\n      liquidityNext = _self.liquidity;\n    } else {\n      liquidityNext = LiquidityMath.addDelta(_self.liquidity, liquidityDelta);\n    }\n\n    uint128 tokensOwed0;\n    uint128 tokensOwed1;\n    if (!staked) {\n      // calculate accumulated fees\n      tokensOwed0 = uint128(\n        FullMath.mulDiv(feeGrowthInside0X128 - _self.feeGrowthInside0LastX128, _self.liquidity, FixedPoint128.Q128)\n      );\n      tokensOwed1 = uint128(\n        FullMath.mulDiv(feeGrowthInside1X128 - _self.feeGrowthInside1LastX128, _self.liquidity, FixedPoint128.Q128)\n      );\n    }\n\n    // update the position\n    if (liquidityDelta != 0) self.liquidity = liquidityNext;\n    self.feeGrowthInside0LastX128 = feeGrowthInside0X128;\n    self.feeGrowthInside1LastX128 = feeGrowthInside1X128;\n    if (tokensOwed0 > 0 || tokensOwed1 > 0) {\n      // overflow is acceptable, have to withdraw before you hit type(uint128).max fees\n      self.tokensOwed0 += tokensOwed0;\n      self.tokensOwed1 += tokensOwed1;\n    }\n  }\n}\n"},"contracts/core/libraries/SafeCast.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Safe casting methods\n/// @notice Contains methods for safely casting between types\nlibrary SafeCast {\n  /// @notice Cast a uint256 to a uint160, revert on overflow\n  /// @param y The uint256 to be downcasted\n  /// @return z The downcasted integer, now type uint160\n  function toUint160(uint256 y) internal pure returns (uint160 z) {\n    require((z = uint160(y)) == y);\n  }\n\n  /// @notice Cast a int256 to a int128, revert on overflow or underflow\n  /// @param y The int256 to be downcasted\n  /// @return z The downcasted integer, now type int128\n  function toInt128(int256 y) internal pure returns (int128 z) {\n    require((z = int128(y)) == y);\n  }\n\n  /// @notice Cast a uint256 to a int256, revert on overflow\n  /// @param y The uint256 to be casted\n  /// @return z The casted integer, now type int256\n  function toInt256(uint256 y) internal pure returns (int256 z) {\n    require(y < 2 ** 255);\n    z = int256(y);\n  }\n}\n"},"contracts/core/libraries/SwapMath.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\nimport './FullMath.sol';\nimport './SqrtPriceMath.sol';\n\n/// @title Computes the result of a swap within ticks\n/// @notice Contains methods for computing the result of a swap within a single tick price range, i.e., a single tick.\nlibrary SwapMath {\n  /// @notice Computes the result of swapping some amount in, or amount out, given the parameters of the swap\n  /// @dev The fee, plus the amount in, will never exceed the amount remaining if the swap's `amountSpecified` is positive\n  /// @param sqrtRatioCurrentX96 The current sqrt price of the pool\n  /// @param sqrtRatioTargetX96 The price that cannot be exceeded, from which the direction of the swap is inferred\n  /// @param liquidity The usable liquidity\n  /// @param amountRemaining How much input or output amount is remaining to be swapped in/out\n  /// @param feePips The fee taken from the input amount, expressed in pips\n  /// @return sqrtRatioNextX96 The price after swapping the amount in/out, not to exceed the price target\n  /// @return amountIn The amount to be swapped in, of either token0 or token1, based on the direction of the swap\n  /// @return amountOut The amount to be received, of either token0 or token1, based on the direction of the swap\n  /// @return feeAmount The amount of input that will be taken as a fee\n  function computeSwapStep(\n    uint160 sqrtRatioCurrentX96,\n    uint160 sqrtRatioTargetX96,\n    uint128 liquidity,\n    int256 amountRemaining,\n    uint24 feePips\n  ) internal pure returns (uint160 sqrtRatioNextX96, uint256 amountIn, uint256 amountOut, uint256 feeAmount) {\n    bool zeroForOne = sqrtRatioCurrentX96 >= sqrtRatioTargetX96;\n    bool exactIn = amountRemaining >= 0;\n\n    if (exactIn) {\n      uint256 amountRemainingLessFee = FullMath.mulDiv(uint256(amountRemaining), 1e6 - feePips, 1e6);\n      amountIn = zeroForOne\n        ? SqrtPriceMath.getAmount0Delta(sqrtRatioTargetX96, sqrtRatioCurrentX96, liquidity, true)\n        : SqrtPriceMath.getAmount1Delta(sqrtRatioCurrentX96, sqrtRatioTargetX96, liquidity, true);\n      if (amountRemainingLessFee >= amountIn) {\n        sqrtRatioNextX96 = sqrtRatioTargetX96;\n      } else {\n        sqrtRatioNextX96 =\n          SqrtPriceMath.getNextSqrtPriceFromInput(sqrtRatioCurrentX96, liquidity, amountRemainingLessFee, zeroForOne);\n      }\n    } else {\n      amountOut = zeroForOne\n        ? SqrtPriceMath.getAmount1Delta(sqrtRatioTargetX96, sqrtRatioCurrentX96, liquidity, false)\n        : SqrtPriceMath.getAmount0Delta(sqrtRatioCurrentX96, sqrtRatioTargetX96, liquidity, false);\n      if (uint256(-amountRemaining) >= amountOut) {\n        sqrtRatioNextX96 = sqrtRatioTargetX96;\n      } else {\n        sqrtRatioNextX96 = SqrtPriceMath.getNextSqrtPriceFromOutput(\n          sqrtRatioCurrentX96, liquidity, uint256(-amountRemaining), zeroForOne\n        );\n      }\n    }\n\n    bool max = sqrtRatioTargetX96 == sqrtRatioNextX96;\n\n    // get the input/output amounts\n    if (zeroForOne) {\n      amountIn = max && exactIn\n        ? amountIn\n        : SqrtPriceMath.getAmount0Delta(sqrtRatioNextX96, sqrtRatioCurrentX96, liquidity, true);\n      amountOut = max && !exactIn\n        ? amountOut\n        : SqrtPriceMath.getAmount1Delta(sqrtRatioNextX96, sqrtRatioCurrentX96, liquidity, false);\n    } else {\n      amountIn = max && exactIn\n        ? amountIn\n        : SqrtPriceMath.getAmount1Delta(sqrtRatioCurrentX96, sqrtRatioNextX96, liquidity, true);\n      amountOut = max && !exactIn\n        ? amountOut\n        : SqrtPriceMath.getAmount0Delta(sqrtRatioCurrentX96, sqrtRatioNextX96, liquidity, false);\n    }\n\n    // cap the output amount to not exceed the remaining output amount\n    if (!exactIn && amountOut > uint256(-amountRemaining)) {\n      amountOut = uint256(-amountRemaining);\n    }\n\n    if (exactIn && sqrtRatioNextX96 != sqrtRatioTargetX96) {\n      // we didn't reach the target, so take the remainder of the maximum input as fee\n      feeAmount = uint256(amountRemaining) - amountIn;\n    } else {\n      feeAmount = FullMath.mulDivRoundingUp(amountIn, feePips, 1e6 - feePips);\n    }\n  }\n}\n"},"contracts/core/libraries/TickMath.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0 <0.8.0;\n\n/// @title Math library for computing sqrt prices from ticks and vice versa\n/// @notice Computes sqrt price for ticks of size 1.0001, i.e. sqrt(1.0001^tick) as fixed point Q64.96 numbers. Supports\n/// prices between 2**-128 and 2**128\nlibrary TickMath {\n  /// @dev The minimum tick that may be passed to #getSqrtRatioAtTick computed from log base 1.0001 of 2**-128\n  int24 internal constant MIN_TICK = -887_272;\n  /// @dev The maximum tick that may be passed to #getSqrtRatioAtTick computed from log base 1.0001 of 2**128\n  int24 internal constant MAX_TICK = -MIN_TICK;\n\n  /// @dev The minimum value that can be returned from #getSqrtRatioAtTick. Equivalent to getSqrtRatioAtTick(MIN_TICK)\n  uint160 internal constant MIN_SQRT_RATIO = 4_295_128_739;\n  /// @dev The maximum value that can be returned from #getSqrtRatioAtTick. Equivalent to getSqrtRatioAtTick(MAX_TICK)\n  uint160 internal constant MAX_SQRT_RATIO = 1_461_446_703_485_210_103_287_273_052_203_988_822_378_723_970_342;\n\n  /// @notice Calculates sqrt(1.0001^tick) * 2^96\n  /// @dev Throws if |tick| > max tick\n  /// @param tick The input tick for the above formula\n  /// @return sqrtPriceX96 A Fixed point Q64.96 number representing the sqrt of the ratio of the two assets (token1/token0)\n  /// at the given tick\n  function getSqrtRatioAtTick(int24 tick) internal pure returns (uint160 sqrtPriceX96) {\n    uint256 absTick = tick < 0 ? uint256(-int256(tick)) : uint256(int256(tick));\n    require(absTick <= uint256(MAX_TICK), 'T');\n\n    uint256 ratio = absTick & 0x1 != 0 ? 0xfffcb933bd6fad37aa2d162d1a594001 : 0x100000000000000000000000000000000;\n    if (absTick & 0x2 != 0) ratio = (ratio * 0xfff97272373d413259a46990580e213a) >> 128;\n    if (absTick & 0x4 != 0) ratio = (ratio * 0xfff2e50f5f656932ef12357cf3c7fdcc) >> 128;\n    if (absTick & 0x8 != 0) ratio = (ratio * 0xffe5caca7e10e4e61c3624eaa0941cd0) >> 128;\n    if (absTick & 0x10 != 0) ratio = (ratio * 0xffcb9843d60f6159c9db58835c926644) >> 128;\n    if (absTick & 0x20 != 0) ratio = (ratio * 0xff973b41fa98c081472e6896dfb254c0) >> 128;\n    if (absTick & 0x40 != 0) ratio = (ratio * 0xff2ea16466c96a3843ec78b326b52861) >> 128;\n    if (absTick & 0x80 != 0) ratio = (ratio * 0xfe5dee046a99a2a811c461f1969c3053) >> 128;\n    if (absTick & 0x100 != 0) ratio = (ratio * 0xfcbe86c7900a88aedcffc83b479aa3a4) >> 128;\n    if (absTick & 0x200 != 0) ratio = (ratio * 0xf987a7253ac413176f2b074cf7815e54) >> 128;\n    if (absTick & 0x400 != 0) ratio = (ratio * 0xf3392b0822b70005940c7a398e4b70f3) >> 128;\n    if (absTick & 0x800 != 0) ratio = (ratio * 0xe7159475a2c29b7443b29c7fa6e889d9) >> 128;\n    if (absTick & 0x1000 != 0) ratio = (ratio * 0xd097f3bdfd2022b8845ad8f792aa5825) >> 128;\n    if (absTick & 0x2000 != 0) ratio = (ratio * 0xa9f746462d870fdf8a65dc1f90e061e5) >> 128;\n    if (absTick & 0x4000 != 0) ratio = (ratio * 0x70d869a156d2a1b890bb3df62baf32f7) >> 128;\n    if (absTick & 0x8000 != 0) ratio = (ratio * 0x31be135f97d08fd981231505542fcfa6) >> 128;\n    if (absTick & 0x10000 != 0) ratio = (ratio * 0x9aa508b5b7a84e1c677de54f3e99bc9) >> 128;\n    if (absTick & 0x20000 != 0) ratio = (ratio * 0x5d6af8dedb81196699c329225ee604) >> 128;\n    if (absTick & 0x40000 != 0) ratio = (ratio * 0x2216e584f5fa1ea926041bedfe98) >> 128;\n    if (absTick & 0x80000 != 0) ratio = (ratio * 0x48a170391f7dc42444e8fa2) >> 128;\n\n    if (tick > 0) ratio = type(uint256).max / ratio;\n\n    // this divides by 1<<32 rounding up to go from a Q128.128 to a Q128.96.\n    // we then downcast because we know the result always fits within 160 bits due to our tick input constraint\n    // we round up in the division so getTickAtSqrtRatio of the output price is always consistent\n    sqrtPriceX96 = uint160((ratio >> 32) + (ratio % (1 << 32) == 0 ? 0 : 1));\n  }\n\n  /// @notice Calculates the greatest tick value such that getRatioAtTick(tick) <= ratio\n  /// @dev Throws in case sqrtPriceX96 < MIN_SQRT_RATIO, as MIN_SQRT_RATIO is the lowest value getRatioAtTick may\n  /// ever return.\n  /// @param sqrtPriceX96 The sqrt ratio for which to compute the tick as a Q64.96\n  /// @return tick The greatest tick for which the ratio is less than or equal to the input ratio\n  function getTickAtSqrtRatio(uint160 sqrtPriceX96) internal pure returns (int24 tick) {\n    // second inequality must be < because the price can never reach the price at the max tick\n    require(sqrtPriceX96 >= MIN_SQRT_RATIO && sqrtPriceX96 < MAX_SQRT_RATIO, 'R');\n    uint256 ratio = uint256(sqrtPriceX96) << 32;\n\n    uint256 r = ratio;\n    uint256 msb = 0;\n\n    assembly {\n      let f := shl(7, gt(r, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF))\n      msb := or(msb, f)\n      r := shr(f, r)\n    }\n    assembly {\n      let f := shl(6, gt(r, 0xFFFFFFFFFFFFFFFF))\n      msb := or(msb, f)\n      r := shr(f, r)\n    }\n    assembly {\n      let f := shl(5, gt(r, 0xFFFFFFFF))\n      msb := or(msb, f)\n      r := shr(f, r)\n    }\n    assembly {\n      let f := shl(4, gt(r, 0xFFFF))\n      msb := or(msb, f)\n      r := shr(f, r)\n    }\n    assembly {\n      let f := shl(3, gt(r, 0xFF))\n      msb := or(msb, f)\n      r := shr(f, r)\n    }\n    assembly {\n      let f := shl(2, gt(r, 0xF))\n      msb := or(msb, f)\n      r := shr(f, r)\n    }\n    assembly {\n      let f := shl(1, gt(r, 0x3))\n      msb := or(msb, f)\n      r := shr(f, r)\n    }\n    assembly {\n      let f := gt(r, 0x1)\n      msb := or(msb, f)\n    }\n\n    if (msb >= 128) r = ratio >> (msb - 127);\n    else r = ratio << (127 - msb);\n\n    int256 log_2 = (int256(msb) - 128) << 64;\n\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(63, f))\n      r := shr(f, r)\n    }\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(62, f))\n      r := shr(f, r)\n    }\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(61, f))\n      r := shr(f, r)\n    }\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(60, f))\n      r := shr(f, r)\n    }\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(59, f))\n      r := shr(f, r)\n    }\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(58, f))\n      r := shr(f, r)\n    }\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(57, f))\n      r := shr(f, r)\n    }\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(56, f))\n      r := shr(f, r)\n    }\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(55, f))\n      r := shr(f, r)\n    }\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(54, f))\n      r := shr(f, r)\n    }\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(53, f))\n      r := shr(f, r)\n    }\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(52, f))\n      r := shr(f, r)\n    }\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(51, f))\n      r := shr(f, r)\n    }\n    assembly {\n      r := shr(127, mul(r, r))\n      let f := shr(128, r)\n      log_2 := or(log_2, shl(50, f))\n    }\n\n    int256 log_sqrt10001 = log_2 * 255_738_958_999_603_826_347_141; // 128.128 number\n\n    int24 tickLow = int24((log_sqrt10001 - 3_402_992_956_809_132_418_596_140_100_660_247_210) >> 128);\n    int24 tickHi = int24((log_sqrt10001 + 291_339_464_771_989_622_907_027_621_153_398_088_495) >> 128);\n\n    tick = tickLow == tickHi ? tickLow : getSqrtRatioAtTick(tickHi) <= sqrtPriceX96 ? tickHi : tickLow;\n  }\n}\n"},"contracts/gauge/interfaces/IGauge.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity =0.7.6;\n\ninterface IGauge {\n  /**\n   * @notice Emitted when the gauge collects pool fees through the VotingRewardsManager.\n   * @param _caller The address that triggered fee collection.\n   * @param _claimed0 The amount of token0 fees collected.\n   * @param _claimed1 The amount of token1 fees collected.\n   */\n  event ClaimFees(address indexed _caller, uint256 _claimed0, uint256 _claimed1);\n\n  /**\n   * @notice Emitted when an account grants or revokes claim approval for an operator\n   * @param _account The account whose approval state changed\n   * @param _operator The operator being approved or revoked\n   * @param _approved The new approval state\n   */\n  event ClaimApproval(address indexed _account, address indexed _operator, bool _approved);\n\n  /**\n   * @notice Emitted when an owner grants or revokes blanket withdrawal approval for an operator\n   * @param _owner The owner whose approval changed\n   * @param _operator The operator being approved or revoked\n   * @param _approved The new approval state\n   */\n  event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);\n\n  /**\n   * @notice Emitted when a referral's deferred emissions are claimed.\n   * @param _referral The referral address whose deferred emissions were claimed.\n   * @param _recipient The recipient of the claimed emissions.\n   * @param _amount The deferred referral emissions paid to the recipient.\n   */\n  event ReferralEmissionsClaimed(address indexed _referral, address indexed _recipient, uint256 _amount);\n\n  /**\n   * @notice Deposit a staked position\n   * @param _lp A token amount for V2 gauges or an NFT token ID for CL gauges\n   */\n  function deposit(uint256 _lp) external;\n\n  /**\n   * @notice Deposit a staked position on behalf of an owner\n   * @dev For V2 gauges, approved MetaRouters are trusted to restrict `_owner` to the account that authorized the\n   *      routed deposit; otherwise, they could reset another account's early-unstake penalty timer.\n   * @param _lp A token amount for V2 gauges or an NFT token ID for CL gauges\n   * @param _owner The address credited as the staked owner\n   */\n  function depositFor(uint256 _lp, address _owner) external;\n\n  /**\n   * @notice Withdraw a staked position owned by the caller\n   * @param _lp A token amount for V2 gauges or an NFT token ID for CL gauges\n   */\n  function withdraw(uint256 _lp) external;\n\n  /**\n   * @notice Withdraw a staked position on behalf of an account\n   * @param _lp A token amount for V2 gauges or an NFT token ID for CL gauges\n   * @param _account The position owner\n   */\n  function withdrawFrom(uint256 _lp, address _account) external;\n\n  /**\n   * @notice Claim accrued emissions\n   * @dev Requires the caller to be the LP or an operator with claim approval\n   * @dev For CL gauges, the account-wide claim also includes account-level deferred LP emissions\n   * @param _account The address of the LP staker whose emissions are being claimed\n   * @param _recipient The recipient of the claimed emissions\n   */\n  function claimEmissions(address _account, address _recipient) external;\n\n  /**\n   * @notice Claims a referral's deferred emissions.\n   * @dev Requires the caller to be the referral or an operator with claim approval.\n   * @dev Contract referrals must be able to call this function or approve an operator to call it on their behalf.\n   * @param _referral The referral address whose deferred emissions are being claimed.\n   * @param _recipient The recipient of the claimed emissions.\n   */\n  function claimReferralEmissions(address _referral, address _recipient) external;\n\n  /**\n   * @notice Grant or revoke an operator's approval to claim emissions on behalf of the caller\n   * @param _operator The operator to approve or revoke\n   * @param _approved True to approve, false to revoke\n   */\n  function approveForClaim(address _operator, bool _approved) external;\n\n  /**\n   * @notice Grant or revoke blanket withdrawal authorization for an operator over all staked positions\n   * @param _operator The operator to authorize or revoke\n   * @param _approved True to grant blanket approval, false to revoke\n   */\n  function setApprovalForAll(address _operator, bool _approved) external;\n\n  /**\n   * @notice Approve an operator to withdraw a staked position\n   * @param _operator The operator to authorize\n   * @param _lp A token amount for V2 gauges or an NFT token ID for CL gauges\n   */\n  function approve(address _operator, uint256 _lp) external;\n\n  /**\n   * @notice Collect currently claimable pool fees directly to the VotingRewardsManager.\n   * @dev Only callable by the VotingRewardsManager.\n   * @return _amount0 The token0 fees collected.\n   * @return _amount1 The token1 fees collected.\n   */\n  function collectFees() external returns (uint256 _amount0, uint256 _amount1);\n\n  /**\n   * @notice LeafVoter contract used for gauge settlement.\n   * @return The address of the LeafVoter.\n   */\n  function voter() external view returns (address);\n\n  /**\n   * @notice Address of the factory that created this gauge.\n   * @return The address of the gauge factory.\n   */\n  function gaugeFactory() external view returns (address);\n\n  /**\n   * @notice Address of the VotingRewardsManager contract linked to the gauge.\n   * @return The address of the VotingRewardsManager.\n   */\n  function votingRewardsManager() external view returns (address);\n\n  /**\n   * @notice Returns if gauge is linked to a legitimate pool.\n   * @return Whether the gauge is linked to a legitimate pool.\n   */\n  function isPool() external view returns (bool);\n\n  /**\n   * @notice The gauge's cursor into the LeafVoter's cumulative reward share accumulator\n   * @return The cumulative reward share at the gauge's last settlement\n   */\n  function lastCumulativeRewardShare() external view returns (uint256);\n\n  /**\n   * @notice Estimates the claimable emissions for a given account\n   * @dev Rewards accrued since the last settlement are an estimate\n   * @dev For CL gauges, includes the account's net deferred LP emissions\n   * @param _account The address of the LP staker\n   * @return The estimated claimable amount\n   */\n  function earned(address _account) external view returns (uint256);\n\n  /**\n   * @notice Whether an operator is approved to claim emissions on behalf of an account\n   * @param _account The account that granted the approval\n   * @param _operator The operator being queried\n   * @return True if the operator is approved\n   */\n  function approvedForClaim(address _account, address _operator) external view returns (bool);\n\n  /**\n   * @notice Returns deferred emissions stored for a referral address\n   * @param _referral The referral address credited with the emissions\n   * @return The deferred referral emissions\n   */\n  function deferredReferralEmissions(address _referral) external view returns (uint256);\n\n  /**\n   * @notice Returns whether an operator has blanket withdrawal authorization for an owner's positions\n   * @param _owner The staked position owner\n   * @param _operator The candidate operator\n   * @return True if blanket approval is active\n   */\n  function isApprovedForAll(address _owner, address _operator) external view returns (bool);\n\n  /**\n   * @notice Return currently claimable pool fees without moving tokens or mutating state.\n   * @return _amount0 The currently pending token0 fees.\n   * @return _amount1 The currently pending token1 fees.\n   */\n  function pendingFees() external view returns (uint256 _amount0, uint256 _amount1);\n}\n"},"contracts/gauge/interfaces/ICLPool.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity =0.7.6;\n\n/// @title Minimal CLPool interface\n/// @notice Used to support the integration with the core implementation\n/// @dev For full context, please review the Uniswap implementation under GPL license.\ninterface ICLPool {\n  function token0() external view returns (address);\n\n  function token1() external view returns (address);\n\n  function tickSpacing() external view returns (int24);\n\n  /// @notice The reward growth as a Q128.128 rewards of emission collected per unit of liquidity for the entire life of the pool\n  /// @dev This value can overflow the uint256\n  function rewardGrowthGlobalX128() external view returns (uint256);\n\n  /// @notice The currently in range staked liquidity available to the pool\n  /// @dev This value has no relationship to the total staked liquidity across all ticks\n  function stakedLiquidity() external view returns (uint128);\n\n  /// @notice The amounts of token0 and token1 that are owed to the gauge\n  /// @dev Gauge fees will never exceed uint128 max in either token\n  function gaugeFees() external view returns (uint128 amount0, uint128 amount1);\n\n  /// @notice Returns data about reward growth within a tick range.\n  /// RewardGrowthGlobalX128 can be supplied as a parameter for claimable reward calculations.\n  /// @dev Used in gauge reward/earned calculations\n  /// @param tickLower The lower tick of the range\n  /// @param tickUpper The upper tick of the range\n  /// @param _rewardGrowthGlobalX128 a calculated rewardGrowthGlobalX128 or 0 (in case of 0 it means we use the rewardGrowthGlobalX128 from state)\n  /// @return rewardGrowthInsideX128 The reward growth in the range\n  function getRewardGrowthInside(\n    int24 tickLower,\n    int24 tickUpper,\n    uint256 _rewardGrowthGlobalX128\n  ) external view returns (uint256 rewardGrowthInsideX128);\n\n  /// @notice Initialize gauge and nft manager\n  /// @dev Callable only once, by the gauge factory\n  /// @param _gauge The gauge corresponding to this pool\n  /// @param _nft The position manager used for position management\n  function setGaugeAndPositionManager(address _gauge, address _nft) external;\n\n  /// @notice Convert existing liquidity into staked liquidity\n  /// @notice Only callable by the gauge associated with this pool\n  /// @param stakedLiquidityDelta The amount by which to increase or decrease the staked liquidity\n  /// @param tickLower The lower tick of the position for which to stake liquidity\n  /// @param tickUpper The upper tick of the position for which to stake liquidity\n  function stake(int128 stakedLiquidityDelta, int24 tickLower, int24 tickUpper) external;\n\n  /// @notice Settle the pool's reward growth to the current block timestamp and return the accrued rollover\n  /// @return _rollover Emissions accrued while no staked liquidity was in range. Reset to 0 after this call.\n  function settleToBlock() external returns (uint256 _rollover);\n\n  /// @notice Collect the gauge fee accrued to the pool\n  /// @param recipient The address that receives the claimed gauge fees\n  /// @return amount0 The gauge fee collected in token0\n  /// @return amount1 The gauge fee collected in token1\n  function collectFees(address recipient) external returns (uint128 amount0, uint128 amount1);\n}\n"},"contracts/core/libraries/TickBitmap.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\nimport './BitMath.sol';\n\n/// @title Packed tick initialized state library\n/// @notice Stores a packed mapping of tick index to its initialized state\n/// @dev The mapping uses int16 for keys since ticks are represented as int24 and there are 256 (2^8) values per word.\nlibrary TickBitmap {\n  /// @notice Computes the position in the mapping where the initialized bit for a tick lives\n  /// @param tick The tick for which to compute the position\n  /// @return wordPos The key in the mapping containing the word in which the bit is stored\n  /// @return bitPos The bit position in the word where the flag is stored\n  function position(int24 tick) private pure returns (int16 wordPos, uint8 bitPos) {\n    wordPos = int16(tick >> 8);\n    bitPos = uint8(tick % 256);\n  }\n\n  /// @notice Flips the initialized state for a given tick from false to true, or vice versa\n  /// @param self The mapping in which to flip the tick\n  /// @param tick The tick to flip\n  /// @param tickSpacing The spacing between usable ticks\n  function flipTick(mapping(int16 => uint256) storage self, int24 tick, int24 tickSpacing) internal {\n    require(tick % tickSpacing == 0); // ensure that the tick is spaced\n    (int16 wordPos, uint8 bitPos) = position(tick / tickSpacing);\n    uint256 mask = 1 << bitPos;\n    self[wordPos] ^= mask;\n  }\n\n  /// @notice Returns the next initialized tick contained in the same word (or adjacent word) as the tick that is either\n  /// to the left (less than or equal to) or right (greater than) of the given tick\n  /// @param self The mapping in which to compute the next initialized tick\n  /// @param tick The starting tick\n  /// @param tickSpacing The spacing between usable ticks\n  /// @param lte Whether to search for the next initialized tick to the left (less than or equal to the starting tick)\n  /// @return next The next initialized or uninitialized tick up to 256 ticks away from the current tick\n  /// @return initialized Whether the next tick is initialized, as the function only searches within up to 256 ticks\n  function nextInitializedTickWithinOneWord(\n    mapping(int16 => uint256) storage self,\n    int24 tick,\n    int24 tickSpacing,\n    bool lte\n  ) internal view returns (int24 next, bool initialized) {\n    int24 compressed = tick / tickSpacing;\n    if (tick < 0 && tick % tickSpacing != 0) compressed--; // round towards negative infinity\n\n    if (lte) {\n      (int16 wordPos, uint8 bitPos) = position(compressed);\n      // all the 1s at or to the right of the current bitPos\n      uint256 mask = (1 << bitPos) - 1 + (1 << bitPos);\n      uint256 masked = self[wordPos] & mask;\n\n      // if there are no initialized ticks to the right of or at the current tick, return rightmost in the word\n      initialized = masked != 0;\n      // overflow/underflow is possible, but prevented externally by limiting both tickSpacing and tick\n      next = initialized\n        ? (compressed - int24(bitPos - BitMath.mostSignificantBit(masked))) * tickSpacing\n        : (compressed - int24(bitPos)) * tickSpacing;\n    } else {\n      // start from the word of the next tick, since the current tick state doesn't matter\n      (int16 wordPos, uint8 bitPos) = position(compressed + 1);\n      // all the 1s at or to the left of the bitPos\n      uint256 mask = ~((1 << bitPos) - 1);\n      uint256 masked = self[wordPos] & mask;\n\n      // if there are no initialized ticks to the left of the current tick, return leftmost in the word\n      initialized = masked != 0;\n      // overflow/underflow is possible, but prevented externally by limiting both tickSpacing and tick\n      next = initialized\n        ? (compressed + 1 + int24(BitMath.leastSignificantBit(masked) - bitPos)) * tickSpacing\n        : (compressed + 1 + int24(type(uint8).max - bitPos)) * tickSpacing;\n    }\n  }\n}\n"},"contracts/core/libraries/UnsafeMath.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Math functions that do not check inputs or outputs\n/// @notice Contains methods that perform common math functions but do not do any overflow or underflow checks\nlibrary UnsafeMath {\n  /// @notice Returns ceil(x / y)\n  /// @dev division by 0 has unspecified behavior, and must be checked externally\n  /// @param x The dividend\n  /// @param y The divisor\n  /// @return z The quotient, ceil(x / y)\n  function divRoundingUp(uint256 x, uint256 y) internal pure returns (uint256 z) {\n    assembly {\n      z := add(div(x, y), gt(mod(x, y), 0))\n    }\n  }\n}\n"},"contracts/gauge/interfaces/ICLGauge.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity =0.7.6;\n\nimport {ICLPool} from 'contracts/gauge/interfaces/ICLPool.sol';\nimport {IGauge} from 'contracts/gauge/interfaces/IGauge.sol';\nimport {INonfungiblePositionManager} from 'contracts/gauge/interfaces/INonfungiblePositionManager.sol';\n\ninterface ICLGauge is IGauge {\n  /**\n   * @notice Emitted when a position is deposited into the gauge.\n   * @param _caller The address that deposited the position.\n   * @param _user The address credited as the staked owner.\n   * @param _tokenId The tokenId of the deposited position.\n   * @param _liquidityToStake The amount of liquidity staked in the pool.\n   */\n  event Deposit(address indexed _caller, address indexed _user, uint256 indexed _tokenId, uint128 _liquidityToStake);\n\n  /**\n   * @notice Emitted when a position is withdrawn from the gauge.\n   * @param _caller The address that withdrew the position.\n   * @param _user The address whose stake was withdrawn.\n   * @param _tokenId The tokenId of the withdrawn position.\n   * @param _liquidityToStake The amount of liquidity unstaked from the pool.\n   */\n  event Withdraw(address indexed _caller, address indexed _user, uint256 indexed _tokenId, uint128 _liquidityToStake);\n\n  /**\n   * @notice Emitted when accrued emissions are claimed for a staked position.\n   * @param _account The address of the LP staker whose emissions were claimed.\n   * @param _tokenId The tokenId of the staked position.\n   * @param _recipient The recipient of the claimed emissions.\n   * @param _rewardAmount The amount of emissions paid to the recipient.\n   */\n  event EmissionsClaimed(\n    address indexed _account, uint256 indexed _tokenId, address indexed _recipient, uint256 _rewardAmount\n  );\n\n  /**\n   * @notice Emitted when accrued emissions are stored instead of claimed during withdrawal.\n   * @param _account The address of the LP staker credited with the deferred emissions.\n   * @param _tokenId The tokenId whose emissions were stored.\n   * @param _rewardAmount The post-penalty, post-referral emissions added to the account's deferred balance.\n   */\n  event EmissionsDeferred(address indexed _account, uint256 indexed _tokenId, uint256 _rewardAmount);\n\n  /**\n   * @notice Emitted when a position's referral emissions are stored for a later claim.\n   * @param _account The address of the LP staker whose emissions paid the referral.\n   * @param _tokenId The tokenId of the staked position.\n   * @param _referral The referral address credited with the emissions.\n   * @param _amount The referral emissions added to the referral's deferred balance.\n   */\n  event ReferralEmissionsDeferred(\n    address indexed _account, uint256 indexed _tokenId, address indexed _referral, uint256 _amount\n  );\n\n  /**\n   * @notice Emitted when an account's deferred emissions are claimed.\n   * @param _account The account whose deferred emissions were claimed.\n   * @param _recipient The recipient of the claimed emissions.\n   * @param _amount The deferred emissions paid to the recipient after referral.\n   */\n  event DeferredEmissionsClaimed(address indexed _account, address indexed _recipient, uint256 _amount);\n\n  /**\n   * @notice Emitted when an early withdrawal penalty is applied to a position's accrued emissions.\n   * @param _from The address of the LP staker whose emissions were penalized.\n   * @param _tokenId The tokenId of the staked position.\n   * @param _penalty The amount of emissions forfeited as the penalty.\n   */\n  event EarlyWithdrawPenalty(address indexed _from, uint256 indexed _tokenId, uint256 _penalty);\n\n  /**\n   * @notice Emitted when a per-tokenId withdrawal approval is set or cleared\n   * @param _owner The position owner\n   * @param _operator The approved operator (address(0) if cleared)\n   * @param _tokenId The approved token ID\n   */\n  event Approval(address indexed _owner, address indexed _operator, uint256 indexed _tokenId);\n\n  /**\n   * @notice Emitted when the gauge settles emissions accrued in the LeafVoter\n   * @dev Not emitted when a settlement accrues no new emissions\n   * @param _cumulativeRewardShare The LeafVoter's cumulative reward share at this settlement\n   * @param _delta The emissions accrued since the previous settlement\n   */\n  event GaugeSettled(uint256 _cumulativeRewardShare, uint256 _delta);\n\n  /**\n   * @notice Emitted when a position is withdrawn through emergency withdraw.\n   * @param _user The staked owner.\n   * @param _tokenId The withdrawn position.\n   * @param _liquidityToStake The liquidity unstaked from the pool.\n   */\n  event EmergencyWithdraw(address indexed _user, uint256 indexed _tokenId, uint128 _liquidityToStake);\n\n  /**\n   * @notice Called on gauge creation by CLGaugeFactory\n   * @dev Only callable by the gauge factory\n   * @param _pool The address of the pool\n   * @param _votingRewardsManager The address of the voting rewards manager contract\n   * @param _token0 The address of token0 of the pool\n   * @param _token1 The address of token1 of the pool\n   * @param _tickSpacing The tick spacing of the pool\n   * @param _isPool Whether the attached pool is a real pool or not\n   */\n  function initialize(\n    address _pool,\n    address _votingRewardsManager,\n    address _token0,\n    address _token1,\n    int24 _tickSpacing,\n    bool _isPool\n  ) external;\n\n  /**\n   * @notice Settle the gauge in the LeafVoter and return the emissions accrued since the last settlement\n   * @dev Only callable by the corresponding pool\n   * @dev Pulls the gauge's cumulative reward share from the LeafVoter and advances the gauge's cursor\n   * @dev Reports the settle to the gauge tape through the factory: a full report when the cursor\n   *      advances, a refresh when it holds at a nonzero level, nothing on a regression\n   * @dev Returns zero without calling the LeafVoter during an emergency withdraw's unstake\n   * @return _delta The emissions accrued since the gauge's last settlement\n   */\n  function settleGauge() external returns (uint256 _delta);\n\n  /**\n   * @notice Withdraw a staked position owned by the caller without touching the LeafVoter\n   * @dev Only while emergency withdraw is on. Emissions accrued since the last action are lost;\n   *      deferred emissions stay claimable\n   * @param _tokenId The staked position to withdraw\n   */\n  function emergencyWithdraw(uint256 _tokenId) external;\n\n  /**\n   * @notice Settle the pool and forfeit any accumulated rollover back to the LeafVoter\n   * @dev Permissionless. Emissions accrued while no staked liquidity is in range are banked in the\n   *      pool as rollover and normally forfeited during claims; an idle gauge with no staked\n   *      positions has no claims, so this entrypoint returns them to the voter directly.\n   */\n  function forfeitRollover() external;\n\n  /**\n   * @notice Claim the LP's accrued emissions across the given positions\n   * @dev Also claims all account-level deferred LP emissions regardless of the requested positions\n   * @param _account The address of the LP staker whose emissions are being claimed\n   * @param _recipient The recipient of the claimed emissions\n   * @param _tokenIds The staked positions to claim\n   */\n  function claimEmissions(address _account, address _recipient, uint256[] calldata _tokenIds) external;\n\n  /**\n   * @notice NonfungiblePositionManager used to create nfts accepted by this gauge.\n   * @return The address of the NonfungiblePositionManager.\n   */\n  function nft() external view returns (INonfungiblePositionManager);\n\n  /**\n   * @notice Address of the CL pool linked to the gauge.\n   * @return The address of the CL pool.\n   */\n  function pool() external view returns (ICLPool);\n\n  /**\n   * @notice Cached address of token0, corresponding to token0 of the pool.\n   * @return The address of token0.\n   */\n  function token0() external view returns (address);\n\n  /**\n   * @notice Cached address of token1, corresponding to token1 of the pool.\n   * @return The address of token1.\n   */\n  function token1() external view returns (address);\n\n  /**\n   * @notice Cached tick spacing of the pool.\n   * @return The tick spacing of the pool.\n   */\n  function tickSpacing() external view returns (int24);\n\n  /**\n   * @notice Returns the rewardGrowthInside of the position at the last user action (deposit, withdraw, claimEmissions)\n   * @param _tokenId The tokenId of the position\n   * @return The rewardGrowthInside for the position\n   */\n  function rewardGrowthInside(uint256 _tokenId) external view returns (uint256);\n\n  /**\n   * @notice Returns the block number at which a position was deposited\n   * @param _tokenId The tokenId of the position\n   * @return The deposit block for the position\n   */\n  function depositBlock(uint256 _tokenId) external view returns (uint256);\n\n  /**\n   * @notice Returns net LP emissions stored for an account when emission minting fails during withdrawal\n   * @param _account The account credited with the deferred emissions\n   * @return The post-penalty, post-referral deferred LP emissions\n   */\n  function deferredEmissions(address _account) external view returns (uint256);\n\n  /**\n   * @notice Estimates the claimable emissions for a given account across the requested positions\n   * @dev Assumes _tokenIds contains no duplicates\n   * @dev Rewards accrued since the last settlement are an estimate\n   * @dev Includes the account-level deferred LP emissions\n   * @param _account The address of the LP staker\n   * @param _tokenIds The staked positions\n   * @return The estimated claimable amount\n   */\n  function earned(address _account, uint256[] memory _tokenIds) external view returns (uint256);\n\n  /**\n   * @notice Returns the operator approved to withdraw a specific staked position\n   * @param _tokenId The staked NFT token ID\n   * @return The approved operator, or address(0) if none\n   */\n  function getApproved(uint256 _tokenId) external view returns (address);\n\n  /**\n   * @notice Fetch all tokenIds staked by a given account\n   * @param _depositor The address of the user\n   * @return The tokenIds of the staked positions\n   */\n  function stakedValues(address _depositor) external view returns (uint256[] memory);\n\n  /**\n   * @notice Fetch a staked tokenId by index\n   * @param _depositor The address of the user\n   * @param _index The index of the staked tokenId\n   * @return The tokenId of the staked position\n   */\n  function stakedByIndex(address _depositor, uint256 _index) external view returns (uint256);\n\n  /**\n   * @notice Check whether a position is staked in the gauge by a certain user\n   * @param _depositor The address of the user\n   * @param _tokenId The tokenId of the position\n   * @return Whether the position is staked in the gauge\n   */\n  function stakedContains(address _depositor, uint256 _tokenId) external view returns (bool);\n\n  /**\n   * @notice The amount of positions staked in the gauge by a certain user\n   * @param _depositor The address of the user\n   * @return The amount of positions staked in the gauge\n   */\n  function stakedLength(address _depositor) external view returns (uint256);\n}\n"},"contracts/core/interfaces/ICLFactory.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\nimport {IFactoryRegistry} from 'contracts/core/interfaces/IFactoryRegistry.sol';\nimport {ILeafVoter} from 'contracts/gauge/interfaces/ILeafVoter.sol';\n\n/// @title The interface for the CL Factory\n/// @notice The CL Factory facilitates creation of CL pools and control over the protocol fees\ninterface ICLFactory {\n  /// @notice An initial tick spacing and its default swap fee, in millionths.\n  /// @param tickSpacing Minimum distance between initialized ticks.\n  /// @param fee Default swap fee, in millionths.\n  struct FeeTier {\n    int24 tickSpacing;\n    uint24 fee;\n  }\n\n  /// @notice Dependencies, initial managers and fee tiers of a newly deployed factory.\n  /// @param owner Initial factory owner.\n  /// @param swapFeeManager Initial swap fee manager.\n  /// @param unstakedFeeManager Initial unstaked fee manager.\n  /// @param voter Leaf voter, or zero until configured.\n  /// @param poolImplementation Implementation cloned for new pools.\n  /// @param positionManager Canonical position manager.\n  /// @param factoryRegistry Registry that approves the factory and records its pools.\n  /// @param defaultSwapHook Initial swap hook, or zero until configured.\n  /// @param discountRegistryManager Initial discount registry manager.\n  /// @param clPoolTapeManager Initial pool tape manager.\n  /// @param initialFeeTiers Tick spacings and fees enabled during construction.\n  struct ConstructorParams {\n    address owner;\n    address swapFeeManager;\n    address unstakedFeeManager;\n    address voter;\n    address poolImplementation;\n    address positionManager;\n    address factoryRegistry;\n    address defaultSwapHook;\n    address discountRegistryManager;\n    address clPoolTapeManager;\n    FeeTier[] initialFeeTiers;\n  }\n\n  /// @notice Emitted when the owner of the factory is changed\n  /// @param oldOwner The owner before the owner was changed\n  /// @param newOwner The owner after the owner was changed\n  event OwnerChanged(address indexed oldOwner, address indexed newOwner);\n\n  /// @notice Emitted when the swapFeeManager of the factory is changed\n  /// @param oldFeeManager The swapFeeManager before the swapFeeManager was changed\n  /// @param newFeeManager The swapFeeManager after the swapFeeManager was changed\n  event SwapFeeManagerChanged(address indexed oldFeeManager, address indexed newFeeManager);\n\n  /// @notice Emitted when the unstakedFeeManager of the factory is changed\n  /// @param oldFeeManager The unstakedFeeManager before the unstakedFeeManager was changed\n  /// @param newFeeManager The unstakedFeeManager after the unstakedFeeManager was changed\n  event UnstakedFeeManagerChanged(address indexed oldFeeManager, address indexed newFeeManager);\n\n  /// @notice Emitted when the default swap hook of the factory is changed\n  /// @param swapHook The default swap hook after it was changed\n  event DefaultSwapHookChanged(address indexed swapHook);\n\n  /// @notice Emitted when the swap hook of a specific pool is changed\n  /// @param pool The pool whose swap hook was changed\n  /// @param swapHook The pool swap hook after it was changed\n  event PoolSwapHookChanged(address indexed pool, address indexed swapHook);\n\n  /// @notice Emitted when the unstakedFeeModule of the factory is changed\n  /// @param oldFeeModule The unstakedFeeModule before the unstakedFeeModule was changed\n  /// @param newFeeModule The unstakedFeeModule after the unstakedFeeModule was changed\n  event UnstakedFeeModuleChanged(address indexed oldFeeModule, address indexed newFeeModule);\n\n  /// @notice Emitted when the defaultUnstakedFee of the factory is changed\n  /// @param oldUnstakedFee The defaultUnstakedFee before the defaultUnstakedFee was changed\n  /// @param newUnstakedFee The defaultUnstakedFee after the unstakedFeeModule was changed\n  event DefaultUnstakedFeeChanged(uint24 indexed oldUnstakedFee, uint24 indexed newUnstakedFee);\n\n  /// @notice Emitted when the discountRegistryManager of the factory is changed\n  /// @param discountRegistryManager The discountRegistryManager after the discountRegistryManager was changed\n  event DiscountRegistryManagerChanged(address indexed discountRegistryManager);\n\n  /// @notice Emitted when the discountRegistry of the factory is changed\n  /// @param discountRegistry The discountRegistry after the discountRegistry was changed\n  event DiscountRegistryChanged(address indexed discountRegistry);\n\n  /// @notice Emitted when the clPoolTape module of the factory is set or cleared\n  /// @param clPoolTape The clPoolTape address after the change. The zero address disables tape registration\n  event ClPoolTapeChanged(address indexed clPoolTape);\n\n  /// @notice Emitted when the clPoolTapeManager of the factory is changed\n  /// @param clPoolTapeManager The clPoolTapeManager after the change\n  event ClPoolTapeManagerChanged(address indexed clPoolTapeManager);\n\n  /// @notice Emitted when the voter of the factory is set\n  /// @param voter The voter after it was set\n  event VoterSet(address indexed voter);\n\n  /// @notice Emitted when a pool is created\n  /// @param token0 The first token of the pool by address sort order\n  /// @param token1 The second token of the pool by address sort order\n  /// @param tickSpacing The minimum number of ticks between initialized ticks\n  /// @param pool The address of the created pool\n  event PoolCreated(address indexed token0, address indexed token1, int24 indexed tickSpacing, address pool);\n\n  /// @notice Emitted when a new tick spacing is enabled for pool creation via the factory\n  /// @param tickSpacing The minimum number of ticks between initialized ticks for pools\n  /// @param fee The default fee for a pool created with a given tickSpacing\n  event TickSpacingEnabled(int24 indexed tickSpacing, uint24 indexed fee);\n\n  /// @notice The LeafVoter contract, used to check gauge activation for unstaked fees\n  /// @dev May be the zero address until set via setVoter, as the voter can be deployed\n  ///      after the factory. Unstaked fees are zero until it is set\n  /// @return The address of the LeafVoter contract\n  function voter() external view returns (ILeafVoter);\n\n  /// @notice The address of the pool implementation contract used to deploy proxies / clones\n  /// @return The address of the pool implementation contract\n  function poolImplementation() external view returns (address);\n\n  /// @notice The canonical position manager for pools created by this factory\n  /// @return The address of the nonfungible position manager\n  function positionManager() external view returns (address);\n\n  /// @notice Factory registry that records pools as gauge targets\n  /// @dev Set at construction. Every created pool is registered as a target;\n  ///      pool creation reverts until this factory is an approved target factory\n  ///      in the registry\n  /// @return The address of the factory registry\n  function factoryRegistry() external view returns (IFactoryRegistry);\n\n  /// @notice Returns the current owner of the factory\n  /// @dev Can be changed by the current owner via setOwner\n  /// @return The address of the factory owner\n  function owner() external view returns (address);\n\n  /// @notice Returns the current swapFeeManager of the factory\n  /// @dev Can be changed by the current swap fee manager via setSwapFeeManager\n  /// @return The address of the factory swapFeeManager\n  function swapFeeManager() external view returns (address);\n\n  /// @notice Returns the current unstakedFeeManager of the factory\n  /// @dev Can be changed by the current unstaked fee manager via setUnstakedFeeManager\n  /// @return The address of the factory unstakedFeeManager\n  function unstakedFeeManager() external view returns (address);\n\n  /// @notice Returns the factory-wide default swap hook used when a pool has no hook set\n  /// @dev Can be changed by the current swap fee manager via setDefaultSwapHook\n  /// @return The address of the factory defaultSwapHook\n  function defaultSwapHook() external view returns (address);\n\n  /// @notice Returns the swap hook override set for a specific pool.\n  /// @param pool The pool to query\n  /// @return The pool swap hook override, or address(0) if unset\n  function poolSwapHook(address pool) external view returns (address);\n\n  /// @notice Resolves the swap hook address for a pool. If the pool doesn't have a swap hook specified,\n  ///         then the default hook address is returned.\n  /// @param pool The pool to resolve the swap hook for\n  /// @return The swap hook address for the pool\n  function getPoolSwapHook(address pool) external view returns (address);\n\n  /// @notice Returns the current unstakedFeeModule of the factory\n  /// @dev Can be changed by the current unstaked fee manager via setUnstakedFeeModule\n  /// @return The address of the factory unstakedFeeModule\n  function unstakedFeeModule() external view returns (address);\n\n  /// @notice Returns the current defaultUnstakedFee of the factory\n  /// @dev Can be changed by the current unstaked fee manager via setDefaultUnstakedFee\n  /// @return The default Unstaked Fee of the factory\n  function defaultUnstakedFee() external view returns (uint24);\n\n  /// @notice The current manager of {discountRegistry} of the factory\n  /// @return The address of the discount registry manager\n  function discountRegistryManager() external view returns (address);\n\n  /// @notice Discount registry for swap fee discounts\n  /// @return The address of the discount registry\n  function discountRegistry() external view returns (address);\n\n  /// @notice The clPoolTape module new pools are registered with. The zero address means registration is disabled\n  /// @return The address of the clPoolTape module\n  function clPoolTape() external view returns (address);\n\n  /// @notice The current clPoolTapeManager of the factory\n  /// @dev Can be changed by the current clPoolTapeManager via setClPoolTapeManager\n  /// @return The address of the clPoolTapeManager\n  function clPoolTapeManager() external view returns (address);\n\n  /// @notice Returns a default fee for a tick spacing.\n  /// @dev Use getFee for the most up to date fee for a given pool.\n  /// A tick spacing can never be removed, so this value should be hard coded or cached in the calling context\n  /// @param tickSpacing The enabled tick spacing. Returns 0 if not enabled\n  /// @return fee The default fee for the given tick spacing\n  function tickSpacingToFee(int24 tickSpacing) external view returns (uint24 fee);\n\n  /// @notice Returns a list of enabled tick spacings. Used to iterate through pools created by the factory\n  /// @dev Tick spacings cannot be removed. Tick spacings are not ordered\n  /// @return List of enabled tick spacings\n  function tickSpacings() external view returns (int24[] memory);\n\n  /// @notice Returns the pool address for a given pair of tokens and a tick spacing, or address 0 if it does not exist\n  /// @dev tokenA and tokenB may be passed in either token0/token1 or token1/token0 order\n  /// @param tokenA The contract address of either token0 or token1\n  /// @param tokenB The contract address of the other token\n  /// @param tickSpacing The tick spacing of the pool in uint24\n  /// @return pool The pool address\n  function getPool(address tokenA, address tokenB, uint24 tickSpacing) external view returns (address pool);\n\n  /// @notice Returns the pool address for a given pair of tokens and a tick spacing, or address 0 if it does not exist\n  /// @dev tokenA and tokenB may be passed in either token0/token1 or token1/token0 order\n  /// @param tokenA The contract address of either token0 or token1\n  /// @param tokenB The contract address of the other token\n  /// @param tickSpacing The tick spacing of the pool\n  /// @return pool The pool address\n  function getPool(address tokenA, address tokenB, int24 tickSpacing) external view returns (address pool);\n\n  /// @notice Return address of pool created by this factory given its `index`\n  /// @param index Index of the pool\n  /// @return The pool address in the given index\n  function allPools(uint256 index) external view returns (address);\n\n  /// @notice Returns the number of pools created from this factory\n  /// @return Number of pools created from this factory\n  function allPoolsLength() external view returns (uint256);\n\n  /// @notice Used in VotingEscrow to determine if a contract is a valid pool of the factory\n  /// @param pool The address of the pool to check\n  /// @return Whether the pool is a valid pool of the factory\n  function isPool(address pool) external view returns (bool);\n\n  /// @notice Get unstaked fee for a given pool. Accounts for default and dynamic fees\n  /// @dev Unstaked fee is denominated in pips. i.e. 1e-6\n  /// @param pool The pool to get the unstaked fee for\n  /// @return The unstaked fee for the given pool\n  function getUnstakedFee(address pool) external view returns (uint24);\n\n  /// @notice Creates a pool for the given two tokens and tick spacing\n  /// @param tokenA One of the two tokens in the desired pool\n  /// @param tokenB The other of the two tokens in the desired pool\n  /// @param tickSpacing The desired tick spacing for the pool\n  /// @dev Use encodeSqrtPrice(1,1) as price\n  /// @dev Used to programmatically create pools in case one does not exist\n  /// @dev Invalid tickSpacing will revert the transaction\n  /// @return pool The address of the newly created pool\n  function createPool(address tokenA, address tokenB, uint24 tickSpacing) external returns (address pool);\n\n  /// @notice Creates a pool for the given two tokens and tick spacing\n  /// @param tokenA One of the two tokens in the desired pool\n  /// @param tokenB The other of the two tokens in the desired pool\n  /// @param tickSpacing The desired tick spacing for the pool\n  /// @param sqrtPriceX96 The initial sqrt price of the pool, as a Q64.96\n  /// @dev tokenA and tokenB may be passed in either order: token0/token1 or token1/token0. The call will\n  /// revert if the pool already exists, the tick spacing is invalid, or the token arguments are invalid\n  /// @return pool The address of the newly created pool\n  function createPool(\n    address tokenA,\n    address tokenB,\n    int24 tickSpacing,\n    uint160 sqrtPriceX96\n  ) external returns (address pool);\n\n  /// @notice Updates the owner of the factory\n  /// @dev Must be called by the current owner\n  /// @param _owner The new owner of the factory\n  function setOwner(address _owner) external;\n\n  /// @notice Sets the voter of the factory\n  /// @dev Must be called by the current owner. Callable only while the voter is unset,\n  ///      so once set the voter is immutable. Used when the factory is deployed before the voter\n  /// @param _voter The voter of the factory\n  function setVoter(address _voter) external;\n\n  /// @notice Updates the swapFeeManager of the factory\n  /// @dev Must be called by the current swap fee manager\n  /// @param _swapFeeManager The new swapFeeManager of the factory\n  function setSwapFeeManager(address _swapFeeManager) external;\n\n  /// @notice Updates the unstakedFeeManager of the factory\n  /// @dev Must be called by the current unstaked fee manager\n  /// @param _unstakedFeeManager The new unstakedFeeManager of the factory\n  function setUnstakedFeeManager(address _unstakedFeeManager) external;\n\n  /// @notice Updates the discountRegistryManager of the factory\n  /// @dev Must be called by the current discount registry manager\n  /// @param _discountRegistryManager The new discountRegistryManager of the factory\n  function setDiscountRegistryManager(address _discountRegistryManager) external;\n\n  /// @notice Updates the unstakedFeeModule of the factory\n  /// @dev Must be called by the current unstaked fee manager\n  /// @param _unstakedFeeModule The new unstakedFeeModule of the factory\n  function setUnstakedFeeModule(address _unstakedFeeModule) external;\n\n  /// @notice Updates the defaultUnstakedFee of the factory\n  /// @dev Must be called by the current unstaked fee manager\n  /// @param _defaultUnstakedFee The new defaultUnstakedFee of the factory\n  function setDefaultUnstakedFee(uint24 _defaultUnstakedFee) external;\n\n  /// @notice Updates the factory-wide default swap hook\n  /// @dev Must be called by the current swap fee manager\n  /// @param _swapHook The new default swap hook of the factory\n  function setDefaultSwapHook(address _swapHook) external;\n\n  /// @notice Sets the swap hook override for a batch of pools\n  /// @dev Must be called by the current swap fee manager. Reverts with 'LMM' if the array lengths differ.\n  ///      For each pool, passing address(0) clears its override back to the default.\n  /// @param _pools The pools to set swap hooks for\n  /// @param _swapHooks The new swapHook for each corresponding pool\n  function setPoolSwapHook(address[] calldata _pools, address[] calldata _swapHooks) external;\n\n  /// @notice Updates the discountRegistry of the factory\n  /// @dev Must be called by the current discount registry manager\n  /// @param _discountRegistry The new discountRegistry of the factory\n  function setDiscountRegistry(address _discountRegistry) external;\n\n  /// @notice Updates the clPoolTapeManager of the factory\n  /// @dev Must be called by the current clPoolTapeManager\n  /// @param _clPoolTapeManager The new clPoolTapeManager of the factory\n  function setClPoolTapeManager(address _clPoolTapeManager) external;\n\n  /// @notice Sets or clears the clPoolTape module new pools are registered with\n  /// @dev Must be called by the clPoolTapeManager. The zero address disables tape registration\n  /// @param _clPoolTape The new clPoolTape module address\n  function setClPoolTape(address _clPoolTape) external;\n\n  /// @notice Enables a certain tickSpacing\n  /// @dev Tick spacings may never be removed once enabled\n  /// @param tickSpacing The spacing between ticks to be enforced in the pool\n  /// @param fee The default fee associated with a given tick spacing\n  function enableTickSpacing(int24 tickSpacing, uint24 fee) external;\n}\n"},"contracts/core/libraries/FixedPoint96.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.4.0;\n\n/// @title FixedPoint96\n/// @notice A library for handling binary fixed point numbers, see https://en.wikipedia.org/wiki/Q_(number_format)\n/// @dev Used in SqrtPriceMath.sol\nlibrary FixedPoint96 {\n  uint8 internal constant RESOLUTION = 96;\n  uint256 internal constant Q96 = 0x1000000000000000000000000;\n}\n"},"contracts/gauge/interfaces/ILeafVoter.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.7.6;\npragma abicoder v2;\n\nimport {IAccessControl} from './IAccessControl.sol';\n\ninterface ILeafVoter is IAccessControl {\n  /**\n   * @notice Aggregated voting power of a gauge at a point in time.\n   * @param bias Decaying voting power at `ts`.\n   * @param slope Per-second decay of `bias`.\n   * @param ts Timestamp the point was resolved at.\n   * @param permanentStakeBalance Non-decaying voting power from permanent stakes.\n   */\n  struct Point {\n    int128 bias;\n    int128 slope;\n    uint48 ts;\n    uint128 permanentStakeBalance;\n  }\n\n  /**\n   * @notice Permissionless settle entrypoint for a registered gauge.\n   *         Settles the chain index to `block.timestamp`, settles `_gauge`, and\n   *         returns the gauge's cumulative reward share. The return value is\n   *         monotonically increasing; a call against an unregistered gauge\n   *         returns 0 without settling, so the function never reverts for any\n   *         input address.\n   * @param _gauge The gauge to settle.\n   * @return _cumulativeRewardShare The gauge's settled cumulative reward share.\n   */\n  function settleGauge(address _gauge) external returns (uint256 _cumulativeRewardShare);\n\n  /**\n   * @notice Read-only twin of `settleGauge`. Projects the gauge's cumulative\n   *         reward share at the current timestamp without writing state.\n   *         `projectedCumulativeRewardShare(_gauge)` equals the value a\n   *         `settleGauge(_gauge)` in this block would return.\n   * @param _gauge The gauge to project.\n   * @return _cumulativeRewardShare The gauge's projected cumulative reward share.\n   */\n  function projectedCumulativeRewardShare(address _gauge) external view returns (uint256 _cumulativeRewardShare);\n\n  /**\n   * @notice Mints `ReceiptToken` to the registered `EmissionsHandler` and calls it back per recipient.\n   * @dev Reverts with `GaugeNotRegistered` for an unregistered caller and `CeilingExceeded` when the claim exceeds the\n   * gauge's claimable headroom, `ceiling - claimed - surplus`. The claim is added to the gauge's `claimed` before the\n   * mint, so all state effects complete before the handler callback fires. Callbacks MUST NOT rely on further\n   * `LeafVoter` state changes. Emits `EmissionsMinted`.\n   * @param _recipients Recipients for the per-leg delivery (LP, referral).\n   * @param _amounts Per-leg amounts of `ReceiptToken`.\n   */\n  function mintEmissions(address[] calldata _recipients, uint128[] calldata _amounts) external;\n\n  /**\n   * @notice Gauge-only entrypoint for forfeiting surplus emissions the gauge\n   *         cannot distribute, covering the Idle Gauge and Early Exit cases.\n   *         Clamps `_amount` to the gauge's claimable headroom\n   *         (`ceiling - claimed - surplus`), flushes the clamped amount into\n   *         the gauge's `surplus` and the chain-level `surplusAccrued`, and\n   *         emits `EmissionsForfeited` with the accrued amount. Reverts with\n   *         `GaugeNotRegistered` when the caller is not a registered gauge.\n   * @param _amount The surplus the calling gauge is forfeiting.\n   */\n  function forfeitEmissions(uint128 _amount) external;\n\n  /**\n   * @notice Whether a gauge is activated for direct allocation routing.\n   * @param _gauge Gauge address to query.\n   * @return Whether the gauge is activated.\n   */\n  function isActivated(address _gauge) external view returns (bool);\n\n  /**\n   * @notice Canonical per-gauge settlement state.\n   * @param _gauge Gauge address to query.\n   * @return _ceiling Cumulative effective share credited to the gauge.\n   * @return _claimed Cumulative emissions minted to recipients by the claim flow.\n   * @return _lastSettlement Timestamp of the gauge's last settlement.\n   * @return _isRegistered Whether the gauge was produced by an approved factory.\n   * @return _isActivated Whether the gauge is activated for direct allocation routing.\n   * @return _surplus Cumulative surplus attributed to the gauge.\n   * @return _lastIndex Snapshot of the chain index at the gauge's last settlement.\n   * @return _lastTimeIndex Snapshot of the chain time index at the gauge's last settlement.\n   * @return _point Decaying weight of the gauge.\n   */\n  function gaugeStates(address _gauge)\n    external\n    view\n    returns (\n      uint128 _ceiling,\n      uint128 _claimed,\n      uint48 _lastSettlement,\n      bool _isRegistered,\n      bool _isActivated,\n      uint128 _surplus,\n      uint256 _lastIndex,\n      uint256 _lastTimeIndex,\n      Point memory _point\n    );\n}\n"},"contracts/core/libraries/FixedPoint128.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.4.0;\n\n/// @title FixedPoint128\n/// @notice A library for handling binary fixed point numbers, see https://en.wikipedia.org/wiki/Q_(number_format)\nlibrary FixedPoint128 {\n  uint256 internal constant Q128 = 0x100000000000000000000000000000000;\n}\n"},"contracts/core/libraries/LiquidityMath.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Math library for liquidity\nlibrary LiquidityMath {\n  /// @notice Add a signed liquidity delta to liquidity and revert if it overflows or underflows\n  /// @param x The liquidity before change\n  /// @param y The delta by which liquidity should be changed\n  /// @return z The liquidity delta\n  function addDelta(uint128 x, int128 y) internal pure returns (uint128 z) {\n    if (y < 0) {\n      require((z = x - uint128(-y)) < x, 'LS');\n    } else {\n      require((z = x + uint128(y)) >= x, 'LA');\n    }\n  }\n}\n"},"contracts/core/libraries/SqrtPriceMath.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\nimport './LowGasSafeMath.sol';\nimport './SafeCast.sol';\n\nimport './FixedPoint96.sol';\nimport './FullMath.sol';\nimport './UnsafeMath.sol';\n\n/// @title Functions based on Q64.96 sqrt price and liquidity\n/// @notice Contains the math that uses square root of price as a Q64.96 and liquidity to compute deltas\nlibrary SqrtPriceMath {\n  using LowGasSafeMath for uint256;\n  using SafeCast for uint256;\n\n  /// @notice Gets the next sqrt price given a delta of token0\n  /// @dev Always rounds up, because in the exact output case (increasing price) we need to move the price at least\n  /// far enough to get the desired output amount, and in the exact input case (decreasing price) we need to move the\n  /// price less in order to not send too much output.\n  /// The most precise formula for this is liquidity * sqrtPX96 / (liquidity +- amount * sqrtPX96),\n  /// if this is impossible because of overflow, we calculate liquidity / (liquidity / sqrtPX96 +- amount).\n  /// @param sqrtPX96 The starting price, i.e. before accounting for the token0 delta\n  /// @param liquidity The amount of usable liquidity\n  /// @param amount How much of token0 to add or remove from virtual reserves\n  /// @param add Whether to add or remove the amount of token0\n  /// @return The price after adding or removing amount, depending on add\n  function getNextSqrtPriceFromAmount0RoundingUp(\n    uint160 sqrtPX96,\n    uint128 liquidity,\n    uint256 amount,\n    bool add\n  ) internal pure returns (uint160) {\n    // we short circuit amount == 0 because the result is otherwise not guaranteed to equal the input price\n    if (amount == 0) return sqrtPX96;\n    uint256 numerator1 = uint256(liquidity) << FixedPoint96.RESOLUTION;\n\n    if (add) {\n      uint256 product;\n      if ((product = amount * sqrtPX96) / amount == sqrtPX96) {\n        uint256 denominator = numerator1 + product;\n        if (denominator >= numerator1) {\n          // always fits in 160 bits\n          return uint160(FullMath.mulDivRoundingUp(numerator1, sqrtPX96, denominator));\n        }\n      }\n\n      return uint160(UnsafeMath.divRoundingUp(numerator1, (numerator1 / sqrtPX96).add(amount)));\n    } else {\n      uint256 product;\n      // if the product overflows, we know the denominator underflows\n      // in addition, we must check that the denominator does not underflow\n      require((product = amount * sqrtPX96) / amount == sqrtPX96 && numerator1 > product);\n      uint256 denominator = numerator1 - product;\n      return FullMath.mulDivRoundingUp(numerator1, sqrtPX96, denominator).toUint160();\n    }\n  }\n\n  /// @notice Gets the next sqrt price given a delta of token1\n  /// @dev Always rounds down, because in the exact output case (decreasing price) we need to move the price at least\n  /// far enough to get the desired output amount, and in the exact input case (increasing price) we need to move the\n  /// price less in order to not send too much output.\n  /// The formula we compute is within <1 wei of the lossless version: sqrtPX96 +- amount / liquidity\n  /// @param sqrtPX96 The starting price, i.e., before accounting for the token1 delta\n  /// @param liquidity The amount of usable liquidity\n  /// @param amount How much of token1 to add, or remove, from virtual reserves\n  /// @param add Whether to add, or remove, the amount of token1\n  /// @return The price after adding or removing `amount`\n  function getNextSqrtPriceFromAmount1RoundingDown(\n    uint160 sqrtPX96,\n    uint128 liquidity,\n    uint256 amount,\n    bool add\n  ) internal pure returns (uint160) {\n    // if we're adding (subtracting), rounding down requires rounding the quotient down (up)\n    // in both cases, avoid a mulDiv for most inputs\n    if (add) {\n      uint256 quotient =\n        (amount <= type(uint160).max\n          ? (amount << FixedPoint96.RESOLUTION) / liquidity\n          : FullMath.mulDiv(amount, FixedPoint96.Q96, liquidity));\n\n      return uint256(sqrtPX96).add(quotient).toUint160();\n    } else {\n      uint256 quotient =\n        (amount <= type(uint160).max\n          ? UnsafeMath.divRoundingUp(amount << FixedPoint96.RESOLUTION, liquidity)\n          : FullMath.mulDivRoundingUp(amount, FixedPoint96.Q96, liquidity));\n\n      require(sqrtPX96 > quotient);\n      // always fits 160 bits\n      return uint160(sqrtPX96 - quotient);\n    }\n  }\n\n  /// @notice Gets the next sqrt price given an input amount of token0 or token1\n  /// @dev Throws if price or liquidity are 0, or if the next price is out of bounds\n  /// @param sqrtPX96 The starting price, i.e., before accounting for the input amount\n  /// @param liquidity The amount of usable liquidity\n  /// @param amountIn How much of token0, or token1, is being swapped in\n  /// @param zeroForOne Whether the amount in is token0 or token1\n  /// @return sqrtQX96 The price after adding the input amount to token0 or token1\n  function getNextSqrtPriceFromInput(\n    uint160 sqrtPX96,\n    uint128 liquidity,\n    uint256 amountIn,\n    bool zeroForOne\n  ) internal pure returns (uint160 sqrtQX96) {\n    require(sqrtPX96 > 0);\n    require(liquidity > 0);\n\n    // round to make sure that we don't pass the target price\n    return zeroForOne\n      ? getNextSqrtPriceFromAmount0RoundingUp(sqrtPX96, liquidity, amountIn, true)\n      : getNextSqrtPriceFromAmount1RoundingDown(sqrtPX96, liquidity, amountIn, true);\n  }\n\n  /// @notice Gets the next sqrt price given an output amount of token0 or token1\n  /// @dev Throws if price or liquidity are 0 or the next price is out of bounds\n  /// @param sqrtPX96 The starting price before accounting for the output amount\n  /// @param liquidity The amount of usable liquidity\n  /// @param amountOut How much of token0, or token1, is being swapped out\n  /// @param zeroForOne Whether the amount out is token0 or token1\n  /// @return sqrtQX96 The price after removing the output amount of token0 or token1\n  function getNextSqrtPriceFromOutput(\n    uint160 sqrtPX96,\n    uint128 liquidity,\n    uint256 amountOut,\n    bool zeroForOne\n  ) internal pure returns (uint160 sqrtQX96) {\n    require(sqrtPX96 > 0);\n    require(liquidity > 0);\n\n    // round to make sure that we pass the target price\n    return zeroForOne\n      ? getNextSqrtPriceFromAmount1RoundingDown(sqrtPX96, liquidity, amountOut, false)\n      : getNextSqrtPriceFromAmount0RoundingUp(sqrtPX96, liquidity, amountOut, false);\n  }\n\n  /// @notice Gets the amount0 delta between two prices\n  /// @dev Calculates liquidity / sqrt(lower) - liquidity / sqrt(upper),\n  /// i.e. liquidity * (sqrt(upper) - sqrt(lower)) / (sqrt(upper) * sqrt(lower))\n  /// @param sqrtRatioAX96 A sqrt price\n  /// @param sqrtRatioBX96 Another sqrt price\n  /// @param liquidity The amount of usable liquidity\n  /// @param roundUp Whether to round the amount up or down\n  /// @return amount0 Amount of token0 required to cover a position of size liquidity between the two passed prices\n  function getAmount0Delta(\n    uint160 sqrtRatioAX96,\n    uint160 sqrtRatioBX96,\n    uint128 liquidity,\n    bool roundUp\n  ) internal pure returns (uint256 amount0) {\n    if (sqrtRatioAX96 > sqrtRatioBX96) (sqrtRatioAX96, sqrtRatioBX96) = (sqrtRatioBX96, sqrtRatioAX96);\n\n    uint256 numerator1 = uint256(liquidity) << FixedPoint96.RESOLUTION;\n    uint256 numerator2 = sqrtRatioBX96 - sqrtRatioAX96;\n\n    require(sqrtRatioAX96 > 0);\n\n    return roundUp\n      ? UnsafeMath.divRoundingUp(FullMath.mulDivRoundingUp(numerator1, numerator2, sqrtRatioBX96), sqrtRatioAX96)\n      : FullMath.mulDiv(numerator1, numerator2, sqrtRatioBX96) / sqrtRatioAX96;\n  }\n\n  /// @notice Gets the amount1 delta between two prices\n  /// @dev Calculates liquidity * (sqrt(upper) - sqrt(lower))\n  /// @param sqrtRatioAX96 A sqrt price\n  /// @param sqrtRatioBX96 Another sqrt price\n  /// @param liquidity The amount of usable liquidity\n  /// @param roundUp Whether to round the amount up, or down\n  /// @return amount1 Amount of token1 required to cover a position of size liquidity between the two passed prices\n  function getAmount1Delta(\n    uint160 sqrtRatioAX96,\n    uint160 sqrtRatioBX96,\n    uint128 liquidity,\n    bool roundUp\n  ) internal pure returns (uint256 amount1) {\n    if (sqrtRatioAX96 > sqrtRatioBX96) (sqrtRatioAX96, sqrtRatioBX96) = (sqrtRatioBX96, sqrtRatioAX96);\n\n    return roundUp\n      ? FullMath.mulDivRoundingUp(liquidity, sqrtRatioBX96 - sqrtRatioAX96, FixedPoint96.Q96)\n      : FullMath.mulDiv(liquidity, sqrtRatioBX96 - sqrtRatioAX96, FixedPoint96.Q96);\n  }\n\n  /// @notice Helper that gets signed token0 delta\n  /// @param sqrtRatioAX96 A sqrt price\n  /// @param sqrtRatioBX96 Another sqrt price\n  /// @param liquidity The change in liquidity for which to compute the amount0 delta\n  /// @return amount0 Amount of token0 corresponding to the passed liquidityDelta between the two prices\n  function getAmount0Delta(\n    uint160 sqrtRatioAX96,\n    uint160 sqrtRatioBX96,\n    int128 liquidity\n  ) internal pure returns (int256 amount0) {\n    return liquidity < 0\n      ? -getAmount0Delta(sqrtRatioAX96, sqrtRatioBX96, uint128(-liquidity), false).toInt256()\n      : getAmount0Delta(sqrtRatioAX96, sqrtRatioBX96, uint128(liquidity), true).toInt256();\n  }\n\n  /// @notice Helper that gets signed token1 delta\n  /// @param sqrtRatioAX96 A sqrt price\n  /// @param sqrtRatioBX96 Another sqrt price\n  /// @param liquidity The change in liquidity for which to compute the amount1 delta\n  /// @return amount1 Amount of token1 corresponding to the passed liquidityDelta between the two prices\n  function getAmount1Delta(\n    uint160 sqrtRatioAX96,\n    uint160 sqrtRatioBX96,\n    int128 liquidity\n  ) internal pure returns (int256 amount1) {\n    return liquidity < 0\n      ? -getAmount1Delta(sqrtRatioAX96, sqrtRatioBX96, uint128(-liquidity), false).toInt256()\n      : getAmount1Delta(sqrtRatioAX96, sqrtRatioBX96, uint128(liquidity), true).toInt256();\n  }\n}\n"},"contracts/core/interfaces/IERC20Minimal.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Minimal ERC20 interface for CL\n/// @notice Contains a subset of the full ERC20 interface that is used in CL\ninterface IERC20Minimal {\n  /// @notice Returns the balance of a token\n  /// @param account The account for which to look up the number of tokens it has, i.e. its balance\n  /// @return The number of tokens held by the account\n  function balanceOf(address account) external view returns (uint256);\n\n  /// @notice Transfers the amount of token from the `msg.sender` to the recipient\n  /// @param recipient The account that will receive the amount transferred\n  /// @param amount The number of tokens to send from the sender to the recipient\n  /// @return Returns true for a successful transfer, false for an unsuccessful transfer\n  function transfer(address recipient, uint256 amount) external returns (bool);\n\n  /// @notice Returns the current allowance given to a spender by an owner\n  /// @param owner The account of the token owner\n  /// @param spender The account of the token spender\n  /// @return The current allowance granted by `owner` to `spender`\n  function allowance(address owner, address spender) external view returns (uint256);\n\n  /// @notice Sets the allowance of a spender from the `msg.sender` to the value `amount`\n  /// @param spender The account which will be allowed to spend a given amount of the owners tokens\n  /// @param amount The amount of tokens allowed to be used by `spender`\n  /// @return Returns true for a successful approval, false for unsuccessful\n  function approve(address spender, uint256 amount) external returns (bool);\n\n  /// @notice Transfers `amount` tokens from `sender` to `recipient` up to the allowance given to the `msg.sender`\n  /// @param sender The account from which the transfer will be initiated\n  /// @param recipient The recipient of the transfer\n  /// @param amount The amount of the transfer\n  /// @return Returns true for a successful transfer, false for unsuccessful\n  function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\n\n  /// @notice Event emitted when tokens are transferred from one address to another, either via `#transfer` or `#transferFrom`.\n  /// @param from The account from which the tokens were sent, i.e. the balance decreased\n  /// @param to The account to which the tokens were sent, i.e. the balance increased\n  /// @param value The amount of tokens that were transferred\n  event Transfer(address indexed from, address indexed to, uint256 value);\n\n  /// @notice Event emitted when the approval amount for the spender of a given owner's tokens changes.\n  /// @param owner The account that approved spending of its tokens\n  /// @param spender The account for which the spending allowance was modified\n  /// @param value The new allowance from the owner to the spender\n  event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n"},"contracts/core/libraries/LowGasSafeMath.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.7.0;\n\n/// @title Optimized overflow and underflow safe math operations\n/// @notice Contains methods for doing math operations that revert on overflow or underflow for minimal gas cost\nlibrary LowGasSafeMath {\n  /// @notice Returns x + y, reverts if sum overflows uint256\n  /// @param x The augend\n  /// @param y The addend\n  /// @return z The sum of x and y\n  function add(uint256 x, uint256 y) internal pure returns (uint256 z) {\n    require((z = x + y) >= x);\n  }\n\n  /// @notice Returns x - y, reverts if underflows\n  /// @param x The minuend\n  /// @param y The subtrahend\n  /// @return z The difference of x and y\n  function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {\n    require((z = x - y) <= x);\n  }\n\n  /// @notice Returns x * y, reverts if overflows\n  /// @param x The multiplicand\n  /// @param y The multiplier\n  /// @return z The product of x and y\n  function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {\n    require(x == 0 || (z = x * y) / x == y);\n  }\n\n  /// @notice Returns x + y, reverts if overflows or underflows\n  /// @param x The augend\n  /// @param y The addend\n  /// @return z The sum of x and y\n  function add(int256 x, int256 y) internal pure returns (int256 z) {\n    require((z = x + y) >= x == (y >= 0));\n  }\n\n  /// @notice Returns x - y, reverts if overflows or underflows\n  /// @param x The minuend\n  /// @param y The subtrahend\n  /// @return z The difference of x and y\n  function sub(int256 x, int256 y) internal pure returns (int256 z) {\n    require((z = x - y) <= x == (y >= 0));\n  }\n}\n"},"contracts/core/libraries/TransferHelper.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.6.0;\n\nimport '../interfaces/IERC20Minimal.sol';\n\n/// @title TransferHelper\n/// @notice Contains helper methods for interacting with ERC20 tokens that do not consistently return true/false\nlibrary TransferHelper {\n  /// @notice Transfers tokens from msg.sender to a recipient\n  /// @dev Calls transfer on token contract, errors with TF if transfer fails\n  /// @param token The contract address of the token which will be transferred\n  /// @param to The recipient of the transfer\n  /// @param value The value of the transfer\n  function safeTransfer(address token, address to, uint256 value) internal {\n    (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20Minimal.transfer.selector, to, value));\n    require(success && (data.length == 0 || abi.decode(data, (bool))), 'TF');\n  }\n}\n"},"contracts/core/interfaces/hook/ISwapHook.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.7.6;\npragma abicoder v2;\n\n/// @notice Interface for CLPool swap hooks that can override pre-swap fees and/or apply post-swap fees.\ninterface ISwapHook {\n  /*////////////////////////////////////////////////////////////\n                              STRUCTS\n  ////////////////////////////////////////////////////////////*/\n\n  /// @notice Swap context passed to hook entry points.\n  /// @param caller `msg.sender` address that initiated the swap.\n  /// @param recipient Recipient of the swap output.\n  /// @param zeroForOne True for token0 -> token1 swaps, false otherwise.\n  /// @param amountSpecified The exact amount specified by the swapper (either input or output).\n  /// @param sqrtPriceLimitX96 Swap price limit.\n  /// @param data Optional calldata supplied to the swap call.\n  /// @param sqrtPriceX96 Square root price of the pool:\n  ///        In {beforeSwap} represents a PRE-SWAP sqrt price.\n  ///        In {afterSwap} represents a POST-SWAP sqrt price.\n  /// @param tick Tick of the pool:\n  ///        In {beforeSwap} represents a PRE-SWAP tick.\n  ///        In {afterSwap} represents a POST-SWAP tick.\n  struct SwapParams {\n    address caller;\n    address recipient;\n    bool zeroForOne;\n    int256 amountSpecified;\n    uint160 sqrtPriceLimitX96;\n    bytes data;\n    uint160 sqrtPriceX96;\n    int24 tick;\n  }\n\n  /// @notice Post-swap state passed to the {afterSwap} entry-point.\n  /// @param amountSpecifiedRemaining Remaining specified amount after the swap loop conclusion.\n  /// @param amountCalculated Amount computed by the swap loop before any post-swap fee adjustment.\n  /// @param fee The fee applied during the swap loop.\n  /// @param hasUpdatedFees Whether swap fees were updated during execution.\n  /// @param feeGrowthGlobalX128 The global fee growth of the input token after the swap loop.\n  /// @param gaugeFee Fee amount paid to staked liquidity.\n  /// @param liquidity In-range liquidity at the end of the swap loop.\n  /// @param stakedLiquidity In-range staked liquidity at the end of the swap loop.\n  /// @param tickCumulative The post-swap value of the tick accumulator, computed only if an initialized tick is crossed.\n  /// @param secondsPerLiquidityCumulativeX128 The post-swap value of the seconds per liquidity\n  ///        accumulator, computed only if an initialized tick is crossed.\n  /// @param computedLatestObservation Whether the latest observation was computed during the swap.\n  struct AfterSwapParams {\n    int256 amountSpecifiedRemaining;\n    int256 amountCalculated;\n    uint24 fee;\n    bool hasUpdatedFees;\n    uint256 feeGrowthGlobalX128;\n    uint128 gaugeFee;\n    uint128 liquidity;\n    uint128 stakedLiquidity;\n    int56 tickCumulative;\n    uint160 secondsPerLiquidityCumulativeX128;\n    bool computedLatestObservation;\n  }\n\n  /// @notice Call context of `flash` function.\n  /// @param caller `msg.sender` address that initiated flash execution.\n  /// @param recipient Recipient of the flash loaned tokens.\n  /// @param amount0 Amount of token0 to flash loan.\n  /// @param amount1 Amount of token1 to flash loan.\n  /// @param data Optional calldata supplied to the flash call.\n  struct FlashParams {\n    address caller;\n    address recipient;\n    uint256 amount0;\n    uint256 amount1;\n    bytes data;\n  }\n\n  /*////////////////////////////////////////////////////////////\n                              VIEW FUNCTIONS\n  ////////////////////////////////////////////////////////////*/\n\n  /// @notice Queries the swap fee that the hook would charge in the swap loop.\n  /// @param _pool Address of the pool making the query.\n  /// @param _swapParams Swap context and pre-swap pool state.\n  /// @return _fee The fee that would be applied in the swap loop, in pips.\n  function getBeforeSwapFee(address _pool, SwapParams memory _swapParams) external view returns (uint24 _fee);\n\n  /// @notice Queries the swap fee that the hook would charge after the swap loop.\n  /// @param _pool Address of the pool making the query.\n  /// @param _swapParams Swap context and post-swap pool state.\n  /// @param _afterSwapParams Post-swap execution state and oracle/liquidity context.\n  /// @return _fee The fee that would be applied after the swap loop, in pips.\n  function getAfterSwapFee(\n    address _pool,\n    SwapParams memory _swapParams,\n    AfterSwapParams memory _afterSwapParams\n  ) external view returns (uint24 _fee);\n\n  /// @notice Queries the flash loan fee that the hook would charge for a given flash context.\n  /// @param _pool Address of the pool making the query.\n  /// @param _flashParams Arguments passed to the flash function.\n  /// @return _fee The fee that would be applied to flash loaned amounts, in pips.\n  function getFlashFee(address _pool, FlashParams memory _flashParams) external view returns (uint24 _fee);\n\n  /*////////////////////////////////////////////////////////////\n                              WRITE FUNCTIONS\n  ////////////////////////////////////////////////////////////*/\n\n  /// @notice Returns the fee to apply inside the swap loop.\n  /// @param _swapParams Swap context and PRE-SWAP pool state.\n  /// @return _fee The fee to apply throughout the swap loop.\n  function beforeSwap(SwapParams memory _swapParams) external returns (uint24 _fee);\n\n  /// @notice Returns the pips fee to apply after the swap loop conclusion.\n  /// @dev The fee is redirected exclusively to the Gauge.\n  /// @param _swapParams Swap context and POST-SWAP pool state.\n  /// @param _afterSwapParams POST-SWAP execution state and oracle/liquidity context.\n  /// @return _fee A post-swap fee to apply to the non-exact input/output part\n  ///         of the swap that's credited to the gauge.\n  function afterSwap(\n    SwapParams memory _swapParams,\n    AfterSwapParams memory _afterSwapParams\n  ) external returns (uint24 _fee);\n\n  /// @notice Returns the fee to apply to `amount0/1` in `flash` function.\n  /// @param _flashParams Arguments passed to the `flash` function.\n  /// @return _fee Fee to apply to flash loaned amounts.\n  function beforeFlash(FlashParams memory _flashParams) external returns (uint24 _fee);\n}\n"},"contracts/core/libraries/hook/SwapHookLib.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity =0.7.6;\npragma abicoder v2;\n\nimport {FullMath} from '../FullMath.sol';\n\nimport {ICLFactory} from 'contracts/core/interfaces/ICLFactory.sol';\nimport {ISwapHook} from 'contracts/core/interfaces/hook/ISwapHook.sol';\n\nimport {CLPool} from 'contracts/core/CLPool.sol';\n\n/// @notice Helper library for invoking swap hook methods and translating pool swap state into hook inputs.\nlibrary SwapHookLib {\n  using SwapHookLib for CLPool.SwapState;\n  using FullMath for uint256;\n\n  /*////////////////////////////////////////////////////////////\n                              CONSTANTS\n  ////////////////////////////////////////////////////////////*/\n\n  /// @dev A pips denominator.\n  uint256 internal constant _DENOMINATOR = 1e6;\n\n  /// @dev A ceil that fees returned from hook methods can not exceed.\n  uint24 internal constant _SWAP_FEE_CEIL = 100_000;\n\n  /*////////////////////////////////////////////////////////////\n                              VIEW FUNCTIONS\n  ////////////////////////////////////////////////////////////*/\n\n  /// @notice Calls the hook's `getBeforeSwapFee` entry point. Falls back to the pool's tick-spacing fee\n  ///         when: swap hook is zero address; returned fee is zero.\n  /// @param _swapHook Address of the hook contract.\n  /// @param _pool Address of the pool making the query.\n  /// @param _swapParams Swap context and PRE-SWAP pool state.\n  /// @param _factory Pool factory used to obtain the default tick-spacing fee.\n  /// @param _tickSpacing Pool's tick spacing.\n  /// @return The swap fee applied in the swap loop.\n  function getBeforeSwapFee(\n    address _swapHook,\n    address _pool,\n    ISwapHook.SwapParams memory _swapParams,\n    address _factory,\n    int24 _tickSpacing\n  ) internal view returns (uint24) {\n    if (_swapHook != address(0)) {\n      uint24 _fee = ISwapHook(_swapHook).getBeforeSwapFee(_pool, _swapParams);\n      if (_fee > 0) return cap(_fee);\n    }\n\n    return ICLFactory(_factory).tickSpacingToFee(_tickSpacing);\n  }\n\n  /// @notice Calls the hook's `getAfterSwapFee` entry point.\n  /// @param _swapHook Address of the hook contract.\n  /// @param _pool Address of the pool making the query.\n  /// @param _swapParams Swap context and POST-SWAP pool state.\n  /// @param _afterSwapParams POST-SWAP execution state and oracle/liquidity context.\n  /// @return The swap fee applied after the swap loop.\n  function getAfterSwapFee(\n    address _swapHook,\n    address _pool,\n    ISwapHook.SwapParams memory _swapParams,\n    ISwapHook.AfterSwapParams memory _afterSwapParams\n  ) internal view returns (uint24) {\n    if (_swapHook != address(0)) {\n      uint24 _fee = ISwapHook(_swapHook).getAfterSwapFee(_pool, _swapParams, _afterSwapParams);\n      if (_fee > 0) return cap(_fee);\n    }\n  }\n\n  /// @notice Calls the hook's `getFlashFee` entry point. Falls back to the pool's tick-spacing fee\n  ///         when: swap hook is zero address.\n  /// @param _swapHook Address of the hook contract.\n  /// @param _pool Address of the pool making the query.\n  /// @param _flashParams Arguments passed to the {CLPool.flash} function.\n  /// @param _factory Pool factory used to obtain the default tick-spacing fee.\n  /// @param _tickSpacing Pool's tick spacing.\n  /// @return The flash fee.\n  function getFlashFee(\n    address _swapHook,\n    address _pool,\n    ISwapHook.FlashParams memory _flashParams,\n    address _factory,\n    int24 _tickSpacing\n  ) internal view returns (uint24) {\n    if (_swapHook != address(0)) {\n      uint24 _fee = ISwapHook(_swapHook).getFlashFee(_pool, _flashParams);\n      return cap(_fee);\n    }\n\n    return ICLFactory(_factory).tickSpacingToFee(_tickSpacing);\n  }\n\n  /*////////////////////////////////////////////////////////////\n                              WRITE FUNCTIONS\n  ////////////////////////////////////////////////////////////*/\n\n  /// @notice Calls the hook's `beforeSwap` entry point. Falls back to the pool's tick-spacing fee\n  ///         when: swap hook is zero address; returned fee is zero.\n  /// @param _swapHook Address of the hook contract.\n  /// @param _swapParams Swap context passed to the hook.\n  /// @param _factory Pool factory used to obtain the default tick-spacing fee.\n  /// @param _tickSpacing Pool's tick spacing.\n  /// @return The fee to apply throughout the swap loop.\n  function beforeSwap(\n    address _swapHook,\n    ISwapHook.SwapParams memory _swapParams,\n    address _factory,\n    int24 _tickSpacing\n  ) internal returns (uint24) {\n    if (_swapHook != address(0)) {\n      uint24 _fee = ISwapHook(_swapHook).beforeSwap(_swapParams);\n      if (_fee > 0) return cap(_fee);\n    }\n\n    return ICLFactory(_factory).tickSpacingToFee(_tickSpacing);\n  }\n\n  /// @notice Calls the hook's `afterSwap` entry point and credits any returned post-swap fee to gauge fees.\n  /// @param _swapHook Address of the hook contract.\n  /// @param _swapParams Swap context passed to the hook.\n  /// @param _state Mutable swap state used to derive the post-swap adjustment.\n  /// @param _cache Swap cache used to derive the post-swap hook parameters.\n  /// @param gaugeFees Storage gauge fee accumulator updated with any computed post-swap fee.\n  function afterSwap(\n    address _swapHook,\n    ISwapHook.SwapParams memory _swapParams,\n    CLPool.SwapState memory _state,\n    CLPool.SwapCache memory _cache,\n    CLPool.GaugeFees storage gaugeFees\n  ) internal {\n    if (_swapHook == address(0)) return;\n\n    uint24 _fee = ISwapHook(_swapHook).afterSwap(_swapParams, _state.toAfterSwapParams(_cache));\n    if (_fee == 0) return;\n\n    _fee = cap(_fee);\n\n    bool _exactInput = _swapParams.amountSpecified > 0;\n\n    // 1. Get the abs amount of the token that was swapped.\n    //    exactInput  (output token)\n    //    exactOutput (input token)\n    uint256 _swapAmount = _exactInput ? uint256(-_state.amountCalculated) : uint256(_state.amountCalculated);\n\n    // 2. Compute fee in token units.\n    uint256 _feeAmount = _swapAmount.mulDivRoundingUp(_fee, _DENOMINATOR);\n\n    // 3. Apply the fee directly to amountCalculated.\n    //    exactInput:  amountCalculated is negative => adding a fee to it\n    //                 decreases the output the swapper receives.\n    //    exactOutput: amountCalculated is positive => adding a fee to it\n    //                 increases the input taken from the swapper.\n    _state.amountCalculated += int256(_feeAmount);\n\n    // 4. Credit the fee difference to the gauge.\n    //    We can't mutate \"exact\" amount, hence\n    //    we're mutating calculated parts of the swap.\n    if (_exactInput) {\n      // Credit OUTPUT token difference to the gauge.\n      if (_swapParams.zeroForOne) gaugeFees.token1 += uint128(_feeAmount);\n      else gaugeFees.token0 += uint128(_feeAmount);\n    } else {\n      // Credit INPUT token difference to the gauge.\n      if (_swapParams.zeroForOne) gaugeFees.token0 += uint128(_feeAmount);\n      else gaugeFees.token1 += uint128(_feeAmount);\n    }\n  }\n\n  /// @notice Calls the hook's `beforeFlash` entry point. Falls back to the pool's tick-spacing fee\n  ///         when swap hook is zero address.\n  /// @param _swapHook Address of the hook contract.\n  /// @param _flashParams Arguments passed to the {CLPool.flash} function.\n  /// @param _factory Pool factory used to obtain the default tick-spacing fee.\n  /// @param _tickSpacing Pool's tick spacing.\n  /// @return The fee to apply to flash loaned amounts.\n  function beforeFlash(\n    address _swapHook,\n    ISwapHook.FlashParams memory _flashParams,\n    address _factory,\n    int24 _tickSpacing\n  ) internal returns (uint24) {\n    if (_swapHook != address(0)) {\n      uint24 _fee = ISwapHook(_swapHook).beforeFlash(_flashParams);\n      return cap(_fee);\n    }\n\n    return ICLFactory(_factory).tickSpacingToFee(_tickSpacing);\n  }\n\n  /*////////////////////////////////////////////////////////////\n                              HELPERS\n  ////////////////////////////////////////////////////////////*/\n\n  /// @notice Converts pool swap state and cache values into the hook's after-swap parameter struct.\n  /// @param _state Current swap state.\n  /// @param _cache Current swap cache.\n  /// @return _afterSwapParams Converted state and cache of the swap.\n  function toAfterSwapParams(\n    CLPool.SwapState memory _state,\n    CLPool.SwapCache memory _cache\n  ) internal pure returns (ISwapHook.AfterSwapParams memory _afterSwapParams) {\n    _afterSwapParams = ISwapHook.AfterSwapParams({\n      amountSpecifiedRemaining: _state.amountSpecifiedRemaining,\n      amountCalculated: _state.amountCalculated,\n      fee: _state.fee,\n      hasUpdatedFees: _state.hasUpdatedFees,\n      feeGrowthGlobalX128: _state.feeGrowthGlobalX128,\n      gaugeFee: _state.gaugeFee,\n      liquidity: _state.liquidity,\n      stakedLiquidity: _state.stakedLiquidity,\n      tickCumulative: _cache.tickCumulative,\n      secondsPerLiquidityCumulativeX128: _cache.secondsPerLiquidityCumulativeX128,\n      computedLatestObservation: _cache.computedLatestObservation\n    });\n  }\n\n  /// @notice Caps the provided `_fee` with `_SWAP_FEE_CEIL`.\n  /// @param _fee The fee returned from the hook method.\n  /// @return _cappedFee Capped fee: min(_fee, _SWAP_FEE_CEIL)\n  function cap(uint24 _fee) internal pure returns (uint24 _cappedFee) {\n    _cappedFee = _fee < _SWAP_FEE_CEIL ? _fee : _SWAP_FEE_CEIL;\n  }\n}\n"},"contracts/gauge/interfaces/IAccessControl.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.7.6;\n\ninterface IAccessControl {\n  function hasRole(bytes32 _role, address _account) external view returns (bool);\n  function getRoleAdmin(bytes32 _role) external view returns (bytes32);\n  function getRoleMemberCount(bytes32 _role) external view returns (uint256);\n  function getRoleMember(bytes32 _role, uint256 _index) external view returns (address);\n  function grantRole(bytes32 _role, address _account) external;\n  function revokeRole(bytes32 _role, address _account) external;\n  function renounceRole(bytes32 _role, address _account) external;\n}\n"},"contracts/core/interfaces/IFactoryRegistry.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity >=0.7.6;\n\n/**\n * @title IFactoryRegistry\n * @notice Surface of the metadex `FactoryRegistry` the CL stack calls.\n * @dev A pool is a \"target\" and a pool factory a \"target factory\". The periphery keeps its own read-only mirror in\n *      `contracts/periphery/interfaces/IV3FactoryRegistry.sol` for the quoters.\n */\ninterface IFactoryRegistry {\n  /**\n   * @notice Registers a gauge factory and the target factory it serves as a pair, writing their permanent link.\n   * @param gaugeFactory The gauge factory to register.\n   * @param targetFactory The target (pool) factory the gauge factory serves.\n   */\n  function registerFactories(address gaugeFactory, address targetFactory) external;\n\n  /**\n   * @notice Records a freshly deployed target. Called by the target factory inside its own creation function.\n   * @param target The deployed target (pool).\n   */\n  function registerTarget(address target) external;\n\n  /**\n   * @notice True when a target (pool) factory is in the approval set.\n   * @param targetFactory The target factory to check.\n   * @return Whether the factory is approved.\n   */\n  function isTargetFactoryApproved(address targetFactory) external view returns (bool);\n\n  /**\n   * @notice The gauge factory serving a target factory.\n   * @param targetFactory The target factory to resolve.\n   * @return The linked gauge factory, zero for an unlinked factory.\n   */\n  function targetFactoryToGaugeFactory(address targetFactory) external view returns (address);\n\n  /**\n   * @notice The gauge over a target (pool).\n   * @param target The target to resolve.\n   * @return The gauge for `target`, zero when none is recorded.\n   */\n  function targetToGauge(address target) external view returns (address);\n\n  /**\n   * @notice Effective emission cap for a gauge, resolved through the factory that deployed it.\n   * @dev Returns zero when the gauge is unknown or the factory call reverts.\n   * @param gauge The gauge to resolve.\n   * @return The effective cap in tokens per second.\n   */\n  function emissionCap(address gauge) external view returns (uint128);\n}\n"},"contracts/core/libraries/CLPoolNonSwapPath.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity =0.7.6;\npragma abicoder v2;\n\nimport {FixedPoint128} from './FixedPoint128.sol';\nimport {FullMath} from './FullMath.sol';\nimport {LiquidityMath} from './LiquidityMath.sol';\nimport {LowGasSafeMath} from './LowGasSafeMath.sol';\nimport {Oracle} from './Oracle.sol';\nimport {Position} from './Position.sol';\nimport {SafeCast} from './SafeCast.sol';\nimport {SqrtPriceMath} from './SqrtPriceMath.sol';\nimport {Tick} from './Tick.sol';\nimport {TickBitmap} from './TickBitmap.sol';\nimport {TickMath} from './TickMath.sol';\nimport {TransferHelper} from './TransferHelper.sol';\nimport {SwapHookLib} from './hook/SwapHookLib.sol';\n\nimport {ICLFactory} from '../interfaces/ICLFactory.sol';\nimport {IERC20Minimal} from '../interfaces/IERC20Minimal.sol';\nimport {IFactoryRegistry} from '../interfaces/IFactoryRegistry.sol';\nimport {ICLFlashCallback} from '../interfaces/callback/ICLFlashCallback.sol';\nimport {ICLMintCallback} from '../interfaces/callback/ICLMintCallback.sol';\nimport {ISwapHook} from '../interfaces/hook/ISwapHook.sol';\n\nimport {CLPool} from '../CLPool.sol';\n\n/// @notice Externally linked implementations of non-swap CLPool paths.\n/// @dev CLPool keeps its public entry points and delegates only the function bodies declared here.\nlibrary CLPoolNonSwapPath {\n  using LowGasSafeMath for uint256;\n  using SafeCast for int256;\n  using Tick for mapping(int24 => Tick.Info);\n  using TickBitmap for mapping(int16 => uint256);\n  using Position for mapping(bytes32 => Position.Info);\n  using Position for Position.Info;\n  using Oracle for Oracle.Observation[65_535];\n  using SwapHookLib for address;\n\n  event Initialize(uint160 sqrtPriceX96, int24 tick);\n  event IncreaseObservationCardinalityNext(uint16 observationCardinalityNextOld, uint16 observationCardinalityNextNew);\n  event Flash(\n    address indexed sender, address indexed recipient, uint256 amount0, uint256 amount1, uint256 paid0, uint256 paid1\n  );\n  event Mint(\n    address sender,\n    address indexed owner,\n    int24 indexed tickLower,\n    int24 indexed tickUpper,\n    uint128 amount,\n    uint256 amount0,\n    uint256 amount1\n  );\n  event Burn(\n    address indexed owner,\n    int24 indexed tickLower,\n    int24 indexed tickUpper,\n    uint128 amount,\n    uint256 amount0,\n    uint256 amount1\n  );\n  event Collect(\n    address indexed owner,\n    address recipient,\n    int24 indexed tickLower,\n    int24 indexed tickUpper,\n    uint128 amount0,\n    uint128 amount1\n  );\n  event CollectFees(address indexed recipient, uint128 amount0, uint128 amount1);\n\n  struct FlashInput {\n    address token0;\n    address token1;\n    address factory;\n    int24 tickSpacing;\n    uint128 liquidity;\n    uint128 stakedLiquidity;\n    address recipient;\n    uint256 amount0;\n    uint256 amount1;\n  }\n\n  struct ModifyPositionInput {\n    address owner;\n    int24 tickLower;\n    int24 tickUpper;\n    uint128 liquidity;\n    uint128 maxLiquidityPerTick;\n    uint256 feeGrowthGlobal0X128;\n    uint256 feeGrowthGlobal1X128;\n    uint256 rewardGrowthGlobalX128;\n    address gauge;\n    int24 tickSpacing;\n    uint128 amount;\n  }\n\n  struct PositionObservation {\n    int56 tickCumulative;\n    uint160 secondsPerLiquidityCumulativeX128;\n    int24 currentTick;\n    int128 liquidityDelta;\n  }\n\n  struct StakeInput {\n    address nft;\n    int24 tickLower;\n    int24 tickUpper;\n    int24 tick;\n    int128 stakedLiquidityDelta;\n    uint256 feeGrowthGlobal0X128;\n    uint256 feeGrowthGlobal1X128;\n  }\n\n  struct SnapshotInput {\n    int24 tickLower;\n    int24 tickUpper;\n    int24 tick;\n    uint16 observationIndex;\n    uint16 observationCardinality;\n    uint128 liquidity;\n  }\n\n  function initializeSlot0(\n    CLPool.Slot0 storage slot0,\n    Oracle.Observation[65_535] storage observations,\n    uint160 sqrtPriceX96,\n    int24 tick,\n    int24 tickSpacing\n  ) external returns (uint128 maxLiquidityPerTick) {\n    (uint16 cardinality, uint16 cardinalityNext) = observations.initialize(uint32(block.timestamp));\n\n    slot0.sqrtPriceX96 = sqrtPriceX96;\n    slot0.tick = tick;\n    slot0.observationIndex = 0;\n    slot0.observationCardinality = cardinality;\n    slot0.observationCardinalityNext = cardinalityNext;\n    slot0.unlocked = true;\n\n    emit Initialize(sqrtPriceX96, tick);\n    return Tick.tickSpacingToMaxLiquidityPerTick(tickSpacing);\n  }\n\n  function flashFee(\n    ISwapHook.FlashParams memory flashParams,\n    address factory,\n    int24 tickSpacing\n  ) external view returns (uint24) {\n    address pool = address(this);\n    return ICLFactory(factory).getPoolSwapHook(pool).getFlashFee(pool, flashParams, factory, tickSpacing);\n  }\n\n  function beforeSwapFee(\n    ISwapHook.SwapParams memory swapParams,\n    address factory,\n    int24 tickSpacing\n  ) external view returns (uint24) {\n    address pool = address(this);\n    return ICLFactory(factory).getPoolSwapHook(pool).getBeforeSwapFee(pool, swapParams, factory, tickSpacing);\n  }\n\n  function afterSwapFee(\n    ISwapHook.SwapParams memory swapParams,\n    ISwapHook.AfterSwapParams memory afterSwapParams,\n    address factory\n  ) external view returns (uint24) {\n    address pool = address(this);\n    return ICLFactory(factory).getPoolSwapHook(pool).getAfterSwapFee(pool, swapParams, afterSwapParams);\n  }\n\n  function stakePositions(\n    mapping(bytes32 => Position.Info) storage positions,\n    mapping(int24 => Tick.Info) storage ticks,\n    address nft,\n    int24 tickLower,\n    int24 tickUpper,\n    int24 tick,\n    int128 stakedLiquidityDelta,\n    uint256 feeGrowthGlobal0X128,\n    uint256 feeGrowthGlobal1X128\n  ) external {\n    _stakePositions(\n      positions,\n      ticks,\n      StakeInput({\n        nft: nft,\n        tickLower: tickLower,\n        tickUpper: tickUpper,\n        tick: tick,\n        stakedLiquidityDelta: stakedLiquidityDelta,\n        feeGrowthGlobal0X128: feeGrowthGlobal0X128,\n        feeGrowthGlobal1X128: feeGrowthGlobal1X128\n      })\n    );\n  }\n\n  function _stakePositions(\n    mapping(bytes32 => Position.Info) storage positions,\n    mapping(int24 => Tick.Info) storage ticks,\n    StakeInput memory input\n  ) private {\n    Position.Info storage nftPosition = positions.get(input.nft, input.tickLower, input.tickUpper);\n    Position.Info storage gaugePosition = positions.get(msg.sender, input.tickLower, input.tickUpper);\n    (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128) = ticks.getFeeGrowthInside(\n      input.tickLower, input.tickUpper, input.tick, input.feeGrowthGlobal0X128, input.feeGrowthGlobal1X128\n    );\n    nftPosition.update(-input.stakedLiquidityDelta, feeGrowthInside0X128, feeGrowthInside1X128, false);\n    gaugePosition.update(input.stakedLiquidityDelta, feeGrowthInside0X128, feeGrowthInside1X128, true);\n    if (ticks[input.tickLower].initialized) ticks.updateStake(input.tickLower, input.stakedLiquidityDelta, false);\n    if (ticks[input.tickUpper].initialized) ticks.updateStake(input.tickUpper, input.stakedLiquidityDelta, true);\n  }\n\n  function snapshotCumulativesInside(\n    mapping(int24 => Tick.Info) storage ticks,\n    Oracle.Observation[65_535] storage observations,\n    int24 tickLower,\n    int24 tickUpper,\n    int24 tick,\n    uint16 observationIndex,\n    uint16 observationCardinality,\n    uint128 liquidity\n  ) external view returns (int56 tickCumulativeInside, uint160 secondsPerLiquidityInsideX128, uint32 secondsInside) {\n    return _snapshotCumulativesInside(\n      ticks,\n      observations,\n      SnapshotInput({\n        tickLower: tickLower,\n        tickUpper: tickUpper,\n        tick: tick,\n        observationIndex: observationIndex,\n        observationCardinality: observationCardinality,\n        liquidity: liquidity\n      })\n    );\n  }\n\n  function _snapshotCumulativesInside(\n    mapping(int24 => Tick.Info) storage ticks,\n    Oracle.Observation[65_535] storage observations,\n    SnapshotInput memory input\n  ) private view returns (int56 tickCumulativeInside, uint160 secondsPerLiquidityInsideX128, uint32 secondsInside) {\n    _checkTicks(input.tickLower, input.tickUpper);\n    Tick.Info storage lower = ticks[input.tickLower];\n    Tick.Info storage upper = ticks[input.tickUpper];\n    require(lower.initialized);\n    require(upper.initialized);\n\n    if (input.tick < input.tickLower) {\n      return (\n        lower.tickCumulativeOutside - upper.tickCumulativeOutside,\n        lower.secondsPerLiquidityOutsideX128 - upper.secondsPerLiquidityOutsideX128,\n        lower.secondsOutside - upper.secondsOutside\n      );\n    }\n    if (input.tick >= input.tickUpper) {\n      return (\n        upper.tickCumulativeOutside - lower.tickCumulativeOutside,\n        upper.secondsPerLiquidityOutsideX128 - lower.secondsPerLiquidityOutsideX128,\n        upper.secondsOutside - lower.secondsOutside\n      );\n    }\n    (int56 tickCumulative, uint160 secondsPerLiquidityCumulativeX128) = observations.observeSingle(\n      uint32(block.timestamp), 0, input.tick, input.observationIndex, input.liquidity, input.observationCardinality\n    );\n    return (\n      tickCumulative - lower.tickCumulativeOutside - upper.tickCumulativeOutside,\n      secondsPerLiquidityCumulativeX128 - lower.secondsPerLiquidityOutsideX128 - upper.secondsPerLiquidityOutsideX128,\n      uint32(block.timestamp) - lower.secondsOutside - upper.secondsOutside\n    );\n  }\n\n  function getFeeGrowthInside(\n    mapping(int24 => Tick.Info) storage ticks,\n    int24 tickLower,\n    int24 tickUpper,\n    int24 tickCurrent,\n    uint256 feeGrowthGlobal0X128,\n    uint256 feeGrowthGlobal1X128\n  ) external view returns (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128) {\n    _checkTicks(tickLower, tickUpper);\n    return ticks.getFeeGrowthInside(tickLower, tickUpper, tickCurrent, feeGrowthGlobal0X128, feeGrowthGlobal1X128);\n  }\n\n  function getRewardGrowthInside(\n    mapping(int24 => Tick.Info) storage ticks,\n    int24 tickLower,\n    int24 tickUpper,\n    int24 tickCurrent,\n    uint256 rewardGrowthGlobalX128,\n    uint256 storedRewardGrowthGlobalX128\n  ) external view returns (uint256 rewardGrowthInsideX128) {\n    _checkTicks(tickLower, tickUpper);\n    if (rewardGrowthGlobalX128 == 0) rewardGrowthGlobalX128 = storedRewardGrowthGlobalX128;\n    return ticks.getRewardGrowthInside(tickLower, tickUpper, tickCurrent, rewardGrowthGlobalX128);\n  }\n\n  function increaseObservationCardinalityNext(\n    Oracle.Observation[65_535] storage observations,\n    CLPool.Slot0 storage slot0,\n    uint16 observationCardinalityNext\n  ) external {\n    uint16 observationCardinalityNextOld = slot0.observationCardinalityNext;\n    uint16 observationCardinalityNextNew = observations.grow(observationCardinalityNextOld, observationCardinalityNext);\n    slot0.observationCardinalityNext = observationCardinalityNextNew;\n    if (observationCardinalityNextOld != observationCardinalityNextNew) {\n      emit IncreaseObservationCardinalityNext(observationCardinalityNextOld, observationCardinalityNextNew);\n    }\n  }\n\n  function _checkTicks(int24 tickLower, int24 tickUpper) private pure {\n    require(tickLower < tickUpper, 'TLU');\n    require(tickLower >= TickMath.MIN_TICK, 'TLM');\n    require(tickUpper <= TickMath.MAX_TICK, 'TUM');\n  }\n\n  function modifyPositionForMint(\n    mapping(bytes32 => Position.Info) storage positions,\n    mapping(int24 => Tick.Info) storage ticks,\n    mapping(int16 => uint256) storage tickBitmap,\n    Oracle.Observation[65_535] storage observations,\n    CLPool.Slot0 storage slot0,\n    ModifyPositionInput memory input\n  ) external returns (uint128 liquidityAfter, uint256 amount0, uint256 amount1) {\n    require(input.amount > 0);\n\n    int256 amount0Int;\n    int256 amount1Int;\n    (liquidityAfter, amount0Int, amount1Int) =\n      _modifyPosition(positions, ticks, tickBitmap, observations, slot0, input, int256(input.amount).toInt128());\n\n    amount0 = uint256(amount0Int);\n    amount1 = uint256(amount1Int);\n  }\n\n  function settleMint(\n    ModifyPositionInput memory input,\n    uint256 amount0,\n    uint256 amount1,\n    address token0,\n    address token1,\n    bytes calldata data\n  ) external {\n    uint256 balance0Before;\n    uint256 balance1Before;\n    if (amount0 > 0) balance0Before = _balance(token0);\n    if (amount1 > 0) balance1Before = _balance(token1);\n    ICLMintCallback(msg.sender).uniswapV3MintCallback(amount0, amount1, data);\n    if (amount0 > 0) require(balance0Before.add(amount0) <= _balance(token0), 'M0');\n    if (amount1 > 0) require(balance1Before.add(amount1) <= _balance(token1), 'M1');\n\n    emit Mint(msg.sender, input.owner, input.tickLower, input.tickUpper, input.amount, amount0, amount1);\n  }\n\n  function burn(\n    mapping(bytes32 => Position.Info) storage positions,\n    mapping(int24 => Tick.Info) storage ticks,\n    mapping(int16 => uint256) storage tickBitmap,\n    Oracle.Observation[65_535] storage observations,\n    CLPool.Slot0 storage slot0,\n    ModifyPositionInput memory input\n  ) external returns (uint128 liquidityAfter, uint256 amount0, uint256 amount1) {\n    int256 amount0Int;\n    int256 amount1Int;\n    (liquidityAfter, amount0Int, amount1Int) =\n      _modifyPosition(positions, ticks, tickBitmap, observations, slot0, input, -int256(input.amount).toInt128());\n\n    amount0 = uint256(-amount0Int);\n    amount1 = uint256(-amount1Int);\n\n    if (amount0 > 0 || amount1 > 0) {\n      _creditBurnedTokens(positions, input, uint128(amount0), uint128(amount1));\n    }\n\n    emit Burn(input.owner, input.tickLower, input.tickUpper, input.amount, amount0, amount1);\n  }\n\n  function _creditBurnedTokens(\n    mapping(bytes32 => Position.Info) storage positions,\n    ModifyPositionInput memory input,\n    uint128 amount0,\n    uint128 amount1\n  ) private {\n    Position.Info storage position = positions.get(input.owner, input.tickLower, input.tickUpper);\n    (position.tokensOwed0, position.tokensOwed1) = (position.tokensOwed0 + amount0, position.tokensOwed1 + amount1);\n  }\n\n  function collect(\n    mapping(bytes32 => Position.Info) storage positions,\n    address recipient,\n    int24 tickLower,\n    int24 tickUpper,\n    uint128 amount0Requested,\n    uint128 amount1Requested,\n    address owner,\n    address token0,\n    address token1\n  ) external returns (uint128 amount0, uint128 amount1) {\n    Position.Info storage position = positions.get(owner, tickLower, tickUpper);\n    amount0 = amount0Requested > position.tokensOwed0 ? position.tokensOwed0 : amount0Requested;\n    amount1 = amount1Requested > position.tokensOwed1 ? position.tokensOwed1 : amount1Requested;\n    if (amount0 > 0) {\n      position.tokensOwed0 -= amount0;\n      TransferHelper.safeTransfer(token0, recipient, amount0);\n    }\n    if (amount1 > 0) {\n      position.tokensOwed1 -= amount1;\n      TransferHelper.safeTransfer(token1, recipient, amount1);\n    }\n    emit Collect(owner, recipient, tickLower, tickUpper, amount0, amount1);\n  }\n\n  function collectFees(\n    CLPool.GaugeFees storage gaugeFees,\n    address recipient,\n    address token0,\n    address token1\n  ) external returns (uint128 amount0, uint128 amount1) {\n    amount0 = gaugeFees.token0;\n    amount1 = gaugeFees.token1;\n    if (amount0 > 1) {\n      gaugeFees.token0 = 1;\n      TransferHelper.safeTransfer(token0, recipient, --amount0);\n    } else {\n      amount0 = 0;\n    }\n    if (amount1 > 1) {\n      gaugeFees.token1 = 1;\n      TransferHelper.safeTransfer(token1, recipient, --amount1);\n    } else {\n      amount1 = 0;\n    }\n    emit CollectFees(recipient, amount0, amount1);\n  }\n\n  function _modifyPosition(\n    mapping(bytes32 => Position.Info) storage positions,\n    mapping(int24 => Tick.Info) storage ticks,\n    mapping(int16 => uint256) storage tickBitmap,\n    Oracle.Observation[65_535] storage observations,\n    CLPool.Slot0 storage slot0,\n    ModifyPositionInput memory input,\n    int128 liquidityDelta\n  ) private returns (uint128 liquidityAfter, int256 amount0, int256 amount1) {\n    _checkTicks(input.tickLower, input.tickUpper);\n\n    CLPool.Slot0 memory currentSlot0 = slot0;\n    _updatePosition(positions, ticks, tickBitmap, observations, currentSlot0, input, liquidityDelta);\n\n    liquidityAfter = input.liquidity;\n    if (liquidityDelta != 0) {\n      if (currentSlot0.tick < input.tickLower) {\n        amount0 = SqrtPriceMath.getAmount0Delta(\n          TickMath.getSqrtRatioAtTick(input.tickLower), TickMath.getSqrtRatioAtTick(input.tickUpper), liquidityDelta\n        );\n      } else if (currentSlot0.tick < input.tickUpper) {\n        (slot0.observationIndex, slot0.observationCardinality) = observations.write(\n          currentSlot0.observationIndex,\n          uint32(block.timestamp),\n          currentSlot0.tick,\n          input.liquidity,\n          currentSlot0.observationCardinality,\n          currentSlot0.observationCardinalityNext\n        );\n\n        amount0 = SqrtPriceMath.getAmount0Delta(\n          currentSlot0.sqrtPriceX96, TickMath.getSqrtRatioAtTick(input.tickUpper), liquidityDelta\n        );\n        amount1 = SqrtPriceMath.getAmount1Delta(\n          TickMath.getSqrtRatioAtTick(input.tickLower), currentSlot0.sqrtPriceX96, liquidityDelta\n        );\n\n        liquidityAfter = LiquidityMath.addDelta(input.liquidity, liquidityDelta);\n      } else {\n        amount1 = SqrtPriceMath.getAmount1Delta(\n          TickMath.getSqrtRatioAtTick(input.tickLower), TickMath.getSqrtRatioAtTick(input.tickUpper), liquidityDelta\n        );\n      }\n    }\n  }\n\n  function _updatePosition(\n    mapping(bytes32 => Position.Info) storage positions,\n    mapping(int24 => Tick.Info) storage ticks,\n    mapping(int16 => uint256) storage tickBitmap,\n    Oracle.Observation[65_535] storage observations,\n    CLPool.Slot0 memory currentSlot0,\n    ModifyPositionInput memory input,\n    int128 liquidityDelta\n  ) private {\n    bool flippedLower;\n    bool flippedUpper;\n    if (liquidityDelta != 0) {\n      PositionObservation memory observation;\n      observation.currentTick = currentSlot0.tick;\n      observation.liquidityDelta = liquidityDelta;\n      (observation.tickCumulative, observation.secondsPerLiquidityCumulativeX128) = observations.observeSingle(\n        uint32(block.timestamp),\n        0,\n        currentSlot0.tick,\n        currentSlot0.observationIndex,\n        input.liquidity,\n        currentSlot0.observationCardinality\n      );\n\n      flippedLower = _updateLowerTick(ticks, input, observation);\n      flippedUpper = _updateUpperTick(ticks, input, observation);\n\n      if (flippedLower) tickBitmap.flipTick(input.tickLower, input.tickSpacing);\n      if (flippedUpper) tickBitmap.flipTick(input.tickUpper, input.tickSpacing);\n    }\n\n    (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128) = ticks.getFeeGrowthInside(\n      input.tickLower, input.tickUpper, currentSlot0.tick, input.feeGrowthGlobal0X128, input.feeGrowthGlobal1X128\n    );\n\n    Position.Info storage position = positions.get(input.owner, input.tickLower, input.tickUpper);\n    bool staked = (input.owner == input.gauge) && (input.owner != address(0));\n    position.update(liquidityDelta, feeGrowthInside0X128, feeGrowthInside1X128, staked);\n\n    if (liquidityDelta < 0) {\n      if (flippedLower) ticks.clear(input.tickLower);\n      if (flippedUpper) ticks.clear(input.tickUpper);\n    }\n  }\n\n  function _updateLowerTick(\n    mapping(int24 => Tick.Info) storage ticks,\n    ModifyPositionInput memory input,\n    PositionObservation memory observation\n  ) private returns (bool) {\n    return ticks.update(\n      input.tickLower,\n      observation.currentTick,\n      observation.liquidityDelta,\n      input.feeGrowthGlobal0X128,\n      input.feeGrowthGlobal1X128,\n      input.rewardGrowthGlobalX128,\n      observation.secondsPerLiquidityCumulativeX128,\n      observation.tickCumulative,\n      uint32(block.timestamp),\n      false,\n      input.maxLiquidityPerTick\n    );\n  }\n\n  function _updateUpperTick(\n    mapping(int24 => Tick.Info) storage ticks,\n    ModifyPositionInput memory input,\n    PositionObservation memory observation\n  ) private returns (bool) {\n    return ticks.update(\n      input.tickUpper,\n      observation.currentTick,\n      observation.liquidityDelta,\n      input.feeGrowthGlobal0X128,\n      input.feeGrowthGlobal1X128,\n      input.rewardGrowthGlobalX128,\n      observation.secondsPerLiquidityCumulativeX128,\n      observation.tickCumulative,\n      uint32(block.timestamp),\n      true,\n      input.maxLiquidityPerTick\n    );\n  }\n\n  function validateGaugeFactory(address factoryRegistry, address factory) external view {\n    address gaugeFactory = IFactoryRegistry(factoryRegistry).targetFactoryToGaugeFactory(factory);\n    require(msg.sender == gaugeFactory, 'NGF');\n  }\n\n  function flash(\n    CLPool.GaugeFees storage gaugeFees,\n    FlashInput memory input,\n    bytes calldata data\n  ) external returns (uint256 feeGrowthDelta0, uint256 feeGrowthDelta1) {\n    require(input.liquidity > 0, 'L');\n\n    (uint256 fee0, uint256 fee1) = _flashFees(input, data);\n    uint256 balance0Before = _balance(input.token0);\n    uint256 balance1Before = _balance(input.token1);\n\n    if (input.amount0 > 0) TransferHelper.safeTransfer(input.token0, input.recipient, input.amount0);\n    if (input.amount1 > 0) TransferHelper.safeTransfer(input.token1, input.recipient, input.amount1);\n\n    ICLFlashCallback(msg.sender).uniswapV3FlashCallback(fee0, fee1, data);\n\n    uint256 paid0 = _paid(input.token0, balance0Before, fee0, 'F0');\n    uint256 paid1 = _paid(input.token1, balance1Before, fee1, 'F1');\n\n    feeGrowthDelta0 = _accrueGaugeFee(gaugeFees, input, paid0, true);\n    feeGrowthDelta1 = _accrueGaugeFee(gaugeFees, input, paid1, false);\n\n    emit Flash(msg.sender, input.recipient, input.amount0, input.amount1, paid0, paid1);\n  }\n\n  function _flashFees(FlashInput memory input, bytes memory data) private returns (uint256 fee0, uint256 fee1) {\n    uint24 feePips = ICLFactory(input.factory)\n      .getPoolSwapHook(address(this))\n      .beforeFlash(\n        ISwapHook.FlashParams({\n          caller: msg.sender, recipient: input.recipient, amount0: input.amount0, amount1: input.amount1, data: data\n        }),\n        input.factory,\n        input.tickSpacing\n      );\n    fee0 = FullMath.mulDivRoundingUp(input.amount0, feePips, SwapHookLib._DENOMINATOR);\n    fee1 = FullMath.mulDivRoundingUp(input.amount1, feePips, SwapHookLib._DENOMINATOR);\n  }\n\n  function _balance(address token) private view returns (uint256) {\n    (bool success, bytes memory data) =\n      token.staticcall(abi.encodeWithSelector(IERC20Minimal.balanceOf.selector, address(this)));\n    require(success && data.length >= 32);\n    return abi.decode(data, (uint256));\n  }\n\n  function _paid(\n    address token,\n    uint256 balanceBefore,\n    uint256 fee,\n    string memory error\n  ) private view returns (uint256) {\n    uint256 balanceAfter = _balance(token);\n    require(balanceBefore.add(fee) <= balanceAfter, error);\n    return balanceAfter - balanceBefore;\n  }\n\n  function _accrueGaugeFee(\n    CLPool.GaugeFees storage gaugeFees,\n    FlashInput memory input,\n    uint256 paid,\n    bool zeroForOne\n  ) private returns (uint256 feeGrowthDelta) {\n    if (paid == 0) return 0;\n\n    uint256 stakedFeeAmount;\n    (feeGrowthDelta, stakedFeeAmount) = _calculateFees(paid, input.liquidity, input.stakedLiquidity, input.factory);\n    if (uint128(stakedFeeAmount) > 0) {\n      if (zeroForOne) gaugeFees.token0 += uint128(stakedFeeAmount);\n      else gaugeFees.token1 += uint128(stakedFeeAmount);\n    }\n  }\n\n  function _calculateFees(\n    uint256 feeAmount,\n    uint128 liquidity,\n    uint128 stakedLiquidity,\n    address factory\n  ) private view returns (uint256 feeGrowthGlobalX128, uint256 stakedFeeAmount) {\n    if (liquidity == stakedLiquidity) {\n      stakedFeeAmount = feeAmount;\n    } else if (stakedLiquidity == 0) {\n      (uint256 unstakedFeeAmount, uint256 stakedFee) = _applyUnstakedFees(feeAmount, 0, factory);\n      feeGrowthGlobalX128 = FullMath.mulDiv(unstakedFeeAmount, FixedPoint128.Q128, liquidity);\n      stakedFeeAmount = stakedFee;\n    } else {\n      (uint256 unstakedFeeAmount, uint256 stakedFee) = _splitFees(feeAmount, liquidity, stakedLiquidity, factory);\n      feeGrowthGlobalX128 = FullMath.mulDiv(unstakedFeeAmount, FixedPoint128.Q128, liquidity - stakedLiquidity);\n      stakedFeeAmount = stakedFee;\n    }\n  }\n\n  function _splitFees(\n    uint256 feeAmount,\n    uint128 liquidity,\n    uint128 stakedLiquidity,\n    address factory\n  ) private view returns (uint256 unstakedFeeAmount, uint256 stakedFeeAmount) {\n    stakedFeeAmount = FullMath.mulDivRoundingUp(feeAmount, stakedLiquidity, liquidity);\n    return _applyUnstakedFees(feeAmount - stakedFeeAmount, stakedFeeAmount, factory);\n  }\n\n  function _applyUnstakedFees(\n    uint256 unstakedFeeAmount,\n    uint256 stakedFeeAmount,\n    address factory\n  ) private view returns (uint256, uint256) {\n    uint256 stakedFee = FullMath.mulDivRoundingUp(\n      unstakedFeeAmount, ICLFactory(factory).getUnstakedFee(address(this)), 1_000_000\n    );\n    return (unstakedFeeAmount - stakedFee, stakedFeeAmount + stakedFee);\n  }\n}\n"},"contracts/core/interfaces/pool/ICLPoolState.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\npragma abicoder v2;\n\nimport {ISwapHook} from '../hook/ISwapHook.sol';\n\n/// @title Pool state that can change\n/// @notice These methods compose the pool's state, and can change with any frequency including multiple times\n/// per transaction\ninterface ICLPoolState {\n  /// @notice The 0th storage slot in the pool stores many values, and is exposed as a single method to save gas\n  /// when accessed externally.\n  /// @return sqrtPriceX96 The current price of the pool as a sqrt(token1/token0) Q64.96 value\n  /// tick The current tick of the pool, i.e. according to the last tick transition that was run.\n  /// This value may not always be equal to SqrtTickMath.getTickAtSqrtRatio(sqrtPriceX96) if the price is on a tick\n  /// boundary.\n  /// observationIndex The index of the last oracle observation that was written,\n  /// observationCardinality The current maximum number of observations stored in the pool,\n  /// observationCardinalityNext The next maximum number of observations, to be updated when the observation.\n  /// unlocked Whether the pool is currently locked to reentrancy\n  function slot0()\n    external\n    view\n    returns (\n      uint160 sqrtPriceX96,\n      int24 tick,\n      uint16 observationIndex,\n      uint16 observationCardinality,\n      uint16 observationCardinalityNext,\n      bool unlocked\n    );\n\n  /// @notice The pool's pre-swap swap fee in pips, i.e. 1e-6\n  /// @param _swapParams Swap context and pre-swap pool state.\n  /// @return The pre-swap fee.\n  function beforeSwapFee(ISwapHook.SwapParams memory _swapParams) external view returns (uint24);\n\n  /// @notice The pool's post-swap swap fee in pips, i.e. 1e-6\n  /// @param _swapParams Swap context and post-swap pool state.\n  /// @param _afterSwapParams Post-swap execution state and oracle/liquidity context.\n  /// @return The post-swap fee.\n  function afterSwapFee(\n    ISwapHook.SwapParams memory _swapParams,\n    ISwapHook.AfterSwapParams memory _afterSwapParams\n  ) external view returns (uint24);\n\n  /// @notice The pool's flash fee in pips, i.e. 1e-6\n  /// @param _flashParams Arguments passed to the flash function.\n  /// @return The flash fee.\n  function flashFee(ISwapHook.FlashParams memory _flashParams) external view returns (uint24);\n\n  /// @notice The pool's swap fee in pips, i.e. 1e-6\n  /// @return The swap fee.\n  function fee() external view returns (uint24);\n\n  /// @notice The pool's unstaked fee in pips, i.e. 1e-6\n  /// @dev Can be modified in PoolFactory on a pool basis or upgraded to be dynamic.\n  /// @return The unstaked fee\n  function unstakedFee() external view returns (uint24);\n\n  /// @notice The fee growth as a Q128.128 fees of token0 collected per unit of liquidity for the entire life of the pool\n  /// @dev This value can overflow the uint256\n  function feeGrowthGlobal0X128() external view returns (uint256);\n\n  /// @notice The fee growth as a Q128.128 fees of token1 collected per unit of liquidity for the entire life of the pool\n  /// @dev This value can overflow the uint256\n  function feeGrowthGlobal1X128() external view returns (uint256);\n\n  /// @notice The reward growth as a Q128.128 rewards of emission collected per unit of liquidity for the entire life of the pool\n  /// @dev This value can overflow the uint256\n  function rewardGrowthGlobalX128() external view returns (uint256);\n\n  /// @notice The cumulative seconds per unit of in-range staked liquidity as of lastUpdated\n  /// @return The Q128.128 stored seconds per staked liquidity cumulative\n  function secondsPerStakedLiquidityCumulativeX128() external view returns (uint160);\n\n  /// @notice The amounts of token0 and token1 that are owed to the gauge\n  /// @dev Gauge fees will never exceed uint128 max in either token\n  function gaugeFees() external view returns (uint128 token0, uint128 token1);\n\n  /// @notice Last time the pool reward growth was advanced\n  function lastUpdated() external view returns (uint48);\n\n  /// @notice Emissions accrued while no staked liquidity was in range\n  function rollover() external view returns (uint256);\n\n  /// @notice The currently in range liquidity available to the pool\n  /// @dev This value has no relationship to the total liquidity across all ticks\n  /// @dev This value includes staked liquidity\n  function liquidity() external view returns (uint128);\n\n  /// @notice The currently in range staked liquidity available to the pool\n  /// @dev This value has no relationship to the total staked liquidity across all ticks\n  function stakedLiquidity() external view returns (uint128);\n\n  /// @notice Look up information about a specific tick in the pool\n  /// @param tick The tick to look up\n  /// @return liquidityGross the total amount of position liquidity that uses the pool either as tick lower or\n  /// tick upper,\n  /// liquidityNet how much liquidity changes when the pool price crosses the tick,\n  /// stakedLiquidityNet how much staked liquidity changes when the pool price crosses the tick,\n  /// feeGrowthOutside0X128 the fee growth on the other side of the tick from the current tick in token0,\n  /// feeGrowthOutside1X128 the fee growth on the other side of the tick from the current tick in token1,\n  /// rewardGrowthOutsideX128 the reward growth on the other side of the tick from the current tick in emission token\n  /// tickCumulativeOutside the cumulative tick value on the other side of the tick from the current tick\n  /// secondsPerLiquidityOutsideX128 the seconds spent per liquidity on the other side of the tick from the current tick,\n  /// secondsOutside the seconds spent on the other side of the tick from the current tick,\n  /// initialized Set to true if the tick is initialized, i.e. liquidityGross is greater than 0, otherwise equal to false.\n  /// Outside values can only be used if the tick is initialized, i.e. if liquidityGross is greater than 0.\n  /// In addition, these values are only relative and must be used only in comparison to previous snapshots for\n  /// a specific position.\n  function ticks(int24 tick)\n    external\n    view\n    returns (\n      uint128 liquidityGross,\n      int128 liquidityNet,\n      int128 stakedLiquidityNet,\n      uint256 feeGrowthOutside0X128,\n      uint256 feeGrowthOutside1X128,\n      uint256 rewardGrowthOutsideX128,\n      int56 tickCumulativeOutside,\n      uint160 secondsPerLiquidityOutsideX128,\n      uint32 secondsOutside,\n      bool initialized\n    );\n\n  /// @notice Returns 256 packed tick initialized boolean values. See TickBitmap for more information\n  function tickBitmap(int16 wordPosition) external view returns (uint256);\n\n  /// @notice Returns the information about a position by the position's key\n  /// @param key The position's key is a hash of a preimage composed by the owner, tickLower and tickUpper\n  /// @return _liquidity The amount of liquidity in the position,\n  /// Returns feeGrowthInside0LastX128 fee growth of token0 inside the tick range as of the last mint/burn/poke,\n  /// Returns feeGrowthInside1LastX128 fee growth of token1 inside the tick range as of the last mint/burn/poke,\n  /// Returns tokensOwed0 the computed amount of token0 owed to the position as of the last mint/burn/poke,\n  /// Returns tokensOwed1 the computed amount of token1 owed to the position as of the last mint/burn/poke\n  function positions(bytes32 key)\n    external\n    view\n    returns (\n      uint128 _liquidity,\n      uint256 feeGrowthInside0LastX128,\n      uint256 feeGrowthInside1LastX128,\n      uint128 tokensOwed0,\n      uint128 tokensOwed1\n    );\n\n  /// @notice Returns data about a specific observation index\n  /// @param index The element of the observations array to fetch\n  /// @dev You most likely want to use #observe() instead of this method to get an observation as of some amount of time\n  /// ago, rather than at a specific index in the array.\n  /// @return blockTimestamp The timestamp of the observation,\n  /// Returns tickCumulative the tick multiplied by seconds elapsed for the life of the pool as of the observation timestamp,\n  /// Returns secondsPerLiquidityCumulativeX128 the seconds per in range liquidity for the life of the pool as of the observation timestamp,\n  /// Returns initialized whether the observation has been initialized and the values are safe to use\n  function observations(uint256 index)\n    external\n    view\n    returns (uint32 blockTimestamp, int56 tickCumulative, uint160 secondsPerLiquidityCumulativeX128, bool initialized);\n\n  /// @notice Returns data about reward growth within a tick range.\n  /// RewardGrowthGlobalX128 can be supplied as a parameter for claimable reward calculations.\n  /// @dev Used in gauge reward/earned calculations\n  /// @param tickLower The lower tick of the range\n  /// @param tickUpper The upper tick of the range\n  /// @param _rewardGrowthGlobalX128 a calculated rewardGrowthGlobalX128 or 0 (in case of 0 it means we use the rewardGrowthGlobalX128 from state)\n  /// @return rewardGrowthInsideX128 The reward growth in the range\n  function getRewardGrowthInside(\n    int24 tickLower,\n    int24 tickUpper,\n    uint256 _rewardGrowthGlobalX128\n  ) external view returns (uint256 rewardGrowthInsideX128);\n\n  /// @notice Returns data about fee growth within a tick range.\n  /// @param tickLower The lower tick of the range\n  /// @param tickUpper The upper tick of the range\n  /// @return feeGrowthInside0X128 The token0 fee growth in range.\n  /// @return feeGrowthInside1X128 The token1 fee growth in range.\n  function getFeeGrowthInside(\n    int24 tickLower,\n    int24 tickUpper\n  ) external view returns (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128);\n}\n"},"contracts/core/interfaces/pool/ICLPoolEvents.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Events emitted by a pool\n/// @notice Contains all events emitted by the pool\ninterface ICLPoolEvents {\n  /// @notice Emitted exactly once by a pool when #initialize is first called on the pool\n  /// @dev Mint/Burn/Swap cannot be emitted by the pool before Initialize\n  /// @param sqrtPriceX96 The initial sqrt price of the pool, as a Q64.96\n  /// @param tick The initial tick of the pool, i.e. log base 1.0001 of the starting price of the pool\n  event Initialize(uint160 sqrtPriceX96, int24 tick);\n\n  /// @notice Emitted when liquidity is minted for a given position\n  /// @param sender The address that minted the liquidity\n  /// @param owner The owner of the position and recipient of any minted liquidity\n  /// @param tickLower The lower tick of the position\n  /// @param tickUpper The upper tick of the position\n  /// @param amount The amount of liquidity minted to the position range\n  /// @param amount0 How much token0 was required for the minted liquidity\n  /// @param amount1 How much token1 was required for the minted liquidity\n  event Mint(\n    address sender,\n    address indexed owner,\n    int24 indexed tickLower,\n    int24 indexed tickUpper,\n    uint128 amount,\n    uint256 amount0,\n    uint256 amount1\n  );\n\n  /// @notice Emitted when fees are collected by the owner of a position\n  /// @dev Collect events may be emitted with zero amount0 and amount1 when the caller chooses not to collect fees\n  /// @param owner The owner of the position for which fees are collected\n  /// @param tickLower The lower tick of the position\n  /// @param tickUpper The upper tick of the position\n  /// @param amount0 The amount of token0 fees collected\n  /// @param amount1 The amount of token1 fees collected\n  event Collect(\n    address indexed owner,\n    address recipient,\n    int24 indexed tickLower,\n    int24 indexed tickUpper,\n    uint128 amount0,\n    uint128 amount1\n  );\n\n  /// @notice Emitted when a position's liquidity is removed\n  /// @dev Does not withdraw any fees earned by the liquidity position, which must be withdrawn via #collect\n  /// @param owner The owner of the position for which liquidity is removed\n  /// @param tickLower The lower tick of the position\n  /// @param tickUpper The upper tick of the position\n  /// @param amount The amount of liquidity to remove\n  /// @param amount0 The amount of token0 withdrawn\n  /// @param amount1 The amount of token1 withdrawn\n  event Burn(\n    address indexed owner,\n    int24 indexed tickLower,\n    int24 indexed tickUpper,\n    uint128 amount,\n    uint256 amount0,\n    uint256 amount1\n  );\n\n  /// @notice Emitted by the pool for any swaps between token0 and token1\n  /// @param sender The address that initiated the swap call, and that received the callback\n  /// @param recipient The address that received the output of the swap\n  /// @param amount0 The delta of the token0 balance of the pool\n  /// @param amount1 The delta of the token1 balance of the pool\n  /// @param sqrtPriceX96 The sqrt(price) of the pool after the swap, as a Q64.96\n  /// @param liquidity The liquidity of the pool after the swap\n  /// @param tick The log base 1.0001 of price of the pool after the swap\n  event Swap(\n    address indexed sender,\n    address indexed recipient,\n    int256 amount0,\n    int256 amount1,\n    uint160 sqrtPriceX96,\n    uint128 liquidity,\n    int24 tick\n  );\n\n  /// @notice Emitted by the pool for any flashes of token0/token1\n  /// @param sender The address that initiated the swap call, and that received the callback\n  /// @param recipient The address that received the tokens from flash\n  /// @param amount0 The amount of token0 that was flashed\n  /// @param amount1 The amount of token1 that was flashed\n  /// @param paid0 The amount of token0 paid for the flash, which can exceed the amount0 plus the fee\n  /// @param paid1 The amount of token1 paid for the flash, which can exceed the amount1 plus the fee\n  event Flash(\n    address indexed sender, address indexed recipient, uint256 amount0, uint256 amount1, uint256 paid0, uint256 paid1\n  );\n\n  /// @notice Emitted by the pool for increases to the number of observations that can be stored\n  /// @dev observationCardinalityNext is not the observation cardinality until an observation is written at the index\n  /// just before a mint/swap/burn.\n  /// @param observationCardinalityNextOld The previous value of the next observation cardinality\n  /// @param observationCardinalityNextNew The updated value of the next observation cardinality\n  event IncreaseObservationCardinalityNext(uint16 observationCardinalityNextOld, uint16 observationCardinalityNextNew);\n\n  /// @notice Emitted when the protocol fee is changed by the pool\n  /// @param feeProtocol0Old The previous value of the token0 protocol fee\n  /// @param feeProtocol1Old The previous value of the token1 protocol fee\n  /// @param feeProtocol0New The updated value of the token0 protocol fee\n  /// @param feeProtocol1New The updated value of the token1 protocol fee\n  event SetFeeProtocol(uint8 feeProtocol0Old, uint8 feeProtocol1Old, uint8 feeProtocol0New, uint8 feeProtocol1New);\n\n  /// @notice Emitted when the collected protocol fees are withdrawn by the gauge\n  /// @param recipient The address that receives the collected protocol fees\n  /// @param amount0 The amount of token0 protocol fees that is withdrawn\n  /// @param amount0 The amount of token1 protocol fees that is withdrawn\n  event CollectFees(address indexed recipient, uint128 amount0, uint128 amount1);\n}\n"},"contracts/core/interfaces/pool/ICLPoolActions.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Permissionless pool actions\n/// @notice Contains pool methods that can be called by anyone\ninterface ICLPoolActions {\n  /// @notice Initialize function used in proxy deployment\n  /// @dev Can be called once only\n  /// Price is represented as a sqrt(amountToken1/amountToken0) Q64.96 value\n  /// @dev not locked because it initializes unlocked\n  /// @param _factory The CL factory contract address\n  /// @param _token0 The first token of the pool by address sort order\n  /// @param _token1 The second token of the pool by address sort order\n  /// @param _tickSpacing The pool tick spacing\n  /// @param _factoryRegistry The address of the factory registry managing the pool factory\n  /// @param _sqrtPriceX96 The initial sqrt price of the pool, as a Q64.96\n  function initialize(\n    address _factory,\n    address _token0,\n    address _token1,\n    int24 _tickSpacing,\n    address _factoryRegistry,\n    uint160 _sqrtPriceX96\n  ) external;\n\n  /// @notice Initialize gauge and nft manager\n  /// @dev Callable only once, by the gauge factory\n  /// @param _gauge The gauge corresponding to this pool\n  /// @param _nft The position manager used for position management\n  function setGaugeAndPositionManager(address _gauge, address _nft) external;\n\n  /// @notice Adds liquidity for the given recipient/tickLower/tickUpper position\n  /// @dev The caller of this method receives a callback in the form of ICLMintCallback#uniswapV3MintCallback\n  /// in which they must pay any token0 or token1 owed for the liquidity. The amount of token0/token1 due depends\n  /// on tickLower, tickUpper, the amount of liquidity, and the current price.\n  /// @param recipient The address for which the liquidity will be created\n  /// @param tickLower The lower tick of the position in which to add liquidity\n  /// @param tickUpper The upper tick of the position in which to add liquidity\n  /// @param amount The amount of liquidity to mint\n  /// @param data Any data that should be passed through to the callback\n  /// @return amount0 The amount of token0 that was paid to mint the given amount of liquidity. Matches the value in the callback\n  /// @return amount1 The amount of token1 that was paid to mint the given amount of liquidity. Matches the value in the callback\n  function mint(\n    address recipient,\n    int24 tickLower,\n    int24 tickUpper,\n    uint128 amount,\n    bytes calldata data\n  ) external returns (uint256 amount0, uint256 amount1);\n\n  /// @notice Collects tokens owed to a position\n  /// @dev Does not recompute fees earned, which must be done either via mint or burn of any amount of liquidity.\n  /// Collect must be called by the position owner. To withdraw only token0 or only token1, amount0Requested or\n  /// amount1Requested may be set to zero. To withdraw all tokens owed, caller may pass any value greater than the\n  /// actual tokens owed, e.g. type(uint128).max. Tokens owed may be from accumulated swap fees or burned liquidity.\n  /// @param recipient The address which should receive the fees collected\n  /// @param tickLower The lower tick of the position for which to collect fees\n  /// @param tickUpper The upper tick of the position for which to collect fees\n  /// @param amount0Requested How much token0 should be withdrawn from the fees owed\n  /// @param amount1Requested How much token1 should be withdrawn from the fees owed\n  /// @return amount0 The amount of fees collected in token0\n  /// @return amount1 The amount of fees collected in token1\n  function collect(\n    address recipient,\n    int24 tickLower,\n    int24 tickUpper,\n    uint128 amount0Requested,\n    uint128 amount1Requested\n  ) external returns (uint128 amount0, uint128 amount1);\n\n  /// @notice Collects tokens owed to a position\n  /// @dev Does not recompute fees earned, which must be done either via mint or burn of any amount of liquidity.\n  /// Collect must be called by the position owner. To withdraw only token0 or only token1, amount0Requested or\n  /// amount1Requested may be set to zero. To withdraw all tokens owed, caller may pass any value greater than the\n  /// actual tokens owed, e.g. type(uint128).max. Tokens owed may be from accumulated swap fees or burned liquidity.\n  /// @param recipient The address which should receive the fees collected\n  /// @param tickLower The lower tick of the position for which to collect fees\n  /// @param tickUpper The upper tick of the position for which to collect fees\n  /// @param amount0Requested How much token0 should be withdrawn from the fees owed\n  /// @param amount1Requested How much token1 should be withdrawn from the fees owed\n  /// @param owner Owner of the position in the pool (nft manager or gauge)\n  /// @return amount0 The amount of fees collected in token0\n  /// @return amount1 The amount of fees collected in token1\n  function collect(\n    address recipient,\n    int24 tickLower,\n    int24 tickUpper,\n    uint128 amount0Requested,\n    uint128 amount1Requested,\n    address owner\n  ) external returns (uint128 amount0, uint128 amount1);\n\n  /// @notice Burn liquidity from the sender and account tokens owed for the liquidity to the position\n  /// @dev Can be used to trigger a recalculation of fees owed to a position by calling with an amount of 0\n  /// @dev Fees must be collected separately via a call to #collect\n  /// @param tickLower The lower tick of the position for which to burn liquidity\n  /// @param tickUpper The upper tick of the position for which to burn liquidity\n  /// @param amount How much liquidity to burn\n  /// @return amount0 The amount of token0 sent to the recipient\n  /// @return amount1 The amount of token1 sent to the recipient\n  function burn(int24 tickLower, int24 tickUpper, uint128 amount) external returns (uint256 amount0, uint256 amount1);\n\n  /// @notice Burn liquidity from the supplied owner and account tokens owed for the liquidity to the position\n  /// @dev Can be used to trigger a recalculation of fees owed to a position by calling with an amount of 0\n  /// @dev Fees must be collected separately via a call to #collect\n  /// @param tickLower The lower tick of the position for which to burn liquidity\n  /// @param tickUpper The upper tick of the position for which to burn liquidity\n  /// @param amount How much liquidity to burn\n  /// @param owner Owner of the position in the pool (nft manager or gauge)\n  /// @return amount0 The amount of token0 sent to the recipient\n  /// @return amount1 The amount of token1 sent to the recipient\n  function burn(\n    int24 tickLower,\n    int24 tickUpper,\n    uint128 amount,\n    address owner\n  ) external returns (uint256 amount0, uint256 amount1);\n\n  /// @notice Convert existing liquidity into staked liquidity\n  /// @notice Only callable by the gauge associated with this pool\n  /// @param stakedLiquidityDelta The amount by which to increase or decrease the staked liquidity\n  /// @param tickLower The lower tick of the position for which to stake liquidity\n  /// @param tickUpper The upper tick of the position for which to stake liquidity\n  function stake(int128 stakedLiquidityDelta, int24 tickLower, int24 tickUpper) external;\n\n  /// @notice Swap token0 for token1, or token1 for token0\n  /// @dev The caller of this method receives a callback in the form of ICLSwapCallback#uniswapV3SwapCallback\n  /// @param recipient The address to receive the output of the swap\n  /// @param zeroForOne The direction of the swap, true for token0 to token1, false for token1 to token0\n  /// @param amountSpecified The amount of the swap, which implicitly configures the swap as exact input (positive), or exact output (negative)\n  /// @param sqrtPriceLimitX96 The Q64.96 sqrt price limit. If zero for one, the price cannot be less than this\n  /// value after the swap. If one for zero, the price cannot be greater than this value after the swap\n  /// @param data Any data to be passed through to the callback\n  /// @return amount0 The delta of the balance of token0 of the pool, exact when negative, minimum when positive\n  /// @return amount1 The delta of the balance of token1 of the pool, exact when negative, minimum when positive\n  function swap(\n    address recipient,\n    bool zeroForOne,\n    int256 amountSpecified,\n    uint160 sqrtPriceLimitX96,\n    bytes calldata data\n  ) external returns (int256 amount0, int256 amount1);\n\n  /// @notice Receive token0 and/or token1 and pay it back, plus a fee, in the callback\n  /// @dev The caller of this method receives a callback in the form of ICLFlashCallback#uniswapV3FlashCallback\n  /// @dev Can be used to donate underlying tokens pro-rata to currently in-range liquidity providers by calling\n  /// with 0 amount{0,1} and sending the donation amount(s) from the callback\n  /// @param recipient The address which will receive the token0 and token1 amounts\n  /// @param amount0 The amount of token0 to send\n  /// @param amount1 The amount of token1 to send\n  /// @param data Any data to be passed through to the callback\n  function flash(address recipient, uint256 amount0, uint256 amount1, bytes calldata data) external;\n\n  /// @notice Increase the maximum number of price and liquidity observations that this pool will store\n  /// @dev This method is no-op if the pool already has an observationCardinalityNext greater than or equal to\n  /// the input observationCardinalityNext.\n  /// @param observationCardinalityNext The desired minimum number of observations for the pool to store\n  function increaseObservationCardinalityNext(uint16 observationCardinalityNext) external;\n\n  /// @notice Settles the pool's reward growth to the current block timestamp and returns the accrued rollover\n  /// @dev Only callable by the gauge. Pulls the emissions accrued since the last settlement through the gauge.\n  /// @return _rollover the emissions accumulated while no staked liquidity was in range. Reset to 0 after this call.\n  function settleToBlock() external returns (uint256 _rollover);\n}\n"},"contracts/core/interfaces/pool/ICLPoolConstants.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Pool state that never changes\n/// @notice These parameters are not defined as immutable (due to proxy pattern) but are effectively immutable.\n/// @notice i.e., the methods will always return the same values\ninterface ICLPoolConstants {\n  /// @notice The contract that deployed the pool, which must adhere to the ICLFactory interface\n  /// @return The contract address\n  function factory() external view returns (address);\n\n  /// @notice The first of the two tokens of the pool, sorted by address\n  /// @return The token contract address\n  function token0() external view returns (address);\n\n  /// @notice The second of the two tokens of the pool, sorted by address\n  /// @return The token contract address\n  function token1() external view returns (address);\n\n  /// @notice The gauge corresponding to this pool\n  /// @return The gauge contract address\n  function gauge() external view returns (address);\n\n  /// @notice The nft manager\n  /// @return The nft manager contract address\n  function nft() external view returns (address);\n\n  /// @notice The factory registry that manages pool <> gauge <> reward factory relationships\n  /// @return The factory registry contract address\n  function factoryRegistry() external view returns (address);\n\n  /// @notice The pool tick spacing\n  /// @dev Ticks can only be used at multiples of this value, minimum of 1 and always positive\n  /// e.g.: a tickSpacing of 3 means ticks can be initialized every 3rd tick, i.e., ..., -6, -3, 0, 3, 6, ...\n  /// This value is an int24 to avoid casting even though it is always positive.\n  /// @return The tick spacing\n  function tickSpacing() external view returns (int24);\n\n  /// @notice The maximum amount of position liquidity that can use any tick in the range\n  /// @dev This parameter is enforced per tick to prevent liquidity from overflowing a uint128 at any point, and\n  /// also prevents out-of-range liquidity from being used to prevent adding in-range liquidity to a pool\n  /// @return The max amount of liquidity per tick\n  function maxLiquidityPerTick() external view returns (uint128);\n\n  /// @notice The ceiling applied to the before/after swap fee.\n  /// @return The swap fee ceiling value in pips.\n  function SWAP_FEE_CEIL() external view returns (uint256);\n\n  /// @notice The denominator used for fees computation.\n  /// @return The denominator value in pips.\n  function DENOMINATOR() external view returns (uint256);\n\n  /// @notice The pool type identifier\n  /// @return The pool type label to be able to identify the type of pool\n  function POOL_TYPE() external view returns (bytes32);\n}\n"},"contracts/core/interfaces/callback/ICLMintCallback.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Callback for ICLPoolActions#mint\n/// @notice Any contract that calls ICLPoolActions#mint must implement this interface\ninterface ICLMintCallback {\n  /// @notice Called to `msg.sender` after minting liquidity to a position from ICLPool#mint.\n  /// @dev In the implementation you must pay the pool tokens owed for the minted liquidity.\n  /// The caller of this method must be checked to be a CLPool deployed by the canonical CLFactory.\n  /// @param amount0Owed The amount of token0 due to the pool for the minted liquidity\n  /// @param amount1Owed The amount of token1 due to the pool for the minted liquidity\n  /// @param data Any data passed through by the caller via the ICLPoolActions#mint call\n  function uniswapV3MintCallback(uint256 amount0Owed, uint256 amount1Owed, bytes calldata data) external;\n}\n"},"contracts/core/interfaces/callback/ICLSwapCallback.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Callback for ICLPoolActions#swap\n/// @notice Any contract that calls ICLPoolActions#swap must implement this interface\ninterface ICLSwapCallback {\n  /// @notice Called to `msg.sender` after executing a swap via ICLPool#swap.\n  /// @dev In the implementation you must pay the pool tokens owed for the swap.\n  /// The caller of this method must be checked to be a CLPool deployed by the canonical CLFactory.\n  /// amount0Delta and amount1Delta can both be 0 if no tokens were swapped.\n  /// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by\n  /// the end of the swap. If positive, the callback must send that amount of token0 to the pool.\n  /// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by\n  /// the end of the swap. If positive, the callback must send that amount of token1 to the pool.\n  /// @param data Any data passed through by the caller via the ICLPoolActions#swap call\n  function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes calldata data) external;\n}\n"},"contracts/core/interfaces/pool/ICLPoolDerivedState.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Pool state that is not stored\n/// @notice Contains view functions to provide information about the pool that is computed rather than stored on the\n/// blockchain. The functions here may have variable gas costs.\ninterface ICLPoolDerivedState {\n  /// @notice Returns the cumulative tick and liquidity as of each timestamp `secondsAgo` from the current block timestamp\n  /// @dev To get a time weighted average tick or liquidity-in-range, you must call this with two values, one representing\n  /// the beginning of the period and another for the end of the period. E.g., to get the last hour time-weighted average tick,\n  /// you must call it with secondsAgos = [3600, 0].\n  /// @dev The time weighted average tick represents the geometric time weighted average price of the pool, in\n  /// log base sqrt(1.0001) of token1 / token0. The TickMath library can be used to go from a tick value to a ratio.\n  /// @param secondsAgos From how long ago each cumulative tick and liquidity value should be returned\n  /// @return tickCumulatives Cumulative tick values as of each `secondsAgos` from the current block timestamp\n  /// @return secondsPerLiquidityCumulativeX128s Cumulative seconds per liquidity-in-range value as of each `secondsAgos` from the current block\n  /// timestamp\n  function observe(uint32[] calldata secondsAgos)\n    external\n    view\n    returns (int56[] memory tickCumulatives, uint160[] memory secondsPerLiquidityCumulativeX128s);\n\n  /// @notice Returns a snapshot of the tick cumulative, seconds per liquidity and seconds inside a tick range\n  /// @dev Snapshots must only be compared to other snapshots, taken over a period for which a position existed.\n  /// I.e., snapshots cannot be compared if a position is not held for the entire period between when the first\n  /// snapshot is taken and the second snapshot is taken.\n  /// @param tickLower The lower tick of the range\n  /// @param tickUpper The upper tick of the range\n  /// @return tickCumulativeInside The snapshot of the tick accumulator for the range\n  /// @return secondsPerLiquidityInsideX128 The snapshot of seconds per liquidity for the range\n  /// @return secondsInside The snapshot of seconds per liquidity for the range\n  function snapshotCumulativesInside(\n    int24 tickLower,\n    int24 tickUpper\n  ) external view returns (int56 tickCumulativeInside, uint160 secondsPerLiquidityInsideX128, uint32 secondsInside);\n\n  /// @notice The seconds per staked liquidity cumulative projected to the current block timestamp\n  /// @return The Q128.128 seconds per staked liquidity cumulative as of the current block\n  function getSecondsPerStakedLiquidityCumulativeX128() external view returns (uint160);\n}\n"},"contracts/core/interfaces/pool/ICLPoolOwnerActions.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Permissioned pool actions\n/// @notice Contains pool methods that may only be called by the factory owner\ninterface ICLPoolOwnerActions {\n  /// @notice Collect the gauge fee accrued to the pool\n  /// @param recipient The address that receives the claimed gauge fees\n  /// @return amount0 The gauge fee collected in token0\n  /// @return amount1 The gauge fee collected in token1\n  function collectFees(address recipient) external returns (uint128 amount0, uint128 amount1);\n}\n"},"contracts/core/interfaces/callback/ICLFlashCallback.sol":{"content":"// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Callback for ICLPoolActions#flash\n/// @notice Any contract that calls ICLPoolActions#flash must implement this interface\ninterface ICLFlashCallback {\n  /// @notice Called to `msg.sender` after transferring to the recipient from ICLPool#flash.\n  /// @dev In the implementation you must repay the pool the tokens sent by flash plus the computed fee amounts.\n  /// The caller of this method must be checked to be a CLPool deployed by the canonical CLFactory.\n  /// @param fee0 The fee amount in token0 due to the pool by the end of the flash\n  /// @param fee1 The fee amount in token1 due to the pool by the end of the flash\n  /// @param data Any data passed through by the caller via the ICLPoolActions#flash call\n  function uniswapV3FlashCallback(uint256 fee0, uint256 fee1, bytes calldata data) external;\n}\n"},"contracts/gauge/interfaces/INonfungiblePositionManager.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity =0.7.6;\npragma abicoder v2;\n\nimport {IERC721} from '@openzeppelin/contracts/token/ERC721/IERC721.sol';\n\n/// @title Minimal NonfungiblePositionManager interface\n/// @notice Used to support the integration with the core implementation\n/// @dev For full context, please review the Uniswap implementation under GPL license.\ninterface INonfungiblePositionManager is IERC721 {\n  function positions(uint256 tokenId)\n    external\n    view\n    returns (\n      uint96 nonce,\n      address operator,\n      address token0,\n      address token1,\n      int24 tickSpacing,\n      int24 tickLower,\n      int24 tickUpper,\n      uint128 liquidity,\n      uint256 feeGrowthInside0LastX128,\n      uint256 feeGrowthInside1LastX128,\n      uint128 tokensOwed0,\n      uint128 tokensOwed1\n    );\n\n  struct CollectParams {\n    uint256 tokenId;\n    address recipient;\n    uint128 amount0Max;\n    uint128 amount1Max;\n  }\n\n  function collect(CollectParams calldata params) external payable returns (uint256 amount0, uint256 amount1);\n}\n"},"node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.7.0;\n\nimport \"../../introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC721 compliant contract.\n */\ninterface IERC721 is IERC165 {\n    /**\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n    /**\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\n     */\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n    /**\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\n     */\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n    /**\n     * @dev Returns the number of tokens in ``owner``'s account.\n     */\n    function balanceOf(address owner) external view returns (uint256 balance);\n\n    /**\n     * @dev Returns the owner of the `tokenId` token.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     */\n    function ownerOf(uint256 tokenId) external view returns (address owner);\n\n    /**\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must exist and be owned by `from`.\n     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n     *\n     * Emits a {Transfer} event.\n     */\n    function safeTransferFrom(address from, address to, uint256 tokenId) external;\n\n    /**\n     * @dev Transfers `tokenId` token from `from` to `to`.\n     *\n     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\n     *\n     * Requirements:\n     *\n     * - `from` cannot be the zero address.\n     * - `to` cannot be the zero address.\n     * - `tokenId` token must be owned by `from`.\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 tokenId) external;\n\n    /**\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\n     * The approval is cleared when the token is transferred.\n     *\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n     *\n     * Requirements:\n     *\n     * - The caller must own the token or be an approved operator.\n     * - `tokenId` must exist.\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address to, uint256 tokenId) external;\n\n    /**\n     * @dev Returns the account approved for `tokenId` token.\n     *\n     * Requirements:\n     *\n     * - `tokenId` must exist.\n     */\n    function getApproved(uint256 tokenId) external view returns (address operator);\n\n    /**\n     * @dev Approve or remove `operator` as an operator for the caller.\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n     *\n     * Requirements:\n     *\n     * - The `operator` cannot be the caller.\n     *\n     * Emits an {ApprovalForAll} event.\n     */\n    function setApprovalForAll(address operator, bool _approved) external;\n\n    /**\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n     *\n     * See {setApprovalForAll}\n     */\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\n\n    /**\n      * @dev Safely transfers `tokenId` token from `from` to `to`.\n      *\n      * Requirements:\n      *\n      * - `from` cannot be the zero address.\n      * - `to` cannot be the zero address.\n      * - `tokenId` token must exist and be owned by `from`.\n      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\n      *\n      * Emits a {Transfer} event.\n      */\n    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\n}\n"},"node_modules/@openzeppelin/contracts/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.7.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"}},"language":"Solidity","settings":{"metadata":{"bytecodeHash":"ipfs"},"libraries":{"contracts/core/CLPool.sol":{"CLPoolNonSwapPath":"0x1ad7a8703ebff81c0d753190938f228672ec7e42"}},"optimizer":{"runs":200,"enabled":true},"evmVersion":"istanbul","remappings":["/Users/acx/code/dromos/metadex-slipstream/node_modules/@hyperlane-xyz/:@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable-v4/","/Users/acx/code/dromos/metadex-slipstream/node_modules/@hyperlane-xyz/:@openzeppelin/contracts/=node_modules/@openzeppelin/contracts-v4/","/Users/acx/code/dromos/metadex-slipstream/node_modules/metadex/:@hyperlane/contracts/=node_modules/@hyperlane-xyz/core/contracts/","/Users/acx/code/dromos/metadex-slipstream/node_modules/metadex/:@nomad-xyz/src/=node_modules/metadex/node_modules/@nomad-xyz/excessively-safe-call/src/","/Users/acx/code/dromos/metadex-slipstream/node_modules/metadex/:@openzeppelin/contracts/=node_modules/metadex/node_modules/@openzeppelin/contracts/","/Users/acx/code/dromos/metadex-slipstream/node_modules/metadex/:@solady/=node_modules/solady/src/","/Users/acx/code/dromos/metadex-slipstream/test/invariants/fuzz/:@openzeppelin/contracts/=node_modules/metadex/node_modules/@openzeppelin/contracts/",":@hyperlane-v11/contracts/=node_modules/@hyperlane-xyz/core-v11/contracts/",":@hyperlane/contracts/=node_modules/@hyperlane-xyz/core/contracts/",":@nomad-xyz/excessively-safe-call/=node_modules/@nomad-xyz/excessively-safe-call/",":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/",":@solady/=node_modules/solady/src/",":@uniswap/lib/=node_modules/@uniswap/lib/",":V3-script/=node_modules/metadex/V3/script/",":V3-test/=node_modules/metadex/V3/test/",":V3/=node_modules/metadex/V3/src/",":base64-sol/=node_modules/base64-sol/",":forge-std/=node_modules/forge-std/src/","node_modules/@hyperlane-xyz/:@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable-v4/","node_modules/@hyperlane-xyz/:@openzeppelin/contracts/=node_modules/@openzeppelin/contracts-v4/","node_modules/metadex/:@hyperlane/contracts/=node_modules/@hyperlane-xyz/core/contracts/","node_modules/metadex/:@nomad-xyz/src/=node_modules/metadex/node_modules/@nomad-xyz/excessively-safe-call/src/","node_modules/metadex/:@openzeppelin/contracts/=node_modules/metadex/node_modules/@openzeppelin/contracts/","node_modules/metadex/:@solady/=node_modules/solady/src/","test/invariants/fuzz/:@openzeppelin/contracts/=node_modules/metadex/node_modules/@openzeppelin/contracts/"]}},"stdJsonOutput":{"sources":{"contracts/core/CLPool.sol":{"id":0},"contracts/core/libraries/Tick.sol":{"id":27},"contracts/core/libraries/Oracle.sol":{"id":22},"contracts/core/libraries/BitMath.sol":{"id":15},"contracts/core/interfaces/ICLPool.sol":{"id":2},"contracts/core/libraries/FullMath.sol":{"id":19},"contracts/core/libraries/Position.sol":{"id":23},"contracts/core/libraries/SafeCast.sol":{"id":24},"contracts/core/libraries/SwapMath.sol":{"id":26},"contracts/core/libraries/TickMath.sol":{"id":29},"contracts/gauge/interfaces/IGauge.sol":{"id":36},"contracts/gauge/interfaces/ICLPool.sol":{"id":35},"contracts/core/libraries/TickBitmap.sol":{"id":28},"contracts/core/libraries/UnsafeMath.sol":{"id":31},"contracts/gauge/interfaces/ICLGauge.sol":{"id":34},"contracts/core/interfaces/ICLFactory.sol":{"id":1},"contracts/core/libraries/FixedPoint96.sol":{"id":18},"contracts/gauge/interfaces/ILeafVoter.sol":{"id":37},"contracts/core/libraries/FixedPoint128.sol":{"id":17},"contracts/core/libraries/LiquidityMath.sol":{"id":20},"contracts/core/libraries/SqrtPriceMath.sol":{"id":25},"contracts/core/interfaces/IERC20Minimal.sol":{"id":3},"contracts/core/libraries/LowGasSafeMath.sol":{"id":21},"contracts/core/libraries/TransferHelper.sol":{"id":30},"contracts/core/interfaces/hook/ISwapHook.sol":{"id":8},"contracts/core/libraries/hook/SwapHookLib.sol":{"id":32},"contracts/gauge/interfaces/IAccessControl.sol":{"id":33},"contracts/core/interfaces/IFactoryRegistry.sol":{"id":4},"contracts/core/libraries/CLPoolNonSwapPath.sol":{"id":16},"contracts/core/interfaces/pool/ICLPoolState.sol":{"id":14},"contracts/core/interfaces/pool/ICLPoolEvents.sol":{"id":12},"contracts/core/interfaces/pool/ICLPoolActions.sol":{"id":9},"contracts/core/interfaces/pool/ICLPoolConstants.sol":{"id":10},"contracts/core/interfaces/callback/ICLMintCallback.sol":{"id":6},"contracts/core/interfaces/callback/ICLSwapCallback.sol":{"id":7},"contracts/core/interfaces/pool/ICLPoolDerivedState.sol":{"id":11},"contracts/core/interfaces/pool/ICLPoolOwnerActions.sol":{"id":13},"contracts/core/interfaces/callback/ICLFlashCallback.sol":{"id":5},"contracts/gauge/interfaces/INonfungiblePositionManager.sol":{"id":38},"node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol":{"id":40},"node_modules/@openzeppelin/contracts/introspection/IERC165.sol":{"id":39}},"contracts":{"contracts/core/CLPool.sol":{"CLPool":{"abi":[{"name":"Burn","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"tickLower","type":"int24","indexed":true,"internalType":"int24"},{"name":"tickUpper","type":"int24","indexed":true,"internalType":"int24"},{"name":"amount","type":"uint128","indexed":false,"internalType":"uint128"},{"name":"amount0","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"amount1","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"Collect","type":"event","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"recipient","type":"address","indexed":false,"internalType":"address"},{"name":"tickLower","type":"int24","indexed":true,"internalType":"int24"},{"name":"tickUpper","type":"int24","indexed":true,"internalType":"int24"},{"name":"amount0","type":"uint128","indexed":false,"internalType":"uint128"},{"name":"amount1","type":"uint128","indexed":false,"internalType":"uint128"}],"anonymous":false},{"name":"CollectFees","type":"event","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount0","type":"uint128","indexed":false,"internalType":"uint128"},{"name":"amount1","type":"uint128","indexed":false,"internalType":"uint128"}],"anonymous":false},{"name":"Flash","type":"event","inputs":[{"name":"sender","type":"address","indexed":true,"internalType":"address"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount0","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"amount1","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"paid0","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"paid1","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"IncreaseObservationCardinalityNext","type":"event","inputs":[{"name":"observationCardinalityNextOld","type":"uint16","indexed":false,"internalType":"uint16"},{"name":"observationCardinalityNextNew","type":"uint16","indexed":false,"internalType":"uint16"}],"anonymous":false},{"name":"Initialize","type":"event","inputs":[{"name":"sqrtPriceX96","type":"uint160","indexed":false,"internalType":"uint160"},{"name":"tick","type":"int24","indexed":false,"internalType":"int24"}],"anonymous":false},{"name":"Mint","type":"event","inputs":[{"name":"sender","type":"address","indexed":false,"internalType":"address"},{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"tickLower","type":"int24","indexed":true,"internalType":"int24"},{"name":"tickUpper","type":"int24","indexed":true,"internalType":"int24"},{"name":"amount","type":"uint128","indexed":false,"internalType":"uint128"},{"name":"amount0","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"amount1","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"name":"SetFeeProtocol","type":"event","inputs":[{"name":"feeProtocol0Old","type":"uint8","indexed":false,"internalType":"uint8"},{"name":"feeProtocol1Old","type":"uint8","indexed":false,"internalType":"uint8"},{"name":"feeProtocol0New","type":"uint8","indexed":false,"internalType":"uint8"},{"name":"feeProtocol1New","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"name":"Swap","type":"event","inputs":[{"name":"sender","type":"address","indexed":true,"internalType":"address"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount0","type":"int256","indexed":false,"internalType":"int256"},{"name":"amount1","type":"int256","indexed":false,"internalType":"int256"},{"name":"sqrtPriceX96","type":"uint160","indexed":false,"internalType":"uint160"},{"name":"liquidity","type":"uint128","indexed":false,"internalType":"uint128"},{"name":"tick","type":"int24","indexed":false,"internalType":"int24"}],"anonymous":false},{"name":"DENOMINATOR","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"POOL_TYPE","type":"function","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"name":"SWAP_FEE_CEIL","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"afterSwapFee","type":"function","inputs":[{"name":"_swapParams","type":"tuple","components":[{"name":"caller","type":"address","internalType":"address"},{"name":"recipient","type":"address","internalType":"address"},{"name":"zeroForOne","type":"bool","internalType":"bool"},{"name":"amountSpecified","type":"int256","internalType":"int256"},{"name":"sqrtPriceLimitX96","type":"uint160","internalType":"uint160"},{"name":"data","type":"bytes","internalType":"bytes"},{"name":"sqrtPriceX96","type":"uint160","internalType":"uint160"},{"name":"tick","type":"int24","internalType":"int24"}],"internalType":"struct ISwapHook.SwapParams"},{"name":"_afterSwapParams","type":"tuple","components":[{"name":"amountSpecifiedRemaining","type":"int256","internalType":"int256"},{"name":"amountCalculated","type":"int256","internalType":"int256"},{"name":"fee","type":"uint24","internalType":"uint24"},{"name":"hasUpdatedFees","type":"bool","internalType":"bool"},{"name":"feeGrowthGlobalX128","type":"uint256","internalType":"uint256"},{"name":"gaugeFee","type":"uint128","internalType":"uint128"},{"name":"liquidity","type":"uint128","internalType":"uint128"},{"name":"stakedLiquidity","type":"uint128","internalType":"uint128"},{"name":"tickCumulative","type":"int56","internalType":"int56"},{"name":"secondsPerLiquidityCumulativeX128","type":"uint160","internalType":"uint160"},{"name":"computedLatestObservation","type":"bool","internalType":"bool"}],"internalType":"struct ISwapHook.AfterSwapParams"}],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"beforeSwapFee","type":"function","inputs":[{"name":"_swapParams","type":"tuple","components":[{"name":"caller","type":"address","internalType":"address"},{"name":"recipient","type":"address","internalType":"address"},{"name":"zeroForOne","type":"bool","internalType":"bool"},{"name":"amountSpecified","type":"int256","internalType":"int256"},{"name":"sqrtPriceLimitX96","type":"uint160","internalType":"uint160"},{"name":"data","type":"bytes","internalType":"bytes"},{"name":"sqrtPriceX96","type":"uint160","internalType":"uint160"},{"name":"tick","type":"int24","internalType":"int24"}],"internalType":"struct ISwapHook.SwapParams"}],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"burn","type":"function","inputs":[{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"amount","type":"uint128","internalType":"uint128"},{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"amount0","type":"uint256","internalType":"uint256"},{"name":"amount1","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"burn","type":"function","inputs":[{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"amount","type":"uint128","internalType":"uint128"}],"outputs":[{"name":"amount0","type":"uint256","internalType":"uint256"},{"name":"amount1","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"collect","type":"function","inputs":[{"name":"recipient","type":"address","internalType":"address"},{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"amount0Requested","type":"uint128","internalType":"uint128"},{"name":"amount1Requested","type":"uint128","internalType":"uint128"},{"name":"owner","type":"address","internalType":"address"}],"outputs":[{"name":"amount0","type":"uint128","internalType":"uint128"},{"name":"amount1","type":"uint128","internalType":"uint128"}],"stateMutability":"nonpayable"},{"name":"collect","type":"function","inputs":[{"name":"recipient","type":"address","internalType":"address"},{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"amount0Requested","type":"uint128","internalType":"uint128"},{"name":"amount1Requested","type":"uint128","internalType":"uint128"}],"outputs":[{"name":"amount0","type":"uint128","internalType":"uint128"},{"name":"amount1","type":"uint128","internalType":"uint128"}],"stateMutability":"nonpayable"},{"name":"collectFees","type":"function","inputs":[{"name":"recipient","type":"address","internalType":"address"}],"outputs":[{"name":"amount0","type":"uint128","internalType":"uint128"},{"name":"amount1","type":"uint128","internalType":"uint128"}],"stateMutability":"nonpayable"},{"name":"factory","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"factoryRegistry","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"fee","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"feeGrowthGlobal0X128","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"feeGrowthGlobal1X128","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"flash","type":"function","inputs":[{"name":"recipient","type":"address","internalType":"address"},{"name":"amount0","type":"uint256","internalType":"uint256"},{"name":"amount1","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"flashFee","type":"function","inputs":[{"name":"_flashParams","type":"tuple","components":[{"name":"caller","type":"address","internalType":"address"},{"name":"recipient","type":"address","internalType":"address"},{"name":"amount0","type":"uint256","internalType":"uint256"},{"name":"amount1","type":"uint256","internalType":"uint256"},{"name":"data","type":"bytes","internalType":"bytes"}],"internalType":"struct ISwapHook.FlashParams"}],"outputs":[{"name":"_fee","type":"uint24","internalType":"uint24"}],"stateMutability":"view"},{"name":"gauge","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"gaugeFees","type":"function","inputs":[],"outputs":[{"name":"token0","type":"uint128","internalType":"uint128"},{"name":"token1","type":"uint128","internalType":"uint128"}],"stateMutability":"view"},{"name":"getFeeGrowthInside","type":"function","inputs":[{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"}],"outputs":[{"name":"feeGrowthInside0X128","type":"uint256","internalType":"uint256"},{"name":"feeGrowthInside1X128","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getRewardGrowthInside","type":"function","inputs":[{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"_rewardGrowthGlobalX128","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"rewardGrowthInside","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getSecondsPerStakedLiquidityCumulativeX128","type":"function","inputs":[],"outputs":[{"name":"_cumulative","type":"uint160","internalType":"uint160"}],"stateMutability":"view"},{"name":"increaseObservationCardinalityNext","type":"function","inputs":[{"name":"observationCardinalityNext","type":"uint16","internalType":"uint16"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"initialize","type":"function","inputs":[{"name":"_factory","type":"address","internalType":"address"},{"name":"_token0","type":"address","internalType":"address"},{"name":"_token1","type":"address","internalType":"address"},{"name":"_tickSpacing","type":"int24","internalType":"int24"},{"name":"_factoryRegistry","type":"address","internalType":"address"},{"name":"_sqrtPriceX96","type":"uint160","internalType":"uint160"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"lastUpdated","type":"function","inputs":[],"outputs":[{"name":"","type":"uint48","internalType":"uint48"}],"stateMutability":"view"},{"name":"liquidity","type":"function","inputs":[],"outputs":[{"name":"","type":"uint128","internalType":"uint128"}],"stateMutability":"view"},{"name":"maxLiquidityPerTick","type":"function","inputs":[],"outputs":[{"name":"","type":"uint128","internalType":"uint128"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[{"name":"recipient","type":"address","internalType":"address"},{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"},{"name":"amount","type":"uint128","internalType":"uint128"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"amount0","type":"uint256","internalType":"uint256"},{"name":"amount1","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"nft","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"observations","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"blockTimestamp","type":"uint32","internalType":"uint32"},{"name":"tickCumulative","type":"int56","internalType":"int56"},{"name":"secondsPerLiquidityCumulativeX128","type":"uint160","internalType":"uint160"},{"name":"initialized","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"observe","type":"function","inputs":[{"name":"secondsAgos","type":"uint32[]","internalType":"uint32[]"}],"outputs":[{"name":"tickCumulatives","type":"int56[]","internalType":"int56[]"},{"name":"secondsPerLiquidityCumulativeX128s","type":"uint160[]","internalType":"uint160[]"}],"stateMutability":"view"},{"name":"positions","type":"function","inputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"liquidity","type":"uint128","internalType":"uint128"},{"name":"feeGrowthInside0LastX128","type":"uint256","internalType":"uint256"},{"name":"feeGrowthInside1LastX128","type":"uint256","internalType":"uint256"},{"name":"tokensOwed0","type":"uint128","internalType":"uint128"},{"name":"tokensOwed1","type":"uint128","internalType":"uint128"}],"stateMutability":"view"},{"name":"rewardGrowthGlobalX128","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"rollover","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"secondsPerStakedLiquidityCumulativeX128","type":"function","inputs":[],"outputs":[{"name":"","type":"uint160","internalType":"uint160"}],"stateMutability":"view"},{"name":"setGaugeAndPositionManager","type":"function","inputs":[{"name":"_gauge","type":"address","internalType":"address"},{"name":"_nft","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"settleToBlock","type":"function","inputs":[],"outputs":[{"name":"_rollover","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"name":"slot0","type":"function","inputs":[],"outputs":[{"name":"sqrtPriceX96","type":"uint160","internalType":"uint160"},{"name":"tick","type":"int24","internalType":"int24"},{"name":"observationIndex","type":"uint16","internalType":"uint16"},{"name":"observationCardinality","type":"uint16","internalType":"uint16"},{"name":"observationCardinalityNext","type":"uint16","internalType":"uint16"},{"name":"unlocked","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"snapshotCumulativesInside","type":"function","inputs":[{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"}],"outputs":[{"name":"tickCumulativeInside","type":"int56","internalType":"int56"},{"name":"secondsPerLiquidityInsideX128","type":"uint160","internalType":"uint160"},{"name":"secondsInside","type":"uint32","internalType":"uint32"}],"stateMutability":"view"},{"name":"stake","type":"function","inputs":[{"name":"stakedLiquidityDelta","type":"int128","internalType":"int128"},{"name":"tickLower","type":"int24","internalType":"int24"},{"name":"tickUpper","type":"int24","internalType":"int24"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"stakedLiquidity","type":"function","inputs":[],"outputs":[{"name":"","type":"uint128","internalType":"uint128"}],"stateMutability":"view"},{"name":"swap","type":"function","inputs":[{"name":"recipient","type":"address","internalType":"address"},{"name":"zeroForOne","type":"bool","internalType":"bool"},{"name":"amountSpecified","type":"int256","internalType":"int256"},{"name":"sqrtPriceLimitX96","type":"uint160","internalType":"uint160"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"amount0","type":"int256","internalType":"int256"},{"name":"amount1","type":"int256","internalType":"int256"}],"stateMutability":"nonpayable"},{"name":"tickBitmap","type":"function","inputs":[{"name":"","type":"int16","internalType":"int16"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"tickSpacing","type":"function","inputs":[],"outputs":[{"name":"","type":"int24","internalType":"int24"}],"stateMutability":"view"},{"name":"ticks","type":"function","inputs":[{"name":"","type":"int24","internalType":"int24"}],"outputs":[{"name":"liquidityGross","type":"uint128","internalType":"uint128"},{"name":"liquidityNet","type":"int128","internalType":"int128"},{"name":"stakedLiquidityNet","type":"int128","internalType":"int128"},{"name":"feeGrowthOutside0X128","type":"uint256","internalType":"uint256"},{"name":"feeGrowthOutside1X128","type":"uint256","internalType":"uint256"},{"name":"rewardGrowthOutsideX128","type":"uint256","internalType":"uint256"},{"name":"tickCumulativeOutside","type":"int56","internalType":"int56"},{"name":"secondsPerLiquidityOutsideX128","type":"uint160","internalType":"uint160"},{"name":"secondsOutside","type":"uint32","internalType":"uint32"},{"name":"initialized","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"token0","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"token1","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"unstakedFee","type":"function","inputs":[],"outputs":[{"name":"","type":"uint24","internalType":"uint24"}],"stateMutability":"view"}],"metadata":"{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"indexed\":true,\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"amount\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount0\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount1\",\"type\":\"uint256\"}],\"name\":\"Burn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"indexed\":true,\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"amount0\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"amount1\",\"type\":\"uint128\"}],\"name\":\"Collect\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"amount0\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"amount1\",\"type\":\"uint128\"}],\"name\":\"CollectFees\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount0\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount1\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"paid0\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"paid1\",\"type\":\"uint256\"}],\"name\":\"Flash\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"observationCardinalityNextOld\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"observationCardinalityNextNew\",\"type\":\"uint16\"}],\"name\":\"IncreaseObservationCardinalityNext\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint160\",\"name\":\"sqrtPriceX96\",\"type\":\"uint160\"},{\"indexed\":false,\"internalType\":\"int24\",\"name\":\"tick\",\"type\":\"int24\"}],\"name\":\"Initialize\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"indexed\":true,\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"amount\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount0\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount1\",\"type\":\"uint256\"}],\"name\":\"Mint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"feeProtocol0Old\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"feeProtocol1Old\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"feeProtocol0New\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"feeProtocol1New\",\"type\":\"uint8\"}],\"name\":\"SetFeeProtocol\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"amount0\",\"type\":\"int256\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"amount1\",\"type\":\"int256\"},{\"indexed\":false,\"internalType\":\"uint160\",\"name\":\"sqrtPriceX96\",\"type\":\"uint160\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"liquidity\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"int24\",\"name\":\"tick\",\"type\":\"int24\"}],\"name\":\"Swap\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"POOL_TYPE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SWAP_FEE_CEIL\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"zeroForOne\",\"type\":\"bool\"},{\"internalType\":\"int256\",\"name\":\"amountSpecified\",\"type\":\"int256\"},{\"internalType\":\"uint160\",\"name\":\"sqrtPriceLimitX96\",\"type\":\"uint160\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint160\",\"name\":\"sqrtPriceX96\",\"type\":\"uint160\"},{\"internalType\":\"int24\",\"name\":\"tick\",\"type\":\"int24\"}],\"internalType\":\"struct ISwapHook.SwapParams\",\"name\":\"_swapParams\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"int256\",\"name\":\"amountSpecifiedRemaining\",\"type\":\"int256\"},{\"internalType\":\"int256\",\"name\":\"amountCalculated\",\"type\":\"int256\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"bool\",\"name\":\"hasUpdatedFees\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"feeGrowthGlobalX128\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"gaugeFee\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"liquidity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"stakedLiquidity\",\"type\":\"uint128\"},{\"internalType\":\"int56\",\"name\":\"tickCumulative\",\"type\":\"int56\"},{\"internalType\":\"uint160\",\"name\":\"secondsPerLiquidityCumulativeX128\",\"type\":\"uint160\"},{\"internalType\":\"bool\",\"name\":\"computedLatestObservation\",\"type\":\"bool\"}],\"internalType\":\"struct ISwapHook.AfterSwapParams\",\"name\":\"_afterSwapParams\",\"type\":\"tuple\"}],\"name\":\"afterSwapFee\",\"outputs\":[{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"zeroForOne\",\"type\":\"bool\"},{\"internalType\":\"int256\",\"name\":\"amountSpecified\",\"type\":\"int256\"},{\"internalType\":\"uint160\",\"name\":\"sqrtPriceLimitX96\",\"type\":\"uint160\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint160\",\"name\":\"sqrtPriceX96\",\"type\":\"uint160\"},{\"internalType\":\"int24\",\"name\":\"tick\",\"type\":\"int24\"}],\"internalType\":\"struct ISwapHook.SwapParams\",\"name\":\"_swapParams\",\"type\":\"tuple\"}],\"name\":\"beforeSwapFee\",\"outputs\":[{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"},{\"internalType\":\"uint128\",\"name\":\"amount\",\"type\":\"uint128\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"burn\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount0\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount1\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"},{\"internalType\":\"uint128\",\"name\":\"amount\",\"type\":\"uint128\"}],\"name\":\"burn\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount0\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount1\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"},{\"internalType\":\"uint128\",\"name\":\"amount0Requested\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"amount1Requested\",\"type\":\"uint128\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"collect\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"amount0\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"amount1\",\"type\":\"uint128\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"},{\"internalType\":\"uint128\",\"name\":\"amount0Requested\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"amount1Requested\",\"type\":\"uint128\"}],\"name\":\"collect\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"amount0\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"amount1\",\"type\":\"uint128\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"collectFees\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"amount0\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"amount1\",\"type\":\"uint128\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"factory\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"factoryRegistry\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fee\",\"outputs\":[{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feeGrowthGlobal0X128\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feeGrowthGlobal1X128\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount0\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount1\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"flash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount0\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount1\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"struct ISwapHook.FlashParams\",\"name\":\"_flashParams\",\"type\":\"tuple\"}],\"name\":\"flashFee\",\"outputs\":[{\"internalType\":\"uint24\",\"name\":\"_fee\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gauge\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gaugeFees\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"token0\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"token1\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"}],\"name\":\"getFeeGrowthInside\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"feeGrowthInside0X128\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"feeGrowthInside1X128\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"},{\"internalType\":\"uint256\",\"name\":\"_rewardGrowthGlobalX128\",\"type\":\"uint256\"}],\"name\":\"getRewardGrowthInside\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"rewardGrowthInside\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSecondsPerStakedLiquidityCumulativeX128\",\"outputs\":[{\"internalType\":\"uint160\",\"name\":\"_cumulative\",\"type\":\"uint160\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"observationCardinalityNext\",\"type\":\"uint16\"}],\"name\":\"increaseObservationCardinalityNext\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_factory\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_token0\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_token1\",\"type\":\"address\"},{\"internalType\":\"int24\",\"name\":\"_tickSpacing\",\"type\":\"int24\"},{\"internalType\":\"address\",\"name\":\"_factoryRegistry\",\"type\":\"address\"},{\"internalType\":\"uint160\",\"name\":\"_sqrtPriceX96\",\"type\":\"uint160\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastUpdated\",\"outputs\":[{\"internalType\":\"uint48\",\"name\":\"\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"liquidity\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxLiquidityPerTick\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"},{\"internalType\":\"uint128\",\"name\":\"amount\",\"type\":\"uint128\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"mint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount0\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount1\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nft\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"observations\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"blockTimestamp\",\"type\":\"uint32\"},{\"internalType\":\"int56\",\"name\":\"tickCumulative\",\"type\":\"int56\"},{\"internalType\":\"uint160\",\"name\":\"secondsPerLiquidityCumulativeX128\",\"type\":\"uint160\"},{\"internalType\":\"bool\",\"name\":\"initialized\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32[]\",\"name\":\"secondsAgos\",\"type\":\"uint32[]\"}],\"name\":\"observe\",\"outputs\":[{\"internalType\":\"int56[]\",\"name\":\"tickCumulatives\",\"type\":\"int56[]\"},{\"internalType\":\"uint160[]\",\"name\":\"secondsPerLiquidityCumulativeX128s\",\"type\":\"uint160[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"positions\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"liquidity\",\"type\":\"uint128\"},{\"internalType\":\"uint256\",\"name\":\"feeGrowthInside0LastX128\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"feeGrowthInside1LastX128\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"tokensOwed0\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"tokensOwed1\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardGrowthGlobalX128\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rollover\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"secondsPerStakedLiquidityCumulativeX128\",\"outputs\":[{\"internalType\":\"uint160\",\"name\":\"\",\"type\":\"uint160\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_gauge\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_nft\",\"type\":\"address\"}],\"name\":\"setGaugeAndPositionManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"settleToBlock\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_rollover\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"slot0\",\"outputs\":[{\"internalType\":\"uint160\",\"name\":\"sqrtPriceX96\",\"type\":\"uint160\"},{\"internalType\":\"int24\",\"name\":\"tick\",\"type\":\"int24\"},{\"internalType\":\"uint16\",\"name\":\"observationIndex\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"observationCardinality\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"observationCardinalityNext\",\"type\":\"uint16\"},{\"internalType\":\"bool\",\"name\":\"unlocked\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"}],\"name\":\"snapshotCumulativesInside\",\"outputs\":[{\"internalType\":\"int56\",\"name\":\"tickCumulativeInside\",\"type\":\"int56\"},{\"internalType\":\"uint160\",\"name\":\"secondsPerLiquidityInsideX128\",\"type\":\"uint160\"},{\"internalType\":\"uint32\",\"name\":\"secondsInside\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int128\",\"name\":\"stakedLiquidityDelta\",\"type\":\"int128\"},{\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"}],\"name\":\"stake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stakedLiquidity\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"zeroForOne\",\"type\":\"bool\"},{\"internalType\":\"int256\",\"name\":\"amountSpecified\",\"type\":\"int256\"},{\"internalType\":\"uint160\",\"name\":\"sqrtPriceLimitX96\",\"type\":\"uint160\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"swap\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"amount0\",\"type\":\"int256\"},{\"internalType\":\"int256\",\"name\":\"amount1\",\"type\":\"int256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int16\",\"name\":\"\",\"type\":\"int16\"}],\"name\":\"tickBitmap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tickSpacing\",\"outputs\":[{\"internalType\":\"int24\",\"name\":\"\",\"type\":\"int24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"int24\",\"name\":\"\",\"type\":\"int24\"}],\"name\":\"ticks\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"liquidityGross\",\"type\":\"uint128\"},{\"internalType\":\"int128\",\"name\":\"liquidityNet\",\"type\":\"int128\"},{\"internalType\":\"int128\",\"name\":\"stakedLiquidityNet\",\"type\":\"int128\"},{\"internalType\":\"uint256\",\"name\":\"feeGrowthOutside0X128\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"feeGrowthOutside1X128\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rewardGrowthOutsideX128\",\"type\":\"uint256\"},{\"internalType\":\"int56\",\"name\":\"tickCumulativeOutside\",\"type\":\"int56\"},{\"internalType\":\"uint160\",\"name\":\"secondsPerLiquidityOutsideX128\",\"type\":\"uint160\"},{\"internalType\":\"uint32\",\"name\":\"secondsOutside\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"initialized\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token0\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"token1\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unstakedFee\",\"outputs\":[{\"internalType\":\"uint24\",\"name\":\"\",\"type\":\"uint24\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"afterSwapFee((address,address,bool,int256,uint160,bytes,uint160,int24),(int256,int256,uint24,bool,uint256,uint128,uint128,uint128,int56,uint160,bool))\":{\"params\":{\"_afterSwapParams\":\"Post-swap execution state and oracle/liquidity context.\",\"_swapParams\":\"Swap context and post-swap pool state.\"},\"returns\":{\"_0\":\"The post-swap fee.\"}},\"beforeSwapFee((address,address,bool,int256,uint160,bytes,uint160,int24))\":{\"params\":{\"_swapParams\":\"Swap context and pre-swap pool state.\"},\"returns\":{\"_0\":\"The pre-swap fee.\"}},\"burn(int24,int24,uint128)\":{\"details\":\"Can be used to trigger a recalculation of fees owed to a position by calling with an amount of 0Fees must be collected separately via a call to #collect\",\"params\":{\"amount\":\"How much liquidity to burn\",\"tickLower\":\"The lower tick of the position for which to burn liquidity\",\"tickUpper\":\"The upper tick of the position for which to burn liquidity\"},\"returns\":{\"amount0\":\"The amount of token0 sent to the recipient\",\"amount1\":\"The amount of token1 sent to the recipient\"}},\"burn(int24,int24,uint128,address)\":{\"details\":\"Can be used to trigger a recalculation of fees owed to a position by calling with an amount of 0Fees must be collected separately via a call to #collect\",\"params\":{\"amount\":\"How much liquidity to burn\",\"owner\":\"Owner of the position in the pool (nft manager or gauge)\",\"tickLower\":\"The lower tick of the position for which to burn liquidity\",\"tickUpper\":\"The upper tick of the position for which to burn liquidity\"},\"returns\":{\"amount0\":\"The amount of token0 sent to the recipient\",\"amount1\":\"The amount of token1 sent to the recipient\"}},\"collect(address,int24,int24,uint128,uint128)\":{\"details\":\"Does not recompute fees earned, which must be done either via mint or burn of any amount of liquidity. Collect must be called by the position owner. To withdraw only token0 or only token1, amount0Requested or amount1Requested may be set to zero. To withdraw all tokens owed, caller may pass any value greater than the actual tokens owed, e.g. type(uint128).max. Tokens owed may be from accumulated swap fees or burned liquidity.\",\"params\":{\"amount0Requested\":\"How much token0 should be withdrawn from the fees owed\",\"amount1Requested\":\"How much token1 should be withdrawn from the fees owed\",\"recipient\":\"The address which should receive the fees collected\",\"tickLower\":\"The lower tick of the position for which to collect fees\",\"tickUpper\":\"The upper tick of the position for which to collect fees\"},\"returns\":{\"amount0\":\"The amount of fees collected in token0\",\"amount1\":\"The amount of fees collected in token1\"}},\"collect(address,int24,int24,uint128,uint128,address)\":{\"details\":\"Does not recompute fees earned, which must be done either via mint or burn of any amount of liquidity. Collect must be called by the position owner. To withdraw only token0 or only token1, amount0Requested or amount1Requested may be set to zero. To withdraw all tokens owed, caller may pass any value greater than the actual tokens owed, e.g. type(uint128).max. Tokens owed may be from accumulated swap fees or burned liquidity.\",\"params\":{\"amount0Requested\":\"How much token0 should be withdrawn from the fees owed\",\"amount1Requested\":\"How much token1 should be withdrawn from the fees owed\",\"owner\":\"Owner of the position in the pool (nft manager or gauge)\",\"recipient\":\"The address which should receive the fees collected\",\"tickLower\":\"The lower tick of the position for which to collect fees\",\"tickUpper\":\"The upper tick of the position for which to collect fees\"},\"returns\":{\"amount0\":\"The amount of fees collected in token0\",\"amount1\":\"The amount of fees collected in token1\"}},\"collectFees(address)\":{\"params\":{\"recipient\":\"The address that receives the claimed gauge fees\"},\"returns\":{\"amount0\":\"The gauge fee collected in token0\",\"amount1\":\"The gauge fee collected in token1\"}},\"fee()\":{\"details\":\"This method can be used for \\\"legacy\\\" swap fee modules.\",\"returns\":{\"_0\":\"The swap fee.\"}},\"flash(address,uint256,uint256,bytes)\":{\"details\":\"The caller of this method receives a callback in the form of ICLFlashCallback#uniswapV3FlashCallbackCan be used to donate underlying tokens pro-rata to currently in-range liquidity providers by calling with 0 amount{0,1} and sending the donation amount(s) from the callback\",\"params\":{\"amount0\":\"The amount of token0 to send\",\"amount1\":\"The amount of token1 to send\",\"data\":\"Any data to be passed through to the callback\",\"recipient\":\"The address which will receive the token0 and token1 amounts\"}},\"flashFee((address,address,uint256,uint256,bytes))\":{\"params\":{\"_flashParams\":\"Arguments passed to the flash function.\"},\"returns\":{\"_fee\":\"The flash fee.\"}},\"getFeeGrowthInside(int24,int24)\":{\"params\":{\"tickLower\":\"The lower tick of the range\",\"tickUpper\":\"The upper tick of the range\"},\"returns\":{\"feeGrowthInside0X128\":\"The token0 fee growth in range.\",\"feeGrowthInside1X128\":\"The token1 fee growth in range.\"}},\"getRewardGrowthInside(int24,int24,uint256)\":{\"details\":\"Used in gauge reward/earned calculations\",\"params\":{\"_rewardGrowthGlobalX128\":\"a calculated rewardGrowthGlobalX128 or 0 (in case of 0 it means we use the rewardGrowthGlobalX128 from state)\",\"tickLower\":\"The lower tick of the range\",\"tickUpper\":\"The upper tick of the range\"},\"returns\":{\"rewardGrowthInside\":\"The reward growth in the range\"}},\"getSecondsPerStakedLiquidityCumulativeX128()\":{\"returns\":{\"_cumulative\":\"The Q128.128 seconds per staked liquidity cumulative as of the current block\"}},\"increaseObservationCardinalityNext(uint16)\":{\"details\":\"This method is no-op if the pool already has an observationCardinalityNext greater than or equal to the input observationCardinalityNext.\",\"params\":{\"observationCardinalityNext\":\"The desired minimum number of observations for the pool to store\"}},\"initialize(address,address,address,int24,address,uint160)\":{\"details\":\"Can be called once only Price is represented as a sqrt(amountToken1/amountToken0) Q64.96 valuenot locked because it initializes unlocked\",\"params\":{\"_factory\":\"The CL factory contract address\",\"_factoryRegistry\":\"The address of the factory registry managing the pool factory\",\"_sqrtPriceX96\":\"The initial sqrt price of the pool, as a Q64.96\",\"_tickSpacing\":\"The pool tick spacing\",\"_token0\":\"The first token of the pool by address sort order\",\"_token1\":\"The second token of the pool by address sort order\"}},\"mint(address,int24,int24,uint128,bytes)\":{\"details\":\"The caller of this method receives a callback in the form of ICLMintCallback#uniswapV3MintCallback in which they must pay any token0 or token1 owed for the liquidity. The amount of token0/token1 due depends on tickLower, tickUpper, the amount of liquidity, and the current price.\",\"params\":{\"amount\":\"The amount of liquidity to mint\",\"data\":\"Any data that should be passed through to the callback\",\"recipient\":\"The address for which the liquidity will be created\",\"tickLower\":\"The lower tick of the position in which to add liquidity\",\"tickUpper\":\"The upper tick of the position in which to add liquidity\"},\"returns\":{\"amount0\":\"The amount of token0 that was paid to mint the given amount of liquidity. Matches the value in the callback\",\"amount1\":\"The amount of token1 that was paid to mint the given amount of liquidity. Matches the value in the callback\"}},\"observe(uint32[])\":{\"details\":\"To get a time weighted average tick or liquidity-in-range, you must call this with two values, one representing the beginning of the period and another for the end of the period. E.g., to get the last hour time-weighted average tick, you must call it with secondsAgos = [3600, 0].The time weighted average tick represents the geometric time weighted average price of the pool, in log base sqrt(1.0001) of token1 / token0. The TickMath library can be used to go from a tick value to a ratio.\",\"params\":{\"secondsAgos\":\"From how long ago each cumulative tick and liquidity value should be returned\"},\"returns\":{\"secondsPerLiquidityCumulativeX128s\":\"Cumulative seconds per liquidity-in-range value as of each `secondsAgos` from the current block timestamp\",\"tickCumulatives\":\"Cumulative tick values as of each `secondsAgos` from the current block timestamp\"}},\"setGaugeAndPositionManager(address,address)\":{\"details\":\"Callable only once, by the gauge factory\",\"params\":{\"_gauge\":\"The gauge corresponding to this pool\",\"_nft\":\"The position manager used for position management\"}},\"settleToBlock()\":{\"details\":\"Only callable by the gauge. Pulls the emissions accrued since the last settlement through the gauge.\",\"returns\":{\"_rollover\":\"the emissions accumulated while no staked liquidity was in range. Reset to 0 after this call.\"}},\"snapshotCumulativesInside(int24,int24)\":{\"details\":\"Snapshots must only be compared to other snapshots, taken over a period for which a position existed. I.e., snapshots cannot be compared if a position is not held for the entire period between when the first snapshot is taken and the second snapshot is taken.\",\"params\":{\"tickLower\":\"The lower tick of the range\",\"tickUpper\":\"The upper tick of the range\"},\"returns\":{\"secondsInside\":\"The snapshot of seconds per liquidity for the range\",\"secondsPerLiquidityInsideX128\":\"The snapshot of seconds per liquidity for the range\",\"tickCumulativeInside\":\"The snapshot of the tick accumulator for the range\"}},\"stake(int128,int24,int24)\":{\"params\":{\"stakedLiquidityDelta\":\"The amount by which to increase or decrease the staked liquidity\",\"tickLower\":\"The lower tick of the position for which to stake liquidity\",\"tickUpper\":\"The upper tick of the position for which to stake liquidity\"}},\"swap(address,bool,int256,uint160,bytes)\":{\"details\":\"The caller of this method receives a callback in the form of ICLSwapCallback#uniswapV3SwapCallback\",\"params\":{\"amountSpecified\":\"The amount of the swap, which implicitly configures the swap as exact input (positive), or exact output (negative)\",\"data\":\"Any data to be passed through to the callback\",\"recipient\":\"The address to receive the output of the swap\",\"sqrtPriceLimitX96\":\"The Q64.96 sqrt price limit. If zero for one, the price cannot be less than this value after the swap. If one for zero, the price cannot be greater than this value after the swap\",\"zeroForOne\":\"The direction of the swap, true for token0 to token1, false for token1 to token0\"},\"returns\":{\"amount0\":\"The delta of the balance of token0 of the pool, exact when negative, minimum when positive\",\"amount1\":\"The delta of the balance of token1 of the pool, exact when negative, minimum when positive\"}},\"unstakedFee()\":{\"details\":\"Can be modified in PoolFactory on a pool basis or upgraded to be dynamic.\",\"returns\":{\"_0\":\"The unstaked fee\"}}},\"stateVariables\":{\"DENOMINATOR\":{\"return\":\"The denominator value in pips.\"},\"POOL_TYPE\":{\"return\":\"The pool type label to be able to identify the type of pool\"},\"SWAP_FEE_CEIL\":{\"return\":\"The swap fee ceiling value in pips.\"},\"factory\":{\"return\":\"The contract address\"},\"factoryRegistry\":{\"return\":\"The factory registry contract address\"},\"feeGrowthGlobal0X128\":{\"details\":\"This value can overflow the uint256\"},\"feeGrowthGlobal1X128\":{\"details\":\"This value can overflow the uint256\"},\"gauge\":{\"return\":\"The gauge contract address\"},\"gaugeFees\":{\"details\":\"Gauge fees will never exceed uint128 max in either token\"},\"liquidity\":{\"details\":\"This value has no relationship to the total liquidity across all ticksThis value includes staked liquidity\"},\"maxLiquidityPerTick\":{\"details\":\"This parameter is enforced per tick to prevent liquidity from overflowing a uint128 at any point, and also prevents out-of-range liquidity from being used to prevent adding in-range liquidity to a pool\",\"return\":\"The max amount of liquidity per tick\"},\"nft\":{\"return\":\"The nft manager contract address\"},\"observations\":{\"details\":\"You most likely want to use #observe() instead of this method to get an observation as of some amount of time ago, rather than at a specific index in the array.\",\"params\":{\"index\":\"The element of the observations array to fetch\"},\"return\":\"blockTimestamp The timestamp of the observation, Returns tickCumulative the tick multiplied by seconds elapsed for the life of the pool as of the observation timestamp, Returns secondsPerLiquidityCumulativeX128 the seconds per in range liquidity for the life of the pool as of the observation timestamp, Returns initialized whether the observation has been initialized and the values are safe to use\"},\"positions\":{\"params\":{\"key\":\"The position's key is a hash of a preimage composed by the owner, tickLower and tickUpper\"},\"return\":\"_liquidity The amount of liquidity in the position, Returns feeGrowthInside0LastX128 fee growth of token0 inside the tick range as of the last mint/burn/poke, Returns feeGrowthInside1LastX128 fee growth of token1 inside the tick range as of the last mint/burn/poke, Returns tokensOwed0 the computed amount of token0 owed to the position as of the last mint/burn/poke, Returns tokensOwed1 the computed amount of token1 owed to the position as of the last mint/burn/poke\"},\"rewardGrowthGlobalX128\":{\"details\":\"This value can overflow the uint256\"},\"secondsPerStakedLiquidityCumulativeX128\":{\"return\":\"The Q128.128 stored seconds per staked liquidity cumulative\"},\"slot0\":{\"return\":\"sqrtPriceX96 The current price of the pool as a sqrt(token1/token0) Q64.96 value tick The current tick of the pool, i.e. according to the last tick transition that was run. This value may not always be equal to SqrtTickMath.getTickAtSqrtRatio(sqrtPriceX96) if the price is on a tick boundary. observationIndex The index of the last oracle observation that was written, observationCardinality The current maximum number of observations stored in the pool, observationCardinalityNext The next maximum number of observations, to be updated when the observation. unlocked Whether the pool is currently locked to reentrancy\"},\"stakedLiquidity\":{\"details\":\"This value has no relationship to the total staked liquidity across all ticks\"},\"tickSpacing\":{\"details\":\"Ticks can only be used at multiples of this value, minimum of 1 and always positive e.g.: a tickSpacing of 3 means ticks can be initialized every 3rd tick, i.e., ..., -6, -3, 0, 3, 6, ... This value is an int24 to avoid casting even though it is always positive.\",\"return\":\"The tick spacing\"},\"ticks\":{\"params\":{\"tick\":\"The tick to look up\"},\"return\":\"liquidityGross the total amount of position liquidity that uses the pool either as tick lower or tick upper, liquidityNet how much liquidity changes when the pool price crosses the tick, stakedLiquidityNet how much staked liquidity changes when the pool price crosses the tick, feeGrowthOutside0X128 the fee growth on the other side of the tick from the current tick in token0, feeGrowthOutside1X128 the fee growth on the other side of the tick from the current tick in token1, rewardGrowthOutsideX128 the reward growth on the other side of the tick from the current tick in emission token tickCumulativeOutside the cumulative tick value on the other side of the tick from the current tick secondsPerLiquidityOutsideX128 the seconds spent per liquidity on the other side of the tick from the current tick, secondsOutside the seconds spent on the other side of the tick from the current tick, initialized Set to true if the tick is initialized, i.e. liquidityGross is greater than 0, otherwise equal to false. Outside values can only be used if the tick is initialized, i.e. if liquidityGross is greater than 0. In addition, these values are only relative and must be used only in comparison to previous snapshots for a specific position.\"},\"token0\":{\"return\":\"The token contract address\"},\"token1\":{\"return\":\"The token contract address\"}},\"version\":1},\"userdoc\":{\"events\":{\"Burn(address,int24,int24,uint128,uint256,uint256)\":{\"notice\":\"Emitted when a position's liquidity is removed\"},\"Collect(address,address,int24,int24,uint128,uint128)\":{\"notice\":\"Emitted when fees are collected by the owner of a position\"},\"CollectFees(address,uint128,uint128)\":{\"notice\":\"Emitted when the collected protocol fees are withdrawn by the gauge\"},\"Flash(address,address,uint256,uint256,uint256,uint256)\":{\"notice\":\"Emitted by the pool for any flashes of token0/token1\"},\"IncreaseObservationCardinalityNext(uint16,uint16)\":{\"notice\":\"Emitted by the pool for increases to the number of observations that can be stored\"},\"Initialize(uint160,int24)\":{\"notice\":\"Emitted exactly once by a pool when #initialize is first called on the pool\"},\"Mint(address,address,int24,int24,uint128,uint256,uint256)\":{\"notice\":\"Emitted when liquidity is minted for a given position\"},\"SetFeeProtocol(uint8,uint8,uint8,uint8)\":{\"notice\":\"Emitted when the protocol fee is changed by the pool\"},\"Swap(address,address,int256,int256,uint160,uint128,int24)\":{\"notice\":\"Emitted by the pool for any swaps between token0 and token1\"}},\"kind\":\"user\",\"methods\":{\"DENOMINATOR()\":{\"notice\":\"The denominator used for fees computation.\"},\"POOL_TYPE()\":{\"notice\":\"The pool type identifier\"},\"SWAP_FEE_CEIL()\":{\"notice\":\"The ceiling applied to the before/after swap fee.\"},\"afterSwapFee((address,address,bool,int256,uint160,bytes,uint160,int24),(int256,int256,uint24,bool,uint256,uint128,uint128,uint128,int56,uint160,bool))\":{\"notice\":\"The pool's post-swap swap fee in pips, i.e. 1e-6\"},\"beforeSwapFee((address,address,bool,int256,uint160,bytes,uint160,int24))\":{\"notice\":\"The pool's pre-swap swap fee in pips, i.e. 1e-6\"},\"burn(int24,int24,uint128)\":{\"notice\":\"Burn liquidity from the sender and account tokens owed for the liquidity to the position\"},\"burn(int24,int24,uint128,address)\":{\"notice\":\"Burn liquidity from the supplied owner and account tokens owed for the liquidity to the position\"},\"collect(address,int24,int24,uint128,uint128)\":{\"notice\":\"Collects tokens owed to a position\"},\"collect(address,int24,int24,uint128,uint128,address)\":{\"notice\":\"Collects tokens owed to a position\"},\"collectFees(address)\":{\"notice\":\"Collect the gauge fee accrued to the pool\"},\"factory()\":{\"notice\":\"The contract that deployed the pool, which must adhere to the ICLFactory interface\"},\"factoryRegistry()\":{\"notice\":\"The factory registry that manages pool <> gauge <> reward factory relationships\"},\"fee()\":{\"notice\":\"The pool's swap fee in pips, i.e. 1e-6\"},\"feeGrowthGlobal0X128()\":{\"notice\":\"The fee growth as a Q128.128 fees of token0 collected per unit of liquidity for the entire life of the pool\"},\"feeGrowthGlobal1X128()\":{\"notice\":\"The fee growth as a Q128.128 fees of token1 collected per unit of liquidity for the entire life of the pool\"},\"flash(address,uint256,uint256,bytes)\":{\"notice\":\"Receive token0 and/or token1 and pay it back, plus a fee, in the callback\"},\"flashFee((address,address,uint256,uint256,bytes))\":{\"notice\":\"The pool's flash fee in pips, i.e. 1e-6\"},\"gauge()\":{\"notice\":\"The gauge corresponding to this pool\"},\"gaugeFees()\":{\"notice\":\"The amounts of token0 and token1 that are owed to the gauge\"},\"getFeeGrowthInside(int24,int24)\":{\"notice\":\"Returns data about fee growth within a tick range.\"},\"getRewardGrowthInside(int24,int24,uint256)\":{\"notice\":\"Returns data about reward growth within a tick range. RewardGrowthGlobalX128 can be supplied as a parameter for claimable reward calculations.\"},\"getSecondsPerStakedLiquidityCumulativeX128()\":{\"notice\":\"The seconds per staked liquidity cumulative projected to the current block timestamp\"},\"increaseObservationCardinalityNext(uint16)\":{\"notice\":\"Increase the maximum number of price and liquidity observations that this pool will store\"},\"initialize(address,address,address,int24,address,uint160)\":{\"notice\":\"Initialize function used in proxy deployment\"},\"lastUpdated()\":{\"notice\":\"Last time the pool reward growth was advanced\"},\"liquidity()\":{\"notice\":\"The currently in range liquidity available to the pool\"},\"maxLiquidityPerTick()\":{\"notice\":\"The maximum amount of position liquidity that can use any tick in the range\"},\"mint(address,int24,int24,uint128,bytes)\":{\"notice\":\"Adds liquidity for the given recipient/tickLower/tickUpper position\"},\"nft()\":{\"notice\":\"The nft manager\"},\"observations(uint256)\":{\"notice\":\"Returns data about a specific observation index\"},\"observe(uint32[])\":{\"notice\":\"Returns the cumulative tick and liquidity as of each timestamp `secondsAgo` from the current block timestamp\"},\"positions(bytes32)\":{\"notice\":\"Returns the information about a position by the position's key\"},\"rewardGrowthGlobalX128()\":{\"notice\":\"The reward growth as a Q128.128 rewards of emission collected per unit of liquidity for the entire life of the pool\"},\"rollover()\":{\"notice\":\"Emissions accrued while no staked liquidity was in range\"},\"secondsPerStakedLiquidityCumulativeX128()\":{\"notice\":\"The cumulative seconds per unit of in-range staked liquidity as of lastUpdated\"},\"setGaugeAndPositionManager(address,address)\":{\"notice\":\"Initialize gauge and nft manager\"},\"settleToBlock()\":{\"notice\":\"Settles the pool's reward growth to the current block timestamp and returns the accrued rollover\"},\"slot0()\":{\"notice\":\"The 0th storage slot in the pool stores many values, and is exposed as a single method to save gas when accessed externally.\"},\"snapshotCumulativesInside(int24,int24)\":{\"notice\":\"Returns a snapshot of the tick cumulative, seconds per liquidity and seconds inside a tick range\"},\"stake(int128,int24,int24)\":{\"notice\":\"Convert existing liquidity into staked liquidityOnly callable by the gauge associated with this pool\"},\"stakedLiquidity()\":{\"notice\":\"The currently in range staked liquidity available to the pool\"},\"swap(address,bool,int256,uint160,bytes)\":{\"notice\":\"Swap token0 for token1, or token1 for token0\"},\"tickBitmap(int16)\":{\"notice\":\"Returns 256 packed tick initialized boolean values. See TickBitmap for more information\"},\"tickSpacing()\":{\"notice\":\"The pool tick spacing\"},\"ticks(int24)\":{\"notice\":\"Look up information about a specific tick in the pool\"},\"token0()\":{\"notice\":\"The first of the two tokens of the pool, sorted by address\"},\"token1()\":{\"notice\":\"The second of the two tokens of the pool, sorted by address\"},\"unstakedFee()\":{\"notice\":\"The pool's unstaked fee in pips, i.e. 1e-6\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/core/CLPool.sol\":\"CLPool\"},\"evmVersion\":\"istanbul\",\"libraries\":{\"contracts/core/CLPool.sol:CLPoolNonSwapPath\":\"0x1ad7a8703ebff81c0d753190938f228672ec7e42\"},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\"/Users/acx/code/dromos/metadex-slipstream/node_modules/@hyperlane-xyz/:@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable-v4/\",\"/Users/acx/code/dromos/metadex-slipstream/node_modules/@hyperlane-xyz/:@openzeppelin/contracts/=node_modules/@openzeppelin/contracts-v4/\",\"/Users/acx/code/dromos/metadex-slipstream/node_modules/metadex/:@hyperlane/contracts/=node_modules/@hyperlane-xyz/core/contracts/\",\"/Users/acx/code/dromos/metadex-slipstream/node_modules/metadex/:@nomad-xyz/src/=node_modules/metadex/node_modules/@nomad-xyz/excessively-safe-call/src/\",\"/Users/acx/code/dromos/metadex-slipstream/node_modules/metadex/:@openzeppelin/contracts/=node_modules/metadex/node_modules/@openzeppelin/contracts/\",\"/Users/acx/code/dromos/metadex-slipstream/node_modules/metadex/:@solady/=node_modules/solady/src/\",\"/Users/acx/code/dromos/metadex-slipstream/test/invariants/fuzz/:@openzeppelin/contracts/=node_modules/metadex/node_modules/@openzeppelin/contracts/\",\":@hyperlane-v11/contracts/=node_modules/@hyperlane-xyz/core-v11/contracts/\",\":@hyperlane/contracts/=node_modules/@hyperlane-xyz/core/contracts/\",\":@nomad-xyz/excessively-safe-call/=node_modules/@nomad-xyz/excessively-safe-call/\",\":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/\",\":@solady/=node_modules/solady/src/\",\":@uniswap/lib/=node_modules/@uniswap/lib/\",\":V3-script/=node_modules/metadex/V3/script/\",\":V3-test/=node_modules/metadex/V3/test/\",\":V3/=node_modules/metadex/V3/src/\",\":base64-sol/=node_modules/base64-sol/\",\":forge-std/=node_modules/forge-std/src/\",\"node_modules/@hyperlane-xyz/:@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable-v4/\",\"node_modules/@hyperlane-xyz/:@openzeppelin/contracts/=node_modules/@openzeppelin/contracts-v4/\",\"node_modules/metadex/:@hyperlane/contracts/=node_modules/@hyperlane-xyz/core/contracts/\",\"node_modules/metadex/:@nomad-xyz/src/=node_modules/metadex/node_modules/@nomad-xyz/excessively-safe-call/src/\",\"node_modules/metadex/:@openzeppelin/contracts/=node_modules/metadex/node_modules/@openzeppelin/contracts/\",\"node_modules/metadex/:@solady/=node_modules/solady/src/\",\"test/invariants/fuzz/:@openzeppelin/contracts/=node_modules/metadex/node_modules/@openzeppelin/contracts/\"]},\"sources\":{\"contracts/core/CLPool.sol\":{\"keccak256\":\"0x21952d180e6b072173e06e54a21f832b0417b4cb26e6e63c19c2b7a16e716405\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://be7ccacefe6ea2da27b33c4f226ad10b737a874aba9dae6327714c78eac67610\",\"dweb:/ipfs/QmW7eszThYGkS3y9GZEkJvueVkNeAVcN9HDUWXPRVBMVkW\"]},\"contracts/core/interfaces/ICLFactory.sol\":{\"keccak256\":\"0x6b01a592afa921d9200147b2b48b8245ef0448a5857618157a10deb567773b95\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://39c0ce02aba69bfa68340c5da95369e25f8b9c7aae109687b6944f48bd0d92f5\",\"dweb:/ipfs/QmcKhrU7wsp2zp27yMr7sK4cejSZqE9a7mLn3WuS77o5Fg\"]},\"contracts/core/interfaces/ICLPool.sol\":{\"keccak256\":\"0x142a7b4607c241a8273cc4595f69194907ebe23b0776c0b35b8a32c1bb1085ae\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://16464b911c254cf1323a3a905d4dd70c4d927796980020363d9eea5eb53e09b5\",\"dweb:/ipfs/QmXhrbfamQYxw7iRuYWwp5Ha7VDD73ofjWdfr5Z96kBokg\"]},\"contracts/core/interfaces/IERC20Minimal.sol\":{\"keccak256\":\"0x00108fbf3411855a1b5e7f20a267bcf26884d61ed389ba4d0bcbb5dc2255dc7d\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://6b366c535920373b2f6fb3d8e78ceac0af42f6daa5a337d0c758074ed904a47b\",\"dweb:/ipfs/QmaFgAttscSGNy9e2acyoAB3azT1YCcouotu7uvZYMHuci\"]},\"contracts/core/interfaces/IFactoryRegistry.sol\":{\"keccak256\":\"0x2e421d5169239b98f359cf7d0a63d7211d1c89b6d1a1d08834af44a253d8a19b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d06bd38918b48ba8425568989020336def562bc525c4ece6bdabe41b6e33b71c\",\"dweb:/ipfs/QmcJkL2EVEMCbfK7g7Bo8Qpz58frKxeDeTvPFJPMAmCqJR\"]},\"contracts/core/interfaces/callback/ICLFlashCallback.sol\":{\"keccak256\":\"0x6c23a765e14f8b7bdf27c7c65768714e32a70ad71061a69870b034929af59712\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://556e520d0e08ea9965edf6936d89d41251968ae53f310668bf8f1918eb3e7a63\",\"dweb:/ipfs/QmefdyHuxQo2kj19YWWJyMPiMxGZaMS8tsvBQCei3SKyay\"]},\"contracts/core/interfaces/callback/ICLMintCallback.sol\":{\"keccak256\":\"0x5b7db3791cfdca4e550ea4c619564d62691983989d29f7a4a6b75d6d97ec8a1c\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://b578c7a7f228fa5fcb61a52461cbfed428ba9a8b55ad5f274f1c38f901caf8b1\",\"dweb:/ipfs/Qmf6vVwCq7CztbGWsoxf98zedTW5iHs5HuYFU3qctaR7zw\"]},\"contracts/core/interfaces/callback/ICLSwapCallback.sol\":{\"keccak256\":\"0x87ec24dc94b3bbaf641695a1bc03836be342776ffc04b6fe04791c5f53d7f093\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://06a58dcc2f54152868a7ce8d54c4dabee3cb6153b49e820fc4ded04bf22f1f10\",\"dweb:/ipfs/QmYKvLJLrWHVdsK9KHz364waBQXsrdvvzrv1RZ7GPZpJdY\"]},\"contracts/core/interfaces/hook/ISwapHook.sol\":{\"keccak256\":\"0xc74295f27ce01f19a09eb6f16f99eac4af519e2d0393a544e9f3b1a34520e8a3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b4825d93936c9381034a8ef2dde7af5d8b0045339398a994137e71d34eb0f04a\",\"dweb:/ipfs/QmUE3kxAt4eqaxvpAou9HohfLJJHAN9TDsQru5GcevP7mV\"]},\"contracts/core/interfaces/pool/ICLPoolActions.sol\":{\"keccak256\":\"0xdf23dde2b776abfdbd7cd1d4f4c41482e7f871c43b28cbefd926819b5ba526ac\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://6df58f44b34ed212b4867ade7ed2cc0568b708c211d4d358612eaf1fcfabe8ad\",\"dweb:/ipfs/QmTny5q14RVeCtKWHEzn61mH5ME3juKetSwWKzhjPVRsFv\"]},\"contracts/core/interfaces/pool/ICLPoolConstants.sol\":{\"keccak256\":\"0xd850ffa73045e1df8c292ea8573a5c3b71cf12fb79db37aadfb5002d118f3184\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://b8471603ee45b3c60d76b2b3d81e2beb889cbcb0012959de57c329ddde6b0a8f\",\"dweb:/ipfs/QmewP8DPRNhDFryaTQvY7HDMboJpr5b8JEafd9RAcWCUpi\"]},\"contracts/core/interfaces/pool/ICLPoolDerivedState.sol\":{\"keccak256\":\"0x31a97d3e2ac1cc70ed5ef57d9fd9054f112311e9459340860fe0d8d01d6d29c3\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://0d91ad8e6884f0de2bed81067ae8db881180d72b76e148587e97dafa676e3f76\",\"dweb:/ipfs/QmVXQERqhnRWGRmoV7z3iBFb5SbnHQiAr5X3nhwA4rY57X\"]},\"contracts/core/interfaces/pool/ICLPoolEvents.sol\":{\"keccak256\":\"0x51a30a3b2e298c62fa80a8679a1e50c3991babcea42bcab2d1e96e173b48fff7\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://522018342062fbef4fba4c64ec2ab97aa75d57f9fb9466c7dc06333271bbd2c9\",\"dweb:/ipfs/QmWQhgYhmawcpKuC6GHJeoSv7eUHYAAAMS7brr5PxMDGDD\"]},\"contracts/core/interfaces/pool/ICLPoolOwnerActions.sol\":{\"keccak256\":\"0xcd81b763e236fc198c42040990f7ce053638e8e5b74f94be89d90e31b2b8f4c1\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://4915b8e08201bede11c3776749890ccd135fc1760bd24fe4a98b689d32192320\",\"dweb:/ipfs/QmadoRNBUZyAFQysms1GT6gzm6Jk9vZuhjUGQEc49n5nZR\"]},\"contracts/core/interfaces/pool/ICLPoolState.sol\":{\"keccak256\":\"0x673671315af9174aa03f8c992a710deef960b6433b5cd5e981071f6240e14147\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://aeccf5e446164201ac9e991cd05c837ebe0ece98a63c46106d8675635ee273f0\",\"dweb:/ipfs/QmULkmq54XED1butftsUrrrF7dzgepvGtm43aDySTjNoT1\"]},\"contracts/core/libraries/BitMath.sol\":{\"keccak256\":\"0x04cb72e8761b2ed72457fbf5cad848654f0ff695e9d92e9132541acdbf95a3e6\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://289546abac263d328a617c8b8d89b7edea7c0c5e3d4f47ab70f1683edecc1655\",\"dweb:/ipfs/QmfRCemeVDNKtT2QU4ANzs5ZiW7met1ZoFthAS6hzEHx4T\"]},\"contracts/core/libraries/CLPoolNonSwapPath.sol\":{\"keccak256\":\"0x91239f1f6f96adbc3ee4ac8c0b226792f48ba2348dd02573b0f7bb38b30ae8b9\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://41ad55c3bd113808ecde1b5604ba2fe07b911ccbd15e66fc6d7fadff4247673c\",\"dweb:/ipfs/QmboT2SKrZpZLsf8piLpyprh46rPC23F4jB6YzruVseM6V\"]},\"contracts/core/libraries/FixedPoint128.sol\":{\"keccak256\":\"0xe9861d501114fbce92ac0648419ff864de0538a902e2439b0861dda25ba4dd72\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://1ca8c2928f2cecf5223c97ae2e6a32990aa43d430da00cd2964da080432678ba\",\"dweb:/ipfs/QmT1HKsnp4eHZVPKSmXQLGHyjQLXSA8qLv7V346CyF2uv7\"]},\"contracts/core/libraries/FixedPoint96.sol\":{\"keccak256\":\"0xed854d4a675a82b8288bfe99d096b459fecfdf96d844a5568389e21b6e7161e0\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://3d6ce8fe6be435a4b7e4245959dc2f93878435ba4a9ffa725014573bda34a117\",\"dweb:/ipfs/Qmay3HJKUbsC6GNFC3HGz69JpZzNuixgYGjH4VatVzwxRB\"]},\"contracts/core/libraries/FullMath.sol\":{\"keccak256\":\"0xbd25ef2d1a953c4edf6233772e736583d3c5a70575150e5b330ba15bc481170d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://101c3c3729b16cd493c47aa710056c5758444ce1d33e3110dfb88fdd6101cc67\",\"dweb:/ipfs/QmUpNgbBmrFqZABt5n88feCL8jmpbP7B4u6r6cXcTVbFhJ\"]},\"contracts/core/libraries/LiquidityMath.sol\":{\"keccak256\":\"0x0bfa12a450f79bf5867da99ebdec70fa716343bf5a4ee86df74029b67120361d\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://25cbb3b5a49afadfbdd173a0858ed5346a20d1007ce4df313ec0d0a1d8810f33\",\"dweb:/ipfs/QmYXyvK23dzf2HNCDjUU8Ch2QPQaJG5SdSFpciriVFu5Qm\"]},\"contracts/core/libraries/LowGasSafeMath.sol\":{\"keccak256\":\"0x847c3e470efae92dc75e28b7a4ac4e9b3fd58d570e8d57932870d2a05f6620d5\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://3c7d17dae5e25e7f645a1b001509827ff07468ed6ef1cf3ef87ef8cc9d0d90c9\",\"dweb:/ipfs/QmQwgMYPZZsB9Cu6ET7MGoGBmZMqJumFfSXAU2UXw5VkNX\"]},\"contracts/core/libraries/Oracle.sol\":{\"keccak256\":\"0x9f9fd24362ff09a31f0da08ea8649f2a7ad2f0eb9cccd7db931831e2d5e3f481\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://12820a34a4174fa3bc437e7349fb2a344ad0a3dc1aac9600bd5fcd10115f8972\",\"dweb:/ipfs/QmXB3NXCoyagoaSGzq1Yo6nYFRL66jSr6kHyEs6nQVo75a\"]},\"contracts/core/libraries/Position.sol\":{\"keccak256\":\"0x475bb30389f36945eca9fb80b539e23af9425105aa42c01f3d1714173e7016bd\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://640ca7bff6eae93a2d91d2d73758450f75280870e823fdd80c85ce6306d473d6\",\"dweb:/ipfs/QmZeyJ8YgY8UigD4DVVkKahWi1cZ7MHVWB1WK8jZnEu423\"]},\"contracts/core/libraries/SafeCast.sol\":{\"keccak256\":\"0x0a26ddda2349cc6f3dd7fa9fa2c015d3b2bac6aeaaee7b09800102d175b63969\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://d171f3a4cb585a6c406b9ba83cfb1b0874556fe4769961589ea7ba293c834b00\",\"dweb:/ipfs/QmVVECqgQgJTLBt1tHVwX9jpk6uTetAJpJ26i8TqDt2KxV\"]},\"contracts/core/libraries/SqrtPriceMath.sol\":{\"keccak256\":\"0xb8c4035f18a407dffa04c548bd1673aba3e291f245919168738ac7851c91b3f0\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://c19af61b971f5e8c3ea7ca8fb22ce0c4fd666321c392e84143a31e78c2b09c6c\",\"dweb:/ipfs/QmUqwBie1x569fWS13m63kZMra4gxAMZ3EXmE7M2gd89LV\"]},\"contracts/core/libraries/SwapMath.sol\":{\"keccak256\":\"0x7744e7ba8ff04df7e96c073873c15b44c805f4092690bf788dd8c77e4d8b3377\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://5dbe8c04ccedc67287b7f4dee544c7d70a065cb21fa9b4e3c1f3712efa16f930\",\"dweb:/ipfs/QmV4P3jHgA4gR1q9XdqZJLkhfjNfDpfYiz16gVS7yeu67T\"]},\"contracts/core/libraries/Tick.sol\":{\"keccak256\":\"0x2412036eecd028e96f7fff76a036483b7e5d8214c1dcf8d692f6c111a21bbc49\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://16e559bc5e4284e4d889c3f357f86f5bfeedc60dd6296de02ae833726e8b5bdb\",\"dweb:/ipfs/QmdEAWPpFWDhi1qCzCxQsSTeoWoCc1Vb8LCxi51hKyDTG8\"]},\"contracts/core/libraries/TickBitmap.sol\":{\"keccak256\":\"0x43558a4e7ab1996d74d607b0218e56ea30c3ce2da2286f3b92e68d777d6da8da\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://b40288735028577f8d32b3fe633d97eed9aa1c8679144c537e9e8209622eebda\",\"dweb:/ipfs/Qmb6aLQtRqJnXZzkKfTyBmcGwjrKM2yfNgHPtLHrBXWutB\"]},\"contracts/core/libraries/TickMath.sol\":{\"keccak256\":\"0x0ed939ab05e4119fee43b50d7736259844f7e2c8cc76ff898fb2219d147c9353\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://49b5287bf19e005c05c3f659df6af89b78503b45fba7d0dc270d52a167757c21\",\"dweb:/ipfs/QmXU5Uh8JZWW3D47aH8nYnSbZrE8Ud2JkJqqYFMEuyNMPT\"]},\"contracts/core/libraries/TransferHelper.sol\":{\"keccak256\":\"0xefca27b33aa4b5356e67ad3e7a9907527b507c5a95bc18bf8e1a2393c3ab2e09\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://bbbb873aabb20a9e039fc825fa93135ac90754068af6608bd9a542cd0a17fabe\",\"dweb:/ipfs/QmWQL5U3N9wZcXCpMgm7HZgk6w8McRTycPdxYCm6jNuokc\"]},\"contracts/core/libraries/UnsafeMath.sol\":{\"keccak256\":\"0x49299b9b0fa2eb3efca394ced75eff752eea35873651400d5ebb62bcff63599d\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://dd45ec0ae9bfa2ec416dcf9ca30caa39b3f6b4fa1c2ceb8ef6594bb85c1e9cad\",\"dweb:/ipfs/QmZSG5JSgZPaGNypbt9W1KbmWMicZRsU1fZM6YA7MG6Un4\"]},\"contracts/core/libraries/hook/SwapHookLib.sol\":{\"keccak256\":\"0xaf64fcb60d4db67048c1cfad33faa1534e0836b215bae2f059bb11793c9c718f\",\"license\":\"GPL-2.0-or-later\",\"urls\":[\"bzz-raw://87ccb10c095badc5a08cf41f7901fefc7266453e10c1238aee8acb867a2b4581\",\"dweb:/ipfs/QmRdrPwNUQDyEyYast3uKxGmqTCdTDcKLxZxzrutrkoahd\"]},\"contracts/gauge/interfaces/IAccessControl.sol\":{\"keccak256\":\"0x1acc7d3204768e4bb7ffb83cae6365eab247e391e2bf14970a1d5ce5bf3f0a31\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://273264c70046286f3f01579c67eaa7b518fdc435d6e287a9c6794e2894e03816\",\"dweb:/ipfs/QmZyCw9BC46SK7Vi2TxZmNrC9RNrYTqfHq5tj5NfQmbCpg\"]},\"contracts/gauge/interfaces/ICLGauge.sol\":{\"keccak256\":\"0x8270510758896dc6f215d1ffb423a48fc39a36c8ba3c3ea257ec4f213c7f7207\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2986b201b790ca8de028b8990e2b244ba9eb28601a9101f3d13ff1097cff18a0\",\"dweb:/ipfs/QmfRPhGorqjJRU3GFSfsnKYwwFELys5ehqx4kb6VaSwnve\"]},\"contracts/gauge/interfaces/ICLPool.sol\":{\"keccak256\":\"0xf18a0a917c5dcfcfc39af164d074acdccd13dc8239ebdc440a3945cee880ba10\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0c531fe5b14791332c90b18332772153770d72277e589077565d021cbbf36364\",\"dweb:/ipfs/QmQ8KnXvdMBGzakc96pXv5KdZA9MAbCssZ1hXVEdfKFKHq\"]},\"contracts/gauge/interfaces/IGauge.sol\":{\"keccak256\":\"0xa245be631b4cfd042d50644c869ce3e7be73f733ccc13b117c2906b49bb3f07d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://12c55ff36627ce63ff9fa1a8b7b453254542e3eabff79bc157fcc6657bd0662b\",\"dweb:/ipfs/QmahwvsEas3M4Y9pLNoCXrbrRjCgtpGyJLt2dcYLaNAUCs\"]},\"contracts/gauge/interfaces/ILeafVoter.sol\":{\"keccak256\":\"0x2847199f9328b17d1b0639a1bb9d4fa3c84ad7051bc7d6d4215503e9a3203e27\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7dc83fb2f6fcd1b3d0508fbb28531b2a72d4f086174517cc15548726c2d93977\",\"dweb:/ipfs/QmaZAtSxzLaNHeo4oEr9aMVtMG6Ch9ZWWrnGNrw8eJMch9\"]},\"contracts/gauge/interfaces/INonfungiblePositionManager.sol\":{\"keccak256\":\"0x3a2fca2f7e9a69d984fb5a4faa21659ce75e9d120d1c650d87c197d0e764d2e0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://77bf112d6209de3f3e86aa1bc621103b8171c4e6625a03672210460d0c37dbb1\",\"dweb:/ipfs/QmNU9EQhECApot9mpmFQtueGbYfA57GZPGrrPv7dk2dhwu\"]},\"node_modules/@openzeppelin/contracts/introspection/IERC165.sol\":{\"keccak256\":\"0xd2f30fad5b24c4120f96dbac83aacdb7993ee610a9092bc23c44463da292bf8d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e3d4e72409e392c7694b6405a0136cf073d8da016df33ef8f9ad195f724ebfea\",\"dweb:/ipfs/QmPGcddKq6CgsiKnxUUif2q76wRqP3dmdQ6bKuHCLmb8Wa\"]},\"node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0xb11597841d47f7a773bca63ca323c76f804cb5d944788de0327db5526319dc82\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://930d2da1934886a1098753be4173dd89c45ca0b306a1930accd37e00b1af4aaf\",\"dweb:/ipfs/QmVSXnvEV41d43k8cfpANHoTYMKgBDBL8iCbxkLfEtQZBe\"]}},\"version\":1}","userdoc":{"kind":"user","events":{"Initialize(uint160,int24)":{"notice":"Emitted exactly once by a pool when #initialize is first called on the pool"},"CollectFees(address,uint128,uint128)":{"notice":"Emitted when the collected protocol fees are withdrawn by the gauge"},"SetFeeProtocol(uint8,uint8,uint8,uint8)":{"notice":"Emitted when the protocol fee is changed by the pool"},"Burn(address,int24,int24,uint128,uint256,uint256)":{"notice":"Emitted when a position's liquidity is removed"},"IncreaseObservationCardinalityNext(uint16,uint16)":{"notice":"Emitted by the pool for increases to the number of observations that can be stored"},"Collect(address,address,int24,int24,uint128,uint128)":{"notice":"Emitted when fees are collected by the owner of a position"},"Flash(address,address,uint256,uint256,uint256,uint256)":{"notice":"Emitted by the pool for any flashes of token0/token1"},"Mint(address,address,int24,int24,uint128,uint256,uint256)":{"notice":"Emitted when liquidity is minted for a given position"},"Swap(address,address,int256,int256,uint160,uint128,int24)":{"notice":"Emitted by the pool for any swaps between token0 and token1"}},"methods":{"fee()":{"notice":"The pool's swap fee in pips, i.e. 1e-6"},"nft()":{"notice":"The nft manager"},"gauge()":{"notice":"The gauge corresponding to this pool"},"slot0()":{"notice":"The 0th storage slot in the pool stores many values, and is exposed as a single method to save gas when accessed externally."},"token0()":{"notice":"The first of the two tokens of the pool, sorted by address"},"token1()":{"notice":"The second of the two tokens of the pool, sorted by address"},"factory()":{"notice":"The contract that deployed the pool, which must adhere to the ICLFactory interface"},"rollover()":{"notice":"Emissions accrued while no staked liquidity was in range"},"POOL_TYPE()":{"notice":"The pool type identifier"},"gaugeFees()":{"notice":"The amounts of token0 and token1 that are owed to the gauge"},"liquidity()":{"notice":"The currently in range liquidity available to the pool"},"ticks(int24)":{"notice":"Look up information about a specific tick in the pool"},"DENOMINATOR()":{"notice":"The denominator used for fees computation."},"lastUpdated()":{"notice":"Last time the pool reward growth was advanced"},"tickSpacing()":{"notice":"The pool tick spacing"},"unstakedFee()":{"notice":"The pool's unstaked fee in pips, i.e. 1e-6"},"SWAP_FEE_CEIL()":{"notice":"The ceiling applied to the before/after swap fee."},"settleToBlock()":{"notice":"Settles the pool's reward growth to the current block timestamp and returns the accrued rollover"},"factoryRegistry()":{"notice":"The factory registry that manages pool <> gauge <> reward factory relationships"},"observe(uint32[])":{"notice":"Returns the cumulative tick and liquidity as of each timestamp `secondsAgo` from the current block timestamp"},"stakedLiquidity()":{"notice":"The currently in range staked liquidity available to the pool"},"tickBitmap(int16)":{"notice":"Returns 256 packed tick initialized boolean values. See TickBitmap for more information"},"positions(bytes32)":{"notice":"Returns the information about a position by the position's key"},"collectFees(address)":{"notice":"Collect the gauge fee accrued to the pool"},"maxLiquidityPerTick()":{"notice":"The maximum amount of position liquidity that can use any tick in the range"},"observations(uint256)":{"notice":"Returns data about a specific observation index"},"feeGrowthGlobal0X128()":{"notice":"The fee growth as a Q128.128 fees of token0 collected per unit of liquidity for the entire life of the pool"},"feeGrowthGlobal1X128()":{"notice":"The fee growth as a Q128.128 fees of token1 collected per unit of liquidity for the entire life of the pool"},"rewardGrowthGlobalX128()":{"notice":"The reward growth as a Q128.128 rewards of emission collected per unit of liquidity for the entire life of the pool"},"burn(int24,int24,uint128)":{"notice":"Burn liquidity from the sender and account tokens owed for the liquidity to the position"},"stake(int128,int24,int24)":{"notice":"Convert existing liquidity into staked liquidityOnly callable by the gauge associated with this pool"},"getFeeGrowthInside(int24,int24)":{"notice":"Returns data about fee growth within a tick range."},"burn(int24,int24,uint128,address)":{"notice":"Burn liquidity from the supplied owner and account tokens owed for the liquidity to the position"},"flash(address,uint256,uint256,bytes)":{"notice":"Receive token0 and/or token1 and pay it back, plus a fee, in the callback"},"snapshotCumulativesInside(int24,int24)":{"notice":"Returns a snapshot of the tick cumulative, seconds per liquidity and seconds inside a tick range"},"mint(address,int24,int24,uint128,bytes)":{"notice":"Adds liquidity for the given recipient/tickLower/tickUpper position"},"swap(address,bool,int256,uint160,bytes)":{"notice":"Swap token0 for token1, or token1 for token0"},"secondsPerStakedLiquidityCumulativeX128()":{"notice":"The cumulative seconds per unit of in-range staked liquidity as of lastUpdated"},"getRewardGrowthInside(int24,int24,uint256)":{"notice":"Returns data about reward growth within a tick range. RewardGrowthGlobalX128 can be supplied as a parameter for claimable reward calculations."},"increaseObservationCardinalityNext(uint16)":{"notice":"Increase the maximum number of price and liquidity observations that this pool will store"},"setGaugeAndPositionManager(address,address)":{"notice":"Initialize gauge and nft manager"},"collect(address,int24,int24,uint128,uint128)":{"notice":"Collects tokens owed to a position"},"getSecondsPerStakedLiquidityCumulativeX128()":{"notice":"The seconds per staked liquidity cumulative projected to the current block timestamp"},"flashFee((address,address,uint256,uint256,bytes))":{"notice":"The pool's flash fee in pips, i.e. 1e-6"},"collect(address,int24,int24,uint128,uint128,address)":{"notice":"Collects tokens owed to a position"},"initialize(address,address,address,int24,address,uint160)":{"notice":"Initialize function used in proxy deployment"},"beforeSwapFee((address,address,bool,int256,uint160,bytes,uint160,int24))":{"notice":"The pool's pre-swap swap fee in pips, i.e. 1e-6"},"afterSwapFee((address,address,bool,int256,uint160,bytes,uint160,int24),(int256,int256,uint24,bool,uint256,uint128,uint128,uint128,int56,uint160,bool))":{"notice":"The pool's post-swap swap fee in pips, i.e. 1e-6"}},"version":1},"devdoc":{"kind":"dev","methods":{"fee()":{"details":"This method can be used for \"legacy\" swap fee modules.","returns":{"_0":"The swap fee."}},"unstakedFee()":{"details":"Can be modified in PoolFactory on a pool basis or upgraded to be dynamic.","returns":{"_0":"The unstaked fee"}},"settleToBlock()":{"details":"Only callable by the gauge. Pulls the emissions accrued since the last settlement through the gauge.","returns":{"_rollover":"the emissions accumulated while no staked liquidity was in range. Reset to 0 after this call."}},"observe(uint32[])":{"params":{"secondsAgos":"From how long ago each cumulative tick and liquidity value should be returned"},"details":"To get a time weighted average tick or liquidity-in-range, you must call this with two values, one representing the beginning of the period and another for the end of the period. E.g., to get the last hour time-weighted average tick, you must call it with secondsAgos = [3600, 0].The time weighted average tick represents the geometric time weighted average price of the pool, in log base sqrt(1.0001) of token1 / token0. The TickMath library can be used to go from a tick value to a ratio.","returns":{"tickCumulatives":"Cumulative tick values as of each `secondsAgos` from the current block timestamp","secondsPerLiquidityCumulativeX128s":"Cumulative seconds per liquidity-in-range value as of each `secondsAgos` from the current block timestamp"}},"collectFees(address)":{"params":{"recipient":"The address that receives the claimed gauge fees"},"returns":{"amount0":"The gauge fee collected in token0","amount1":"The gauge fee collected in token1"}},"burn(int24,int24,uint128)":{"params":{"amount":"How much liquidity to burn","tickLower":"The lower tick of the position for which to burn liquidity","tickUpper":"The upper tick of the position for which to burn liquidity"},"details":"Can be used to trigger a recalculation of fees owed to a position by calling with an amount of 0Fees must be collected separately via a call to #collect","returns":{"amount0":"The amount of token0 sent to the recipient","amount1":"The amount of token1 sent to the recipient"}},"stake(int128,int24,int24)":{"params":{"tickLower":"The lower tick of the position for which to stake liquidity","tickUpper":"The upper tick of the position for which to stake liquidity","stakedLiquidityDelta":"The amount by which to increase or decrease the staked liquidity"}},"getFeeGrowthInside(int24,int24)":{"params":{"tickLower":"The lower tick of the range","tickUpper":"The upper tick of the range"},"returns":{"feeGrowthInside0X128":"The token0 fee growth in range.","feeGrowthInside1X128":"The token1 fee growth in range."}},"burn(int24,int24,uint128,address)":{"params":{"owner":"Owner of the position in the pool (nft manager or gauge)","amount":"How much liquidity to burn","tickLower":"The lower tick of the position for which to burn liquidity","tickUpper":"The upper tick of the position for which to burn liquidity"},"details":"Can be used to trigger a recalculation of fees owed to a position by calling with an amount of 0Fees must be collected separately via a call to #collect","returns":{"amount0":"The amount of token0 sent to the recipient","amount1":"The amount of token1 sent to the recipient"}},"flash(address,uint256,uint256,bytes)":{"params":{"data":"Any data to be passed through to the callback","amount0":"The amount of token0 to send","amount1":"The amount of token1 to send","recipient":"The address which will receive the token0 and token1 amounts"},"details":"The caller of this method receives a callback in the form of ICLFlashCallback#uniswapV3FlashCallbackCan be used to donate underlying tokens pro-rata to currently in-range liquidity providers by calling with 0 amount{0,1} and sending the donation amount(s) from the callback"},"snapshotCumulativesInside(int24,int24)":{"params":{"tickLower":"The lower tick of the range","tickUpper":"The upper tick of the range"},"details":"Snapshots must only be compared to other snapshots, taken over a period for which a position existed. I.e., snapshots cannot be compared if a position is not held for the entire period between when the first snapshot is taken and the second snapshot is taken.","returns":{"secondsInside":"The snapshot of seconds per liquidity for the range","tickCumulativeInside":"The snapshot of the tick accumulator for the range","secondsPerLiquidityInsideX128":"The snapshot of seconds per liquidity for the range"}},"mint(address,int24,int24,uint128,bytes)":{"params":{"data":"Any data that should be passed through to the callback","amount":"The amount of liquidity to mint","recipient":"The address for which the liquidity will be created","tickLower":"The lower tick of the position in which to add liquidity","tickUpper":"The upper tick of the position in which to add liquidity"},"details":"The caller of this method receives a callback in the form of ICLMintCallback#uniswapV3MintCallback in which they must pay any token0 or token1 owed for the liquidity. The amount of token0/token1 due depends on tickLower, tickUpper, the amount of liquidity, and the current price.","returns":{"amount0":"The amount of token0 that was paid to mint the given amount of liquidity. Matches the value in the callback","amount1":"The amount of token1 that was paid to mint the given amount of liquidity. Matches the value in the callback"}},"swap(address,bool,int256,uint160,bytes)":{"params":{"data":"Any data to be passed through to the callback","recipient":"The address to receive the output of the swap","zeroForOne":"The direction of the swap, true for token0 to token1, false for token1 to token0","amountSpecified":"The amount of the swap, which implicitly configures the swap as exact input (positive), or exact output (negative)","sqrtPriceLimitX96":"The Q64.96 sqrt price limit. If zero for one, the price cannot be less than this value after the swap. If one for zero, the price cannot be greater than this value after the swap"},"details":"The caller of this method receives a callback in the form of ICLSwapCallback#uniswapV3SwapCallback","returns":{"amount0":"The delta of the balance of token0 of the pool, exact when negative, minimum when positive","amount1":"The delta of the balance of token1 of the pool, exact when negative, minimum when positive"}},"getRewardGrowthInside(int24,int24,uint256)":{"params":{"tickLower":"The lower tick of the range","tickUpper":"The upper tick of the range","_rewardGrowthGlobalX128":"a calculated rewardGrowthGlobalX128 or 0 (in case of 0 it means we use the rewardGrowthGlobalX128 from state)"},"details":"Used in gauge reward/earned calculations","returns":{"rewardGrowthInside":"The reward growth in the range"}},"increaseObservationCardinalityNext(uint16)":{"params":{"observationCardinalityNext":"The desired minimum number of observations for the pool to store"},"details":"This method is no-op if the pool already has an observationCardinalityNext greater than or equal to the input observationCardinalityNext."},"setGaugeAndPositionManager(address,address)":{"params":{"_nft":"The position manager used for position management","_gauge":"The gauge corresponding to this pool"},"details":"Callable only once, by the gauge factory"},"collect(address,int24,int24,uint128,uint128)":{"params":{"recipient":"The address which should receive the fees collected","tickLower":"The lower tick of the position for which to collect fees","tickUpper":"The upper tick of the position for which to collect fees","amount0Requested":"How much token0 should be withdrawn from the fees owed","amount1Requested":"How much token1 should be withdrawn from the fees owed"},"details":"Does not recompute fees earned, which must be done either via mint or burn of any amount of liquidity. Collect must be called by the position owner. To withdraw only token0 or only token1, amount0Requested or amount1Requested may be set to zero. To withdraw all tokens owed, caller may pass any value greater than the actual tokens owed, e.g. type(uint128).max. Tokens owed may be from accumulated swap fees or burned liquidity.","returns":{"amount0":"The amount of fees collected in token0","amount1":"The amount of fees collected in token1"}},"getSecondsPerStakedLiquidityCumulativeX128()":{"returns":{"_cumulative":"The Q128.128 seconds per staked liquidity cumulative as of the current block"}},"flashFee((address,address,uint256,uint256,bytes))":{"params":{"_flashParams":"Arguments passed to the flash function."},"returns":{"_fee":"The flash fee."}},"collect(address,int24,int24,uint128,uint128,address)":{"params":{"owner":"Owner of the position in the pool (nft manager or gauge)","recipient":"The address which should receive the fees collected","tickLower":"The lower tick of the position for which to collect fees","tickUpper":"The upper tick of the position for which to collect fees","amount0Requested":"How much token0 should be withdrawn from the fees owed","amount1Requested":"How much token1 should be withdrawn from the fees owed"},"details":"Does not recompute fees earned, which must be done either via mint or burn of any amount of liquidity. Collect must be called by the position owner. To withdraw only token0 or only token1, amount0Requested or amount1Requested may be set to zero. To withdraw all tokens owed, caller may pass any value greater than the actual tokens owed, e.g. type(uint128).max. Tokens owed may be from accumulated swap fees or burned liquidity.","returns":{"amount0":"The amount of fees collected in token0","amount1":"The amount of fees collected in token1"}},"initialize(address,address,address,int24,address,uint160)":{"params":{"_token0":"The first token of the pool by address sort order","_token1":"The second token of the pool by address sort order","_factory":"The CL factory contract address","_tickSpacing":"The pool tick spacing","_sqrtPriceX96":"The initial sqrt price of the pool, as a Q64.96","_factoryRegistry":"The address of the factory registry managing the pool factory"},"details":"Can be called once only Price is represented as a sqrt(amountToken1/amountToken0) Q64.96 valuenot locked because it initializes unlocked"},"beforeSwapFee((address,address,bool,int256,uint160,bytes,uint160,int24))":{"params":{"_swapParams":"Swap context and pre-swap pool state."},"returns":{"_0":"The pre-swap fee."}},"afterSwapFee((address,address,bool,int256,uint160,bytes,uint160,int24),(int256,int256,uint24,bool,uint256,uint128,uint128,uint128,int56,uint160,bool))":{"params":{"_swapParams":"Swap context and post-swap pool state.","_afterSwapParams":"Post-swap execution state and oracle/liquidity context."},"returns":{"_0":"The post-swap fee."}}},"version":1,"stateVariables":{"nft":{"return":"The nft manager contract address"},"gauge":{"return":"The gauge contract address"},"slot0":{"return":"sqrtPriceX96 The current price of the pool as a sqrt(token1/token0) Q64.96 value tick The current tick of the pool, i.e. according to the last tick transition that was run. This value may not always be equal to SqrtTickMath.getTickAtSqrtRatio(sqrtPriceX96) if the price is on a tick boundary. observationIndex The index of the last oracle observation that was written, observationCardinality The current maximum number of observations stored in the pool, observationCardinalityNext The next maximum number of observations, to be updated when the observation. unlocked Whether the pool is currently locked to reentrancy"},"ticks":{"params":{"tick":"The tick to look up"},"return":"liquidityGross the total amount of position liquidity that uses the pool either as tick lower or tick upper, liquidityNet how much liquidity changes when the pool price crosses the tick, stakedLiquidityNet how much staked liquidity changes when the pool price crosses the tick, feeGrowthOutside0X128 the fee growth on the other side of the tick from the current tick in token0, feeGrowthOutside1X128 the fee growth on the other side of the tick from the current tick in token1, rewardGrowthOutsideX128 the reward growth on the other side of the tick from the current tick in emission token tickCumulativeOutside the cumulative tick value on the other side of the tick from the current tick secondsPerLiquidityOutsideX128 the seconds spent per liquidity on the other side of the tick from the current tick, secondsOutside the seconds spent on the other side of the tick from the current tick, initialized Set to true if the tick is initialized, i.e. liquidityGross is greater than 0, otherwise equal to false. Outside values can only be used if the tick is initialized, i.e. if liquidityGross is greater than 0. In addition, these values are only relative and must be used only in comparison to previous snapshots for a specific position."},"token0":{"return":"The token contract address"},"token1":{"return":"The token contract address"},"factory":{"return":"The contract address"},"POOL_TYPE":{"return":"The pool type label to be able to identify the type of pool"},"gaugeFees":{"details":"Gauge fees will never exceed uint128 max in either token"},"liquidity":{"details":"This value has no relationship to the total liquidity across all ticksThis value includes staked liquidity"},"positions":{"params":{"key":"The position's key is a hash of a preimage composed by the owner, tickLower and tickUpper"},"return":"_liquidity The amount of liquidity in the position, Returns feeGrowthInside0LastX128 fee growth of token0 inside the tick range as of the last mint/burn/poke, Returns feeGrowthInside1LastX128 fee growth of token1 inside the tick range as of the last mint/burn/poke, Returns tokensOwed0 the computed amount of token0 owed to the position as of the last mint/burn/poke, Returns tokensOwed1 the computed amount of token1 owed to the position as of the last mint/burn/poke"},"DENOMINATOR":{"return":"The denominator value in pips."},"tickSpacing":{"return":"The tick spacing","details":"Ticks can only be used at multiples of this value, minimum of 1 and always positive e.g.: a tickSpacing of 3 means ticks can be initialized every 3rd tick, i.e., ..., -6, -3, 0, 3, 6, ... This value is an int24 to avoid casting even though it is always positive."},"observations":{"params":{"index":"The element of the observations array to fetch"},"return":"blockTimestamp The timestamp of the observation, Returns tickCumulative the tick multiplied by seconds elapsed for the life of the pool as of the observation timestamp, Returns secondsPerLiquidityCumulativeX128 the seconds per in range liquidity for the life of the pool as of the observation timestamp, Returns initialized whether the observation has been initialized and the values are safe to use","details":"You most likely want to use #observe() instead of this method to get an observation as of some amount of time ago, rather than at a specific index in the array."},"SWAP_FEE_CEIL":{"return":"The swap fee ceiling value in pips."},"factoryRegistry":{"return":"The factory registry contract address"},"stakedLiquidity":{"details":"This value has no relationship to the total staked liquidity across all ticks"},"maxLiquidityPerTick":{"return":"The max amount of liquidity per tick","details":"This parameter is enforced per tick to prevent liquidity from overflowing a uint128 at any point, and also prevents out-of-range liquidity from being used to prevent adding in-range liquidity to a pool"},"feeGrowthGlobal0X128":{"details":"This value can overflow the uint256"},"feeGrowthGlobal1X128":{"details":"This value can overflow the uint256"},"rewardGrowthGlobalX128":{"details":"This value can overflow the uint256"},"secondsPerStakedLiquidityCumulativeX128":{"return":"The Q128.128 stored seconds per staked liquidity cumulative"}}},"storageLayout":{"types":{"t_bool":{"label":"bool","encoding":"inplace","numberOfBytes":"1"},"t_int16":{"label":"int16","encoding":"inplace","numberOfBytes":"2"},"t_int24":{"label":"int24","encoding":"inplace","numberOfBytes":"3"},"t_int56":{"label":"int56","encoding":"inplace","numberOfBytes":"7"},"t_int128":{"label":"int128","encoding":"inplace","numberOfBytes":"16"},"t_uint16":{"label":"uint16","encoding":"inplace","numberOfBytes":"2"},"t_uint32":{"label":"uint32","encoding":"inplace","numberOfBytes":"4"},"t_uint48":{"label":"uint48","encoding":"inplace","numberOfBytes":"6"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_bytes32":{"label":"bytes32","encoding":"inplace","numberOfBytes":"32"},"t_uint128":{"label":"uint128","encoding":"inplace","numberOfBytes":"16"},"t_uint160":{"label":"uint160","encoding":"inplace","numberOfBytes":"20"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_struct(Info)7471_storage":{"label":"struct Position.Info","members":[{"slot":"0","type":"t_uint128","astId":7462,"label":"liquidity","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"1","type":"t_uint256","astId":7464,"label":"feeGrowthInside0LastX128","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"2","type":"t_uint256","astId":7466,"label":"feeGrowthInside1LastX128","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"3","type":"t_uint128","astId":7468,"label":"tokensOwed0","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"3","type":"t_uint128","astId":7470,"label":"tokensOwed1","offset":16,"contract":"contracts/core/CLPool.sol:CLPool"}],"encoding":"inplace","numberOfBytes":"128"},"t_struct(Info)8525_storage":{"label":"struct Tick.Info","members":[{"slot":"0","type":"t_uint128","astId":8506,"label":"liquidityGross","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"0","type":"t_int128","astId":8508,"label":"liquidityNet","offset":16,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"1","type":"t_int128","astId":8510,"label":"stakedLiquidityNet","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"2","type":"t_uint256","astId":8512,"label":"feeGrowthOutside0X128","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"3","type":"t_uint256","astId":8514,"label":"feeGrowthOutside1X128","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"4","type":"t_uint256","astId":8516,"label":"rewardGrowthOutsideX128","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"5","type":"t_int56","astId":8518,"label":"tickCumulativeOutside","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"5","type":"t_uint160","astId":8520,"label":"secondsPerLiquidityOutsideX128","offset":7,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"5","type":"t_uint32","astId":8522,"label":"secondsOutside","offset":27,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"5","type":"t_bool","astId":8524,"label":"initialized","offset":31,"contract":"contracts/core/CLPool.sol:CLPool"}],"encoding":"inplace","numberOfBytes":"192"},"t_struct(Slot0)102_storage":{"label":"struct CLPool.Slot0","members":[{"slot":"0","type":"t_uint160","astId":91,"label":"sqrtPriceX96","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"0","type":"t_int24","astId":93,"label":"tick","offset":20,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"0","type":"t_uint16","astId":95,"label":"observationIndex","offset":23,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"0","type":"t_uint16","astId":97,"label":"observationCardinality","offset":25,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"0","type":"t_uint16","astId":99,"label":"observationCardinalityNext","offset":27,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"0","type":"t_bool","astId":101,"label":"unlocked","offset":29,"contract":"contracts/core/CLPool.sol:CLPool"}],"encoding":"inplace","numberOfBytes":"32"},"t_mapping(t_int16,t_uint256)":{"key":"t_int16","label":"mapping(int16 => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_struct(GaugeFees)123_storage":{"label":"struct CLPool.GaugeFees","members":[{"slot":"0","type":"t_uint128","astId":120,"label":"token0","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"0","type":"t_uint128","astId":122,"label":"token1","offset":16,"contract":"contracts/core/CLPool.sol:CLPool"}],"encoding":"inplace","numberOfBytes":"32"},"t_struct(Observation)6730_storage":{"label":"struct Oracle.Observation","members":[{"slot":"0","type":"t_uint32","astId":6723,"label":"blockTimestamp","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"0","type":"t_int56","astId":6725,"label":"tickCumulative","offset":4,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"0","type":"t_uint160","astId":6727,"label":"secondsPerLiquidityCumulativeX128","offset":11,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"0","type":"t_bool","astId":6729,"label":"initialized","offset":31,"contract":"contracts/core/CLPool.sol:CLPool"}],"encoding":"inplace","numberOfBytes":"32"},"t_mapping(t_int24,t_struct(Info)8525_storage)":{"key":"t_int24","label":"mapping(int24 => struct Tick.Info)","value":"t_struct(Info)8525_storage","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_bytes32,t_struct(Info)7471_storage)":{"key":"t_bytes32","label":"mapping(bytes32 => struct Position.Info)","value":"t_struct(Info)7471_storage","encoding":"mapping","numberOfBytes":"32"},"t_array(t_struct(Observation)6730_storage)65535_storage":{"base":"t_struct(Observation)6730_storage","label":"struct Oracle.Observation[65535]","encoding":"inplace","numberOfBytes":"2097120"}},"storage":[{"slot":"0","type":"t_address","astId":69,"label":"factory","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"1","type":"t_address","astId":73,"label":"token0","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"2","type":"t_address","astId":77,"label":"token1","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"3","type":"t_address","astId":81,"label":"gauge","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"4","type":"t_address","astId":85,"label":"nft","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"5","type":"t_address","astId":89,"label":"factoryRegistry","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"6","type":"t_struct(Slot0)102_storage","astId":106,"label":"slot0","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"7","type":"t_uint256","astId":110,"label":"feeGrowthGlobal0X128","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"8","type":"t_uint256","astId":114,"label":"feeGrowthGlobal1X128","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"9","type":"t_uint256","astId":118,"label":"rewardGrowthGlobalX128","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"10","type":"t_struct(GaugeFees)123_storage","astId":127,"label":"gaugeFees","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"11","type":"t_uint256","astId":131,"label":"rollover","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"12","type":"t_uint128","astId":135,"label":"stakedLiquidity","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"12","type":"t_uint48","astId":139,"label":"lastUpdated","offset":16,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"12","type":"t_int24","astId":143,"label":"tickSpacing","offset":22,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"13","type":"t_uint128","astId":147,"label":"liquidity","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"13","type":"t_uint128","astId":151,"label":"maxLiquidityPerTick","offset":16,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"14","type":"t_mapping(t_int24,t_struct(Info)8525_storage)","astId":157,"label":"ticks","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"15","type":"t_mapping(t_int16,t_uint256)","astId":163,"label":"tickBitmap","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"16","type":"t_mapping(t_bytes32,t_struct(Info)7471_storage)","astId":169,"label":"positions","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"17","type":"t_array(t_struct(Observation)6730_storage)65535_storage","astId":175,"label":"observations","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"},{"slot":"65552","type":"t_uint160","astId":179,"label":"secondsPerStakedLiquidityCumulativeX128","offset":0,"contract":"contracts/core/CLPool.sol:CLPool"}]},"transientStorageLayout":null,"evm":{"bytecode":{"object":"608060405234801561001057600080fd5b50615efb80620000216000396000f3fe608060405234801561001057600080fd5b506004361061029f5760003560e01c80636f89244c11610167578063b64cc67b116100ce578063e8bfe65c11610087578063e8bfe65c14610595578063eb4ad999146105a8578063f1e663a9146105bb578063f3058399146105c3578063f30dba93146105cb578063fe0106d5146105f45761029f565b8063b64cc67b1461054b578063c45a015514610553578063d0b06f5d1461055b578063d0c93a7c14610570578063d21220a714610585578063ddca3f431461058d5761029f565b8063a16368c911610120578063a16368c9146104e0578063a34123a7146104f3578063a38807f214610506578063a480ca7914610528578063a6f19c841461053b578063b056b49a146105435761029f565b80636f89244c1461047657806370cf754a14610489578063883bdbfd146104915780638f50914d146104b2578063918f8674146104c557806396518d4a146104cd5761029f565b80633850c7bd1161020b578063490e6cbc116101c4578063490e6cbc146104095780634f1eb3d81461041c578063514ea4bf1461042f5780635339c2961461045357806357806ada14610466578063648da8591461046e5761029f565b80633850c7bd146103af5780633ab04b20146103c95780633bf0c9fb146103d15780633c8a7d8d146103d957806346141319146103ec57806347ccca02146104015761029f565b80631f7c35681161025d5780631f7c3568146103285780632071d8841461033d578063252c09d714610350578063293833ba14610373578063313383741461038957806332148f671461039c5761029f565b8062d0139a146102a4578063044078e1146102c25780630dfe1681146102e2578063128acb08146102ea578063171852be1461030b5780631a68650214610313575b600080fd5b6102ac6105fc565b6040516102b99190615795565b60405180910390f35b6102d56102d03660046152f9565b61060d565b6040516102b99190615e04565b6102ac6106ad565b6102fd6102f8366004614dbb565b6106bc565b6040516102b992919061587a565b6102ac611362565b61031b6113ac565b6040516102b99190615cfc565b61033b610336366004614d04565b6113bb565b005b61033b61034b366004614d3c565b611522565b61036361035e36600461502a565b611678565b6040516102b99493929190615e14565b61037b6116bd565b6040516102b9929190615d79565b61037b610397366004614ef6565b6116d7565b61033b6103aa366004615482565b611710565b6103b7611790565b6040516102b996959493929190615dc5565b61031b6117d7565b6102ac6117e6565b6102fd6103e7366004614e3b565b6117f5565b6103f46119a0565b6040516102b99190615863565b6102ac6119a6565b61033b610417366004614f55565b6119b5565b61037b61042a366004614e8a565b611af4565b61044261043d36600461502a565b611b24565b6040516102b9959493929190615d93565b6103f461046136600461508b565b611b61565b6103f4611b73565b6103f4611b79565b6102fd61048436600461513e565b611b82565b61031b611bb7565b6104a461049f366004614fbc565b611bcd565b6040516102b99291906157c3565b61033b6104c0366004615042565b611c4f565b6103f4611d6d565b6102fd6104db3660046150c6565b611d74565b6103f46104ee366004615195565b611e19565b6102fd6105013660046150f8565b611ec5565b6105196105143660046150c6565b611ef1565b6040516102b9939291906158ea565b61037b610536366004614ccc565b61201d565b6102ac6120e0565b6103f46120ef565b6102d56120f5565b6102ac61217c565b61056361218b565b6040516102b99190615e45565b6105786121a0565b6040516102b9919061586c565b6102ac6121b0565b6102d56121bf565b6102d56105a3366004615219565b6121db565b6102d56105b63660046152c7565b612286565b6103f46122d9565b6103f46122e0565b6105de6105d93660046150ac565b6122e6565b6040516102b99a99989796959493929190615d10565b6103f4612360565b62010010546001600160a01b031681565b60008054604051631465b7d360e21b815273000000000000000000000000000000000000000091635196df4c9161065491879187916001600160a01b031690600401615cbe565b60206040518083038186803b15801561066c57600080fd5b505af4158015610680573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a491906154a4565b90505b92915050565b6001546001600160a01b031681565b6000806106e7866000141560405180604001604052806002815260200161415360f01b81525061238d565b6040805160c0810182526006546001600160a01b0381168252600160a01b8104600290810b810b900b602080840191909152600160b81b820461ffff90811684860152600160c81b830481166060850152600160d81b8304166080840152600160e81b90910460ff16151560a08301819052835180850190945260038452624c4f4b60e81b91840191909152909161077f919061238d565b610820886107cd5781600001516001600160a01b0316876001600160a01b03161180156107c8575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038816105b6107ff565b81600001516001600160a01b0316876001600160a01b03161080156107ff57506401000276a36001600160a01b038816115b6040518060400160405280600381526020016214d41360ea1b81525061238d565b6006805460ff60e81b191690556040805160e081018252600d546001600160801b039081168252600c541660208201524263ffffffff16818301526000606082018190526080820181905260a082018190528054925163d8f7529960e01b8152909260c08301916001600160a01b039091169063d8f75299906108a7903090600401615795565b60206040518083038186803b1580156108bf57600080fd5b505afa1580156108d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f79190614ce8565b6001600160a01b031681525090506000808913905060006040518061014001604052808b81526020016000815260200185600001516001600160a01b03168152602001856020015160020b8152602001600062ffffff1681526020016000151581526020018c6109695760085461096d565b6007545b815260200160006001600160801b0316815260200184600001516001600160801b0316815260200184602001516001600160801b03168152509050610a73604051806101000160405280336001600160a01b031681526020018e6001600160a01b031681526020018d151581526020018c81526020018b6001600160a01b031681526020018a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250938552505088516001600160a01b039081166020808601919091528a0151600290810b6040909501949094529154600c5460c08a0151841695949190931692600160b01b9004900b90506123b5565b62ffffff1660808201525b805115801590610aa45750886001600160a01b031681604001516001600160a01b031614155b15610e7157610ab1614a08565b60408201516001600160a01b031681526060820151600c54610ae091600f91600160b01b900460020b8f6124ee565b15156040830152600290810b810b60208301819052620d89e719910b1215610b1157620d89e7196020820152610b30565b6020810151620d89e860029190910b1315610b3057620d89e860208201525b610b3d8160200151612630565b6001600160a01b031660608201526040820151610bb3908d610b77578b6001600160a01b031683606001516001600160a01b031611610b91565b8b6001600160a01b031683606001516001600160a01b0316105b610b9f578260600151610ba1565b8b5b61010085015185516080870151612961565b60c085015260a084015260808301526001600160a01b031660408301528215610c1557610be98160c00151826080015101612b53565b825103825260a0810151610c0b90610c0090612b53565b602084015190612b65565b6020830152610c50565b610c228160a00151612b53565b825101825260c08101516080820151610c4a91610c3f9101612b53565b602084015190612b7b565b60208301525b6101008201516001600160801b031615610ca457600080610c808360c00151856101000151866101200151612b91565b60c0860180519290920190915260e0850180519091016001600160801b0316905250505b80606001516001600160a01b031682604001516001600160a01b03161415610e3057806040015115610e07578360a00151610d2e57610d0c846040015160008760200151886040015188600001518a606001516011612c30909695949392919063ffffffff16565b6001600160a01b03166080860152600690810b900b6060850152600160a08501525b8160a00151610d4757610d3f612dc2565b600160a08301525b6000610d9782602001518e610d5e57600754610d64565b8460c001515b8f610d73578560c00151610d77565b6008545b608089015160608a015160408b0151600954600e96959493929190612e86565b90508c15610dbf5780516000908103600f90810b810b8352602083018051909203810b900b90525b610dd28361010001518260000151612f75565b6001600160801b03166101008401526101208301516020820151610df69190612f75565b6001600160801b0316610120840152505b8b610e16578060200151610e1f565b60018160200151035b600290810b900b6060830152610e6b565b80600001516001600160a01b031682604001516001600160a01b031614610e6b57610e5e826040015161302b565b600290810b900b60608301525b50610a7e565b610f27604051806101000160405280336001600160a01b031681526020018e6001600160a01b031681526020018d151581526020018c81526020018b6001600160a01b031681526020018a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506040808501516001600160a01b039081166020840152606086015160020b919092015260c086015116908386600a613345565b836020015160020b816060015160020b14610ff557600080610f7586604001518660400151886020015188600001518a606001518b6080015160116134f9909695949392919063ffffffff16565b604085015160608601516006805461ffff60c81b1916600160c81b61ffff958616021761ffff60b81b1916600160b81b95909416949094029290921762ffffff60a01b1916600160a01b62ffffff60029490940b9390931692909202919091176001600160a01b0319166001600160a01b039091161790555061101a9050565b6040810151600680546001600160a01b0319166001600160a01b039092169190911790555b8061010001516001600160801b031683600001516001600160801b03161461106257610100810151600d80546001600160801b0319166001600160801b039092169190911790555b8061012001516001600160801b031683602001516001600160801b0316146110aa57610120810151600c80546001600160801b0319166001600160801b039092169190911790555b8a156110fa5760c081015160075560e08101516001600160801b0316156110f55760e0810151600a80546001600160801b031981166001600160801b03918216909301169190911790555b611140565b60c081015160085560e08101516001600160801b0316156111405760e0810151600a80546001600160801b03808216600160801b92839004821690940116029190911790555b8115158b15151461115957602081015181518b03611166565b80600001518a0381602001515b90965094508a1561123b57600085121561119557600254611195906001600160a01b03168d6000889003613694565b600061119f6137db565b60405163fa461e3360e01b8152909150339063fa461e33906111cb908a908a908e908e90600401615888565b600060405180830381600087803b1580156111e557600080fd5b505af11580156111f9573d6000803e3d6000fd5b505050506112356112086137db565b611212838a61385c565b11156040518060400160405280600381526020016249494160e81b81525061238d565b506112de565b600086121561125f5760015461125f906001600160a01b03168d6000899003613694565b600061126961386c565b60405163fa461e3360e01b8152909150339063fa461e3390611295908a908a908e908e90600401615888565b600060405180830381600087803b1580156112af57600080fd5b505af11580156112c3573d6000803e3d6000fd5b505050506112dc6112d261386c565b611212838961385c565b505b8b6001600160a01b0316336001600160a01b03167fc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca678888856040015186610100015187606001516040516113369594939291906158b2565b60405180910390a350506006805460ff60e81b1916600160e81b17905550919890975095505050505050565b6201001054600c546001600160a01b03909116906001600160801b031680156113a857600c546113a390600160801b900465ffffffffffff1642038261389d565b820191505b5090565b600d546001600160801b031681565b6113c36138bd565b60055460005460405163bc5bde7b60e01b81527300000000000000000000000000000000000000009263bc5bde7b9261140e926001600160a01b0392831692909116906004016157a9565b60006040518083038186803b15801561142657600080fd5b505af415801561143a573d6000803e3d6000fd5b50506003546001600160a01b0316159150611456905057600080fd5b600380546001600160a01b038085166001600160a01b0319928316811790935560048054918516919092161781556040805163f7413fef60e01b815290516000939263f7413fef9280820192602092909182900301818787803b1580156114bc57600080fd5b505af11580156114d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f491906154c0565b90506115158142600c60109054906101000a900465ffffffffffff166138fd565b61151d6139a6565b505050565b6000546001600160a01b031615801561154357506001600160a01b03861615155b61154c57600080fd5b600080546001600160a01b038089166001600160a01b0319928316179092556001805488841690831617905560028054878416908316178155600c80549187900b62ffffff16600160b01b0262ffffff60b01b1990921691909117905560058054928516929091169190911790557300000000000000000000000000000000000000006307219df660066011846115e28161302b565b886040518663ffffffff1660e01b8152600401611603959493929190615c1f565b60206040518083038186803b15801561161b57600080fd5b505af415801561162f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116539190615402565b600d80546001600160801b03928316600160801b029216919091179055505050505050565b60118161ffff811061168957600080fd5b015463ffffffff81169150600160201b810460060b90600160581b81046001600160a01b031690600160f81b900460ff1684565b600a546001600160801b0380821691600160801b90041682565b6000806116e26138bd565b6116ea6139bb565b6116f88888888888886139f0565b90925090506117056139a6565b965096945050505050565b6117186138bd565b604051633c7e0d5560e21b81527300000000000000000000000000000000000000009063f1f8355490611755906011906006908690600401615849565b60006040518083038186803b15801561176d57600080fd5b505af4158015611781573d6000803e3d6000fd5b5050505061178d6139a6565b50565b6006546001600160a01b03811690600160a01b810460020b9061ffff600160b81b8204811691600160c81b8104821691600160d81b8204169060ff600160e81b9091041686565b600c546001600160801b031681565b6005546001600160a01b031681565b6000806118006138bd565b600061180d898989613aad565b6001600160801b03871661014082015260405163025e487960e41b815290915060009081908190730000000000000000000000000000000000000000906325e487909061186d90601090600e90600f906011906006908c906004016159be565b60606040518083038186803b15801561188557600080fd5b505af4158015611899573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bd919061544c565b92509250925082600d60006101000a8154816001600160801b0302191690836001600160801b0316021790555073000000000000000000000000000000000000000063e0ed1c1a858484600160009054906101000a90046001600160a01b0316600260009054906101000a90046001600160a01b03168e8e6040518863ffffffff1660e01b81526004016119579796959493929190615bc4565b60006040518083038186803b15801561196f57600080fd5b505af4158015611983573d6000803e3d6000fd5b5050505061198f6139a6565b909b909a5098505050505050505050565b60085481565b6004546001600160a01b031681565b6119bd6138bd565b60408051610120810182526001546001600160a01b039081168252600280548216602084015260008054831684860152600c54600160b01b8104830b90920b6060850152600d546001600160801b03908116608086015290911660a084015290881660c083015260e082018790526101008201869052915163b79fa2e360e01b815282917300000000000000000000000000000000000000009163b79fa2e391611a7191600a919089908990600401615b0e565b604080518083038186803b158015611a8857600080fd5b505af4158015611a9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac091906154d8565b90925090508115611ad45760078054830190555b8015611ae35760088054820190555b611aeb6139a6565b50505050505050565b600080611aff6138bd565b611b0d8787878787336139f0565b9092509050611b1a6139a6565b9550959350505050565b60106020526000908152604090208054600182015460028301546003909301546001600160801b0392831693919281811691600160801b90041685565b600f6020526000908152604090205481565b60095481565b6110d360f21b81565b600080611b8d6138bd565b611b956139bb565b611ba186868686613b43565b9092509050611bae6139a6565b94509492505050565b600d54600160801b90046001600160801b031681565b606080611c434285858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600654600d54601195949350600160a01b820460020b925061ffff600160b81b83048116926001600160801b0390921691600160c81b900416613c34565b915091505b9250929050565b611c576138bd565b611c5f613d8c565b600654600160a01b9004600290810b9083810b9082900b12801590611c8957508160020b8160020b125b15611ccd57611c96612dc2565b600c54611cac906001600160801b031685612f75565b600c80546001600160801b0319166001600160801b03929092169190911790555b73000000000000000000000000000000000000000063c3846f716010600e600460009054906101000a90046001600160a01b03168787878b6007546008546040518a63ffffffff1660e01b8152600401611d2f9998979695949392919061596e565b60006040518083038186803b158015611d4757600080fd5b505af4158015611d5b573d6000803e3d6000fd5b50505050611d676139a6565b50505050565b620f424081565b60065460075460085460405163b76224fb60e01b815260009384937300000000000000000000000000000000000000009363b76224fb93611dca93600e938b938b93600160a01b90930460020b92600401615a39565b604080518083038186803b158015611de157600080fd5b505af4158015611df5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4391906154d8565b60065460095460405163bf4efc0760e01b81526000927300000000000000000000000000000000000000009263bf4efc0792611e6b92600e928a928a92600160a01b900460020b918a91600401615a39565b60206040518083038186803b158015611e8357600080fd5b505af4158015611e97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebb91906154c0565b90505b9392505050565b600080611ed06138bd565b611edc85858533613b43565b9092509050611ee96139a6565b935093915050565b6040805160c0810182526006546001600160a01b0381168252600160a01b8104600290810b810b900b60208301819052600160b81b820461ffff908116848601819052600160c81b8404821660608601819052600160d81b85049092166080860152600160e81b90930460ff16151560a0850152600d549451633e0d664760e11b815260009586958695909473000000000000000000000000000000000000000094637c1acc8e94611fbf94600e946011948f948f94919390916001600160801b03909116906004016159ef565b60606040518083038186803b158015611fd757600080fd5b505af4158015611feb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200f91906151d0565b935093509350509250925092565b6000806120286138bd565b612030613d8c565b60015460025460405163152245cf60e11b815273000000000000000000000000000000000000000092632a448b9e9261207f92600a9289926001600160a01b0391821692911690600401615ae7565b604080518083038186803b15801561209657600080fd5b505af41580156120aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ce919061541e565b90925090506120db6139a6565b915091565b6003546001600160a01b031681565b600b5481565b600080546040516348cf7a4360e01b81526001600160a01b03909116906348cf7a4390612126903090600401615795565b60206040518083038186803b15801561213e57600080fd5b505afa158015612152573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217691906154a4565b90505b90565b6000546001600160a01b031681565b600c54600160801b900465ffffffffffff1681565b600c54600160b01b900460020b81565b6002546001600160a01b031681565b60006121c9614a44565b3381526121d581612286565b91505090565b60008054600c54604051633082eea360e01b815273000000000000000000000000000000000000000092633082eea39261222e9287926001600160a01b031691600160b01b900460020b90600401615a7b565b60206040518083038186803b15801561224657600080fd5b505af415801561225a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227e91906154a4565b90505b919050565b60008054600c5460405163099f15f760e01b81527300000000000000000000000000000000000000009263099f15f79261222e9287926001600160a01b031691600160b01b900460020b90600401615c64565b620186a081565b60075481565b600e602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160801b03851695600160801b909504600f90810b9594900b9390600681900b90600160381b81046001600160a01b031690600160d81b810463ffffffff1690600160f81b900460ff168a565b600061236a6138bd565b612372613d8c565b61237a612dc2565b600b549050600b600090556121796139a6565b808261151d5760405162461bcd60e51b81526004016123ac9190615a68565b60405180910390fd5b60006001600160a01b0385161561246757604051631a7cd7eb60e31b81526000906001600160a01b0387169063d3e6bf58906123f5908890600401615c51565b602060405180830381600087803b15801561240f57600080fd5b505af1158015612423573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244791906154a4565b905062ffffff8116156124655761245d81613dbd565b9150506124e6565b505b604051631c06e0e160e11b81526001600160a01b0384169063380dc1c29061249390859060040161586c565b60206040518083038186803b1580156124ab57600080fd5b505afa1580156124bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e391906154a4565b90505b949350505050565b60008060008460020b8660020b8161250257fe5b05905060008660020b12801561252957508460020b8660020b8161252257fe5b0760020b15155b1561253357600019015b83156125a85760008061254583613dd7565b600182810b810b600090815260208d9052604090205460ff83169190911b8001600019019081168015159750929450909250908561258a57888360ff1686030261259d565b8861259482613de9565b840360ff168603025b965050505050612626565b6000806125b783600101613dd7565b91509150600060018260ff166001901b031990506000818b60008660010b60010b815260200190815260200160002054169050806000141595508561260957888360ff0360ff1686600101010261261f565b888361261483613e88565b0360ff168660010101025b9650505050505b5094509492505050565b60008060008360020b12612647578260020b61264f565b8260020b6000035b9050620d89e881111561268d576040805162461bcd60e51b81526020600482015260016024820152601560fa1b604482015290519081900360640190fd5b6000600182166126a157600160801b6126b3565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff16905060028216156126e7576ffff97272373d413259a46990580e213a0260801c5b6004821615612706576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612725576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612744576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612763576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612782576fff2ea16466c96a3843ec78b326b528610260801c5b60808216156127a1576ffe5dee046a99a2a811c461f1969c30530260801c5b6101008216156127c1576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b6102008216156127e1576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612801576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612821576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612841576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612861576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612881576f70d869a156d2a1b890bb3df62baf32f70260801c5b6180008216156128a1576f31be135f97d08fd981231505542fcfa60260801c5b620100008216156128c2576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b620200008216156128e2576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612901576d2216e584f5fa1ea926041bedfe980260801c5b6208000082161561291e576b048a170391f7dc42444e8fa20260801c5b60008460020b131561293957806000198161293557fe5b0490505b600160201b81061561294c57600161294f565b60005b60ff16602082901c0192505050919050565b60008080806001600160a01b03808916908a1610158187128015906129e657600061299a8989620f42400362ffffff16620f4240613f71565b9050826129b3576129ae8c8c8c6001614020565b6129c0565b6129c08b8d8c6001614090565b95508581106129d1578a96506129e0565b6129dd8c8b838661413b565b96505b50612a30565b816129fd576129f88b8b8b6000614090565b612a0a565b612a0a8a8c8b6000614020565b9350838860000310612a1e57899550612a30565b612a2d8b8a8a60000385614187565b95505b6001600160a01b038a8116908716148215612a9357808015612a4f5750815b612a6557612a60878d8c6001614090565b612a67565b855b9550808015612a74575081155b612a8a57612a85878d8c6000614020565b612a8c565b845b9450612add565b808015612a9d5750815b612ab357612aae8c888c6001614020565b612ab5565b855b9550808015612ac2575081155b612ad857612ad38c888c6000614090565b612ada565b845b94505b81158015612aed57508860000385115b15612af9578860000394505b818015612b1857508a6001600160a01b0316876001600160a01b031614155b15612b27578589039350612b44565b612b41868962ffffff168a620f42400362ffffff166141d3565b93505b50505095509550955095915050565b6000600160ff1b82106113a857600080fd5b808203828113156000831215146106a757600080fd5b818101828112156000831215146106a757600080fd5b600080826001600160801b0316846001600160801b03161415612bb5575083611ee9565b6001600160801b038316612bf857600080612bd187600061420d565b91509150612bed82600160801b886001600160801b0316613f71565b93509150611ee99050565b600080612c0687878761423b565b91509150612c2482600160801b8789036001600160801b0316613f71565b97909650945050505050565b60008063ffffffff8716612cd6576000898661ffff1661ffff8110612c5157fe5b60408051608081018252919092015463ffffffff808216808452600160201b8304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508a1614612cc257612cbf818a8988614275565b90505b806020015181604001519250925050612db6565b868803600080612ceb8c8c858c8c8c8c614318565b91509150816000015163ffffffff168363ffffffff161415612d1d578160200151826040015194509450505050612db6565b805163ffffffff84811691161415612d45578060200151816040015194509450505050612db6565b8151815160208085015190840151918390039286039163ffffffff80841692908516910360060b81612d7357fe5b05028460200151018263ffffffff168263ffffffff1686604001518660400151036001600160a01b03160281612da557fe5b048560400151019650965050505050505b97509795505050505050565b600c54429065ffffffffffff600160801b9091048116908216811415612de9575050612e84565b6003546001600160a01b031680612e0257505050612e84565b6000816001600160a01b031663f7413fef6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612e3f57600080fd5b505af1158015612e53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e7791906154c0565b9050611d678185856138fd565b565b612e8e614a87565b600297880b880b60009081526020998a5260409020978801805490970390965560038701805490950390945560048601805490940390935560058501805463ffffffff600160d81b6001600160a01b03600160381b808504821690970316909502670100000000000000600160d81b031990921691909117600681810b90940390930b66ffffffffffffff1666ffffffffffffff1990931692909217838104831690940390911690910263ffffffff60d81b199092169190911790558154600160801b9004600f90810b810b810b8252600190920154820b820b90910b9181019190915290565b60008082600f0b1215612fda57826001600160801b03168260000384039150816001600160801b031610612fd5576040805162461bcd60e51b81526020600482015260026024820152614c5360f01b604482015290519081900360640190fd5b6106a7565b826001600160801b03168284019150816001600160801b031610156106a7576040805162461bcd60e51b81526020600482015260026024820152614c4160f01b604482015290519081900360640190fd5b60006401000276a36001600160a01b03831610801590613067575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038316105b61309c576040805162461bcd60e51b81526020600482015260016024820152602960f91b604482015290519081900360640190fd5b640100000000600160c01b03602083901b166001600160801b03811160071b81811c6001600160401b03811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c9790881196179094179092171790911717176080811061312f57607f810383901c9150613139565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c600160381b161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b1461333657886001600160a01b031661331a82612630565b6001600160a01b0316111561332f5781613331565b805b613338565b815b9998505050505050505050565b6001600160a01b038516613358576134f2565b60006001600160a01b03861663a991dd8b866133748787614512565b6040518363ffffffff1660e01b8152600401613391929190615c9a565b602060405180830381600087803b1580156133ab57600080fd5b505af11580156133bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e391906154a4565b905062ffffff81166133f557506134f2565b6133fe81613dbd565b9050600080866060015113905060008161341c578560200151613425565b85602001516000035b9050600061343c8262ffffff8616620f42406141d3565b60208801805182019052905082156134a05787604001511561347b5784546001600160801b03600160801b80830482168401821602911617855561349b565b84546001600160801b038082168301166001600160801b03199091161785555b6134ed565b8760400151156134ce5784546001600160801b038082168301166001600160801b03199091161785556134ed565b84546001600160801b03600160801b8083048216840182160291161785555b505050505b5050505050565b6000806000898961ffff1661ffff811061350f57fe5b60408051608081018252919092015463ffffffff808216808452600160201b8304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508916141561357e5788859250925050612db6565b8461ffff168461ffff1611801561359f57506001850361ffff168961ffff16145b156135ac578391506135b0565b8491505b8161ffff168960010161ffff16816135c457fe5b0692506135d381898989614275565b8a8461ffff1661ffff81106135e457fe5b825191018054602084015160408501516060909501511515600160f81b026001600160f81b036001600160a01b03909616600160581b027fff0000000000000000000000000000000000000000ffffffffffffffffffffff60069390930b66ffffffffffffff16600160201b026affffffffffffff000000001963ffffffff90971663ffffffff199095169490941795909516929092171692909217929092161790555097509795505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b602083106137105780518252601f1990920191602091820191016136f1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613772576040519150601f19603f3d011682016040523d82523d6000602084013e613777565b606091505b50915091508180156137a55750805115806137a557508080602001905160208110156137a257600080fd5b50515b6134f2576040805162461bcd60e51b81526020600482015260026024820152612a2360f11b604482015290519081900360640190fd5b6001546040516370a0823160e01b81526000916001600160a01b0316906370a082319061380c903090600401615795565b60206040518083038186803b15801561382457600080fd5b505afa158015613838573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217691906154c0565b808201828110156106a757600080fd5b6002546040516370a0823160e01b81526000916001600160a01b0316906370a082319061380c903090600401615795565b6000816001600160801b0316608084901b816138b557fe5b049392505050565b6006546040805180820190915260038152624c4f4b60e81b60208201526138ee91600160e81b900460ff169061238d565b6006805460ff60e81b19169055565b600c546001600160801b031680156139705761392784600160801b836001600160801b0316613f71565b60098054909101905561394465ffffffffffff838503168261389d565b6201001080546001600160a01b031981166001600160a01b039182169390930116919091179055613979565b600b8054850190555b5050600c805465ffffffffffff909216600160801b0265ffffffffffff60801b1990921691909117905550565b6006805460ff60e81b1916600160e81b179055565b6004805460408051808201909152918252631393919560e21b6020830152612e84916001600160a01b0390911633149061238d565b6001546002546040516309426dd160e41b8152600092839273000000000000000000000000000000000000000092639426dd1092613a4f926010928e928e928e928e928e928e926001600160a01b039283169290911690600401615914565b604080518083038186803b158015613a6657600080fd5b505af4158015613a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a9e919061541e565b91509150965096945050505050565b613ab5614a9e565b5060408051610160810182526001600160a01b039485168152600293840b602082015291830b90820152600d546001600160801b038082166060840152600160801b90910416608082015260075460a082015260085460c082015260095460e0820152600354909216610100830152600c54600160b01b9004810b900b610120820152600061014082015290565b6000806000613b53848888613aad565b6001600160801b0386166101408201526040516377998a5760e01b815290915060009081908190730000000000000000000000000000000000000000906377998a5790613bb390601090600e90600f906011906006908c906004016159be565b60606040518083038186803b158015613bcb57600080fd5b505af4158015613bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c03919061544c565b600d80546001600160801b0319166001600160801b0394909416939093179092559b909a5098505050505050505050565b60608060008361ffff1611613c74576040805162461bcd60e51b81526020600482015260016024820152604960f81b604482015290519081900360640190fd5b86516001600160401b0381118015613c8b57600080fd5b50604051908082528060200260200182016040528015613cb5578160200160208202803683370190505b50915086516001600160401b0381118015613ccf57600080fd5b50604051908082528060200260200182016040528015613cf9578160200160208202803683370190505b50905060005b8751811015613d7f57613d2a8a8a8a8481518110613d1957fe5b60200260200101518a8a8a8a612c30565b848381518110613d3657fe5b60200260200101848481518110613d4957fe5b60200260200101826001600160a01b03166001600160a01b03168152508260060b60060b81525050508080600101915050613cff565b5097509795505050505050565b6003546040805180820190915260028152614e4760f01b6020820152612e84916001600160a01b031633149061238d565b6000620186a062ffffff8316106113a857620186a061227e565b60020b600881901d9161010090910790565b6000808211613df757600080fd5b600160801b8210613e0a57608091821c91015b680100000000000000008210613e2257604091821c91015b600160201b8210613e3557602091821c91015b620100008210613e4757601091821c91015b6101008210613e5857600891821c91015b60108210613e6857600491821c91015b60048210613e7857600291821c91015b6002821061228157600101919050565b6000808211613e9657600080fd5b5060ff6001600160801b03821615613eb157607f1901613eb9565b608082901c91505b6001600160401b03821615613ed157603f1901613ed9565b604082901c91505b63ffffffff821615613eee57601f1901613ef6565b602082901c91505b61ffff821615613f0957600f1901613f11565b601082901c91505b60ff821615613f235760071901613f2b565b600882901c91505b600f821615613f3d5760031901613f45565b600482901c91505b6003821615613f575760011901613f5f565b600282901c91505b60018216156122815760001901919050565b6000808060001985870986860292508281109083900303905080613fa75760008411613f9c57600080fd5b508290049050611ebe565b808411613fb357600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b6000836001600160a01b0316856001600160a01b03161115614040579293925b8161406d57614068836001600160801b03168686036001600160a01b0316600160601b613f71565b6124e3565b6124e3836001600160801b03168686036001600160a01b0316600160601b6141d3565b6000836001600160a01b0316856001600160a01b031611156140b0579293925b600160601b600160e01b03606084901b166001600160a01b0386860381169087166140da57600080fd5b8361410a57866001600160a01b03166140fd8383896001600160a01b0316613f71565b8161410457fe5b04614130565b6141306141218383896001600160a01b03166141d3565b886001600160a01b03166145cc565b979650505050505050565b600080856001600160a01b03161161415257600080fd5b6000846001600160801b03161161416857600080fd5b8161417a5761406885858560016145d7565b6124e385858560016146b0565b600080856001600160a01b03161161419e57600080fd5b6000846001600160801b0316116141b457600080fd5b816141c65761406885858560006146b0565b6124e385858560006145d7565b60006141e0848484613f71565b9050600082806141ec57fe5b8486091115611ebe57600019811061420357600080fd5b6001019392505050565b600080600061422c8561421e6120f5565b62ffffff16620f42406141d3565b94859003959390940193505050565b60008061425b85846001600160801b0316866001600160801b03166141d3565b90506142698186038261420d565b90969095509350505050565b61427d614afa565b600085600001518503905060405180608001604052808663ffffffff1681526020018263ffffffff168660020b0288602001510160060b81526020016000856001600160801b0316116142d15760016142d3565b845b6001600160801b031663ffffffff60801b608085901b16816142f157fe5b048860400151016001600160a01b0316815260200160011515815250915050949350505050565b614320614afa565b614328614afa565b888561ffff1661ffff811061433957fe5b60408051608081018252919092015463ffffffff8116808352600160201b8204600690810b810b900b6020840152600160581b82046001600160a01b031693830193909352600160f81b900460ff1615156060820152925061439d90899089614793565b156143d5578663ffffffff16826000015163ffffffff1614156143bf57612db6565b816143cc83898988614275565b91509150612db6565b888361ffff168660010161ffff16816143ea57fe5b0661ffff1661ffff81106143fa57fe5b60408051608081018252929091015463ffffffff81168352600160201b8104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082018190529092506144af57604080516080810182528a5463ffffffff81168252600160201b8104600690810b810b900b6020830152600160581b81046001600160a01b031692820192909252600160f81b90910460ff161515606082015291505b6144be88836000015189614793565b6144f5576040805162461bcd60e51b815260206004820152600360248201526213d31160ea1b604482015290519081900360640190fd5b6145028989898887614854565b9150915097509795505050505050565b61451a614a9e565b6040518061016001604052808460000151815260200184602001518152602001846080015162ffffff1681526020018460a00151151581526020018460c0015181526020018460e001516001600160801b031681526020018461010001516001600160801b031681526020018461012001516001600160801b03168152602001836060015160060b815260200183608001516001600160a01b031681526020018360a001511515815250905092915050565b808204910615150190565b600081156146425760006001600160a01b0384111561460d5761460884600160601b876001600160801b0316613f71565b614625565b6001600160801b038516606085901b8161462357fe5b045b905061245d61463d6001600160a01b0388168361385c565b6149f2565b60006001600160a01b038411156146705761466b84600160601b876001600160801b03166141d3565b614687565b614687606085901b6001600160801b0387166145cc565b905080866001600160a01b03161161469e57600080fd5b6001600160a01b0386160390506124e6565b6000826146be5750836124e6565b600160601b600160e01b03606085901b16821561474c576001600160a01b038616848102908582816146ec57fe5b04141561471d5781810182811061471b5761471183896001600160a01b0316836141d3565b93505050506124e6565b505b6147438261473e878a6001600160a01b0316868161473757fe5b049061385c565b6145cc565b925050506124e6565b6001600160a01b0386168481029085828161476357fe5b0414801561477057508082115b61477957600080fd5b80820361471161463d846001600160a01b038b16846141d3565b60008363ffffffff168363ffffffff16111580156147bd57508363ffffffff168263ffffffff1611155b156147d9578163ffffffff168363ffffffff1611159050611ebe565b60008463ffffffff168463ffffffff1611614800578363ffffffff16600160201b01614808565b8363ffffffff165b64ffffffffff16905060008563ffffffff168463ffffffff1611614838578363ffffffff16600160201b01614840565b8363ffffffff165b64ffffffffff169091111595945050505050565b61485c614afa565b614864614afa565b60008361ffff168560010161ffff168161487a57fe5b0661ffff169050600060018561ffff16830103905060005b506002818301048961ffff871682816148a757fe5b0661ffff81106148b357fe5b60408051608081018252929091015463ffffffff81168352600160201b8104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b9091041615156060820181905290955061491d57806001019250614892565b898661ffff16826001018161492e57fe5b0661ffff811061493a57fe5b60408051608081018252929091015463ffffffff81168352600160201b8104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082015285519094506000906149a4908b908b614793565b90508080156149bd57506149bd8a8a8760000151614793565b156149c857506149e5565b806149d8576001820392506149df565b8160010193505b50614892565b5050509550959350505050565b806001600160a01b038116811461228157600080fd5b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b604080516101008101825260008082526020820181905291810182905260608082018390526080820183905260a082015260c0810182905260e081019190915290565b604080518082019091526000808252602082015290565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b803561228181615e7b565b8035801515811461228157600080fd5b60008083601f840112614b4d578182fd5b5081356001600160401b03811115614b63578182fd5b602083019150836020828501011115611c4857600080fd5b600082601f830112614b8b578081fd5b81356001600160401b03811115614b9e57fe5b614bb1601f8201601f1916602001615e58565b818152846020838601011115614bc5578283fd5b816020850160208301379081016020019190915292915050565b8035600281900b811461228157600080fd5b803561228181615e90565b6000610100808385031215614c0f578182fd5b614c1881615e58565b915050614c2482614b21565b8152614c3260208301614b21565b6020820152614c4360408301614b2c565b604082015260608201356060820152614c5e60808301614b21565b608082015260a08201356001600160401b03811115614c7c57600080fd5b614c8884828501614b7b565b60a083015250614c9a60c08301614b21565b60c0820152614cab60e08301614bdf565b60e082015292915050565b803561228181615e9f565b803561228181615eb4565b600060208284031215614cdd578081fd5b8135611ebe81615e7b565b600060208284031215614cf9578081fd5b8151611ebe81615e7b565b60008060408385031215614d16578081fd5b8235614d2181615e7b565b91506020830135614d3181615e7b565b809150509250929050565b60008060008060008060c08789031215614d54578182fd5b8635614d5f81615e7b565b95506020870135614d6f81615e7b565b94506040870135614d7f81615e7b565b9350614d8d60608801614bdf565b92506080870135614d9d81615e7b565b915060a0870135614dad81615e7b565b809150509295509295509295565b60008060008060008060a08789031215614dd3578384fd5b8635614dde81615e7b565b9550614dec60208801614b2c565b9450604087013593506060870135614e0381615e7b565b925060808701356001600160401b03811115614e1d578283fd5b614e2989828a01614b3c565b979a9699509497509295939492505050565b60008060008060008060a08789031215614e53578384fd5b8635614e5e81615e7b565b9550614e6c60208801614bdf565b9450614e7a60408801614bdf565b93506060870135614e0381615e9f565b600080600080600060a08688031215614ea1578283fd5b8535614eac81615e7b565b9450614eba60208701614bdf565b9350614ec860408701614bdf565b92506060860135614ed881615e9f565b91506080860135614ee881615e9f565b809150509295509295909350565b60008060008060008060c08789031215614f0e578384fd5b8635614f1981615e7b565b9550614f2760208801614bdf565b9450614f3560408801614bdf565b93506060870135614f4581615e9f565b92506080870135614d9d81615e9f565b600080600080600060808688031215614f6c578283fd5b8535614f7781615e7b565b9450602086013593506040860135925060608601356001600160401b03811115614f9f578182fd5b614fab88828901614b3c565b969995985093965092949392505050565b60008060208385031215614fce578182fd5b82356001600160401b0380821115614fe4578384fd5b818501915085601f830112614ff7578384fd5b813581811115615005578485fd5b8660208083028501011115615018578485fd5b60209290920196919550909350505050565b60006020828403121561503b578081fd5b5035919050565b600080600060608486031215615056578081fd5b833580600f0b8114615066578182fd5b925061507460208501614bdf565b915061508260408501614bdf565b90509250925092565b60006020828403121561509c578081fd5b81358060010b8114611ebe578182fd5b6000602082840312156150bd578081fd5b6106a482614bdf565b600080604083850312156150d8578182fd5b6150e183614bdf565b91506150ef60208401614bdf565b90509250929050565b60008060006060848603121561510c578081fd5b61511584614bdf565b925061512360208501614bdf565b9150604084013561513381615e9f565b809150509250925092565b60008060008060808587031215615153578182fd5b61515c85614bdf565b935061516a60208601614bdf565b9250604085013561517a81615e9f565b9150606085013561518a81615e7b565b939692955090935050565b6000806000606084860312156151a9578081fd5b6151b284614bdf565b92506151c060208501614bdf565b9150604084013590509250925092565b6000806000606084860312156151e4578081fd5b83516151ef81615e90565b602085015190935061520081615e7b565b604085015190925063ffffffff81168114615133578182fd5b60006020828403121561522a578081fd5b81356001600160401b0380821115615240578283fd5b9083019060a08286031215615253578283fd5b60405160a08101818110838211171561526857fe5b60405261527483614b21565b815261528260208401614b21565b602082015260408301356040820152606083013560608201526080830135828111156152ac578485fd5b6152b887828601614b7b565b60808301525095945050505050565b6000602082840312156152d8578081fd5b81356001600160401b038111156152ed578182fd5b6124e684828501614bfc565b60008082840361018081121561530d578283fd5b83356001600160401b03811115615322578384fd5b61532e86828701614bfc565b93505061016080601f1983011215615344578283fd5b61534d81615e58565b9150602085013582526040850135602083015261536c60608601614cc1565b604083015261537d60808601614b2c565b606083015260a0850135608083015261539860c08601614cb6565b60a08301526153a960e08601614cb6565b60c08301526101006153bc818701614cb6565b60e08401526101206153cf818801614bf1565b8285015261014091506153e3828801614b21565b908401526153f2868301614b2c565b9083015250919491935090915050565b600060208284031215615413578081fd5b8151611ebe81615e9f565b60008060408385031215615430578182fd5b825161543b81615e9f565b6020840151909250614d3181615e9f565b600080600060608486031215615460578081fd5b835161546b81615e9f565b602085015160409095015190969495509392505050565b600060208284031215615493578081fd5b813561ffff81168114611ebe578182fd5b6000602082840312156154b5578081fd5b8151611ebe81615eb4565b6000602082840312156154d1578081fd5b5051919050565b600080604083850312156154ea578182fd5b505080516020909101519092909150565b6001600160a01b03169052565b15159052565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452815b8181101561555d57602081850181015186830182015201615541565b8181111561556e5782602083870101525b50601f01601f19169290920160200192915050565b60020b9052565b60060b9052565b805182526020810151602083015260408101516155b1604084018261578c565b5060608101516155c46060840182615508565b506080810151608083015260a08101516155e160a084018261577f565b5060c08101516155f460c084018261577f565b5060e081015161560760e084018261577f565b506101008082015161561b8285018261558a565b505061012080820151615630828501826154fb565b505061014080820151611d6782850182615508565b6156508282516154fb565b60208101516156626020840182615583565b5060408101516156756040840182615583565b506060810151615688606084018261577f565b50608081015161569b608084018261577f565b5060a081015160a083015260c081015160c083015260e081015160e0830152610100808201516156cd828501826154fb565b5050610120808201516156e282850182615583565b505061014080820151611d678285018261577f565b600061010060018060a01b03808451168552806020850151166020860152604084015115156040860152606084015160608601528060808501511660808601525060a08301518160a086015261574f82860182615538565b91505060c083015161576460c08601826154fb565b5060e083015161577760e0860182615583565b509392505050565b6001600160801b03169052565b62ffffff169052565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b604080825283519082018190526000906020906060840190828701845b828110156157ff57815160060b845292840192908401906001016157e0565b50505083810382850152845180825285830191830190845b8181101561583c5783516001600160a01b031683529284019291840191600101615817565b5090979650505050505050565b928352602083019190915261ffff16604082015260600190565b90815260200190565b60029190910b815260200190565b918252602082015260400190565b6000858252846020830152606060408301526158a860608301848661550e565b9695505050505050565b94855260208501939093526001600160a01b039190911660408401526001600160801b0316606083015260020b608082015260a00190565b60069390930b83526001600160a01b0391909116602083015263ffffffff16604082015260600190565b9889526001600160a01b0397881660208a0152600296870b60408a01529490950b60608801526001600160801b039283166080880152911660a0860152831660c085015290821660e0840152166101008201526101200190565b98895260208901979097526001600160a01b03959095166040880152600293840b606088015291830b608087015290910b60a0850152600f0b60c084015260e08301526101008201526101200190565b60006102008201905087825286602083015285604083015284606083015283608083015261413060a0830184615645565b9788526020880196909652600294850b604088015292840b6060870152920b608085015261ffff91821660a08501521660c08301526001600160801b031660e08201526101000190565b958652600294850b602087015292840b6040860152920b6060840152608083019190915260a082015260c00190565b6000602082526106a46020830184615538565b60006060825260018060a01b03808651166060840152806020870151166080840152604086015160a0840152606086015160c0840152608086015160a060e0850152615acb610100850182615538565b959091166020840152505060029190910b604090910152919050565b9384526001600160a01b039283166020850152908216604084015216606082015260800190565b600061016086835260018060a01b0386511660208401526020860151615b3760408501826154fb565b506040860151615b4a60608501826154fb565b506060860151615b5d6080850182615583565b506080860151615b7060a085018261577f565b5060a0860151615b8360c085018261577f565b5060c0860151615b9660e08501826154fb565b5060e0860151610100818186015280880151610120860152505080610140840152614130818401858761550e565b6000610200615bd3838b615645565b610160830189905261018083018890526001600160a01b038781166101a085015286166101c08401526101e08301819052615c11818401858761550e565b9a9950505050505050505050565b94855260208501939093526001600160a01b03919091166040840152600290810b60608401520b608082015260a00190565b6000602082526106a460208301846156f7565b600060608252615c7760608301866156f7565b6001600160a01b039490941660208301525060029190910b604090910152919050565b6000610180808352615cae818401866156f7565b915050611ebe6020830184615591565b60006101a0808352615cd2818401876156f7565b915050615ce26020830185615591565b6001600160a01b0392909216610180919091015292915050565b6001600160801b0391909116815260200190565b6001600160801b039a909a168a52600f98890b60208b01529690970b60408901526060880194909452608087019290925260a086015260060b60c08501526001600160a01b031660e084015263ffffffff90911661010083015215156101208201526101400190565b6001600160801b0392831681529116602082015260400190565b6001600160801b0395861681526020810194909452604084019290925283166060830152909116608082015260a00190565b6001600160a01b0396909616865260029490940b602086015261ffff92831660408601529082166060850152166080830152151560a082015260c00190565b62ffffff91909116815260200190565b63ffffffff94909416845260069290920b60208401526001600160a01b031660408301521515606082015260800190565b65ffffffffffff91909116815260200190565b6040518181016001600160401b0381118282101715615e7357fe5b604052919050565b6001600160a01b038116811461178d57600080fd5b8060060b811461178d57600080fd5b6001600160801b038116811461178d57600080fd5b62ffffff8116811461178d57600080fdfea2646970667358221220a469918fd754a61268a102489254f65c850a135863b7cb2abe1c81001a04ce3664736f6c63430007060033","sourceMap":"968:31805:0:-:0;;;;;;;;;;;;;;;;;;;","linkReferences":{"contracts/core/libraries/CLPoolNonSwapPath.sol":{"CLPoolNonSwapPath":[{"start":1601,"length":20},{"start":5113,"length":20},{"start":5597,"length":20},{"start":5960,"length":20},{"start":6231,"length":20},{"start":6413,"length":20},{"start":6756,"length":20},{"start":7408,"length":20},{"start":7602,"length":20},{"start":7762,"length":20},{"start":8096,"length":20},{"start":8294,"length":20},{"start":8722,"length":20},{"start":8893,"length":20},{"start":14891,"length":20},{"start":15261,"length":20}]}}},"deployedBytecode":{"object":"608060405234801561001057600080fd5b506004361061029f5760003560e01c80636f89244c11610167578063b64cc67b116100ce578063e8bfe65c11610087578063e8bfe65c14610595578063eb4ad999146105a8578063f1e663a9146105bb578063f3058399146105c3578063f30dba93146105cb578063fe0106d5146105f45761029f565b8063b64cc67b1461054b578063c45a015514610553578063d0b06f5d1461055b578063d0c93a7c14610570578063d21220a714610585578063ddca3f431461058d5761029f565b8063a16368c911610120578063a16368c9146104e0578063a34123a7146104f3578063a38807f214610506578063a480ca7914610528578063a6f19c841461053b578063b056b49a146105435761029f565b80636f89244c1461047657806370cf754a14610489578063883bdbfd146104915780638f50914d146104b2578063918f8674146104c557806396518d4a146104cd5761029f565b80633850c7bd1161020b578063490e6cbc116101c4578063490e6cbc146104095780634f1eb3d81461041c578063514ea4bf1461042f5780635339c2961461045357806357806ada14610466578063648da8591461046e5761029f565b80633850c7bd146103af5780633ab04b20146103c95780633bf0c9fb146103d15780633c8a7d8d146103d957806346141319146103ec57806347ccca02146104015761029f565b80631f7c35681161025d5780631f7c3568146103285780632071d8841461033d578063252c09d714610350578063293833ba14610373578063313383741461038957806332148f671461039c5761029f565b8062d0139a146102a4578063044078e1146102c25780630dfe1681146102e2578063128acb08146102ea578063171852be1461030b5780631a68650214610313575b600080fd5b6102ac6105fc565b6040516102b99190615795565b60405180910390f35b6102d56102d03660046152f9565b61060d565b6040516102b99190615e04565b6102ac6106ad565b6102fd6102f8366004614dbb565b6106bc565b6040516102b992919061587a565b6102ac611362565b61031b6113ac565b6040516102b99190615cfc565b61033b610336366004614d04565b6113bb565b005b61033b61034b366004614d3c565b611522565b61036361035e36600461502a565b611678565b6040516102b99493929190615e14565b61037b6116bd565b6040516102b9929190615d79565b61037b610397366004614ef6565b6116d7565b61033b6103aa366004615482565b611710565b6103b7611790565b6040516102b996959493929190615dc5565b61031b6117d7565b6102ac6117e6565b6102fd6103e7366004614e3b565b6117f5565b6103f46119a0565b6040516102b99190615863565b6102ac6119a6565b61033b610417366004614f55565b6119b5565b61037b61042a366004614e8a565b611af4565b61044261043d36600461502a565b611b24565b6040516102b9959493929190615d93565b6103f461046136600461508b565b611b61565b6103f4611b73565b6103f4611b79565b6102fd61048436600461513e565b611b82565b61031b611bb7565b6104a461049f366004614fbc565b611bcd565b6040516102b99291906157c3565b61033b6104c0366004615042565b611c4f565b6103f4611d6d565b6102fd6104db3660046150c6565b611d74565b6103f46104ee366004615195565b611e19565b6102fd6105013660046150f8565b611ec5565b6105196105143660046150c6565b611ef1565b6040516102b9939291906158ea565b61037b610536366004614ccc565b61201d565b6102ac6120e0565b6103f46120ef565b6102d56120f5565b6102ac61217c565b61056361218b565b6040516102b99190615e45565b6105786121a0565b6040516102b9919061586c565b6102ac6121b0565b6102d56121bf565b6102d56105a3366004615219565b6121db565b6102d56105b63660046152c7565b612286565b6103f46122d9565b6103f46122e0565b6105de6105d93660046150ac565b6122e6565b6040516102b99a99989796959493929190615d10565b6103f4612360565b62010010546001600160a01b031681565b60008054604051631465b7d360e21b815273000000000000000000000000000000000000000091635196df4c9161065491879187916001600160a01b031690600401615cbe565b60206040518083038186803b15801561066c57600080fd5b505af4158015610680573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a491906154a4565b90505b92915050565b6001546001600160a01b031681565b6000806106e7866000141560405180604001604052806002815260200161415360f01b81525061238d565b6040805160c0810182526006546001600160a01b0381168252600160a01b8104600290810b810b900b602080840191909152600160b81b820461ffff90811684860152600160c81b830481166060850152600160d81b8304166080840152600160e81b90910460ff16151560a08301819052835180850190945260038452624c4f4b60e81b91840191909152909161077f919061238d565b610820886107cd5781600001516001600160a01b0316876001600160a01b03161180156107c8575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038816105b6107ff565b81600001516001600160a01b0316876001600160a01b03161080156107ff57506401000276a36001600160a01b038816115b6040518060400160405280600381526020016214d41360ea1b81525061238d565b6006805460ff60e81b191690556040805160e081018252600d546001600160801b039081168252600c541660208201524263ffffffff16818301526000606082018190526080820181905260a082018190528054925163d8f7529960e01b8152909260c08301916001600160a01b039091169063d8f75299906108a7903090600401615795565b60206040518083038186803b1580156108bf57600080fd5b505afa1580156108d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f79190614ce8565b6001600160a01b031681525090506000808913905060006040518061014001604052808b81526020016000815260200185600001516001600160a01b03168152602001856020015160020b8152602001600062ffffff1681526020016000151581526020018c6109695760085461096d565b6007545b815260200160006001600160801b0316815260200184600001516001600160801b0316815260200184602001516001600160801b03168152509050610a73604051806101000160405280336001600160a01b031681526020018e6001600160a01b031681526020018d151581526020018c81526020018b6001600160a01b031681526020018a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250938552505088516001600160a01b039081166020808601919091528a0151600290810b6040909501949094529154600c5460c08a0151841695949190931692600160b01b9004900b90506123b5565b62ffffff1660808201525b805115801590610aa45750886001600160a01b031681604001516001600160a01b031614155b15610e7157610ab1614a08565b60408201516001600160a01b031681526060820151600c54610ae091600f91600160b01b900460020b8f6124ee565b15156040830152600290810b810b60208301819052620d89e719910b1215610b1157620d89e7196020820152610b30565b6020810151620d89e860029190910b1315610b3057620d89e860208201525b610b3d8160200151612630565b6001600160a01b031660608201526040820151610bb3908d610b77578b6001600160a01b031683606001516001600160a01b031611610b91565b8b6001600160a01b031683606001516001600160a01b0316105b610b9f578260600151610ba1565b8b5b61010085015185516080870151612961565b60c085015260a084015260808301526001600160a01b031660408301528215610c1557610be98160c00151826080015101612b53565b825103825260a0810151610c0b90610c0090612b53565b602084015190612b65565b6020830152610c50565b610c228160a00151612b53565b825101825260c08101516080820151610c4a91610c3f9101612b53565b602084015190612b7b565b60208301525b6101008201516001600160801b031615610ca457600080610c808360c00151856101000151866101200151612b91565b60c0860180519290920190915260e0850180519091016001600160801b0316905250505b80606001516001600160a01b031682604001516001600160a01b03161415610e3057806040015115610e07578360a00151610d2e57610d0c846040015160008760200151886040015188600001518a606001516011612c30909695949392919063ffffffff16565b6001600160a01b03166080860152600690810b900b6060850152600160a08501525b8160a00151610d4757610d3f612dc2565b600160a08301525b6000610d9782602001518e610d5e57600754610d64565b8460c001515b8f610d73578560c00151610d77565b6008545b608089015160608a015160408b0151600954600e96959493929190612e86565b90508c15610dbf5780516000908103600f90810b810b8352602083018051909203810b900b90525b610dd28361010001518260000151612f75565b6001600160801b03166101008401526101208301516020820151610df69190612f75565b6001600160801b0316610120840152505b8b610e16578060200151610e1f565b60018160200151035b600290810b900b6060830152610e6b565b80600001516001600160a01b031682604001516001600160a01b031614610e6b57610e5e826040015161302b565b600290810b900b60608301525b50610a7e565b610f27604051806101000160405280336001600160a01b031681526020018e6001600160a01b031681526020018d151581526020018c81526020018b6001600160a01b031681526020018a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506040808501516001600160a01b039081166020840152606086015160020b919092015260c086015116908386600a613345565b836020015160020b816060015160020b14610ff557600080610f7586604001518660400151886020015188600001518a606001518b6080015160116134f9909695949392919063ffffffff16565b604085015160608601516006805461ffff60c81b1916600160c81b61ffff958616021761ffff60b81b1916600160b81b95909416949094029290921762ffffff60a01b1916600160a01b62ffffff60029490940b9390931692909202919091176001600160a01b0319166001600160a01b039091161790555061101a9050565b6040810151600680546001600160a01b0319166001600160a01b039092169190911790555b8061010001516001600160801b031683600001516001600160801b03161461106257610100810151600d80546001600160801b0319166001600160801b039092169190911790555b8061012001516001600160801b031683602001516001600160801b0316146110aa57610120810151600c80546001600160801b0319166001600160801b039092169190911790555b8a156110fa5760c081015160075560e08101516001600160801b0316156110f55760e0810151600a80546001600160801b031981166001600160801b03918216909301169190911790555b611140565b60c081015160085560e08101516001600160801b0316156111405760e0810151600a80546001600160801b03808216600160801b92839004821690940116029190911790555b8115158b15151461115957602081015181518b03611166565b80600001518a0381602001515b90965094508a1561123b57600085121561119557600254611195906001600160a01b03168d6000889003613694565b600061119f6137db565b60405163fa461e3360e01b8152909150339063fa461e33906111cb908a908a908e908e90600401615888565b600060405180830381600087803b1580156111e557600080fd5b505af11580156111f9573d6000803e3d6000fd5b505050506112356112086137db565b611212838a61385c565b11156040518060400160405280600381526020016249494160e81b81525061238d565b506112de565b600086121561125f5760015461125f906001600160a01b03168d6000899003613694565b600061126961386c565b60405163fa461e3360e01b8152909150339063fa461e3390611295908a908a908e908e90600401615888565b600060405180830381600087803b1580156112af57600080fd5b505af11580156112c3573d6000803e3d6000fd5b505050506112dc6112d261386c565b611212838961385c565b505b8b6001600160a01b0316336001600160a01b03167fc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca678888856040015186610100015187606001516040516113369594939291906158b2565b60405180910390a350506006805460ff60e81b1916600160e81b17905550919890975095505050505050565b6201001054600c546001600160a01b03909116906001600160801b031680156113a857600c546113a390600160801b900465ffffffffffff1642038261389d565b820191505b5090565b600d546001600160801b031681565b6113c36138bd565b60055460005460405163bc5bde7b60e01b81527300000000000000000000000000000000000000009263bc5bde7b9261140e926001600160a01b0392831692909116906004016157a9565b60006040518083038186803b15801561142657600080fd5b505af415801561143a573d6000803e3d6000fd5b50506003546001600160a01b0316159150611456905057600080fd5b600380546001600160a01b038085166001600160a01b0319928316811790935560048054918516919092161781556040805163f7413fef60e01b815290516000939263f7413fef9280820192602092909182900301818787803b1580156114bc57600080fd5b505af11580156114d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f491906154c0565b90506115158142600c60109054906101000a900465ffffffffffff166138fd565b61151d6139a6565b505050565b6000546001600160a01b031615801561154357506001600160a01b03861615155b61154c57600080fd5b600080546001600160a01b038089166001600160a01b0319928316179092556001805488841690831617905560028054878416908316178155600c80549187900b62ffffff16600160b01b0262ffffff60b01b1990921691909117905560058054928516929091169190911790557300000000000000000000000000000000000000006307219df660066011846115e28161302b565b886040518663ffffffff1660e01b8152600401611603959493929190615c1f565b60206040518083038186803b15801561161b57600080fd5b505af415801561162f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116539190615402565b600d80546001600160801b03928316600160801b029216919091179055505050505050565b60118161ffff811061168957600080fd5b015463ffffffff81169150600160201b810460060b90600160581b81046001600160a01b031690600160f81b900460ff1684565b600a546001600160801b0380821691600160801b90041682565b6000806116e26138bd565b6116ea6139bb565b6116f88888888888886139f0565b90925090506117056139a6565b965096945050505050565b6117186138bd565b604051633c7e0d5560e21b81527300000000000000000000000000000000000000009063f1f8355490611755906011906006908690600401615849565b60006040518083038186803b15801561176d57600080fd5b505af4158015611781573d6000803e3d6000fd5b5050505061178d6139a6565b50565b6006546001600160a01b03811690600160a01b810460020b9061ffff600160b81b8204811691600160c81b8104821691600160d81b8204169060ff600160e81b9091041686565b600c546001600160801b031681565b6005546001600160a01b031681565b6000806118006138bd565b600061180d898989613aad565b6001600160801b03871661014082015260405163025e487960e41b815290915060009081908190730000000000000000000000000000000000000000906325e487909061186d90601090600e90600f906011906006908c906004016159be565b60606040518083038186803b15801561188557600080fd5b505af4158015611899573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bd919061544c565b92509250925082600d60006101000a8154816001600160801b0302191690836001600160801b0316021790555073000000000000000000000000000000000000000063e0ed1c1a858484600160009054906101000a90046001600160a01b0316600260009054906101000a90046001600160a01b03168e8e6040518863ffffffff1660e01b81526004016119579796959493929190615bc4565b60006040518083038186803b15801561196f57600080fd5b505af4158015611983573d6000803e3d6000fd5b5050505061198f6139a6565b909b909a5098505050505050505050565b60085481565b6004546001600160a01b031681565b6119bd6138bd565b60408051610120810182526001546001600160a01b039081168252600280548216602084015260008054831684860152600c54600160b01b8104830b90920b6060850152600d546001600160801b03908116608086015290911660a084015290881660c083015260e082018790526101008201869052915163b79fa2e360e01b815282917300000000000000000000000000000000000000009163b79fa2e391611a7191600a919089908990600401615b0e565b604080518083038186803b158015611a8857600080fd5b505af4158015611a9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac091906154d8565b90925090508115611ad45760078054830190555b8015611ae35760088054820190555b611aeb6139a6565b50505050505050565b600080611aff6138bd565b611b0d8787878787336139f0565b9092509050611b1a6139a6565b9550959350505050565b60106020526000908152604090208054600182015460028301546003909301546001600160801b0392831693919281811691600160801b90041685565b600f6020526000908152604090205481565b60095481565b6110d360f21b81565b600080611b8d6138bd565b611b956139bb565b611ba186868686613b43565b9092509050611bae6139a6565b94509492505050565b600d54600160801b90046001600160801b031681565b606080611c434285858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600654600d54601195949350600160a01b820460020b925061ffff600160b81b83048116926001600160801b0390921691600160c81b900416613c34565b915091505b9250929050565b611c576138bd565b611c5f613d8c565b600654600160a01b9004600290810b9083810b9082900b12801590611c8957508160020b8160020b125b15611ccd57611c96612dc2565b600c54611cac906001600160801b031685612f75565b600c80546001600160801b0319166001600160801b03929092169190911790555b73000000000000000000000000000000000000000063c3846f716010600e600460009054906101000a90046001600160a01b03168787878b6007546008546040518a63ffffffff1660e01b8152600401611d2f9998979695949392919061596e565b60006040518083038186803b158015611d4757600080fd5b505af4158015611d5b573d6000803e3d6000fd5b50505050611d676139a6565b50505050565b620f424081565b60065460075460085460405163b76224fb60e01b815260009384937300000000000000000000000000000000000000009363b76224fb93611dca93600e938b938b93600160a01b90930460020b92600401615a39565b604080518083038186803b158015611de157600080fd5b505af4158015611df5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4391906154d8565b60065460095460405163bf4efc0760e01b81526000927300000000000000000000000000000000000000009263bf4efc0792611e6b92600e928a928a92600160a01b900460020b918a91600401615a39565b60206040518083038186803b158015611e8357600080fd5b505af4158015611e97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebb91906154c0565b90505b9392505050565b600080611ed06138bd565b611edc85858533613b43565b9092509050611ee96139a6565b935093915050565b6040805160c0810182526006546001600160a01b0381168252600160a01b8104600290810b810b900b60208301819052600160b81b820461ffff908116848601819052600160c81b8404821660608601819052600160d81b85049092166080860152600160e81b90930460ff16151560a0850152600d549451633e0d664760e11b815260009586958695909473000000000000000000000000000000000000000094637c1acc8e94611fbf94600e946011948f948f94919390916001600160801b03909116906004016159ef565b60606040518083038186803b158015611fd757600080fd5b505af4158015611feb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200f91906151d0565b935093509350509250925092565b6000806120286138bd565b612030613d8c565b60015460025460405163152245cf60e11b815273000000000000000000000000000000000000000092632a448b9e9261207f92600a9289926001600160a01b0391821692911690600401615ae7565b604080518083038186803b15801561209657600080fd5b505af41580156120aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ce919061541e565b90925090506120db6139a6565b915091565b6003546001600160a01b031681565b600b5481565b600080546040516348cf7a4360e01b81526001600160a01b03909116906348cf7a4390612126903090600401615795565b60206040518083038186803b15801561213e57600080fd5b505afa158015612152573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217691906154a4565b90505b90565b6000546001600160a01b031681565b600c54600160801b900465ffffffffffff1681565b600c54600160b01b900460020b81565b6002546001600160a01b031681565b60006121c9614a44565b3381526121d581612286565b91505090565b60008054600c54604051633082eea360e01b815273000000000000000000000000000000000000000092633082eea39261222e9287926001600160a01b031691600160b01b900460020b90600401615a7b565b60206040518083038186803b15801561224657600080fd5b505af415801561225a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227e91906154a4565b90505b919050565b60008054600c5460405163099f15f760e01b81527300000000000000000000000000000000000000009263099f15f79261222e9287926001600160a01b031691600160b01b900460020b90600401615c64565b620186a081565b60075481565b600e602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160801b03851695600160801b909504600f90810b9594900b9390600681900b90600160381b81046001600160a01b031690600160d81b810463ffffffff1690600160f81b900460ff168a565b600061236a6138bd565b612372613d8c565b61237a612dc2565b600b549050600b600090556121796139a6565b808261151d5760405162461bcd60e51b81526004016123ac9190615a68565b60405180910390fd5b60006001600160a01b0385161561246757604051631a7cd7eb60e31b81526000906001600160a01b0387169063d3e6bf58906123f5908890600401615c51565b602060405180830381600087803b15801561240f57600080fd5b505af1158015612423573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244791906154a4565b905062ffffff8116156124655761245d81613dbd565b9150506124e6565b505b604051631c06e0e160e11b81526001600160a01b0384169063380dc1c29061249390859060040161586c565b60206040518083038186803b1580156124ab57600080fd5b505afa1580156124bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124e391906154a4565b90505b949350505050565b60008060008460020b8660020b8161250257fe5b05905060008660020b12801561252957508460020b8660020b8161252257fe5b0760020b15155b1561253357600019015b83156125a85760008061254583613dd7565b600182810b810b600090815260208d9052604090205460ff83169190911b8001600019019081168015159750929450909250908561258a57888360ff1686030261259d565b8861259482613de9565b840360ff168603025b965050505050612626565b6000806125b783600101613dd7565b91509150600060018260ff166001901b031990506000818b60008660010b60010b815260200190815260200160002054169050806000141595508561260957888360ff0360ff1686600101010261261f565b888361261483613e88565b0360ff168660010101025b9650505050505b5094509492505050565b60008060008360020b12612647578260020b61264f565b8260020b6000035b9050620d89e881111561268d576040805162461bcd60e51b81526020600482015260016024820152601560fa1b604482015290519081900360640190fd5b6000600182166126a157600160801b6126b3565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff16905060028216156126e7576ffff97272373d413259a46990580e213a0260801c5b6004821615612706576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612725576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612744576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612763576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612782576fff2ea16466c96a3843ec78b326b528610260801c5b60808216156127a1576ffe5dee046a99a2a811c461f1969c30530260801c5b6101008216156127c1576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b6102008216156127e1576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612801576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612821576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612841576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612861576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612881576f70d869a156d2a1b890bb3df62baf32f70260801c5b6180008216156128a1576f31be135f97d08fd981231505542fcfa60260801c5b620100008216156128c2576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b620200008216156128e2576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612901576d2216e584f5fa1ea926041bedfe980260801c5b6208000082161561291e576b048a170391f7dc42444e8fa20260801c5b60008460020b131561293957806000198161293557fe5b0490505b600160201b81061561294c57600161294f565b60005b60ff16602082901c0192505050919050565b60008080806001600160a01b03808916908a1610158187128015906129e657600061299a8989620f42400362ffffff16620f4240613f71565b9050826129b3576129ae8c8c8c6001614020565b6129c0565b6129c08b8d8c6001614090565b95508581106129d1578a96506129e0565b6129dd8c8b838661413b565b96505b50612a30565b816129fd576129f88b8b8b6000614090565b612a0a565b612a0a8a8c8b6000614020565b9350838860000310612a1e57899550612a30565b612a2d8b8a8a60000385614187565b95505b6001600160a01b038a8116908716148215612a9357808015612a4f5750815b612a6557612a60878d8c6001614090565b612a67565b855b9550808015612a74575081155b612a8a57612a85878d8c6000614020565b612a8c565b845b9450612add565b808015612a9d5750815b612ab357612aae8c888c6001614020565b612ab5565b855b9550808015612ac2575081155b612ad857612ad38c888c6000614090565b612ada565b845b94505b81158015612aed57508860000385115b15612af9578860000394505b818015612b1857508a6001600160a01b0316876001600160a01b031614155b15612b27578589039350612b44565b612b41868962ffffff168a620f42400362ffffff166141d3565b93505b50505095509550955095915050565b6000600160ff1b82106113a857600080fd5b808203828113156000831215146106a757600080fd5b818101828112156000831215146106a757600080fd5b600080826001600160801b0316846001600160801b03161415612bb5575083611ee9565b6001600160801b038316612bf857600080612bd187600061420d565b91509150612bed82600160801b886001600160801b0316613f71565b93509150611ee99050565b600080612c0687878761423b565b91509150612c2482600160801b8789036001600160801b0316613f71565b97909650945050505050565b60008063ffffffff8716612cd6576000898661ffff1661ffff8110612c5157fe5b60408051608081018252919092015463ffffffff808216808452600160201b8304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508a1614612cc257612cbf818a8988614275565b90505b806020015181604001519250925050612db6565b868803600080612ceb8c8c858c8c8c8c614318565b91509150816000015163ffffffff168363ffffffff161415612d1d578160200151826040015194509450505050612db6565b805163ffffffff84811691161415612d45578060200151816040015194509450505050612db6565b8151815160208085015190840151918390039286039163ffffffff80841692908516910360060b81612d7357fe5b05028460200151018263ffffffff168263ffffffff1686604001518660400151036001600160a01b03160281612da557fe5b048560400151019650965050505050505b97509795505050505050565b600c54429065ffffffffffff600160801b9091048116908216811415612de9575050612e84565b6003546001600160a01b031680612e0257505050612e84565b6000816001600160a01b031663f7413fef6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015612e3f57600080fd5b505af1158015612e53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e7791906154c0565b9050611d678185856138fd565b565b612e8e614a87565b600297880b880b60009081526020998a5260409020978801805490970390965560038701805490950390945560048601805490940390935560058501805463ffffffff600160d81b6001600160a01b03600160381b808504821690970316909502670100000000000000600160d81b031990921691909117600681810b90940390930b66ffffffffffffff1666ffffffffffffff1990931692909217838104831690940390911690910263ffffffff60d81b199092169190911790558154600160801b9004600f90810b810b810b8252600190920154820b820b90910b9181019190915290565b60008082600f0b1215612fda57826001600160801b03168260000384039150816001600160801b031610612fd5576040805162461bcd60e51b81526020600482015260026024820152614c5360f01b604482015290519081900360640190fd5b6106a7565b826001600160801b03168284019150816001600160801b031610156106a7576040805162461bcd60e51b81526020600482015260026024820152614c4160f01b604482015290519081900360640190fd5b60006401000276a36001600160a01b03831610801590613067575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038316105b61309c576040805162461bcd60e51b81526020600482015260016024820152602960f91b604482015290519081900360640190fd5b640100000000600160c01b03602083901b166001600160801b03811160071b81811c6001600160401b03811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c9790881196179094179092171790911717176080811061312f57607f810383901c9150613139565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c600160381b161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b1461333657886001600160a01b031661331a82612630565b6001600160a01b0316111561332f5781613331565b805b613338565b815b9998505050505050505050565b6001600160a01b038516613358576134f2565b60006001600160a01b03861663a991dd8b866133748787614512565b6040518363ffffffff1660e01b8152600401613391929190615c9a565b602060405180830381600087803b1580156133ab57600080fd5b505af11580156133bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e391906154a4565b905062ffffff81166133f557506134f2565b6133fe81613dbd565b9050600080866060015113905060008161341c578560200151613425565b85602001516000035b9050600061343c8262ffffff8616620f42406141d3565b60208801805182019052905082156134a05787604001511561347b5784546001600160801b03600160801b80830482168401821602911617855561349b565b84546001600160801b038082168301166001600160801b03199091161785555b6134ed565b8760400151156134ce5784546001600160801b038082168301166001600160801b03199091161785556134ed565b84546001600160801b03600160801b8083048216840182160291161785555b505050505b5050505050565b6000806000898961ffff1661ffff811061350f57fe5b60408051608081018252919092015463ffffffff808216808452600160201b8304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508916141561357e5788859250925050612db6565b8461ffff168461ffff1611801561359f57506001850361ffff168961ffff16145b156135ac578391506135b0565b8491505b8161ffff168960010161ffff16816135c457fe5b0692506135d381898989614275565b8a8461ffff1661ffff81106135e457fe5b825191018054602084015160408501516060909501511515600160f81b026001600160f81b036001600160a01b03909616600160581b027fff0000000000000000000000000000000000000000ffffffffffffffffffffff60069390930b66ffffffffffffff16600160201b026affffffffffffff000000001963ffffffff90971663ffffffff199095169490941795909516929092171692909217929092161790555097509795505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b602083106137105780518252601f1990920191602091820191016136f1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613772576040519150601f19603f3d011682016040523d82523d6000602084013e613777565b606091505b50915091508180156137a55750805115806137a557508080602001905160208110156137a257600080fd5b50515b6134f2576040805162461bcd60e51b81526020600482015260026024820152612a2360f11b604482015290519081900360640190fd5b6001546040516370a0823160e01b81526000916001600160a01b0316906370a082319061380c903090600401615795565b60206040518083038186803b15801561382457600080fd5b505afa158015613838573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217691906154c0565b808201828110156106a757600080fd5b6002546040516370a0823160e01b81526000916001600160a01b0316906370a082319061380c903090600401615795565b6000816001600160801b0316608084901b816138b557fe5b049392505050565b6006546040805180820190915260038152624c4f4b60e81b60208201526138ee91600160e81b900460ff169061238d565b6006805460ff60e81b19169055565b600c546001600160801b031680156139705761392784600160801b836001600160801b0316613f71565b60098054909101905561394465ffffffffffff838503168261389d565b6201001080546001600160a01b031981166001600160a01b039182169390930116919091179055613979565b600b8054850190555b5050600c805465ffffffffffff909216600160801b0265ffffffffffff60801b1990921691909117905550565b6006805460ff60e81b1916600160e81b179055565b6004805460408051808201909152918252631393919560e21b6020830152612e84916001600160a01b0390911633149061238d565b6001546002546040516309426dd160e41b8152600092839273000000000000000000000000000000000000000092639426dd1092613a4f926010928e928e928e928e928e928e926001600160a01b039283169290911690600401615914565b604080518083038186803b158015613a6657600080fd5b505af4158015613a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a9e919061541e565b91509150965096945050505050565b613ab5614a9e565b5060408051610160810182526001600160a01b039485168152600293840b602082015291830b90820152600d546001600160801b038082166060840152600160801b90910416608082015260075460a082015260085460c082015260095460e0820152600354909216610100830152600c54600160b01b9004810b900b610120820152600061014082015290565b6000806000613b53848888613aad565b6001600160801b0386166101408201526040516377998a5760e01b815290915060009081908190730000000000000000000000000000000000000000906377998a5790613bb390601090600e90600f906011906006908c906004016159be565b60606040518083038186803b158015613bcb57600080fd5b505af4158015613bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c03919061544c565b600d80546001600160801b0319166001600160801b0394909416939093179092559b909a5098505050505050505050565b60608060008361ffff1611613c74576040805162461bcd60e51b81526020600482015260016024820152604960f81b604482015290519081900360640190fd5b86516001600160401b0381118015613c8b57600080fd5b50604051908082528060200260200182016040528015613cb5578160200160208202803683370190505b50915086516001600160401b0381118015613ccf57600080fd5b50604051908082528060200260200182016040528015613cf9578160200160208202803683370190505b50905060005b8751811015613d7f57613d2a8a8a8a8481518110613d1957fe5b60200260200101518a8a8a8a612c30565b848381518110613d3657fe5b60200260200101848481518110613d4957fe5b60200260200101826001600160a01b03166001600160a01b03168152508260060b60060b81525050508080600101915050613cff565b5097509795505050505050565b6003546040805180820190915260028152614e4760f01b6020820152612e84916001600160a01b031633149061238d565b6000620186a062ffffff8316106113a857620186a061227e565b60020b600881901d9161010090910790565b6000808211613df757600080fd5b600160801b8210613e0a57608091821c91015b680100000000000000008210613e2257604091821c91015b600160201b8210613e3557602091821c91015b620100008210613e4757601091821c91015b6101008210613e5857600891821c91015b60108210613e6857600491821c91015b60048210613e7857600291821c91015b6002821061228157600101919050565b6000808211613e9657600080fd5b5060ff6001600160801b03821615613eb157607f1901613eb9565b608082901c91505b6001600160401b03821615613ed157603f1901613ed9565b604082901c91505b63ffffffff821615613eee57601f1901613ef6565b602082901c91505b61ffff821615613f0957600f1901613f11565b601082901c91505b60ff821615613f235760071901613f2b565b600882901c91505b600f821615613f3d5760031901613f45565b600482901c91505b6003821615613f575760011901613f5f565b600282901c91505b60018216156122815760001901919050565b6000808060001985870986860292508281109083900303905080613fa75760008411613f9c57600080fd5b508290049050611ebe565b808411613fb357600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b6000836001600160a01b0316856001600160a01b03161115614040579293925b8161406d57614068836001600160801b03168686036001600160a01b0316600160601b613f71565b6124e3565b6124e3836001600160801b03168686036001600160a01b0316600160601b6141d3565b6000836001600160a01b0316856001600160a01b031611156140b0579293925b600160601b600160e01b03606084901b166001600160a01b0386860381169087166140da57600080fd5b8361410a57866001600160a01b03166140fd8383896001600160a01b0316613f71565b8161410457fe5b04614130565b6141306141218383896001600160a01b03166141d3565b886001600160a01b03166145cc565b979650505050505050565b600080856001600160a01b03161161415257600080fd5b6000846001600160801b03161161416857600080fd5b8161417a5761406885858560016145d7565b6124e385858560016146b0565b600080856001600160a01b03161161419e57600080fd5b6000846001600160801b0316116141b457600080fd5b816141c65761406885858560006146b0565b6124e385858560006145d7565b60006141e0848484613f71565b9050600082806141ec57fe5b8486091115611ebe57600019811061420357600080fd5b6001019392505050565b600080600061422c8561421e6120f5565b62ffffff16620f42406141d3565b94859003959390940193505050565b60008061425b85846001600160801b0316866001600160801b03166141d3565b90506142698186038261420d565b90969095509350505050565b61427d614afa565b600085600001518503905060405180608001604052808663ffffffff1681526020018263ffffffff168660020b0288602001510160060b81526020016000856001600160801b0316116142d15760016142d3565b845b6001600160801b031663ffffffff60801b608085901b16816142f157fe5b048860400151016001600160a01b0316815260200160011515815250915050949350505050565b614320614afa565b614328614afa565b888561ffff1661ffff811061433957fe5b60408051608081018252919092015463ffffffff8116808352600160201b8204600690810b810b900b6020840152600160581b82046001600160a01b031693830193909352600160f81b900460ff1615156060820152925061439d90899089614793565b156143d5578663ffffffff16826000015163ffffffff1614156143bf57612db6565b816143cc83898988614275565b91509150612db6565b888361ffff168660010161ffff16816143ea57fe5b0661ffff1661ffff81106143fa57fe5b60408051608081018252929091015463ffffffff81168352600160201b8104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082018190529092506144af57604080516080810182528a5463ffffffff81168252600160201b8104600690810b810b900b6020830152600160581b81046001600160a01b031692820192909252600160f81b90910460ff161515606082015291505b6144be88836000015189614793565b6144f5576040805162461bcd60e51b815260206004820152600360248201526213d31160ea1b604482015290519081900360640190fd5b6145028989898887614854565b9150915097509795505050505050565b61451a614a9e565b6040518061016001604052808460000151815260200184602001518152602001846080015162ffffff1681526020018460a00151151581526020018460c0015181526020018460e001516001600160801b031681526020018461010001516001600160801b031681526020018461012001516001600160801b03168152602001836060015160060b815260200183608001516001600160a01b031681526020018360a001511515815250905092915050565b808204910615150190565b600081156146425760006001600160a01b0384111561460d5761460884600160601b876001600160801b0316613f71565b614625565b6001600160801b038516606085901b8161462357fe5b045b905061245d61463d6001600160a01b0388168361385c565b6149f2565b60006001600160a01b038411156146705761466b84600160601b876001600160801b03166141d3565b614687565b614687606085901b6001600160801b0387166145cc565b905080866001600160a01b03161161469e57600080fd5b6001600160a01b0386160390506124e6565b6000826146be5750836124e6565b600160601b600160e01b03606085901b16821561474c576001600160a01b038616848102908582816146ec57fe5b04141561471d5781810182811061471b5761471183896001600160a01b0316836141d3565b93505050506124e6565b505b6147438261473e878a6001600160a01b0316868161473757fe5b049061385c565b6145cc565b925050506124e6565b6001600160a01b0386168481029085828161476357fe5b0414801561477057508082115b61477957600080fd5b80820361471161463d846001600160a01b038b16846141d3565b60008363ffffffff168363ffffffff16111580156147bd57508363ffffffff168263ffffffff1611155b156147d9578163ffffffff168363ffffffff1611159050611ebe565b60008463ffffffff168463ffffffff1611614800578363ffffffff16600160201b01614808565b8363ffffffff165b64ffffffffff16905060008563ffffffff168463ffffffff1611614838578363ffffffff16600160201b01614840565b8363ffffffff165b64ffffffffff169091111595945050505050565b61485c614afa565b614864614afa565b60008361ffff168560010161ffff168161487a57fe5b0661ffff169050600060018561ffff16830103905060005b506002818301048961ffff871682816148a757fe5b0661ffff81106148b357fe5b60408051608081018252929091015463ffffffff81168352600160201b8104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b9091041615156060820181905290955061491d57806001019250614892565b898661ffff16826001018161492e57fe5b0661ffff811061493a57fe5b60408051608081018252929091015463ffffffff81168352600160201b8104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082015285519094506000906149a4908b908b614793565b90508080156149bd57506149bd8a8a8760000151614793565b156149c857506149e5565b806149d8576001820392506149df565b8160010193505b50614892565b5050509550959350505050565b806001600160a01b038116811461228157600080fd5b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b604080516101008101825260008082526020820181905291810182905260608082018390526080820183905260a082015260c0810182905260e081019190915290565b604080518082019091526000808252602082015290565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810182905261014081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b803561228181615e7b565b8035801515811461228157600080fd5b60008083601f840112614b4d578182fd5b5081356001600160401b03811115614b63578182fd5b602083019150836020828501011115611c4857600080fd5b600082601f830112614b8b578081fd5b81356001600160401b03811115614b9e57fe5b614bb1601f8201601f1916602001615e58565b818152846020838601011115614bc5578283fd5b816020850160208301379081016020019190915292915050565b8035600281900b811461228157600080fd5b803561228181615e90565b6000610100808385031215614c0f578182fd5b614c1881615e58565b915050614c2482614b21565b8152614c3260208301614b21565b6020820152614c4360408301614b2c565b604082015260608201356060820152614c5e60808301614b21565b608082015260a08201356001600160401b03811115614c7c57600080fd5b614c8884828501614b7b565b60a083015250614c9a60c08301614b21565b60c0820152614cab60e08301614bdf565b60e082015292915050565b803561228181615e9f565b803561228181615eb4565b600060208284031215614cdd578081fd5b8135611ebe81615e7b565b600060208284031215614cf9578081fd5b8151611ebe81615e7b565b60008060408385031215614d16578081fd5b8235614d2181615e7b565b91506020830135614d3181615e7b565b809150509250929050565b60008060008060008060c08789031215614d54578182fd5b8635614d5f81615e7b565b95506020870135614d6f81615e7b565b94506040870135614d7f81615e7b565b9350614d8d60608801614bdf565b92506080870135614d9d81615e7b565b915060a0870135614dad81615e7b565b809150509295509295509295565b60008060008060008060a08789031215614dd3578384fd5b8635614dde81615e7b565b9550614dec60208801614b2c565b9450604087013593506060870135614e0381615e7b565b925060808701356001600160401b03811115614e1d578283fd5b614e2989828a01614b3c565b979a9699509497509295939492505050565b60008060008060008060a08789031215614e53578384fd5b8635614e5e81615e7b565b9550614e6c60208801614bdf565b9450614e7a60408801614bdf565b93506060870135614e0381615e9f565b600080600080600060a08688031215614ea1578283fd5b8535614eac81615e7b565b9450614eba60208701614bdf565b9350614ec860408701614bdf565b92506060860135614ed881615e9f565b91506080860135614ee881615e9f565b809150509295509295909350565b60008060008060008060c08789031215614f0e578384fd5b8635614f1981615e7b565b9550614f2760208801614bdf565b9450614f3560408801614bdf565b93506060870135614f4581615e9f565b92506080870135614d9d81615e9f565b600080600080600060808688031215614f6c578283fd5b8535614f7781615e7b565b9450602086013593506040860135925060608601356001600160401b03811115614f9f578182fd5b614fab88828901614b3c565b969995985093965092949392505050565b60008060208385031215614fce578182fd5b82356001600160401b0380821115614fe4578384fd5b818501915085601f830112614ff7578384fd5b813581811115615005578485fd5b8660208083028501011115615018578485fd5b60209290920196919550909350505050565b60006020828403121561503b578081fd5b5035919050565b600080600060608486031215615056578081fd5b833580600f0b8114615066578182fd5b925061507460208501614bdf565b915061508260408501614bdf565b90509250925092565b60006020828403121561509c578081fd5b81358060010b8114611ebe578182fd5b6000602082840312156150bd578081fd5b6106a482614bdf565b600080604083850312156150d8578182fd5b6150e183614bdf565b91506150ef60208401614bdf565b90509250929050565b60008060006060848603121561510c578081fd5b61511584614bdf565b925061512360208501614bdf565b9150604084013561513381615e9f565b809150509250925092565b60008060008060808587031215615153578182fd5b61515c85614bdf565b935061516a60208601614bdf565b9250604085013561517a81615e9f565b9150606085013561518a81615e7b565b939692955090935050565b6000806000606084860312156151a9578081fd5b6151b284614bdf565b92506151c060208501614bdf565b9150604084013590509250925092565b6000806000606084860312156151e4578081fd5b83516151ef81615e90565b602085015190935061520081615e7b565b604085015190925063ffffffff81168114615133578182fd5b60006020828403121561522a578081fd5b81356001600160401b0380821115615240578283fd5b9083019060a08286031215615253578283fd5b60405160a08101818110838211171561526857fe5b60405261527483614b21565b815261528260208401614b21565b602082015260408301356040820152606083013560608201526080830135828111156152ac578485fd5b6152b887828601614b7b565b60808301525095945050505050565b6000602082840312156152d8578081fd5b81356001600160401b038111156152ed578182fd5b6124e684828501614bfc565b60008082840361018081121561530d578283fd5b83356001600160401b03811115615322578384fd5b61532e86828701614bfc565b93505061016080601f1983011215615344578283fd5b61534d81615e58565b9150602085013582526040850135602083015261536c60608601614cc1565b604083015261537d60808601614b2c565b606083015260a0850135608083015261539860c08601614cb6565b60a08301526153a960e08601614cb6565b60c08301526101006153bc818701614cb6565b60e08401526101206153cf818801614bf1565b8285015261014091506153e3828801614b21565b908401526153f2868301614b2c565b9083015250919491935090915050565b600060208284031215615413578081fd5b8151611ebe81615e9f565b60008060408385031215615430578182fd5b825161543b81615e9f565b6020840151909250614d3181615e9f565b600080600060608486031215615460578081fd5b835161546b81615e9f565b602085015160409095015190969495509392505050565b600060208284031215615493578081fd5b813561ffff81168114611ebe578182fd5b6000602082840312156154b5578081fd5b8151611ebe81615eb4565b6000602082840312156154d1578081fd5b5051919050565b600080604083850312156154ea578182fd5b505080516020909101519092909150565b6001600160a01b03169052565b15159052565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452815b8181101561555d57602081850181015186830182015201615541565b8181111561556e5782602083870101525b50601f01601f19169290920160200192915050565b60020b9052565b60060b9052565b805182526020810151602083015260408101516155b1604084018261578c565b5060608101516155c46060840182615508565b506080810151608083015260a08101516155e160a084018261577f565b5060c08101516155f460c084018261577f565b5060e081015161560760e084018261577f565b506101008082015161561b8285018261558a565b505061012080820151615630828501826154fb565b505061014080820151611d6782850182615508565b6156508282516154fb565b60208101516156626020840182615583565b5060408101516156756040840182615583565b506060810151615688606084018261577f565b50608081015161569b608084018261577f565b5060a081015160a083015260c081015160c083015260e081015160e0830152610100808201516156cd828501826154fb565b5050610120808201516156e282850182615583565b505061014080820151611d678285018261577f565b600061010060018060a01b03808451168552806020850151166020860152604084015115156040860152606084015160608601528060808501511660808601525060a08301518160a086015261574f82860182615538565b91505060c083015161576460c08601826154fb565b5060e083015161577760e0860182615583565b509392505050565b6001600160801b03169052565b62ffffff169052565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b604080825283519082018190526000906020906060840190828701845b828110156157ff57815160060b845292840192908401906001016157e0565b50505083810382850152845180825285830191830190845b8181101561583c5783516001600160a01b031683529284019291840191600101615817565b5090979650505050505050565b928352602083019190915261ffff16604082015260600190565b90815260200190565b60029190910b815260200190565b918252602082015260400190565b6000858252846020830152606060408301526158a860608301848661550e565b9695505050505050565b94855260208501939093526001600160a01b039190911660408401526001600160801b0316606083015260020b608082015260a00190565b60069390930b83526001600160a01b0391909116602083015263ffffffff16604082015260600190565b9889526001600160a01b0397881660208a0152600296870b60408a01529490950b60608801526001600160801b039283166080880152911660a0860152831660c085015290821660e0840152166101008201526101200190565b98895260208901979097526001600160a01b03959095166040880152600293840b606088015291830b608087015290910b60a0850152600f0b60c084015260e08301526101008201526101200190565b60006102008201905087825286602083015285604083015284606083015283608083015261413060a0830184615645565b9788526020880196909652600294850b604088015292840b6060870152920b608085015261ffff91821660a08501521660c08301526001600160801b031660e08201526101000190565b958652600294850b602087015292840b6040860152920b6060840152608083019190915260a082015260c00190565b6000602082526106a46020830184615538565b60006060825260018060a01b03808651166060840152806020870151166080840152604086015160a0840152606086015160c0840152608086015160a060e0850152615acb610100850182615538565b959091166020840152505060029190910b604090910152919050565b9384526001600160a01b039283166020850152908216604084015216606082015260800190565b600061016086835260018060a01b0386511660208401526020860151615b3760408501826154fb565b506040860151615b4a60608501826154fb565b506060860151615b5d6080850182615583565b506080860151615b7060a085018261577f565b5060a0860151615b8360c085018261577f565b5060c0860151615b9660e08501826154fb565b5060e0860151610100818186015280880151610120860152505080610140840152614130818401858761550e565b6000610200615bd3838b615645565b610160830189905261018083018890526001600160a01b038781166101a085015286166101c08401526101e08301819052615c11818401858761550e565b9a9950505050505050505050565b94855260208501939093526001600160a01b03919091166040840152600290810b60608401520b608082015260a00190565b6000602082526106a460208301846156f7565b600060608252615c7760608301866156f7565b6001600160a01b039490941660208301525060029190910b604090910152919050565b6000610180808352615cae818401866156f7565b915050611ebe6020830184615591565b60006101a0808352615cd2818401876156f7565b915050615ce26020830185615591565b6001600160a01b0392909216610180919091015292915050565b6001600160801b0391909116815260200190565b6001600160801b039a909a168a52600f98890b60208b01529690970b60408901526060880194909452608087019290925260a086015260060b60c08501526001600160a01b031660e084015263ffffffff90911661010083015215156101208201526101400190565b6001600160801b0392831681529116602082015260400190565b6001600160801b0395861681526020810194909452604084019290925283166060830152909116608082015260a00190565b6001600160a01b0396909616865260029490940b602086015261ffff92831660408601529082166060850152166080830152151560a082015260c00190565b62ffffff91909116815260200190565b63ffffffff94909416845260069290920b60208401526001600160a01b031660408301521515606082015260800190565b65ffffffffffff91909116815260200190565b6040518181016001600160401b0381118282101715615e7357fe5b604052919050565b6001600160a01b038116811461178d57600080fd5b8060060b811461178d57600080fd5b6001600160801b038116811461178d57600080fd5b62ffffff8116811461178d57600080fdfea2646970667358221220a469918fd754a61268a102489254f65c850a135863b7cb2abe1c81001a04ce3664736f6c63430007060033","sourceMap":"968:31805:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3628:63;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5745:239;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1503:30::-;;;:::i;16081:9095::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;8460:360::-;;;:::i;3121:33::-;;;:::i;:::-;;;;;;;:::i;32109:662::-;;;;;;:::i;:::-;;:::i;:::-;;4963:541;;;;;;:::i;:::-;;:::i;3537:55::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;2766:35::-;;;:::i;:::-;;;;;;;;:::i;11221:513::-;;;;;;:::i;:::-;;:::i;8857:222::-;;;;;;:::i;:::-;;:::i;2345:27::-;;;:::i;:::-;;;;;;;;;;;;:::i;2905:39::-;;;:::i;1775:::-;;;:::i;10023:648::-;;;;;;:::i;:::-;;:::i;2487:44::-;;;:::i;:::-;;;;;;;:::i;1709:27::-;;;:::i;25213:1232::-;;;;;;:::i;:::-;;:::i;10708:476::-;;;;;;:::i;:::-;;:::i;3443:59::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;3356:52::-;;;;;;:::i;:::-;;:::i;2567:46::-;;;:::i;3921:49::-;;;:::i;12459:324::-;;;;;;:::i;:::-;;:::i;3193:43::-;;;:::i;8070:348::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;13313:596::-;;;;;;:::i;:::-;;:::i;3826:56::-;;;:::i;9114:290::-;;;;;;:::i;:::-;;:::i;26480:318::-;;;;;;:::i;:::-;;:::i;12135:287::-;;;;;;:::i;:::-;;:::i;7528:500::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;31841:231::-;;;;;;:::i;:::-;;:::i;1641:29::-;;;:::i;2837:32::-;;;:::i;6507:128::-;;;:::i;1433:31::-;;;:::i;2979:34::-;;;:::i;:::-;;;;;;;:::i;3052:33::-;;;:::i;:::-;;;;;;;:::i;1572:30::-;;;:::i;6291:181::-;;;:::i;6019:171::-;;;;;;:::i;:::-;;:::i;5539:::-;;;;;;:::i;:::-;;:::i;3731:56::-;;;:::i;2408:44::-;;;:::i;3272:49::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;:::i;28746:191::-;;;:::i;3628:63::-;;;-1:-1:-1;;;;;3628:63:0;;:::o;5745:239::-;5903:6;5971:7;;5924:55;;-1:-1:-1;;;5924:55:0;;:2;;:15;;:55;;5940:11;;5953:16;;-1:-1:-1;;;;;5971:7:0;;5924:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5917:62;;5745:239;;;;;:::o;1503:30::-;;;-1:-1:-1;;;;;1503:30:0;;:::o;16081:9095::-;16254:14;16270;16292:36;16301:15;16320:1;16301:20;;16292:36;;;;;;;;;;;;;-1:-1:-1;;;16292:36:0;;;:8;:36::i;:::-;16335:31;;;;;;;;16361:5;16335:31;-1:-1:-1;;;;;16335:31:0;;;;-1:-1:-1;;;16335:31:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16335:31:0;;;;;;;;;;-1:-1:-1;;;16335:31:0;;;;;;;;-1:-1:-1;;;16335:31:0;;;;;;;-1:-1:-1;;;16335:31:0;;;;;;;;;;;;;16373:36;;;;;;;;;;;-1:-1:-1;;;16373:36:0;;;;;;;16335:31;;16373:36;;16335:31;16373:8;:36::i;:::-;16415:247;16431:10;:212;;16573:10;:23;;;-1:-1:-1;;;;;16553:43:0;:17;-1:-1:-1;;;;;16553:43:0;;:90;;;;-1:-1:-1;992:65:29;-1:-1:-1;;;;;16600:43:0;;;16553:90;16431:212;;;16472:10;:23;;;-1:-1:-1;;;;;16452:43:0;:17;-1:-1:-1;;;;;16452:43:0;;:90;;;;-1:-1:-1;813:13:29;-1:-1:-1;;;;;16499:43:0;;;16452:90;16415:247;;;;;;;;;;;;;-1:-1:-1;;;16415:247:0;;;:8;:247::i;:::-;16669:5;:22;;-1:-1:-1;;;;16669:22:0;;;16723:319;;;;;;;;16757:9;;-1:-1:-1;;;;;16757:9:0;;;16723:319;;16796:15;;;16723:319;;;;16842:15;16723:319;;;;;;-1:-1:-1;16723:319:0;;;;;;;;;;;;;;;;;;16996:7;;16985:50;;-1:-1:-1;;;16985:50:0;;-1:-1:-1;;16723:319:0;;;;-1:-1:-1;;;;;16996:7:0;;;;16985:35;;:50;;17029:4;;16985:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;16723:319:0;;;;16698:344;;17049:15;17085:1;17067:15;:19;17049:37;;17093:22;17118:417;;;;;;;;17162:15;17118:417;;;;17203:1;17118:417;;;;17226:10;:23;;;-1:-1:-1;;;;;17118:417:0;;;;;17263:10;:15;;;17118:417;;;;;;17291:1;17118:417;;;;;;17329:5;17118:417;;;;;;17363:10;:56;;17399:20;;17363:56;;;17376:20;;17363:56;17118:417;;;;17437:1;-1:-1:-1;;;;;17118:417:0;;;;;17457:5;:20;;;-1:-1:-1;;;;;17118:417:0;;;;;17502:5;:26;;;-1:-1:-1;;;;;17118:417:0;;;;17093:442;;17554:412;17596:324;;;;;;;;17637:10;-1:-1:-1;;;;;17596:324:0;;;;;17670:9;-1:-1:-1;;;;;17596:324:0;;;;;17703:10;17596:324;;;;;;17742:15;17596:324;;;;17788:17;-1:-1:-1;;;;;17596:324:0;;;;;17823:4;;17596:324;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17596:324:0;;;-1:-1:-1;;17853:23:0;;-1:-1:-1;;;;;17596:324:0;;;;;;;;;;;17894:15;;;17596:324;;;;;;;;;;;;17930:7;;17947:11;;17554:14;;;;:32;;;:412;17930:7;;;;;-1:-1:-1;;;17947:11:0;;;;;-1:-1:-1;17554:32:0;:412::i;:::-;17542:424;;:9;;;:424;18085:4200;18092:30;;:35;;;;:78;;;18153:17;-1:-1:-1;;;;;18131:39:0;:5;:18;;;-1:-1:-1;;;;;18131:39:0;;;18092:78;18085:4200;;;18180:28;;:::i;:::-;18242:18;;;;-1:-1:-1;;;;;18217:43:0;;;18357:10;;;;18369:11;;18313:80;;:10;;-1:-1:-1;;;18369:11:0;;;;18382:10;18313:43;:80::i;:::-;18269:124;;18285:16;;;18269:124;;;;;;;18270:13;;;18269:124;;;-1:-1:-1;;18513:33:0;;;18509:188;;;-1:-1:-1;;18558:13:0;;;:33;18509:188;;;18610:13;;;;637:9:29;18610:33:0;;;;;;18606:91;;;637:9:29;18655:13:0;;;:33;18606:91;18770:42;18798:4;:13;;;18770:27;:42::i;:::-;-1:-1:-1;;;;;18746:66:0;:21;;;:66;19038:18;;;;19004:318;;19067:10;:98;;19148:17;-1:-1:-1;;;;;19124:41:0;:4;:21;;;-1:-1:-1;;;;;19124:41:0;;19067:98;;;19104:17;-1:-1:-1;;;;;19080:41:0;:4;:21;;;-1:-1:-1;;;;;19080:41:0;;19067:98;19066:164;;19209:4;:21;;;19066:164;;;19179:17;19066:164;19240:15;;;;19265:30;;19305:9;;;;19004:24;:318::i;:::-;18986:14;;;18934:388;18970:14;;;18934:388;18955:13;;;18934:388;-1:-1:-1;;;;;18934:388:0;18935:18;;;18934:388;19331:390;;;;19391:43;19408:4;:14;;;19392:4;:13;;;:30;19391:41;:43::i;:::-;19357:77;;;;;19496:14;;;;19469:53;;19496:25;;:23;:25::i;:::-;19469:22;;;;;:26;:53::i;:::-;19444:22;;;:78;19331:390;;;19581:25;:4;:14;;;:23;:25::i;:::-;19547:59;;;;;19685:14;;;;19669:13;;;;19641:71;;19668:43;;19669:30;19668:41;:43::i;:::-;19641:22;;;;;:26;:71::i;:::-;19616:22;;;:96;19331:390;19782:15;;;;-1:-1:-1;;;;;19782:19:0;;19778:295;;19814:28;19844:24;19882:69;19896:4;:14;;;19912:5;:15;;;19929:5;:21;;;19882:13;:69::i;:::-;19962:25;;;:49;;;;;;;;;20021:14;;;:43;;;;;-1:-1:-1;;;;;20021:43:0;;;-1:-1:-1;;19778:295:0;20156:4;:21;;;-1:-1:-1;;;;;20134:43:0;:5;:18;;;-1:-1:-1;;;;;20134:43:0;;20130:2149;;;20256:4;:16;;;20252:1702;;;20441:5;:31;;;20436:435;;20554:252;20596:5;:20;;;20632:1;20649:10;:15;;;20680:10;:27;;;20723:5;:20;;;20759:10;:33;;;20554:12;:26;;:252;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;20488:318:0;20511:39;;;20488:318;;;;;;;20489:20;;;20488:318;20854:4;20820:31;;;:38;20436:435;20887:5;:20;;;20882:111;;20923:16;:14;:16::i;:::-;20976:4;20953:20;;;:27;20882:111;21004:30;21037:361;21062:4;:13;;;21090:10;:61;;21131:20;;21090:61;;;21103:5;:25;;;21090:61;21167:10;:61;;21203:5;:25;;;21167:61;;;21180:20;;21167:61;21243:39;;;;21296:20;;;;21330;;;;21364:22;;21037:5;;:361;;;21243:39;21296:20;21330;21037:11;:361::i;:::-;21004:394;;21608:10;21604:145;;;21655:17;;;21654:18;;;21634:38;;;;;;;;21713:23;;;;;21712:24;;;21686:50;;;;;;21604:145;21779:58;21802:5;:15;;;21819:4;:17;;;21779:22;:58::i;:::-;-1:-1:-1;;;;;21761:76:0;:15;;;:76;21896:21;;;;21919:23;;;;21873:70;;21896:21;21873:22;:70::i;:::-;-1:-1:-1;;;;;21849:94:0;:21;;;:94;-1:-1:-1;20252:1702:0;21977:10;:46;;22010:4;:13;;;21977:46;;;22006:1;21990:4;:13;;;:17;21977:46;21964:59;;;;;;:10;;;:59;20130:2149;;;22064:4;:22;;;-1:-1:-1;;;;;22042:44:0;:5;:18;;;-1:-1:-1;;;;;22042:44:0;;22038:241;;22223:47;22251:5;:18;;;22223:27;:47::i;:::-;22210:60;;;;;;:10;;;:60;22038:241;18085:4200;;;;22366:412;22407:314;;;;;;;;22448:10;-1:-1:-1;;;;;22407:314:0;;;;;22481:9;-1:-1:-1;;;;;22407:314:0;;;;;22514:10;22407:314;;;;;;22553:15;22407:314;;;;22599:17;-1:-1:-1;;;;;22407:314:0;;;;;22634:4;;22407:314;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;22407:314:0;;;-1:-1:-1;22664:18:0;;;;;-1:-1:-1;;;;;22407:314:0;;;;;;;22700:10;;;;22407:314;;;;;;;22366:14;;;;:31;;22664:5;22746;22761:9;22366:31;:412::i;:::-;22867:10;:15;;;22853:29;;:5;:10;;;:29;;;22849:625;;22893:23;22918:29;22951:238;22979:10;:27;;;23016:5;:20;;;23046:10;:15;;;23071:5;:20;;;23101:10;:33;;;23144:10;:37;;;22951:12;:18;;:238;;;;;;;;;:::i;:::-;23293:18;;;;23313:10;;;;23198:5;23197:169;;-1:-1:-1;;;;23197:169:0;-1:-1:-1;;;23197:169:0;;;;;;-1:-1:-1;;;;23197:169:0;-1:-1:-1;;;23197:169:0;;;;;;;;;;;;-1:-1:-1;;;;23197:169:0;-1:-1:-1;;;23197:169:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23197:169:0;-1:-1:-1;;;;;23197:169:0;;;;;;-1:-1:-1;22849:625:0;;-1:-1:-1;22849:625:0;;23449:18;;;;23428:5;:39;;-1:-1:-1;;;;;;23428:39:0;-1:-1:-1;;;;;23428:39:0;;;;;;;;;22849:625;23566:5;:15;;;-1:-1:-1;;;;;23542:39:0;:5;:20;;;-1:-1:-1;;;;;23542:39:0;;23538:72;;23595:15;;;;23583:9;:27;;-1:-1:-1;;;;;;23583:27:0;-1:-1:-1;;;;;23583:27:0;;;;;;;;;23538:72;23650:5;:21;;;-1:-1:-1;;;;;23620:51:0;:5;:26;;;-1:-1:-1;;;;;23620:51:0;;23616:96;;23691:21;;;;23673:15;:39;;-1:-1:-1;;;;;;23673:39:0;-1:-1:-1;;;;;23673:39:0;;;;;;;;;23616:96;23879:10;23875:280;;;23922:25;;;;23899:20;:48;23959:14;;;;-1:-1:-1;;;;;23959:18:0;;23955:58;;23999:14;;;;23979:9;:34;;-1:-1:-1;;;;;;23979:34:0;;-1:-1:-1;;;;;23979:34:0;;;;;;;;;;;;;23955:58;23875:280;;;24057:25;;;;24034:20;:48;24094:14;;;;-1:-1:-1;;;;;24094:18:0;;24090:58;;24134:14;;;;24114:9;:34;;-1:-1:-1;;;;;24114:34:0;;;-1:-1:-1;;;24114:34:0;;;;;;;;;;;;;;;;;24090:58;24196:10;24182:24;;:10;:24;;;:190;;24299:22;;;;24341:30;;24323:48;;24182:190;;;24234:5;:30;;;24216:15;:48;24266:5;:22;;;24182:190;24161:211;;-1:-1:-1;24161:211:0;-1:-1:-1;24423:616:0;;;;24461:1;24451:7;:11;24447:82;;;24492:6;;24464:65;;-1:-1:-1;;;;;24492:6:0;24500:9;24492:6;24519:8;;;24464:27;:65::i;:::-;24538:22;24563:10;:8;:10::i;:::-;24581:73;;-1:-1:-1;;;24581:73:0;;24538:35;;-1:-1:-1;24597:10:0;;24581:49;;:73;;24631:7;;24640;;24649:4;;;;24581:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24662:67;24711:10;:8;:10::i;:::-;24671:36;:14;24698:7;24671:18;:36::i;:::-;:50;;24662:67;;;;;;;;;;;;;-1:-1:-1;;;24662:67:0;;;:8;:67::i;:::-;24423:616;;;;24764:1;24754:7;:11;24750:82;;;24795:6;;24767:65;;-1:-1:-1;;;;;24795:6:0;24803:9;24795:6;24822:8;;;24767:27;:65::i;:::-;24841:22;24866:10;:8;:10::i;:::-;24884:73;;-1:-1:-1;;;24884:73:0;;24841:35;;-1:-1:-1;24900:10:0;;24884:49;;:73;;24934:7;;24943;;24952:4;;;;24884:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24965:67;25014:10;:8;:10::i;:::-;24974:36;:14;25001:7;24974:18;:36::i;24965:67::-;24423:616;;25067:9;-1:-1:-1;;;;;25050:94:0;25055:10;-1:-1:-1;;;;;25050:94:0;;25078:7;25087;25096:5;:18;;;25116:5;:15;;;25133:5;:10;;;25050:94;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;25150:5:0;:21;;-1:-1:-1;;;;25150:21:0;-1:-1:-1;;;25150:21:0;;;-1:-1:-1;16081:9095:0;;;;-1:-1:-1;16081:9095:0;-1:-1:-1;;;;;;16081:9095:0:o;8460:360::-;8587:39;;8659:15;;-1:-1:-1;;;;;8587:39:0;;;;-1:-1:-1;;;;;8659:15:0;8684:20;;8680:136;;8779:11;;8729:80;;-1:-1:-1;;;8779:11:0;;;;8761:15;:29;8792:16;8729:31;:80::i;:::-;8714:95;;;;8680:136;8460:360;;:::o;3121:33::-;;;-1:-1:-1;;;;;3121:33:0;;:::o;32109:662::-;32199:7;:5;:7::i;:::-;32236:15;;;32253:7;32212:49;;-1:-1:-1;;;32212:49:0;;:2;;:23;;:49;;-1:-1:-1;;;;;32236:15:0;;;;32253:7;;;;32212:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32275:5:0;;-1:-1:-1;;;;;32275:5:0;:19;;-1:-1:-1;32267:28:0;;-1:-1:-1;32267:28:0;;;;;32301:5;:14;;-1:-1:-1;;;;;32301:14:0;;;-1:-1:-1;;;;;;32301:14:0;;;;;;;;32321:3;:10;;;;;;;;;;;;32629:30;;;-1:-1:-1;;;32629:30:0;;;;32301:5;;:14;32629:28;;:30;;;;;;;;;;;;;32301:5;:14;32629:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32598:61;;32665:86;32692:20;32721:15;32739:11;;;;;;;;;;;32665:26;:86::i;:::-;32757:9;:7;:9::i;:::-;32109:662;;;:::o;4963:541::-;5183:1;5164:7;-1:-1:-1;;;;;5164:7:0;:21;:47;;;;-1:-1:-1;;;;;;5189:22:0;;;;5164:47;5156:56;;;;;;5218:7;:18;;-1:-1:-1;;;;;5218:18:0;;;-1:-1:-1;;;;;;5218:18:0;;;;;;;;5242:16;;;;;;;;;;;5264:6;:16;;;;;;;;;;;5286:11;:26;;;;;;;;-1:-1:-1;;;5286:26:0;-1:-1:-1;;;;5286:26:0;;;;;;;;;5318:15;:34;;;;;;;;;;;;;;;5387:2;:18;5406:5;5413:12;5427:13;5442:42;5427:13;5442:27;:42::i;:::-;5486:12;5387:112;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5359:19;:140;;-1:-1:-1;;;;;5359:140:0;;;-1:-1:-1;;;5359:140:0;;;;;;;;;-1:-1:-1;;;;;;4963:541:0:o;3537:55::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;3537:55:0;;;;;-1:-1:-1;;;3537:55:0;;-1:-1:-1;;;;;3537:55:0;;-1:-1:-1;;;3537:55:0;;;;;:::o;2766:35::-;;;-1:-1:-1;;;;;2766:35:0;;;;-1:-1:-1;;;2766:35:0;;;;:::o;11221:513::-;11413:15;11430;11453:7;:5;:7::i;:::-;11466:17;:15;:17::i;:::-;11510:204;11538:9;11566;11594;11629:16;11671;11702:5;11510:8;:204::i;:::-;11489:225;;-1:-1:-1;11489:225:0;-1:-1:-1;11720:9:0;:7;:9::i;:::-;11221:513;;;;;;;;;:::o;8857:222::-;8960:7;:5;:7::i;:::-;8973:86;;-1:-1:-1;;;8973:86:0;;:2;;:37;;:86;;9011:12;;9025:5;;9032:26;;8973:86;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9065:9;:7;:9::i;:::-;8857:222;:::o;2345:27::-;;;-1:-1:-1;;;;;2345:27:0;;;-1:-1:-1;;;2345:27:0;;;;;;-1:-1:-1;;;2345:27:0;;;;;-1:-1:-1;;;2345:27:0;;;;;-1:-1:-1;;;2345:27:0;;;;;-1:-1:-1;;;2345:27:0;;;;;:::o;2905:39::-;;;-1:-1:-1;;;;;2905:39:0;;:::o;1775:::-;;;-1:-1:-1;;;;;1775:39:0;;:::o;10023:648::-;10178:15;10195;10218:7;:5;:7::i;:::-;10231:35;10269:53;10290:9;10301;10312;10269:20;:53::i;:::-;-1:-1:-1;;;;;10328:21:0;;:12;;;:21;10428:82;;-1:-1:-1;;;10428:82:0;;10231:91;;-1:-1:-1;10356:22:0;;;;;;10428:2;;:24;;:82;;10453:9;;10464:5;;10471:10;;10483:12;;10497:5;;10231:91;;10428:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10355:155;;;;;;10528:14;10516:9;;:26;;;;;-1:-1:-1;;;;;10516:26:0;;;;;-1:-1:-1;;;;;10516:26:0;;;;;;10548:2;:13;10562:5;10569:10;10581;10593:6;;;;;;;;;-1:-1:-1;;;;;10593:6:0;10601;;;;;;;;;-1:-1:-1;;;;;10601:6:0;10609:4;;10548:66;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10620:9;:7;:9::i;:::-;10643:10;;;;-1:-1:-1;10023:648:0;-1:-1:-1;;;;;;;;;10023:648:0:o;2487:44::-;;;;:::o;1709:27::-;;;-1:-1:-1;;;;;1709:27:0;;:::o;25213:1232::-;25326:7;:5;:7::i;:::-;25982:285;;;;;;;;26014:6;;-1:-1:-1;;;;;26014:6:0;;;25982:285;;26038:6;;;;;25982:285;;;;25897:23;26063:7;;;;25982:285;;;;26093:11;;-1:-1:-1;;;26093:11:0;;;;25982:285;;;;;;;26125:9;;-1:-1:-1;;;;;26125:9:0;;;25982:285;;;;26161:15;;;25982:285;;;;;;;;;;;;;;;;;26014:6;25982:285;;;;;25949:336;;-1:-1:-1;;;25949:336:0;;25897:23;;25949:2;;:8;;:336;;25965:9;;25982:285;26275:4;;;;25949:336;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25896:389;;-1:-1:-1;25896:389:0;-1:-1:-1;26295:19:0;;26291:64;;26316:20;:39;;;;;;26291:64;26365:19;;26361:64;;26386:20;:39;;;;;;26361:64;26431:9;:7;:9::i;:::-;25213:1232;;;;;;;:::o;10708:476::-;10881:15;10898;10921:7;:5;:7::i;:::-;10955:209;10983:9;11011;11039;11074:16;11116;11147:10;10955:8;:209::i;:::-;10934:230;;-1:-1:-1;10934:230:0;-1:-1:-1;11170:9:0;:7;:9::i;:::-;10708:476;;;;;;;;:::o;3443:59::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3443:59:0;;;;;;;;;;-1:-1:-1;;;3443:59:0;;;;:::o;3356:52::-;;;;;;;;;;;;;:::o;2567:46::-;;;;:::o;3921:49::-;-1:-1:-1;;;3921:49:0;:::o;12459:324::-;12585:15;12602;12625:7;:5;:7::i;:::-;12638:17;:15;:17::i;:::-;12682:81;12700:9;12722;12741:6;12756:5;12682;:81::i;:::-;12661:102;;-1:-1:-1;12661:102:0;-1:-1:-1;12769:9:0;:7;:9::i;:::-;12459:324;;;;;;;:::o;3193:43::-;;;-1:-1:-1;;;3193:43:0;;-1:-1:-1;;;;;3193:43:0;;:::o;8070:348::-;8166:30;8198:51;8266:147;8301:15;8319:11;;8266:147;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8332:5:0;:10;8368:9;;8266:12;;:147;;-1:-1:-1;;;;8332:10:0;;;;;-1:-1:-1;8344:22:0;-1:-1:-1;;;8344:22:0;;;;;-1:-1:-1;;;;;8368:9:0;;;;-1:-1:-1;;;8379:28:0;;;8266:20;:147::i;:::-;8259:154;;;;8070:348;;;;;;:::o;13313:596::-;13415:7;:5;:7::i;:::-;13428:12;:10;:12::i;:::-;13459:5;:10;-1:-1:-1;;;13459:10:0;;;;;;;13532:17;;;;;;;;;;;:37;;;13560:9;13553:16;;:4;:16;;;13532:37;13528:161;;;13579:16;:14;:16::i;:::-;13644:15;;13621:61;;-1:-1:-1;;;;;13644:15:0;13661:20;13621:22;:61::i;:::-;13603:15;:79;;-1:-1:-1;;;;;;13603:79:0;-1:-1:-1;;;;;13603:79:0;;;;;;;;;;13528:161;13695:2;:17;13720:9;13737:5;13750:3;;;;;;;;;-1:-1:-1;;;;;13750:3:0;13761:9;13778;13795:4;13807:20;13835;;13863;;13695:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13895:9;:7;:9::i;:::-;13313:596;;;;:::o;3826:56::-;3873:9;3826:56;:::o;9114:290::-;9344:5;:10;9356:20;;9378;;9293:106;;-1:-1:-1;;;9293:106:0;;9220:28;;;;9293:2;;:21;;:106;;9315:5;;9322:9;;9333;;-1:-1:-1;;;9344:10:0;;;;;;9293:106;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;26480:318::-;26728:5;:10;26765:22;;26667:126;;-1:-1:-1;;;26667:126:0;;26626:26;;26667:2;;:24;;:126;;26699:5;;26706:9;;26717;;-1:-1:-1;;;26728:10:0;;;;;26740:23;;26667:126;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26660:133;;26480:318;;;;;;:::o;12135:287::-;12242:15;12259;12282:7;:5;:7::i;:::-;12316:86;12334:9;12356;12375:6;12390:10;12316:5;:86::i;:::-;12295:107;;-1:-1:-1;12295:107:0;-1:-1:-1;12408:9:0;:7;:9::i;:::-;12135:287;;;;;;:::o;7528:500::-;7754:33;;;;;;;;7782:5;7754:33;-1:-1:-1;;;;;7754:33:0;;;;-1:-1:-1;;;7754:33:0;;;;;;;;;;;;;;;;-1:-1:-1;;;7754:33:0;;;;;;;;;;;;-1:-1:-1;;;7754:33:0;;;;;;;;;;-1:-1:-1;;;7754:33:0;;;;;;;;;-1:-1:-1;;;7754:33:0;;;;;;;;;;;8008:9;;7800:223;;-1:-1:-1;;;7800:223:0;;-1:-1:-1;;;;;;7754:33:0;;7800:2;;:28;;:223;;7836:5;;7849:12;;7869:9;;7886;;7754:33;;;;-1:-1:-1;;;;;8008:9:0;;;;7800:223;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7793:230;;;;;;;7528:500;;;;;:::o;31841:231::-;31908:15;31925;31948:7;:5;:7::i;:::-;31961:12;:10;:12::i;:::-;32037:6;;32045;;32000:52;;-1:-1:-1;;;32000:52:0;;:2;;:14;;:52;;32015:9;;32026;;-1:-1:-1;;;;;32037:6:0;;;;32045;;;32000:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31979:73;;-1:-1:-1;31979:73:0;-1:-1:-1;32058:9:0;:7;:9::i;:::-;31841:231;;;:::o;1641:29::-;;;-1:-1:-1;;;;;1641:29:0;;:::o;2837:32::-;;;;:::o;6507:128::-;6560:6;6592:7;;6581:49;;-1:-1:-1;;;6581:49:0;;-1:-1:-1;;;;;6592:7:0;;;;6581:34;;:49;;6624:4;;6581:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6574:56;;6507:128;;:::o;1433:31::-;;;-1:-1:-1;;;;;1433:31:0;;:::o;2979:34::-;;;-1:-1:-1;;;2979:34:0;;;;;:::o;3052:33::-;;;-1:-1:-1;;;3052:33:0;;;;;:::o;1572:30::-;;;-1:-1:-1;;;;;1572:30:0;;:::o;6291:181::-;6338:6;6352:39;;:::i;:::-;6418:10;6397:31;;6441:26;6397:11;6441:13;:26::i;:::-;6434:33;;;6291:181;:::o;6019:171::-;6112:11;6164:7;;6173:11;;6138:47;;-1:-1:-1;;;6138:47:0;;:2;;:11;;:47;;6150:12;;-1:-1:-1;;;;;6164:7:0;;-1:-1:-1;;;6173:11:0;;;;;6138:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6131:54;;6019:171;;;;:::o;5539:::-;5633:6;5684:7;;5693:11;;5654:51;;-1:-1:-1;;;5654:51:0;;:2;;:16;;:51;;5671:11;;-1:-1:-1;;;;;5684:7:0;;-1:-1:-1;;;5693:11:0;;;;;5654:51;;;:::i;3731:56::-;3780:7;3731:56;:::o;2408:44::-;;;;:::o;3272:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3272:49:0;;;-1:-1:-1;;;3272:49:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3272:49:0;;-1:-1:-1;;;;;3272:49:0;;-1:-1:-1;;;3272:49:0;;;;;-1:-1:-1;;;3272:49:0;;;;;:::o;28746:191::-;28798:17;28823:7;:5;:7::i;:::-;28836:12;:10;:12::i;:::-;28854:16;:14;:16::i;:::-;28888:8;;28876:20;;28909:8;28902:15;;;28923:9;:7;:9::i;4479:104::-;4572:5;4561:9;4553:25;;;;-1:-1:-1;;;4553:25:0;;;;;;;;:::i;:::-;;;;;;;;4333:379:32;4489:6;-1:-1:-1;;;;;4507:23:32;;;4503:140;;4554:44;;-1:-1:-1;;;4554:44:32;;4540:11;;-1:-1:-1;;;;;4554:31:32;;;;;:44;;4586:11;;4554:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4540:58;-1:-1:-1;4610:8:32;;;;4606:30;;4627:9;4631:4;4627:3;:9::i;:::-;4620:16;;;;;4606:30;4503:140;;4656:51;;-1:-1:-1;;;4656:51:32;;-1:-1:-1;;;;;4656:37:32;;;;;:51;;4694:12;;4656:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4649:58;;4333:379;;;;;;;:::o;2100:1747:28:-;2266:10;2278:16;2302;2328:11;2321:18;;:4;:18;;;;;;;;2302:37;;2356:1;2349:4;:8;;;:35;;;;;2368:11;2361:18;;:4;:18;;;;;;;;:23;;;;2349:35;2345:53;;;-1:-1:-1;;2386:12:28;2345:53;2444:3;2440:1403;;;2458:13;2473:12;2489:20;2498:10;2489:8;:20::i;:::-;2614:1;2651:13;;;;;2578:12;2651:13;;;;;;;;;;;2614:11;;;;;;;2593:33;;-1:-1:-1;;2593:33:28;2651:20;;;2806:11;;;;-1:-1:-1;2457:52:28;;-1:-1:-1;2457:52:28;;-1:-1:-1;2593:33:28;2806:11;2936:154;;3079:11;3068:6;3062:13;;3049:10;:26;3048:42;2936:154;;;3026:11;2987:34;3014:6;2987:26;:34::i;:::-;2978:6;:43;2972:50;;2959:10;:63;2958:79;2936:154;2929:161;;2440:1403;;;;;;;3203:13;3218:12;3234:24;3243:10;3256:1;3243:14;3234:8;:24::i;:::-;3202:56;;;;3318:12;3351:1;3341:6;3336:11;;:1;:11;;3335:17;3333:20;3318:35;;3361:14;3394:4;3378;:13;3383:7;3378:13;;;;;;;;;;;;;;;;:20;3361:37;;3525:6;3535:1;3525:11;;3511:25;;3655:11;:181;;3825:11;3814:6;3796:15;:24;3790:31;;3773:10;3786:1;3773:14;:48;3772:64;3655:181;;;3750:11;3739:6;3701:35;3729:6;3701:27;:35::i;:::-;:44;3695:51;;3678:10;3691:1;3678:14;:68;3677:84;3655:181;3648:188;;2440:1403;;;;;2100:1747;;;;;;;;:::o;1354:2470:29:-;1417:20;1445:15;1470:1;1463:4;:8;;;:57;;1514:4;1507:12;;1463:57;;;1490:4;1483:12;;1482:13;;1463:57;1445:75;-1:-1:-1;637:9:29;1534:28;;;1526:42;;;;;-1:-1:-1;;;1526:42:29;;;;;;;;;;;;-1:-1:-1;;;1526:42:29;;;;;;;;;;;;;;;1575:13;1601:3;1591:13;;:93;;-1:-1:-1;;;1591:93:29;;;1612:34;1591:93;1575:109;;;-1:-1:-1;1704:3:29;1694:13;;:18;1690:83;;1731:34;1723:42;1770:3;1722:51;1690:83;1793:3;1783:13;;:18;1779:83;;1820:34;1812:42;1859:3;1811:51;1779:83;1882:3;1872:13;;:18;1868:83;;1909:34;1901:42;1948:3;1900:51;1868:83;1971:4;1961:14;;:19;1957:84;;1999:34;1991:42;2038:3;1990:51;1957:84;2061:4;2051:14;;:19;2047:84;;2089:34;2081:42;2128:3;2080:51;2047:84;2151:4;2141:14;;:19;2137:84;;2179:34;2171:42;2218:3;2170:51;2137:84;2241:4;2231:14;;:19;2227:84;;2269:34;2261:42;2308:3;2260:51;2227:84;2331:5;2321:15;;:20;2317:85;;2360:34;2352:42;2399:3;2351:51;2317:85;2422:5;2412:15;;:20;2408:85;;2451:34;2443:42;2490:3;2442:51;2408:85;2513:5;2503:15;;:20;2499:85;;2542:34;2534:42;2581:3;2533:51;2499:85;2604:5;2594:15;;:20;2590:85;;2633:34;2625:42;2672:3;2624:51;2590:85;2695:6;2685:16;;:21;2681:86;;2725:34;2717:42;2764:3;2716:51;2681:86;2787:6;2777:16;;:21;2773:86;;2817:34;2809:42;2856:3;2808:51;2773:86;2879:6;2869:16;;:21;2865:86;;2909:34;2901:42;2948:3;2900:51;2865:86;2971:6;2961:16;;:21;2957:86;;3001:34;2993:42;3040:3;2992:51;2957:86;3063:7;3053:17;;:22;3049:86;;3094:33;3086:41;3132:3;3085:50;3049:86;3155:7;3145:17;;:22;3141:85;;3186:32;3178:40;3223:3;3177:49;3141:85;3246:7;3236:17;;:22;3232:83;;3277:30;3269:38;3312:3;3268:47;3232:83;3335:7;3325:17;;:22;3321:78;;3366:25;3358:33;3396:3;3357:42;3321:78;3417:1;3410:4;:8;;;3406:47;;;3448:5;-1:-1:-1;;3428:25:29;;;;;;3420:33;;3406:47;-1:-1:-1;;;3787:5:29;:17;:22;:30;;3816:1;3787:30;;;3812:1;3787:30;3770:48;;3780:2;3771:5;:11;;3770:48;3747:72;;1354:2470;;;;;:::o;1360:2741:26:-;1548:24;;;;-1:-1:-1;;;;;1654:41:26;;;;;;;;1716:20;;;;;;1743:1134;;1764:30;1797:61;1821:15;1845:7;1839:3;:13;1797:61;;1854:3;1797:15;:61::i;:::-;1764:94;;1877:10;:206;;1996:87;2026:19;2047:18;2067:9;2078:4;1996:29;:87::i;:::-;1877:206;;;1898:87;1928:18;1948:19;1969:9;1980:4;1898:29;:87::i;:::-;1866:217;;2121:8;2095:22;:34;2091:257;;2160:18;2141:37;;2091:257;;;2232:107;2272:19;2293:9;2304:22;2328:10;2232:39;:107::i;:::-;2203:136;;2091:257;1743:1134;;;;2380:10;:208;;2500:88;2530:19;2551:18;2571:9;2582:5;2500:29;:88::i;:::-;2380:208;;;2401:88;2431:18;2451:19;2472:9;2483:5;2401:29;:88::i;:::-;2368:220;;2629:9;2609:15;2608:16;;2600:38;2596:275;;2669:18;2650:37;;2596:275;;;2731:131;2783:19;2804:9;2824:15;2823:16;;2842:10;2731:40;:131::i;:::-;2712:150;;2596:275;-1:-1:-1;;;;;2894:38:26;;;;;;;2975:636;;;;3010:3;:14;;;;;3017:7;3010:14;:129;;3054:85;3084:16;3102:19;3123:9;3134:4;3054:29;:85::i;:::-;3010:129;;;3035:8;3010:129;2999:140;;3159:3;:15;;;;;3167:7;3166:8;3159:15;:132;;3205:86;3235:16;3253:19;3274:9;3285:5;3205:29;:86::i;:::-;3159:132;;;3185:9;3159:132;3147:144;;2975:636;;;3323:3;:14;;;;;3330:7;3323:14;:129;;3367:85;3397:19;3418:16;3436:9;3447:4;3367:29;:85::i;:::-;3323:129;;;3348:8;3323:129;3312:140;;3472:3;:15;;;;;3480:7;3479:8;3472:15;:132;;3518:86;3548:19;3569:16;3587:9;3598:5;3518:29;:86::i;:::-;3472:132;;;3498:9;3472:132;3460:144;;2975:636;3693:7;3692:8;:49;;;;;3725:15;3724:16;;3704:9;:37;3692:49;3688:107;;;3772:15;3771:16;;3751:37;;3688:107;3805:7;:49;;;;;3836:18;-1:-1:-1;;;;;3816:38:26;:16;-1:-1:-1;;;;;3816:38:26;;;3805:49;3801:296;;;3990:8;3971:15;3963:35;3951:47;;3801:296;;;4031:59;4057:8;4067:7;4031:59;;4082:7;4076:3;:13;4031:59;;:25;:59::i;:::-;4019:71;;3801:296;1360:2741;;;;;;;;;;;;;:::o;888:113:24:-;940:8;-1:-1:-1;;;964:1:24;:12;956:21;;;;;1499:114:21;1584:5;;;1579:16;;;;1555:8;1600:6;;;1579:28;1571:37;;;;;1218:114;1303:5;;;1298:16;;;;1274:8;1319:6;;;1298:28;1290:37;;;;;30829:970:0;30956:27;30985:23;31075:16;-1:-1:-1;;;;;31061:30:0;:10;-1:-1:-1;;;;;31061:30:0;;31057:738;;;-1:-1:-1;31119:9:0;31057:738;;;-1:-1:-1;;;;;31192:21:0;;31188:607;;31224:25;31251:24;31279:31;31297:9;31308:1;31279:17;:31::i;:::-;31223:87;;;;31340:66;31356:17;-1:-1:-1;;;31395:10:0;-1:-1:-1;;;;;31340:66:0;:15;:66::i;:::-;31318:88;-1:-1:-1;31432:16:0;-1:-1:-1;31188:607:0;;-1:-1:-1;31188:607:0;;31526:25;31553:24;31581:50;31591:9;31602:10;31614:16;31581:9;:50::i;:::-;31525:106;;;;31661:85;31677:17;-1:-1:-1;;;31729:16:0;31716:10;:29;-1:-1:-1;;;;;31661:85:0;:15;:85::i;:::-;31639:107;31772:16;;-1:-1:-1;30829:970:0;-1:-1:-1;;;;;30829:970:0:o;11876:1686:22:-;12085:20;;12160:15;;;12156:235;;12185:23;12211:4;12216:5;12211:11;;;;;;;;;12185:37;;;;;;;;12211:11;;;;12185:37;;;;;;;;-1:-1:-1;;;12185:37:22;;;;;;;;;;;;;;-1:-1:-1;;;12185:37:22;;-1:-1:-1;;;;;12185:37:22;;;;;;;;-1:-1:-1;;;12185:37:22;;;;;;;;;;;;;-1:-1:-1;12234:27:22;;;12230:78;;12270:38;12280:4;12286;12292;12298:9;12270;:38::i;:::-;12263:45;;12230:78;12324:4;:19;;;12345:4;:38;;;12316:68;;;;;;;12156:235;12413:17;;;12397:13;;12507:83;12534:4;12413;:17;12554:4;12560:5;12567:9;12578:11;12507:26;:83::i;:::-;12437:153;;;;12611:10;:25;;;12601:35;;:6;:35;;;12597:961;;;12690:10;:25;;;12717:10;:44;;;12682:80;;;;;;;;;12597:961;12789:24;;12779:34;;;;;;;12775:783;;;12868:9;:24;;;12894:9;:43;;;12860:78;;;;;;;;;12775:783;13045:25;;13018:24;;13215:25;;;;;13188:24;;;;13018:52;;;;;13099:34;;;13186:103;;;;;13187:77;;;;13188:52;13187:77;;;;;;;;13186:103;13158:10;:25;;;:131;13511:20;13377:154;;13496:11;13378:129;;13432:10;:44;;;13386:9;:43;;;:90;-1:-1:-1;;;;;13378:99:22;:129;13377:154;;;;;;13299:10;:44;;;:244;13141:410;;;;;;;;;11876:1686;;;;;;;;;;;:::o;28322:387:0:-;28434:11;;28390:15;;28434:11;-1:-1:-1;;;28434:11:0;;;;;;28455:26;;;;28451:39;;;28483:7;;;;28451:39;28513:5;;-1:-1:-1;;;;;28513:5:0;28528:20;28524:33;;28550:7;;;;;28524:33;28563:28;28603:6;-1:-1:-1;;;;;28594:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28563:61;;28630:74;28657:20;28679:10;28691:12;28630:26;:74::i;28322:387::-;:::o;11336:969:27:-;11629:25;;:::i;:::-;11687:10;;;;;;11662:22;11687:10;;;;;;;;;;11755:26;;;;;11732:49;;;11703:78;;;11839:26;;;;;11816:49;;;11787:78;;;11927:28;;;;;11902:53;;;11871:84;;;12035:35;;;;;12183:19;-1:-1:-1;;;;;;;;;;;12035:35:27;;;;;11999:71;;;11961:109;;;;-1:-1:-1;;;;;;11961:109:27;;;;;;;12122:26;;;;12105:43;;;12076:72;;;;;-1:-1:-1;;12076:72:27;;;;;;;12183:19;;;;;12176:26;;;12154:48;;;;;;-1:-1:-1;;;;12154:48:27;;;;;;;;;12228:17;;-1:-1:-1;;;12228:17:27;;;;;;12208:37;;;;;;-1:-1:-1;12277:23:27;;;;;;12251:49;;;;;:23;;;:49;;;;12208:4;11336:969::o;373:210:20:-;435:9;460:1;456;:5;;;452:127;;;503:1;-1:-1:-1;;;;;479:25:20;497:1;496:2;;484:1;:15;480:19;;;-1:-1:-1;;;;;479:25:20;;471:40;;;;;-1:-1:-1;;;471:40:20;;;;;;;;;;;;-1:-1:-1;;;471:40:20;;;;;;;;;;;;;;;452:127;;;564:1;-1:-1:-1;;;;;540:25:20;557:1;545;:14;541:18;;;-1:-1:-1;;;;;540:25:20;;;532:40;;;;;-1:-1:-1;;;532:40:20;;;;;;;;;;;;-1:-1:-1;;;532:40:20;;;;;;;;;;;;;;4231:3618:29;4304:10;813:13;-1:-1:-1;;;;;4425:30:29;;;;;;:63;;-1:-1:-1;992:65:29;-1:-1:-1;;;;;4459:29:29;;;4425:63;4417:77;;;;;-1:-1:-1;;;4417:77:29;;;;;;;;;;;;-1:-1:-1;;;4417:77:29;;;;;;;;;;;;;;;-1:-1:-1;;;;;4541:2:29;4516:27;;;;-1:-1:-1;;;;;4628:41:29;;4625:1;4621:49;4706:9;;;-1:-1:-1;;;;;4759:25:29;;4756:1;4752:33;4821:9;;;4880:10;4874:17;;4871:1;4867:25;4928:9;;;4987:6;4981:13;;4978:1;4974:21;5031:9;;;5090:4;5084:11;;5081:1;5077:19;;;5132:9;;;5191:3;5185:10;;5182:1;5178:18;5232:9;;;5285:10;;;5282:1;5278:18;;;5332:9;;;;5378:10;;;4799;;4906;;;5009;;;5110;5210;;;5310;5402;5435:3;5428:10;;5424:75;;5460:3;5454;:9;5444:5;:20;;5440:24;;5424:75;;;5495:3;5489;:9;5479:5;:20;;5475:24;;5424:75;5584:9;;;5579:3;5575:19;;;5610:11;;;;5670:9;;;;5721;;5712:19;;;5747:11;;;5807:9;5858;;5849:19;;;5884:11;;;5944:9;5995;;5986:19;;;6021:11;;;6081:9;6132;;6123:19;;;6158:11;;;6218:9;6269;;6260:19;;;6295:11;;;6355:9;6406;;6397:19;;;6432:11;;;6492:9;6543;;6534:19;;;6569:11;;;6629:9;6680;;6671:19;;;6706:11;;;6766:9;6817;;6808:19;;;6843:11;;;6903:9;6954;;6945:19;;;6980:11;;;7040:9;7091;;7082:19;;;7117:11;;;7177:9;7228;;7219:19;;;7254:11;;;;7314:9;;;;7365;;7356:19;;;;;5584:9;-1:-1:-1;;5522:17:29;;5544:2;5521:25;5647:10;;;;;;;5637:21;5784:10;;;;;;;5774:21;;;;5921:10;;;;;;;5911:21;;;;6058:10;;;;;;;6048:21;;;;6195:10;;;;;;;6185:21;;;;6332:10;;;;;;;6322:21;;;;6469:10;;;;;;;6459:21;6606:10;;;;;-1:-1:-1;;;6606:10:29;6596:21;6743:10;;;;;;;6733:21;6880:10;;;;;;;6870:21;7017:10;;;;;;;7007:21;7154:10;;;;;;;7144:21;7291:10;;;;;;;7281:21;7428:10;;;;;;;7418:21;7482:31;7474:39;;-1:-1:-1;;7561:65:29;;5536:3;7560:74;;;;7679:51;7663:67;;7662:76;;7753:17;;;;;;;;;:91;;7813:12;-1:-1:-1;;;;;7783:42:29;:26;7802:6;7783:18;:26::i;:::-;-1:-1:-1;;;;;7783:42:29;;;:61;;7837:7;7783:61;;;7828:6;7783:61;7753:91;;;7773:7;7753:91;7746:98;4231:3618;-1:-1:-1;;;;;;;;;4231:3618:29:o;5187:1765:32:-;-1:-1:-1;;;;;5409:23:32;;5405:36;;5434:7;;5405:36;5447:11;-1:-1:-1;;;;;5461:30:32;;;5492:11;5505:32;:6;5530;5505:24;:32::i;:::-;5461:77;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5447:91;-1:-1:-1;5548:9:32;;;5544:22;;5559:7;;;5544:22;5579:9;5583:4;5579:3;:9::i;:::-;5572:16;;5595;5644:1;5614:11;:27;;;:31;5595:50;;5785:19;5807:11;:82;;5865:6;:23;;;5807:82;;;5830:6;:23;;;5829:24;;5807:82;5785:104;-1:-1:-1;5934:18:32;5955:48;5785:104;5955:48;;;774:3;5955:28;:48::i;:::-;6345:23;;;:45;;;;;;5934:69;-1:-1:-1;6550:398:32;;;;6633:11;:22;;;6629:119;;;6657:39;;-1:-1:-1;;;;;;;;6657:39:32;;;;;;;;;;;;;;;6629:119;;;6709:39;;-1:-1:-1;;;;;6709:39:32;;;;;;-1:-1:-1;;;;;;6709:39:32;;;;;;6629:119;6550:398;;;6826:11;:22;;;6822:119;;;6850:39;;-1:-1:-1;;;;;6850:39:32;;;;;;-1:-1:-1;;;;;;6850:39:32;;;;;;6822:119;;;6902:39;;-1:-1:-1;;;;;;;;6902:39:32;;;;;;;;;;;;;;;6822:119;5187:1765;;;;;;;;;;:::o;4192:823:22:-;4403:19;4424:25;4457:23;4483:4;4488:5;4483:11;;;;;;;;;4457:37;;;;;;;;4483:11;;;;4457:37;;;;;;;;-1:-1:-1;;;4457:37:22;;;;;;;;;;;;;;-1:-1:-1;;;4457:37:22;;-1:-1:-1;;;;;4457:37:22;;;;;;;;-1:-1:-1;;;4457:37:22;;;;;;;;;;;;;-1:-1:-1;4576:37:22;;;4572:70;;;4623:5;4630:11;4615:27;;;;;;;4572:70;4735:11;4717:29;;:15;:29;;;:59;;;;;4774:1;4760:11;:15;4750:26;;:5;:26;;;4717:59;4713:169;;;4807:15;4786:36;;4713:169;;;4864:11;4843:32;;4713:169;4917:18;4903:32;;4904:5;4912:1;4904:9;4903:32;;;;;;;;4888:47;;4962:48;4972:4;4978:14;4994:4;5000:9;4962;:48::i;:::-;4941:4;4946:12;4941:18;;;;;;;;;:69;;:18;;:69;;;;;;;;;;;;;;;;;-1:-1:-1;;;4941:69:22;-1:-1:-1;;;;;;;;;;4941:69:22;;;-1:-1:-1;;;4941:69:22;;;;;;;;;-1:-1:-1;;;4941:69:22;-1:-1:-1;;4941:69:22;;;;-1:-1:-1;;4941:69:22;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4192:823:22;;;;;;;;;;:::o;590:276:30:-;716:66;;;-1:-1:-1;;;;;716:66:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;716:66:30;-1:-1:-1;;;716:66:30;;;705:78;;;;670:12;;;;705:10;;;;716:66;705:78;;;716:66;705:78;;716:66;705:78;;;;;;;;;;-1:-1:-1;;705:78:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;669:114;;;;797:7;:57;;;;-1:-1:-1;809:11:30;;:16;;:44;;;840:4;829:24;;;;;;;;;;;;;;;-1:-1:-1;829:24:30;809:44;789:72;;;;;-1:-1:-1;;;789:72:30;;;;;;;;;;;;-1:-1:-1;;;789:72:30;;;;;;;;;;;;;;7081:115:0;7159:6;;7145:46;;-1:-1:-1;;;7145:46:0;;7123:7;;-1:-1:-1;;;;;7159:6:0;;7145:31;;:46;;7185:4;;7145:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;425:105:21:-;513:5;;;508:16;;;;500:25;;;;;7371:115:0;7449:6;;7435:46;;-1:-1:-1;;;7435:46:0;;7413:7;;-1:-1:-1;;;;;7449:6:0;;7435:31;;:46;;7475:4;;7435:46;;;:::i;26887:180::-;26995:7;27045:16;-1:-1:-1;;;;;27025:36:0;27038:3;27026:8;:15;;27025:36;;;;;;;26887:180;-1:-1:-1;;;26887:180:0:o;4317:95::-;4357:5;:14;4348:31;;;;;;;;;;;;-1:-1:-1;;;4348:31:0;;;;;;-1:-1:-1;;;4357:14:0;;;;;4348:8;:31::i;:::-;4385:5;:22;;-1:-1:-1;;;;4385:22:0;;;4317:95::o;27288:507::-;27430:15;;-1:-1:-1;;;;;27430:15:0;27455:20;;27451:316;;27511:75;27527:20;-1:-1:-1;;;27569:16:0;-1:-1:-1;;;;;27511:75:0;:15;:75::i;:::-;27485:22;:101;;;;;;;27637:70;;27669:19;;;27637:70;27690:16;27637:31;:70::i;:::-;27594:39;:113;;-1:-1:-1;;;;;;27594:113:0;;-1:-1:-1;;;;;27594:113:0;;;;;;;;;;;;;;27451:316;;;27728:8;:32;;;;;;27451:316;-1:-1:-1;;27772:11:0;:18;;;;;;-1:-1:-1;;;27772:18:0;-1:-1:-1;;;;27772:18:0;;;;;;;;;-1:-1:-1;27288:507:0:o;4416:59::-;4449:5;:21;;-1:-1:-1;;;;4449:21:0;-1:-1:-1;;;4449:21:0;;;4416:59::o;4840:86::-;4909:3;;;4886:35;;;;;;;;;;;;-1:-1:-1;;;4886:35:0;;;;;;-1:-1:-1;;;;;4909:3:0;;;4895:10;:17;;4886:8;:35::i;11738:360::-;12073:6;;12081;;11968:125;;-1:-1:-1;;;11968:125:0;;11921:15;;;;11968:2;;:10;;:125;;11986:9;;11997;;12008;;12019;;12030:16;;12048;;12066:5;;-1:-1:-1;;;;;12073:6:0;;;;12081;;;;11968:125;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11961:132;;;;11738:360;;;;;;;;;:::o;9408:578::-;9525:35;;:::i;:::-;-1:-1:-1;9576:405:0;;;;;;;;-1:-1:-1;;;;;9576:405:0;;;;;;;;;;;;;;;;;;;;9694:9;;-1:-1:-1;;;;;9694:9:0;;;9576:405;;;;-1:-1:-1;;;9732:19:0;;;;9576:405;;;;9781:20;;9576:405;;;;9831:20;;9576:405;;;;9883:22;;9576:405;;;;9920:5;;;;;9694:9;9576:405;;;9946:11;;-1:-1:-1;;;9946:11:0;;;;9576:405;;;;;;-1:-1:-1;9576:405:0;;;;;9408:578::o;12787:489::-;12904:15;12921;12944:35;12982:49;13003:5;13010:9;13021;12982:20;:49::i;:::-;-1:-1:-1;;;;;13037:21:0;;:12;;;:21;13137:65;;-1:-1:-1;;;13137:65:0;;12944:87;;-1:-1:-1;13065:22:0;;;;;;13137:2;;:7;;:65;;13145:9;;13156:5;;13163:10;;13175:12;;13189:5;;12944:87;;13137:65;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13208:9;:26;;-1:-1:-1;;;;;;13208:26:0;-1:-1:-1;;;;;13208:26:0;;;;;;;;;;;13064:138;13208:26;;-1:-1:-1;12787:489:0;-1:-1:-1;;;;;;;;;12787:489:0:o;14492:687:22:-;14705:30;14737:51;14818:1;14804:11;:15;;;14796:29;;;;;-1:-1:-1;;;14796:29:22;;;;;;;;;;;;-1:-1:-1;;;14796:29:22;;;;;;;;;;;;;;;14862:11;:18;-1:-1:-1;;;;;14850:31:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14850:31:22;;14832:49;;14938:11;:18;-1:-1:-1;;;;;14924:33:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14924:33:22;;14887:70;;14968:9;14963:212;14987:11;:18;14983:1;:22;14963:212;;;15090:78;15104:4;15110;15116:11;15128:1;15116:14;;;;;;;;;;;;;;15132:4;15138:5;15145:9;15156:11;15090:13;:78::i;:::-;15021:15;15037:1;15021:18;;;;;;;;;;;;;15041:34;15076:1;15041:37;;;;;;;;;;;;;15020:148;-1:-1:-1;;;;;15020:148:22;-1:-1:-1;;;;;15020:148:22;;;;;;;;;;;;;;15007:3;;;;;;;14963:212;;;;14492:687;;;;;;;;;;:::o;4681:81:0:-;4745:5;;4722:35;;;;;;;;;;;;-1:-1:-1;;;4722:35:0;;;;;;-1:-1:-1;;;;;4745:5:0;4731:10;:19;;4722:8;:35::i;9180:137:32:-;9229:17;895:7;9267:21;;;;:45;;895:7;9267:45;;684:150:28;787:9;;795:1;787:9;;;;825:3;818:10;;;;684:150::o;657:581:15:-;719:7;746:1;742;:5;734:14;;;;;;-1:-1:-1;;;759:1:15;:40;755:86;;815:3;809:9;;;;826:8;755:86;855:19;850:1;:24;846:68;;890:2;884:8;;;;900:7;846:68;-1:-1:-1;;;923:1:15;:16;919:60;;955:2;949:8;;;;965:7;919:60;993:7;988:1;:12;984:56;;1016:2;1010:8;;;;1026:7;984:56;1054:5;1049:1;:10;1045:52;;1075:1;1069:7;;;;1084:6;1045:52;1111:4;1106:1;:9;1102:51;;1131:1;1125:7;;;;1140:6;1102:51;1167:3;1162:1;:8;1158:50;;1186:1;1180:7;;;;1195:6;1158:50;1222:3;1217:1;:8;1213:20;;1232:1;1227:6;657:581;;;:::o;1715:712::-;1778:7;1805:1;1801;:5;1793:14;;;;;;-1:-1:-1;1818:3:15;-1:-1:-1;;;;;1831:21:15;;:25;1827:84;;-1:-1:-1;;1866:8:15;1827:84;;;1901:3;1895:9;;;;;1827:84;-1:-1:-1;;;;;1920:20:15;;:24;1916:81;;-1:-1:-1;;1954:7:15;1916:81;;;1988:2;1982:8;;;;;1916:81;2010:16;2006:20;;:24;2002:81;;-1:-1:-1;;2040:7:15;2002:81;;;2074:2;2068:8;;;;;2002:81;2096:16;2092:20;;:24;2088:81;;-1:-1:-1;;2126:7:15;2088:81;;;2160:2;2154:8;;;;;2088:81;2182:15;2178:19;;:23;2174:78;;-1:-1:-1;;2211:6:15;2174:78;;;2244:1;2238:7;;;;;2174:78;2265:3;2261:7;;:11;2257:66;;-1:-1:-1;;2282:6:15;2257:66;;;2315:1;2309:7;;;;;2257:66;2336:3;2332:7;;:11;2328:66;;-1:-1:-1;;2353:6:15;2328:66;;;2386:1;2380:7;;;;;2328:66;2407:3;2403:7;;:11;2399:23;;-1:-1:-1;;2416:6:15;1715:712;;;:::o;735:3398:19:-;817:14;;;-1:-1:-1;;1286:1:19;1283;1276:20;1312:9;;;;-1:-1:-1;1357:13:19;;;1341:14;;;;1337:34;;-1:-1:-1;1441:10:19;1437:143;;1483:1;1469:11;:15;1461:24;;;;;;-1:-1:-1;1522:23:19;;;;-1:-1:-1;1560:13:19;;1437:143;1695:5;1681:11;:19;1673:28;;;;;;1954:17;2020:11;2017:1;2014;2007:25;2328:12;2343;;;:26;;2449:22;;;;;3176:1;3157;:15;;3156:21;;3387:17;;;3383:21;;3376:28;3441:17;;;3437:21;;3430:28;3496:17;;;3492:21;;3485:28;3551:17;;;3547:21;;3540:28;3606:17;;;3602:21;;3595:28;3662:17;;;3658:21;;;3651:28;2777:12;;;;2773:23;;;2798:1;2769:31;2131:20;;;2120:32;;;2820:12;;;;2168:21;;;;2559:16;;;;2811:21;;;;4098:11;;;;;-1:-1:-1;;735:3398:19;;;;;:::o;8001:472:25:-;8148:15;8191:13;-1:-1:-1;;;;;8175:29:25;:13;-1:-1:-1;;;;;8175:29:25;;8171:98;;;8240:13;;8255;8171:98;8283:7;:185;;8393:75;8409:9;-1:-1:-1;;;;;8393:75:25;8436:13;8420;:29;-1:-1:-1;;;;;8393:75:25;-1:-1:-1;;;8393:15:25;:75::i;:::-;8283:185;;;8299:85;8325:9;-1:-1:-1;;;;;8299:85:25;8352:13;8336;:29;-1:-1:-1;;;;;8299:85:25;-1:-1:-1;;;8299:25:25;:85::i;6913:649::-;7060:15;7103:13;-1:-1:-1;;;;;7087:29:25;:13;-1:-1:-1;;;;;7087:29:25;;7083:98;;;7152:13;;7167;7083:98;-1:-1:-1;;;;;;;307:2:18;7209:45:25;;;;-1:-1:-1;;;;;7281:29:25;;;7260:50;;;7325:17;;7317:26;;;;;;7357:7;:200;;7544:13;-1:-1:-1;;;;;7487:70:25;:54;7503:10;7515;7527:13;-1:-1:-1;;;;;7487:54:25;:15;:54::i;:::-;:70;;;;;;7357:200;;;7373:105;7398:64;7424:10;7436;7448:13;-1:-1:-1;;;;;7398:64:25;:25;:64::i;:::-;7464:13;-1:-1:-1;;;;;7373:105:25;:24;:105::i;:::-;7350:207;6913:649;-1:-1:-1;;;;;;;6913:649:25:o;4889:482::-;5039:16;5082:1;5071:8;-1:-1:-1;;;;;5071:12:25;;5063:21;;;;;;5110:1;5098:9;-1:-1:-1;;;;;5098:13:25;;5090:22;;;;;;5188:10;:178;;5290:76;5330:8;5340:9;5351:8;5361:4;5290:39;:76::i;5188:178::-;5207:74;5245:8;5255:9;5266:8;5276:4;5207:37;:74::i;5901:482::-;6053:16;6096:1;6085:8;-1:-1:-1;;;;;6085:12:25;;6077:21;;;;;;6124:1;6112:9;-1:-1:-1;;;;;6112:13:25;;6104:22;;;;;;6196:10;:182;;6302:76;6340:8;6350:9;6361;6372:5;6302:37;:76::i;6196:182::-;6215:78;6255:8;6265:9;6276;6287:5;6215:39;:78::i;4403:259:19:-;4495:14;4526:25;4533:1;4536;4539:11;4526:6;:25::i;:::-;4517:34;;4589:1;4574:11;4561:25;;;;;4571:1;4568;4561:25;:29;4557:101;;;-1:-1:-1;;4608:6:19;:26;4600:35;;;;;;4643:8;;4403:259;;;;;:::o;30347:381:0:-;30463:25;30490:23;30521:18;30542:71;30568:18;30588:13;:11;:13::i;:::-;30542:71;;30603:9;30542:25;:71::i;:::-;30639:31;;;;;30694:29;;;;;-1:-1:-1;;;30347:381:0:o;29456:378::-;29579:25;29606:23;29655:66;29681:9;29692:16;-1:-1:-1;;;;;29655:66:0;29710:10;-1:-1:-1;;;;;29655:66:0;:25;:66::i;:::-;29637:84;;29766:63;29796:15;29784:9;:27;29813:15;29766:17;:63::i;:::-;29727:102;;;;-1:-1:-1;29456:378:0;-1:-1:-1;;;;29456:378:0:o;1767:533:22:-;1907:18;;:::i;:::-;1933:12;1965:4;:19;;;1948:14;:36;1933:51;;1997:298;;;;;;;;2033:14;1997:298;;;;;;2107:5;2093:19;;2099:4;2093:11;;:19;2071:4;:19;;;:41;1997:298;;;;;;2244:1;2232:9;-1:-1:-1;;;;;2232:13:22;;:29;;2260:1;2232:29;;;2248:9;2232:29;-1:-1:-1;;;;;2205:57:22;-1:-1:-1;;;2224:3:22;2206:21;;;;2205:57;;;;;;2155:4;:38;;;:108;-1:-1:-1;;;;;1997:298:22;;;;;2284:4;1997:298;;;;;1990:305;;;1767:533;;;;;;:::o;9497:1296::-;9714:29;;:::i;:::-;9745:28;;:::i;:::-;9853:4;9858:5;9853:11;;;;;;;;;9840:24;;;;;;;;9853:11;;;;9840:24;;;;;;;-1:-1:-1;;;9840:24:22;;;;;;;;;;;;;;-1:-1:-1;;;9840:24:22;;-1:-1:-1;;;;;9840:24:22;;;;;;;;-1:-1:-1;;;9840:24:22;;;;;;;;;;;-1:-1:-1;9971:44:22;;9975:4;;10008:6;9971:3;:44::i;:::-;9967:389;;;10058:6;10029:35;;:10;:25;;;:35;;;10025:325;;;10176:30;;10025:325;10282:10;10294:46;10304:10;10316:6;10324:4;10330:9;10294;:46::i;:::-;10274:67;;;;;;10025:325;10424:4;10443:11;10429:25;;10430:5;10438:1;10430:9;10429:25;;;;;;;;10424:31;;;;;;;;;10411:44;;;;;;;;10424:31;;;;10411:44;;;;;;-1:-1:-1;;;10411:44:22;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;10411:44:22;;;;;;;;;;;-1:-1:-1;;;10411:44:22;;;;;;;;;;;;;;-1:-1:-1;10461:49:22;;10490:20;;;;;;;;;;;;;;;-1:-1:-1;;;10490:20:22;;;;;;;;;;;;;;-1:-1:-1;;;10490:20:22;;-1:-1:-1;;;;;10490:20:22;;;;;;;;-1:-1:-1;;;10490:20:22;;;;;;;;;;;;-1:-1:-1;10461:49:22;10609:44;10613:4;10619:10;:25;;;10646:6;10609:3;:44::i;:::-;10601:60;;;;;-1:-1:-1;;;10601:60:22;;;;;;;;;;;;-1:-1:-1;;;10601:60:22;;;;;;;;;;;;;;;10736:52;10749:4;10755;10761:6;10769:5;10776:11;10736:12;:52::i;:::-;10729:59;;;;9497:1296;;;;;;;;;;:::o;8207:787:32:-;8333:49;;:::i;:::-;8409:580;;;;;;;;8469:6;:31;;;8409:580;;;;8526:6;:23;;;8409:580;;;;8562:6;:10;;;8409:580;;;;;;8596:6;:21;;;8409:580;;;;;;8646:6;:26;;;8409:580;;;;8690:6;:15;;;-1:-1:-1;;;;;8409:580:32;;;;;8724:6;:16;;;-1:-1:-1;;;;;8409:580:32;;;;;8765:6;:22;;;-1:-1:-1;;;;;8409:580:32;;;;;8811:6;:21;;;8409:580;;;;;;8875:6;:40;;;-1:-1:-1;;;;;8409:580:32;;;;;8950:6;:32;;;8409:580;;;;;8390:599;;8207:787;;;;:::o;480:149:31:-;591:9;;;605;;602:16;;587:32;;574:51::o;3427:929:25:-;3582:7;3747:3;3743:609;;;3760:16;-1:-1:-1;;;;;3788:27:25;;;:152;;3888:52;3904:6;-1:-1:-1;;;3930:9:25;-1:-1:-1;;;;;3888:52:25;:15;:52::i;:::-;3788:152;;;-1:-1:-1;;;;;3828:47:25;;307:2:18;3829:33:25;;;3828:47;;;;;;3788:152;3760:181;-1:-1:-1;3957:43:25;:31;-1:-1:-1;;;;;3957:17:25;;3760:181;3957:21;:31::i;:::-;:41;:43::i;3743:609::-;4021:16;-1:-1:-1;;;;;4049:27:25;;;:185;;4172:62;4198:6;-1:-1:-1;;;4224:9:25;-1:-1:-1;;;;;4172:62:25;:25;:62::i;:::-;4049:185;;;4089:70;307:2:18;4114:33:25;;;-1:-1:-1;;;;;4089:70:25;;:24;:70::i;:::-;4021:214;;4263:8;4252;-1:-1:-1;;;;;4252:19:25;;4244:28;;;;;;-1:-1:-1;;;;;4325:19:25;;;;-1:-1:-1;4310:35:25;;1385:1238;1538:7;1665:11;1661:32;;-1:-1:-1;1685:8:25;1678:15;;1661:32;-1:-1:-1;;;;;;;307:2:18;1720:45:25;;;;1772:847;;;;-1:-1:-1;;;;;1816:50:25;;1827:17;;;;1848:6;1827:17;1848:6;1816:38;;;;;:50;1812:293;;;1900:20;;;1934:25;;;1930:167;;2025:60;2051:10;2063:8;-1:-1:-1;;;;;2025:60:25;2073:11;2025:25;:60::i;:::-;2010:76;;;;;;;1930:167;1812:293;;2128:73;2153:10;2165:35;2193:6;2179:8;-1:-1:-1;;;;;2166:21:25;:10;:21;;;;;;;2165:27;:35::i;:::-;2128:24;:73::i;:::-;2113:89;;;;;;1772:847;-1:-1:-1;;;;;2400:50:25;;2411:17;;;;2432:6;2411:17;2432:6;2400:38;;;;;:50;:74;;;;;2467:7;2454:10;:20;2400:74;2392:83;;;;;;2505:20;;;2540:72;:60;2505:10;-1:-1:-1;;;;;2540:60:25;;2505:20;2540:25;:60::i;6306:323:22:-;6374:4;6451;6446:9;;:1;:9;;;;:22;;;;;6464:4;6459:9;;:1;:9;;;;6446:22;6442:41;;;6482:1;6477:6;;:1;:6;;;;6470:13;;;;6442:41;6490:17;6514:4;6510:8;;:1;:8;;;:26;;6525:1;:11;;-1:-1:-1;;;6525:11:22;6510:26;;;6521:1;6510:26;;;6490:46;;;;6542:17;6566:4;6562:8;;:1;:8;;;:26;;6577:1;:11;;-1:-1:-1;;;6577:11:22;6562:26;;;6573:1;6562:26;;;6542:46;;6602:22;;;;;6306:323;-1:-1:-1;;;;;6306:323:22:o;7560:939::-;7724:29;;:::i;:::-;7755:28;;:::i;:::-;7791:9;7817:11;7803:25;;7804:5;7812:1;7804:9;7803:25;;;;;;;;7791:37;;;;7856:9;7886:1;7872:11;7868:15;;:1;:15;:19;7856:31;;7915:9;7930:565;-1:-1:-1;7965:1:22;7956:5;;;7955:11;7988:4;7993:15;;;7955:11;7993:15;;;;;;7988:21;;;;;;;7975:34;;;;;;;;7988:21;;;;7975:34;;;;;;-1:-1:-1;;;7975:34:22;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;7975:34:22;;;;;;;;;;;-1:-1:-1;;;7975:34:22;;;;;;;;;;;;;;-1:-1:-1;8104:75:22;;8147:1;8151;8147:5;8143:9;;8162:8;;8104:75;8199:4;8214:11;8204:21;;8205:1;8209;8205:5;8204:21;;;;;;8199:27;;;;;;;8187:39;;;;;;;;8199:27;;;;8187:39;;;;;;-1:-1:-1;;;8187:39:22;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;8187:39:22;;;;;;;;;;;-1:-1:-1;;;8187:39:22;;;;;;;;;;8268:25;;8187:39;;-1:-1:-1;;;8258:44:22;;8262:4;;8295:6;8258:3;:44::i;:::-;8235:67;;8357:15;:62;;;;;8376:43;8380:4;8386:6;8394:9;:24;;;8376:3;:43::i;:::-;8353:73;;;8421:5;;;8353:73;8440:15;8435:53;;8465:1;8461;:5;8457:9;;8435:53;;;8483:1;8487;8483:5;8479:9;;8435:53;7930:565;;;;7560:939;;;;;;;;;;;:::o;349:105:24:-;447:1;-1:-1:-1;;;;;427:21:24;;;;419:30;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:138:41:-;84:20;;113:33;84:20;113:33;:::i;157:162::-;224:20;;280:13;;273:21;263:32;;253:2;;309:1;306;299:12;324:377;;;441:3;434:4;426:6;422:17;418:27;408:2;;466:8;456;449:26;408:2;-1:-1:-1;496:20:41;;-1:-1:-1;;;;;528:30:41;;525:2;;;578:8;568;561:26;525:2;622:4;614:6;610:17;598:29;;674:3;667:4;658:6;650;646:19;642:30;639:39;636:2;;;691:1;688;681:12;706:542;;803:3;796:4;788:6;784:17;780:27;770:2;;825:5;818;811:20;770:2;865:6;852:20;-1:-1:-1;;;;;887:2:41;884:26;881:2;;;913:9;881:2;948:54;990:2;971:13;;-1:-1:-1;;967:27:41;996:4;963:38;948:54;:::i;:::-;1027:2;1018:7;1011:19;1073:3;1066:4;1061:2;1053:6;1049:15;1045:26;1042:35;1039:2;;;1094:5;1087;1080:20;1039:2;1163;1156:4;1148:6;1144:17;1137:4;1128:7;1124:18;1111:55;1186:16;;;1204:4;1182:27;1175:42;;;;1190:7;760:488;-1:-1:-1;;760:488:41:o;1253:162::-;1321:20;;1381:1;1370:20;;;1360:31;;1350:2;;1405:1;1402;1395:12;1420:134;1488:20;;1517:31;1488:20;1517:31;:::i;1559:885::-;;1649:6;1692:2;1680:9;1675:3;1671:19;1667:28;1664:2;;;1712:5;1705;1698:20;1664:2;1738:18;1753:2;1738:18;:::i;:::-;1729:27;;;1779:31;1800:9;1779:31;:::i;:::-;1772:5;1765:46;1843:40;1879:2;1868:9;1864:18;1843:40;:::i;:::-;1838:2;1831:5;1827:14;1820:64;1916:37;1949:2;1938:9;1934:18;1916:37;:::i;:::-;1911:2;1904:5;1900:14;1893:61;2014:2;2003:9;1999:18;1986:32;1981:2;1974:5;1970:14;1963:56;2052:41;2088:3;2077:9;2073:19;2052:41;:::i;:::-;2046:3;2039:5;2035:15;2028:66;2145:3;2134:9;2130:19;2117:33;-1:-1:-1;;;;;2165:6:41;2162:30;2159:2;;;2205:1;2202;2195:12;2159:2;2242:47;2285:3;2276:6;2265:9;2261:22;2242:47;:::i;:::-;2236:3;2229:5;2225:15;2218:72;;2323:41;2359:3;2348:9;2344:19;2323:41;:::i;:::-;2317:3;2310:5;2306:15;2299:66;2398:39;2432:3;2421:9;2417:19;2398:39;:::i;:::-;2392:3;2385:5;2381:15;2374:64;1629:815;;;;:::o;2449:138::-;2519:20;;2548:33;2519:20;2548:33;:::i;2592:136::-;2661:20;;2690:32;2661:20;2690:32;:::i;2733:259::-;;2845:2;2833:9;2824:7;2820:23;2816:32;2813:2;;;2866:6;2858;2851:22;2813:2;2910:9;2897:23;2929:33;2956:5;2929:33;:::i;2997:263::-;;3120:2;3108:9;3099:7;3095:23;3091:32;3088:2;;;3141:6;3133;3126:22;3088:2;3178:9;3172:16;3197:33;3224:5;3197:33;:::i;3265:402::-;;;3394:2;3382:9;3373:7;3369:23;3365:32;3362:2;;;3415:6;3407;3400:22;3362:2;3459:9;3446:23;3478:33;3505:5;3478:33;:::i;:::-;3530:5;-1:-1:-1;3587:2:41;3572:18;;3559:32;3600:35;3559:32;3600:35;:::i;:::-;3654:7;3644:17;;;3352:315;;;;;:::o;3672:906::-;;;;;;;3867:3;3855:9;3846:7;3842:23;3838:33;3835:2;;;3889:6;3881;3874:22;3835:2;3933:9;3920:23;3952:33;3979:5;3952:33;:::i;:::-;4004:5;-1:-1:-1;4061:2:41;4046:18;;4033:32;4074:35;4033:32;4074:35;:::i;:::-;4128:7;-1:-1:-1;4187:2:41;4172:18;;4159:32;4200:35;4159:32;4200:35;:::i;:::-;4254:7;-1:-1:-1;4280:38:41;4314:2;4299:18;;4280:38;:::i;:::-;4270:48;;4370:3;4359:9;4355:19;4342:33;4384:35;4411:7;4384:35;:::i;:::-;4438:7;-1:-1:-1;4497:3:41;4482:19;;4469:33;4511:35;4469:33;4511:35;:::i;:::-;4565:7;4555:17;;;3825:753;;;;;;;;:::o;4583:850::-;;;;;;;4778:3;4766:9;4757:7;4753:23;4749:33;4746:2;;;4800:6;4792;4785:22;4746:2;4844:9;4831:23;4863:33;4890:5;4863:33;:::i;:::-;4915:5;-1:-1:-1;4939:37:41;4972:2;4957:18;;4939:37;:::i;:::-;4929:47;;5023:2;5012:9;5008:18;4995:32;4985:42;;5079:2;5068:9;5064:18;5051:32;5092:35;5119:7;5092:35;:::i;:::-;5146:7;-1:-1:-1;5204:3:41;5189:19;;5176:33;-1:-1:-1;;;;;5221:30:41;;5218:2;;;5269:6;5261;5254:22;5218:2;5313:60;5365:7;5356:6;5345:9;5341:22;5313:60;:::i;:::-;4736:697;;;;-1:-1:-1;4736:697:41;;-1:-1:-1;4736:697:41;;5392:8;;4736:697;-1:-1:-1;;;4736:697:41:o;5438:857::-;;;;;;;5633:3;5621:9;5612:7;5608:23;5604:33;5601:2;;;5655:6;5647;5640:22;5601:2;5699:9;5686:23;5718:33;5745:5;5718:33;:::i;:::-;5770:5;-1:-1:-1;5794:38:41;5828:2;5813:18;;5794:38;:::i;:::-;5784:48;;5851:38;5885:2;5874:9;5870:18;5851:38;:::i;:::-;5841:48;;5941:2;5930:9;5926:18;5913:32;5954:35;5981:7;5954:35;:::i;6300:691::-;;;;;;6476:3;6464:9;6455:7;6451:23;6447:33;6444:2;;;6498:6;6490;6483:22;6444:2;6542:9;6529:23;6561:33;6588:5;6561:33;:::i;:::-;6613:5;-1:-1:-1;6637:38:41;6671:2;6656:18;;6637:38;:::i;:::-;6627:48;;6694:38;6728:2;6717:9;6713:18;6694:38;:::i;:::-;6684:48;;6784:2;6773:9;6769:18;6756:32;6797:35;6824:7;6797:35;:::i;:::-;6851:7;-1:-1:-1;6910:3:41;6895:19;;6882:33;6924:35;6882:33;6924:35;:::i;:::-;6978:7;6968:17;;;6434:557;;;;;;;;:::o;6996:835::-;;;;;;;7189:3;7177:9;7168:7;7164:23;7160:33;7157:2;;;7211:6;7203;7196:22;7157:2;7255:9;7242:23;7274:33;7301:5;7274:33;:::i;:::-;7326:5;-1:-1:-1;7350:38:41;7384:2;7369:18;;7350:38;:::i;:::-;7340:48;;7407:38;7441:2;7430:9;7426:18;7407:38;:::i;:::-;7397:48;;7497:2;7486:9;7482:18;7469:32;7510:35;7537:7;7510:35;:::i;:::-;7564:7;-1:-1:-1;7623:3:41;7608:19;;7595:33;7637:35;7595:33;7637:35;:::i;7836:705::-;;;;;;8018:3;8006:9;7997:7;7993:23;7989:33;7986:2;;;8040:6;8032;8025:22;7986:2;8084:9;8071:23;8103:33;8130:5;8103:33;:::i;:::-;8155:5;-1:-1:-1;8207:2:41;8192:18;;8179:32;;-1:-1:-1;8258:2:41;8243:18;;8230:32;;-1:-1:-1;8313:2:41;8298:18;;8285:32;-1:-1:-1;;;;;8329:30:41;;8326:2;;;8377:6;8369;8362:22;8326:2;8421:60;8473:7;8464:6;8453:9;8449:22;8421:60;:::i;:::-;7976:565;;;;-1:-1:-1;7976:565:41;;-1:-1:-1;8500:8:41;;8395:86;7976:565;-1:-1:-1;;;7976:565:41:o;8546:665::-;;;8692:2;8680:9;8671:7;8667:23;8663:32;8660:2;;;8713:6;8705;8698:22;8660:2;8758:9;8745:23;-1:-1:-1;;;;;8828:2:41;8820:6;8817:14;8814:2;;;8849:6;8841;8834:22;8814:2;8892:6;8881:9;8877:22;8867:32;;8937:7;8930:4;8926:2;8922:13;8918:27;8908:2;;8964:6;8956;8949:22;8908:2;9009;8996:16;9035:2;9027:6;9024:14;9021:2;;;9056:6;9048;9041:22;9021:2;9115:7;9110:2;9104;9096:6;9092:15;9088:2;9084:24;9080:33;9077:46;9074:2;;;9141:6;9133;9126:22;9074:2;9177;9169:11;;;;;9199:6;;-1:-1:-1;8650:561:41;;-1:-1:-1;;;;8650:561:41:o;9216:190::-;;9328:2;9316:9;9307:7;9303:23;9299:32;9296:2;;;9349:6;9341;9334:22;9296:2;-1:-1:-1;9377:23:41;;9286:120;-1:-1:-1;9286:120:41:o;9411:439::-;;;;9552:2;9540:9;9531:7;9527:23;9523:32;9520:2;;;9573:6;9565;9558:22;9520:2;9617:9;9604:23;9671:5;9667:2;9656:21;9649:5;9646:32;9636:2;;9697:6;9689;9682:22;9636:2;9725:5;-1:-1:-1;9749:38:41;9783:2;9768:18;;9749:38;:::i;:::-;9739:48;;9806:38;9840:2;9829:9;9825:18;9806:38;:::i;:::-;9796:48;;9510:340;;;;;:::o;9855:293::-;;9965:2;9953:9;9944:7;9940:23;9936:32;9933:2;;;9986:6;9978;9971:22;9933:2;10030:9;10017:23;10083:5;10080:1;10069:20;10062:5;10059:31;10049:2;;10109:6;10101;10094:22;10153:194;;10263:2;10251:9;10242:7;10238:23;10234:32;10231:2;;;10284:6;10276;10269:22;10231:2;10312:29;10331:9;10312:29;:::i;10352:266::-;;;10477:2;10465:9;10456:7;10452:23;10448:32;10445:2;;;10498:6;10490;10483:22;10445:2;10526:29;10545:9;10526:29;:::i;:::-;10516:39;;10574:38;10608:2;10597:9;10593:18;10574:38;:::i;:::-;10564:48;;10435:183;;;;;:::o;10623:403::-;;;;10765:2;10753:9;10744:7;10740:23;10736:32;10733:2;;;10786:6;10778;10771:22;10733:2;10814:29;10833:9;10814:29;:::i;:::-;10804:39;;10862:38;10896:2;10885:9;10881:18;10862:38;:::i;:::-;10852:48;;10950:2;10939:9;10935:18;10922:32;10963:33;10990:5;10963:33;:::i;:::-;11015:5;11005:15;;;10723:303;;;;;:::o;11031:547::-;;;;;11190:3;11178:9;11169:7;11165:23;11161:33;11158:2;;;11212:6;11204;11197:22;11158:2;11240:29;11259:9;11240:29;:::i;:::-;11230:39;;11288:38;11322:2;11311:9;11307:18;11288:38;:::i;:::-;11278:48;;11376:2;11365:9;11361:18;11348:32;11389:33;11416:5;11389:33;:::i;:::-;11441:5;-1:-1:-1;11498:2:41;11483:18;;11470:32;11511:35;11470:32;11511:35;:::i;:::-;11148:430;;;;-1:-1:-1;11148:430:41;;-1:-1:-1;;11148:430:41:o;11583:334::-;;;;11725:2;11713:9;11704:7;11700:23;11696:32;11693:2;;;11746:6;11738;11731:22;11693:2;11774:29;11793:9;11774:29;:::i;:::-;11764:39;;11822:38;11856:2;11845:9;11841:18;11822:38;:::i;:::-;11812:48;;11907:2;11896:9;11892:18;11879:32;11869:42;;11683:234;;;;;:::o;11922:570::-;;;;12076:2;12064:9;12055:7;12051:23;12047:32;12044:2;;;12097:6;12089;12082:22;12044:2;12134:9;12128:16;12153:31;12178:5;12153:31;:::i;:::-;12253:2;12238:18;;12232:25;12203:5;;-1:-1:-1;12266:35:41;12232:25;12266:35;:::i;:::-;12372:2;12357:18;;12351:25;12320:7;;-1:-1:-1;12420:10:41;12407:24;;12395:37;;12385:2;;12451:6;12443;12436:22;12497:1045;;12638:2;12626:9;12617:7;12613:23;12609:32;12606:2;;;12659:6;12651;12644:22;12606:2;12704:9;12691:23;-1:-1:-1;;;;;12774:2:41;12766:6;12763:14;12760:2;;;12795:6;12787;12780:22;12760:2;12823:22;;;;12879:4;12861:16;;;12857:27;12854:2;;;12902:6;12894;12887:22;12854:2;12940;12934:9;12982:4;12974:6;12970:17;13037:6;13025:10;13022:22;13017:2;13005:10;13002:18;12999:46;12996:2;;;13048:9;12996:2;13075;13068:22;13114:24;13135:2;13114:24;:::i;:::-;13106:6;13099:40;13172:33;13201:2;13197;13193:11;13172:33;:::i;:::-;13167:2;13159:6;13155:15;13148:58;13260:2;13256;13252:11;13239:25;13234:2;13226:6;13222:15;13215:50;13319:2;13315;13311:11;13298:25;13293:2;13285:6;13281:15;13274:50;13370:3;13366:2;13362:12;13349:26;13400:2;13390:8;13387:16;13384:2;;;13421:6;13413;13406:22;13384:2;13464:46;13502:7;13491:8;13487:2;13483:17;13464:46;:::i;:::-;13458:3;13446:16;;13439:72;-1:-1:-1;13450:6:41;12596:946;-1:-1:-1;;;;;12596:946:41:o;13547:374::-;;13687:2;13675:9;13666:7;13662:23;13658:32;13655:2;;;13708:6;13700;13693:22;13655:2;13753:9;13740:23;-1:-1:-1;;;;;13778:6:41;13775:30;13772:2;;;13823:6;13815;13808:22;13772:2;13851:64;13907:7;13898:6;13887:9;13883:22;13851:64;:::i;13926:1434::-;;;14107:9;14098:7;14094:23;14137:3;14133:2;14129:12;14126:2;;;14159:6;14151;14144:22;14126:2;14204:9;14191:23;-1:-1:-1;;;;;14229:6:41;14226:30;14223:2;;;14274:6;14266;14259:22;14223:2;14302:64;14358:7;14349:6;14338:9;14334:22;14302:64;:::i;:::-;14292:74;;;14385:6;14425:2;14419;14415:7;14411:2;14407:16;14403:25;14400:2;;;14446:6;14438;14431:22;14400:2;14477:18;14492:2;14477:18;:::i;:::-;14464:31;;14546:2;14535:9;14531:18;14518:32;14511:5;14504:47;14611:2;14600:9;14596:18;14583:32;14578:2;14571:5;14567:14;14560:56;14648:39;14683:2;14672:9;14668:18;14648:39;:::i;:::-;14643:2;14636:5;14632:14;14625:63;14720:38;14753:3;14742:9;14738:19;14720:38;:::i;:::-;14715:2;14708:5;14704:14;14697:62;14820:3;14809:9;14805:19;14792:33;14786:3;14779:5;14775:15;14768:58;14859:41;14895:3;14884:9;14880:19;14859:41;:::i;:::-;14853:3;14846:5;14842:15;14835:66;14934:41;14970:3;14959:9;14955:19;14934:41;:::i;:::-;14928:3;14921:5;14917:15;14910:66;14995:3;15031:40;15067:2;15056:9;15052:18;15031:40;:::i;:::-;15025:3;15018:5;15014:15;15007:65;15091:3;15126:38;15160:2;15149:9;15145:18;15126:38;:::i;:::-;15121:2;15114:5;15110:14;15103:62;15184:3;15174:13;;15219:40;15255:2;15244:9;15240:18;15219:40;:::i;:::-;15203:14;;;15196:64;15292:37;15310:18;;;15292:37;:::i;:::-;15276:14;;;15269:61;-1:-1:-1;14074:1286:41;;15280:5;;-1:-1:-1;14074:1286:41;;-1:-1:-1;;14074:1286:41:o;15365:263::-;;15488:2;15476:9;15467:7;15463:23;15459:32;15456:2;;;15509:6;15501;15494:22;15456:2;15546:9;15540:16;15565:33;15592:5;15565:33;:::i;15633:399::-;;;15773:2;15761:9;15752:7;15748:23;15744:32;15741:2;;;15794:6;15786;15779:22;15741:2;15831:9;15825:16;15850:33;15877:5;15850:33;:::i;:::-;15952:2;15937:18;;15931:25;15902:5;;-1:-1:-1;15965:35:41;15931:25;15965:35;:::i;16037:385::-;;;;16194:2;16182:9;16173:7;16169:23;16165:32;16162:2;;;16215:6;16207;16200:22;16162:2;16252:9;16246:16;16271:33;16298:5;16271:33;:::i;:::-;16368:2;16353:18;;16347:25;16412:2;16397:18;;;16391:25;16323:5;;16347:25;;-1:-1:-1;16391:25:41;16152:270;-1:-1:-1;;;16152:270:41:o;16427:292::-;;16538:2;16526:9;16517:7;16513:23;16509:32;16506:2;;;16559:6;16551;16544:22;16506:2;16603:9;16590:23;16653:6;16646:5;16642:18;16635:5;16632:29;16622:2;;16680:6;16672;16665:22;16724:261;;16846:2;16834:9;16825:7;16821:23;16817:32;16814:2;;;16867:6;16859;16852:22;16814:2;16904:9;16898:16;16923:32;16949:5;16923:32;:::i;17185:194::-;;17308:2;17296:9;17287:7;17283:23;17279:32;17276:2;;;17329:6;17321;17314:22;17276:2;-1:-1:-1;17357:16:41;;17266:113;-1:-1:-1;17266:113:41:o;17384:255::-;;;17524:2;17512:9;17503:7;17499:23;17495:32;17492:2;;;17545:6;17537;17530:22;17492:2;-1:-1:-1;;17573:16:41;;17629:2;17614:18;;;17608:25;17573:16;;17608:25;;-1:-1:-1;17482:157:41:o;17644:106::-;-1:-1:-1;;;;;17712:31:41;17700:44;;17690:60::o;17755:93::-;17827:13;17820:21;17808:34;;17798:50::o;17853:270::-;;17943:6;17938:3;17931:19;17995:6;17988:5;17981:4;17976:3;17972:14;17959:43;18047:3;18040:4;18031:6;18026:3;18022:16;18018:27;18011:40;18112:4;18105:2;18101:7;18096:2;18088:6;18084:15;18080:29;18075:3;18071:39;18067:50;18060:57;;17921:202;;;;;:::o;18128:477::-;;18209:5;18203:12;18236:6;18231:3;18224:19;18261:3;18273:162;18287:6;18284:1;18281:13;18273:162;;;18349:4;18405:13;;;18401:22;;18395:29;18377:11;;;18373:20;;18366:59;18302:12;18273:162;;;18453:6;18450:1;18447:13;18444:2;;;18519:3;18512:4;18503:6;18498:3;18494:16;18490:27;18483:40;18444:2;-1:-1:-1;18587:2:41;18566:15;-1:-1:-1;;18562:29:41;18553:39;;;;18594:4;18549:50;;18179:426;-1:-1:-1;;18179:426:41:o;18610:93::-;18687:1;18676:20;18664:33;;18654:49::o;18708:93::-;18785:1;18774:20;18762:33;;18752:49::o;18806:1185::-;18896:5;18890:12;18885:3;18878:25;18952:4;18945:5;18941:16;18935:23;18928:4;18923:3;18919:14;18912:47;19005:4;18998:5;18994:16;18988:23;19020:49;19063:4;19058:3;19054:14;19040:12;19020:49;:::i;:::-;;19117:4;19110:5;19106:16;19100:23;19132:49;19175:4;19170:3;19166:14;19150;19132:49;:::i;:::-;;19230:4;19223:5;19219:16;19213:23;19206:4;19201:3;19197:14;19190:47;19285:4;19278:5;19274:16;19268:23;19300:52;19346:4;19341:3;19337:14;19321;19300:52;:::i;:::-;;19400:4;19393:5;19389:16;19383:23;19415:52;19461:4;19456:3;19452:14;19436;19415:52;:::i;:::-;;19515:4;19508:5;19504:16;19498:23;19530:52;19576:4;19571:3;19567:14;19551;19530:52;:::i;:::-;;19601:6;19655:2;19648:5;19644:14;19638:21;19668:48;19712:2;19707:3;19703:12;19687:14;19668:48;:::i;:::-;;;19735:6;19789:2;19782:5;19778:14;19772:21;19802:50;19848:2;19843:3;19839:12;19823:14;19802:50;:::i;:::-;;;19871:6;19925:2;19918:5;19914:14;19908:21;19938:47;19981:2;19976:3;19972:12;19956:14;19938:47;:::i;19996:1147::-;20072:39;20107:3;20099:5;20093:12;20072:39;:::i;:::-;20157:4;20150:5;20146:16;20140:23;20172:48;20214:4;20209:3;20205:14;20191:12;20172:48;:::i;:::-;;20268:4;20261:5;20257:16;20251:23;20283:50;20327:4;20322:3;20318:14;20302;20283:50;:::i;:::-;;20381:4;20374:5;20370:16;20364:23;20396:52;20442:4;20437:3;20433:14;20417;20396:52;:::i;:::-;;20496:4;20489:5;20485:16;20479:23;20511:52;20557:4;20552:3;20548:14;20532;20511:52;:::i;:::-;;20612:4;20605:5;20601:16;20595:23;20588:4;20583:3;20579:14;20572:47;20668:4;20661:5;20657:16;20651:23;20644:4;20639:3;20635:14;20628:47;20724:4;20717:5;20713:16;20707:23;20700:4;20695:3;20691:14;20684:47;20750:6;20804:2;20797:5;20793:14;20787:21;20817:50;20863:2;20858:3;20854:12;20838:14;20817:50;:::i;:::-;;;20886:6;20940:2;20933:5;20929:14;20923:21;20953:48;20997:2;20992:3;20988:12;20972:14;20953:48;:::i;:::-;;;21020:6;21074:2;21067:5;21063:14;21057:21;21087:50;21133:2;21128:3;21124:12;21108:14;21087:50;:::i;21148:837::-;;21232:6;21274:1;21270;21265:3;21261:11;21257:19;21315:2;21307:5;21301:12;21297:21;21292:3;21285:34;21380:2;21372:4;21365:5;21361:16;21355:23;21351:32;21344:4;21339:3;21335:14;21328:56;21447:4;21440:5;21436:16;21430:23;21423:31;21416:39;21409:4;21404:3;21400:14;21393:63;21505:4;21498:5;21494:16;21488:23;21481:4;21476:3;21472:14;21465:47;21573:2;21565:4;21558:5;21554:16;21548:23;21544:32;21537:4;21532:3;21528:14;21521:56;;21623:4;21616:5;21612:16;21606:23;21661:2;21654:4;21649:3;21645:14;21638:26;21685:46;21727:2;21722:3;21718:12;21704;21685:46;:::i;:::-;21673:58;;;21779:4;21772:5;21768:16;21762:23;21794:52;21840:4;21835:3;21831:14;21815;21794:52;:::i;:::-;;21894:4;21887:5;21883:16;21877:23;21909:50;21953:4;21948:3;21944:14;21928;21909:50;:::i;:::-;-1:-1:-1;21975:4:41;21212:773;-1:-1:-1;;;21212:773:41:o;21990:121::-;-1:-1:-1;;;;;22058:46:41;22046:59;;22036:75::o;22116:94::-;22194:8;22183:20;22171:33;;22161:49::o;22215:203::-;-1:-1:-1;;;;;22379:32:41;;;;22361:51;;22349:2;22334:18;;22316:102::o;22423:312::-;-1:-1:-1;;;;;22661:15:41;;;22643:34;;22713:15;;22708:2;22693:18;;22686:43;22593:2;22578:18;;22560:175::o;22740:1195::-;23004:2;23016:21;;;23086:13;;22989:18;;;23108:22;;;22740:1195;;23183:4;;23161:2;23146:18;;;23210:15;;;22740:1195;23256:184;23270:6;23267:1;23264:13;23256:184;;;23345:13;;23342:1;23331:28;23319:41;;23380:12;;;;23415:15;;;;23292:1;23285:9;23256:184;;;-1:-1:-1;;;23476:19:41;;;23456:18;;;23449:47;23546:13;;23568:21;;;23644:15;;;;23607:12;;;23679:4;23692:215;23708:8;23703:3;23700:17;23692:215;;;23781:15;;-1:-1:-1;;;;;23777:41:41;23763:56;;23880:17;;;;23841:14;;;;23815:1;23727:11;23692:215;;;-1:-1:-1;23924:5:41;;22965:970;-1:-1:-1;;;;;;;22965:970:41:o;23940:407::-;24217:25;;;24273:2;24258:18;;24251:34;;;;24333:6;24321:19;24316:2;24301:18;;24294:47;24205:2;24190:18;;24172:175::o;24352:177::-;24498:25;;;24486:2;24471:18;;24453:76::o;24534:188::-;24705:1;24694:21;;;;24676:40;;24664:2;24649:18;;24631:91::o;24727:244::-;24897:25;;;24953:2;24938:18;;24931:34;24885:2;24870:18;;24852:119::o;24976:384::-;;25185:6;25174:9;25167:25;25228:6;25223:2;25212:9;25208:18;25201:34;25271:2;25266;25255:9;25251:18;25244:30;25291:63;25350:2;25339:9;25335:18;25327:6;25319;25291:63;:::i;:::-;25283:71;25157:203;-1:-1:-1;;;;;;25157:203:41:o;25365:537::-;25616:25;;;25672:2;25657:18;;25650:34;;;;-1:-1:-1;;;;;25720:32:41;;;;25715:2;25700:18;;25693:60;-1:-1:-1;;;;;25789:47:41;25784:2;25769:18;;25762:75;25885:1;25874:21;25868:3;25853:19;;25846:50;25603:3;25588:19;;25570:332::o;25907:371::-;26132:1;26121:21;;;;26103:40;;-1:-1:-1;;;;;26179:32:41;;;;26174:2;26159:18;;26152:60;26260:10;26248:23;26243:2;26228:18;;26221:51;26091:2;26076:18;;26058:220::o;26283:970::-;26698:25;;;-1:-1:-1;;;;;26797:15:41;;;26792:2;26777:18;;26770:43;26860:1;26849:21;;;26844:2;26829:18;;26822:49;26907:21;;;;26902:2;26887:18;;26880:49;-1:-1:-1;;;;;27019:15:41;;;27013:3;26998:19;;26991:44;27072:15;;26750:3;27051:19;;27044:44;27125:15;;27119:3;27104:19;;27097:44;27178:15;;;27172:3;27157:19;;27150:44;27231:15;27225:3;27210:19;;27203:44;26685:3;26670:19;;26652:601::o;27258:918::-;27709:25;;;27765:2;27750:18;;27743:34;;;;-1:-1:-1;;;;;27813:32:41;;;;27808:2;27793:18;;27786:60;27893:1;27882:21;;;27877:2;27862:18;;27855:49;27941:21;;;27935:3;27920:19;;27913:50;28000:21;;;27833:3;27979:19;;27972:50;28070:2;28059:22;28053:3;28038:19;;28031:51;28113:3;28098:19;;28091:35;28157:3;28142:19;;28135:35;27696:3;27681:19;;27663:513::o;28181:829::-;;28715:3;28704:9;28700:19;28692:27;;28746:6;28735:9;28728:25;28789:6;28784:2;28773:9;28769:18;28762:34;28832:6;28827:2;28816:9;28812:18;28805:34;28875:6;28870:2;28859:9;28855:18;28848:34;28919:6;28913:3;28902:9;28898:19;28891:35;28935:69;28999:3;28988:9;28984:19;28976:6;28935:69;:::i;29015:892::-;29442:25;;;29498:2;29483:18;;29476:34;;;;29557:1;29546:21;;;29541:2;29526:18;;29519:49;29604:21;;;29599:2;29584:18;;29577:49;29663:21;;29657:3;29642:19;;29635:50;29704:6;29747:15;;;29741:3;29726:19;;29719:44;29800:15;29794:3;29779:19;;29772:44;-1:-1:-1;;;;;29853:47:41;29847:3;29832:19;;29825:76;29429:3;29414:19;;29396:511::o;29912:618::-;30237:25;;;30309:1;30298:21;;;30293:2;30278:18;;30271:49;30356:21;;;30351:2;30336:18;;30329:49;30414:21;;30409:2;30394:18;;30387:49;30467:3;30452:19;;30445:35;;;;30511:3;30496:19;;30489:35;30224:3;30209:19;;30191:339::o;30535:221::-;;30684:2;30673:9;30666:21;30704:46;30746:2;30735:9;30731:18;30723:6;30704:46;:::i;30761:825::-;;31008:2;30997:9;30990:21;31047:1;31043;31038:3;31034:11;31030:19;31104:2;31095:6;31089:13;31085:22;31080:2;31069:9;31065:18;31058:50;31175:2;31167:4;31159:6;31155:17;31149:24;31145:33;31139:3;31128:9;31124:19;31117:62;31235:4;31227:6;31223:17;31217:24;31210:4;31199:9;31195:20;31188:54;31297:2;31289:6;31285:15;31279:22;31273:3;31262:9;31258:19;31251:51;31349:3;31341:6;31337:16;31331:23;31391:4;31385:3;31374:9;31370:19;31363:33;31413:53;31461:3;31450:9;31446:19;31432:12;31413:53;:::i;:::-;31504:15;;;;31497:4;31482:20;;31475:45;-1:-1:-1;;31569:1:41;31558:21;;;;31551:4;31536:20;;;31529:51;31405:61;30980:606;-1:-1:-1;30980:606:41:o;31591:487::-;31853:25;;;-1:-1:-1;;;;;31952:15:41;;;31947:2;31932:18;;31925:43;32004:15;;;31999:2;31984:18;;31977:43;32056:15;32051:2;32036:18;;32029:43;31840:3;31825:19;;31807:271::o;32083:1403::-;;32375:3;32405:6;32394:9;32387:25;32484:1;32480;32475:3;32471:11;32467:19;32458:6;32452:13;32448:39;32443:2;32432:9;32428:18;32421:67;32535:2;32527:6;32523:15;32517:22;32548:54;32598:2;32587:9;32583:18;32569:12;32548:54;:::i;:::-;;32651:2;32643:6;32639:15;32633:22;32664:56;32716:2;32705:9;32701:18;32685:14;32664:56;:::i;:::-;;32769:2;32761:6;32757:15;32751:22;32782:55;32832:3;32821:9;32817:19;32801:14;32782:55;:::i;:::-;;32886:3;32878:6;32874:16;32868:23;32900:57;32952:3;32941:9;32937:19;32921:14;32900:57;:::i;:::-;;33006:3;32998:6;32994:16;32988:23;33020:57;33072:3;33061:9;33057:19;33041:14;33020:57;:::i;:::-;;33126:3;33118:6;33114:16;33108:23;33140:57;33192:3;33181:9;33177:19;33161:14;33140:57;:::i;:::-;;33234:3;33226:6;33222:16;33216:23;33258:3;33297:2;33292;33281:9;33277:18;33270:30;33355:2;33347:6;33343:15;33337:22;33331:3;33320:9;33316:19;33309:51;;;33397:2;33391:3;33380:9;33376:19;33369:31;33417:63;33476:2;33465:9;33461:18;33453:6;33445;33417:63;:::i;33491:800::-;;33862:3;33874:59;33923:9;33915:6;33874:59;:::i;:::-;33964:3;33949:19;;33942:35;;;34008:3;33993:19;;33986:35;;;-1:-1:-1;;;;;34096:15:41;;;34090:3;34075:19;;34068:44;34149:15;;34143:3;34128:19;;34121:44;34196:3;34181:19;;34174:31;;;34222:63;34266:18;;;34258:6;34250;34222:63;:::i;:::-;34214:71;33842:449;-1:-1:-1;;;;;;;;;;33842:449:41:o;34296:588::-;34624:25;;;34680:2;34665:18;;34658:34;;;;-1:-1:-1;;;;;34728:32:41;;;;34723:2;34708:18;;34701:60;34808:1;34797:21;;;34792:2;34777:18;;34770:49;34856:21;34850:3;34835:19;;34828:50;34611:3;34596:19;;34578:306::o;34889:270::-;;35074:2;35063:9;35056:21;35094:59;35149:2;35138:9;35134:18;35126:6;35094:59;:::i;35164:457::-;;35409:2;35398:9;35391:21;35429:59;35484:2;35473:9;35469:18;35461:6;35429:59;:::i;:::-;-1:-1:-1;;;;;35524:32:41;;;;35519:2;35504:18;;35497:60;-1:-1:-1;35604:1:41;35593:21;;;;35588:2;35573:18;;;35566:49;35421:67;35381:240;-1:-1:-1;35381:240:41:o;35626:459::-;;35897:3;35927:2;35916:9;35909:21;35947:59;36002:2;35991:9;35987:18;35979:6;35947:59;:::i;:::-;35939:67;;;36015:64;36075:2;36064:9;36060:18;36052:6;36015:64;:::i;36090:565::-;;36397:3;36427:2;36416:9;36409:21;36447:59;36502:2;36491:9;36487:18;36479:6;36447:59;:::i;:::-;36439:67;;;36515:64;36575:2;36564:9;36560:18;36552:6;36515:64;:::i;:::-;-1:-1:-1;;;;;36616:32:41;;;;36610:3;36595:19;;;;36588:61;36377:278;;-1:-1:-1;;36377:278:41:o;36660:218::-;-1:-1:-1;;;;;36824:47:41;;;;36806:66;;36794:2;36779:18;;36761:117::o;36883:954::-;-1:-1:-1;;;;;37284:47:41;;;;37266:66;;37379:2;37368:22;;;37363:2;37348:18;;37341:50;37427:22;;;;37422:2;37407:18;;37400:50;37481:2;37466:18;;37459:34;;;;37524:3;37509:19;;37502:35;;;;37568:3;37553:19;;37546:35;37629:1;37618:21;37612:3;37597:19;;37590:50;-1:-1:-1;;;;;37677:32:41;37671:3;37656:19;;37649:61;37759:10;37747:23;;;37741:3;37726:19;;37719:52;37815:14;37808:22;37802:3;37787:19;;37780:51;37253:3;37238:19;;37220:617::o;37842:319::-;-1:-1:-1;;;;;38087:15:41;;;38069:34;;38139:15;;38134:2;38119:18;;38112:43;38004:2;37989:18;;37971:190::o;38166:543::-;-1:-1:-1;;;;;38496:15:41;;;38478:34;;38543:2;38528:18;;38521:34;;;;38586:2;38571:18;;38564:34;;;;38634:15;;38629:2;38614:18;;38607:43;38687:15;;;38681:3;38666:19;;38659:44;38412:3;38397:19;;38379:330::o;38922:628::-;-1:-1:-1;;;;;39211:32:41;;;;39193:51;;39291:1;39280:21;;;;39275:2;39260:18;;39253:49;39321:6;39363:15;;;39358:2;39343:18;;39336:43;39415:15;;;39410:2;39395:18;;39388:43;39468:15;39462:3;39447:19;;39440:44;39528:14;39521:22;39231:3;39500:19;;39493:51;39180:3;39165:19;;39147:403::o;39555:190::-;39729:8;39717:21;;;;39699:40;;39687:2;39672:18;;39654:91::o;40185:453::-;40434:10;40422:23;;;;40404:42;;40493:1;40482:21;;;;40477:2;40462:18;;40455:49;-1:-1:-1;;;;;40540:32:41;40535:2;40520:18;;40513:60;40616:14;40609:22;40604:2;40589:18;;40582:50;40391:3;40376:19;;40358:280::o;40643:196::-;40817:14;40805:27;;;;40787:46;;40775:2;40760:18;;40742:97::o;40844:242::-;40914:2;40908:9;40944:17;;;-1:-1:-1;;;;;40976:34:41;;41012:22;;;40973:62;40970:2;;;41038:9;40970:2;41065;41058:22;40888:198;;-1:-1:-1;40888:198:41:o;41091:133::-;-1:-1:-1;;;;;41168:31:41;;41158:42;;41148:2;;41214:1;41211;41204:12;41229:120;41318:5;41315:1;41304:20;41297:5;41294:31;41284:2;;41339:1;41336;41329:12;41354:148;-1:-1:-1;;;;;41435:5:41;41431:46;41424:5;41421:57;41411:2;;41492:1;41489;41482:12;41507:121;41594:8;41587:5;41583:20;41576:5;41573:31;41563:2;;41618:1;41615;41608:12","linkReferences":{"contracts/core/libraries/CLPoolNonSwapPath.sol":{"CLPoolNonSwapPath":[{"start":1568,"length":20},{"start":5080,"length":20},{"start":5564,"length":20},{"start":5927,"length":20},{"start":6198,"length":20},{"start":6380,"length":20},{"start":6723,"length":20},{"start":7375,"length":20},{"start":7569,"length":20},{"start":7729,"length":20},{"start":8063,"length":20},{"start":8261,"length":20},{"start":8689,"length":20},{"start":8860,"length":20},{"start":14858,"length":20},{"start":15228,"length":20}]}},"immutableReferences":{}}}}}}},"signatures":{"function":[{"signature":"afterSwapFee((address,address,bool,int256,uint160,bytes,uint160,int24),(int256,int256,uint24,bool,uint256,uint128,uint128,uint128,int56,uint160,bool))","signatureHash4":"0x044078e1","signatureHash32":"0x044078e19c1369cce49b8bf02dd8a8620e7c0c6dae6823047f2af598d7c36f14"},{"signature":"beforeSwapFee((address,address,bool,int256,uint160,bytes,uint160,int24))","signatureHash4":"0xeb4ad999","signatureHash32":"0xeb4ad999654ab63966366a2ae3f9421d098d523ed0aaa2043bbeff312918a1a8"},{"signature":"burn(int24,int24,uint128)","signatureHash4":"0xa34123a7","signatureHash32":"0xa34123a737454f920864d797d3361d40f7f0159a3ecf63c6a7a962c3ac6f739d"},{"signature":"burn(int24,int24,uint128,address)","signatureHash4":"0x6f89244c","signatureHash32":"0x6f89244c35f70955bea7821c4da5adef6f4841622fde05c25db90f4093ab6d35"},{"signature":"collect(address,int24,int24,uint128,uint128)","signatureHash4":"0x4f1eb3d8","signatureHash32":"0x4f1eb3d8398a16d05fd459162c9ad1fe844210bdd1748592f23c8cb98975101e"},{"signature":"collect(address,int24,int24,uint128,uint128,address)","signatureHash4":"0x31338374","signatureHash32":"0x31338374e1dea89ce9ab686894328e9dbe2b016741ba9090620fc13ba23949a4"},{"signature":"collectFees(address)","signatureHash4":"0xa480ca79","signatureHash32":"0xa480ca795ffcfa368e52bf4c581a13a7ae98b748dbf61607d48cc5874865b64f"},{"signature":"DENOMINATOR()","signatureHash4":"0x918f8674","signatureHash32":"0x918f86740bdbc0d200b8ead385773a89305fac99d509085ee7eb22d19835cb93"},{"signature":"factory()","signatureHash4":"0xc45a0155","signatureHash32":"0xc45a01550ceb4bc5c6b2e6f722b5033a03078f9bd6673457375ba94c26ac1cf0"},{"signature":"factoryRegistry()","signatureHash4":"0x3bf0c9fb","signatureHash32":"0x3bf0c9fb5b31df486eefacf4a36d936b5e828b2139c15f17a61fa3226b5f55ee"},{"signature":"fee()","signatureHash4":"0xddca3f43","signatureHash32":"0xddca3f43ec14c316eec05be67ed7b013e80616749d7b4e6e5f59f3ae1e667d8f"},{"signature":"feeGrowthGlobal0X128()","signatureHash4":"0xf3058399","signatureHash32":"0xf305839992b282d6457f5fb2e9e285e7523c17301916633065b9ff777fbaf2c2"},{"signature":"feeGrowthGlobal1X128()","signatureHash4":"0x46141319","signatureHash32":"0x461413191fbb530f885e8fa97c6981177f1409ee9cfb8f39b58d17458a61c78c"},{"signature":"flash(address,uint256,uint256,bytes)","signatureHash4":"0x490e6cbc","signatureHash32":"0x490e6cbcbf65f141d1a92bcb35f7dea9989b177130cce7ff570c5923200acf55"},{"signature":"flashFee((address,address,uint256,uint256,bytes))","signatureHash4":"0xe8bfe65c","signatureHash32":"0xe8bfe65cef2c2c0efc5096382ecf20dc97b2ace002394499911bcccbd86fb7fd"},{"signature":"gauge()","signatureHash4":"0xa6f19c84","signatureHash32":"0xa6f19c84957c0440ad393e7922e5975a0989dd806976ca24a342515e29f97428"},{"signature":"gaugeFees()","signatureHash4":"0x293833ba","signatureHash32":"0x293833bae3efda0ccbbb624aa46acf13a029eccdaae88c2f413722032f09dcbb"},{"signature":"getFeeGrowthInside(int24,int24)","signatureHash4":"0x96518d4a","signatureHash32":"0x96518d4a977ac2692fbbfcca44f7a49fa95591c9560bcf12d94e61ac37106173"},{"signature":"getRewardGrowthInside(int24,int24,uint256)","signatureHash4":"0xa16368c9","signatureHash32":"0xa16368c90fd0670df67cdbc7d83d4de6982022a6104eb9b281ad50bbbc45a58d"},{"signature":"getSecondsPerStakedLiquidityCumulativeX128()","signatureHash4":"0x171852be","signatureHash32":"0x171852be7b7f7905397995a83d1b6fe62d920ed3d4b8ee0e8e05d3a917035f58"},{"signature":"increaseObservationCardinalityNext(uint16)","signatureHash4":"0x32148f67","signatureHash32":"0x32148f671b2ccdd41d0d5958b5bc633b423588268b03b67e35bf29e1a6510a68"},{"signature":"initialize(address,address,address,int24,address,uint160)","signatureHash4":"0x2071d884","signatureHash32":"0x2071d884135d57f51512af688297e72484f21f8732e8cd6ce513e799c41cac3d"},{"signature":"lastUpdated()","signatureHash4":"0xd0b06f5d","signatureHash32":"0xd0b06f5db734bd48918d540ad07c6bcff881f54b18194109859cc6896d10c75f"},{"signature":"liquidity()","signatureHash4":"0x1a686502","signatureHash32":"0x1a6865023bb6802a8242ca2c302ae847bdcc3a6b7f67a07be6e7c136ed01b2ea"},{"signature":"maxLiquidityPerTick()","signatureHash4":"0x70cf754a","signatureHash32":"0x70cf754a95bf07ea894ee48eaf737b391d7a271cf3e368c8fc889cd56ac8ee1f"},{"signature":"mint(address,int24,int24,uint128,bytes)","signatureHash4":"0x3c8a7d8d","signatureHash32":"0x3c8a7d8d2e32bc96ca7f99b40fd027c9cfade4e214a5a0d2aa1417d5dc9df2f2"},{"signature":"nft()","signatureHash4":"0x47ccca02","signatureHash32":"0x47ccca0201ed22f779508456c61f73397d88b6577f89f05d9bdd674c21209b55"},{"signature":"observations(uint256)","signatureHash4":"0x252c09d7","signatureHash32":"0x252c09d726f244607e932f457f571ce303b1ef613256cfc3e2645a4508bcc067"},{"signature":"observe(uint32[])","signatureHash4":"0x883bdbfd","signatureHash32":"0x883bdbfdafb581e01e12cfe744d865ab15ff96e60e0558a3b991333a957b1131"},{"signature":"POOL_TYPE()","signatureHash4":"0x648da859","signatureHash32":"0x648da8595eee84ab49d9a49183f8f1f920f299e55027e28f78044d05ec3354eb"},{"signature":"positions(bytes32)","signatureHash4":"0x514ea4bf","signatureHash32":"0x514ea4bfb070e17245f35dd5f38eec5857ca69bfb5e56bbed9d3a9a98acc0dc2"},{"signature":"rewardGrowthGlobalX128()","signatureHash4":"0x57806ada","signatureHash32":"0x57806ada08607eeaafacc12de8850278d571c8331807de0e72e95e97b5722e13"},{"signature":"rollover()","signatureHash4":"0xb056b49a","signatureHash32":"0xb056b49add1fa36ce7004cc2d0cae233f2c0c1f59414451e49e3bb6f1e505357"},{"signature":"secondsPerStakedLiquidityCumulativeX128()","signatureHash4":"0x00d0139a","signatureHash32":"0x00d0139afdcaaa7661fcd2ebfb922c9e777230e7daa916f124eee5c95ec56231"},{"signature":"setGaugeAndPositionManager(address,address)","signatureHash4":"0x1f7c3568","signatureHash32":"0x1f7c3568d2957e9f8341919f8d485271692622c64a3fc131b4e5fa46aa298798"},{"signature":"settleToBlock()","signatureHash4":"0xfe0106d5","signatureHash32":"0xfe0106d5ee7a9e46f65167a03dd47badd8120eb5fffb3beed25af7987e5fc6a6"},{"signature":"slot0()","signatureHash4":"0x3850c7bd","signatureHash32":"0x3850c7bd89327fabe6a1d2618cc44e6ca090221b2f752dc41d2ff5129beee61d"},{"signature":"snapshotCumulativesInside(int24,int24)","signatureHash4":"0xa38807f2","signatureHash32":"0xa38807f2e649a2d99660c19d9edf2d83d85a29203562d65718713ef6839eb298"},{"signature":"stakedLiquidity()","signatureHash4":"0x3ab04b20","signatureHash32":"0x3ab04b20207b05509048bc9d0e15b606b830e57a211602858d5b04caa7c113d9"},{"signature":"stake(int128,int24,int24)","signatureHash4":"0x8f50914d","signatureHash32":"0x8f50914dcafa9f1d78ae81930d06c9701723c0d3b66a64f49331ef551026d701"},{"signature":"swap(address,bool,int256,uint160,bytes)","signatureHash4":"0x128acb08","signatureHash32":"0x128acb082af64f862c55384c1f69a2f03a967a596a1b8a54ed8dc96a91b50ab7"},{"signature":"SWAP_FEE_CEIL()","signatureHash4":"0xf1e663a9","signatureHash32":"0xf1e663a960be4cd202faa0a7741d46f71fd8e6f689428b5a08041992f463511a"},{"signature":"tickBitmap(int16)","signatureHash4":"0x5339c296","signatureHash32":"0x5339c2962de8456e0f130cfdd0475adbb727f7c994320d4ffb525242fb92901d"},{"signature":"ticks(int24)","signatureHash4":"0xf30dba93","signatureHash32":"0xf30dba93ad0111bd09b004f3330144e7d668b15ee95df528a70eaeb859c01faf"},{"signature":"tickSpacing()","signatureHash4":"0xd0c93a7c","signatureHash32":"0xd0c93a7c53c0b55b7a725cdb3b45d1cdd97bec788ee8c48af4e328d6860bee74"},{"signature":"token0()","signatureHash4":"0x0dfe1681","signatureHash32":"0x0dfe16819b2523f68151ea44c4f107305bfeb85c4b18e7e63ac6f999d8cf9a0e"},{"signature":"token1()","signatureHash4":"0xd21220a7","signatureHash32":"0xd21220a7b5fcd6706feb17ecf897df81a823584a161e849e09b1ff66574ed2cb"},{"signature":"unstakedFee()","signatureHash4":"0xb64cc67b","signatureHash32":"0xb64cc67b8010445ae5b112e2756525678c0f7c84339f68ffba39677261e8dcec"}],"event":[{"signature":"Burn(address,int24,int24,uint128,uint256,uint256)","signatureHash4":"0x0c396cd9","signatureHash32":"0x0c396cd989a39f4459b5fa1aed6a9a8dcdbc45908acfd67e028cd568da98982c"},{"signature":"Collect(address,address,int24,int24,uint128,uint128)","signatureHash4":"0x70935338","signatureHash32":"0x70935338e69775456a85ddef226c395fb668b63fa0115f5f20610b388e6ca9c0"},{"signature":"CollectFees(address,uint128,uint128)","signatureHash4":"0x205860e6","signatureHash32":"0x205860e66845f2bbc0966bfab80db9bf93fca93862ea2b9fcf6945748352b4a3"},{"signature":"Flash(address,address,uint256,uint256,uint256,uint256)","signatureHash4":"0xbdbdb71d","signatureHash32":"0xbdbdb71d7860376ba52b25a5028beea23581364a40522f6bcfb86bb1f2dca633"},{"signature":"IncreaseObservationCardinalityNext(uint16,uint16)","signatureHash4":"0xac49e518","signatureHash32":"0xac49e518f90a358f652e4400164f05a5d8f7e35e7747279bc3a93dbf584e125a"},{"signature":"Initialize(uint160,int24)","signatureHash4":"0x98636036","signatureHash32":"0x98636036cb66a9c19a37435efc1e90142190214e8abeb821bdba3f2990dd4c95"},{"signature":"Mint(address,address,int24,int24,uint128,uint256,uint256)","signatureHash4":"0x7a53080b","signatureHash32":"0x7a53080ba414158be7ec69b987b5fb7d07dee101fe85488f0853ae16239d0bde"},{"signature":"SetFeeProtocol(uint8,uint8,uint8,uint8)","signatureHash4":"0x973d8d92","signatureHash32":"0x973d8d92bb299f4af6ce49b52a8adb85ae46b9f214c4c4fc06ac77401237b133"},{"signature":"Swap(address,address,int256,int256,uint160,uint128,int24)","signatureHash4":"0xc42079f9","signatureHash32":"0xc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca67"}],"error":[]},"proxyResolution":{"isProxy":false,"proxyType":null,"implementations":[]},"match":"match","chainId":"8453","address":"0x1642634C8CB1C9f1B84c9a1a08534F8c3F4E89f8"}