{ "address": "0x7A967D114B8676874FA2cFC1C14F3095C88418Eb", "abi": [ { "inputs": [ { "internalType": "contract RoleStore", "name": "_roleStore", "type": "address" }, { "internalType": "contract DataStore", "name": "_dataStore", "type": "address" }, { "internalType": "contract EventEmitter", "name": "_eventEmitter", "type": "address" }, { "internalType": "contract OracleStore", "name": "_oracleStore", "type": "address" }, { "internalType": "uint256", "name": "_timelockDelay", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [], "name": "ActionAlreadySignalled", "type": "error" }, { "inputs": [], "name": "ActionNotSignalled", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "receiver", "type": "address" } ], "name": "InvalidFeeReceiver", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "receiver", "type": "address" } ], "name": "InvalidOracleSigner", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "timelockDelay", "type": "uint256" } ], "name": "InvalidTimelockDelay", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "timelockDelay", "type": "uint256" } ], "name": "MaxTimelockDelayExceeded", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "signalTime", "type": "uint256" } ], "name": "SignalTimeNotYetPassed", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "msgSender", "type": "address" }, { "internalType": "string", "name": "role", "type": "string" } ], "name": "Unauthorized", "type": "error" }, { "inputs": [], "name": "MAX_TIMELOCK_DELAY", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "addOracleSignerAfterSignal", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "actionKey", "type": "bytes32" } ], "name": "cancelAction", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "dataStore", "outputs": [ { "internalType": "contract DataStore", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "eventEmitter", "outputs": [ { "internalType": "contract EventEmitter", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "bytes32", "name": "roleKey", "type": "bytes32" } ], "name": "grantRoleAfterSignal", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_timelockDelay", "type": "uint256" } ], "name": "increaseTimelockDelay", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes[]", "name": "data", "type": "bytes[]" } ], "name": "multicall", "outputs": [ { "internalType": "bytes[]", "name": "results", "type": "bytes[]" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "oracleStore", "outputs": [ { "internalType": "contract OracleStore", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "name": "pendingActions", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "removeOracleSignerAfterSignal", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "bytes32", "name": "roleKey", "type": "bytes32" } ], "name": "revokeRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "bytes32", "name": "roleKey", "type": "bytes32" } ], "name": "revokeRoleAfterSignal", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "roleStore", "outputs": [ { "internalType": "contract RoleStore", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "provider", "type": "address" }, { "internalType": "bool", "name": "value", "type": "bool" } ], "name": "setAtomicOracleProviderAfterSignal", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "token", "type": "address" }, { "internalType": "bytes32", "name": "feedId", "type": "bytes32" }, { "internalType": "uint256", "name": "dataStreamMultiplier", "type": "uint256" } ], "name": "setDataStreamAfterSignal", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "setFeeReceiverAfterSignal", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "provider", "type": "address" }, { "internalType": "bool", "name": "value", "type": "bool" } ], "name": "setOracleProviderEnabled", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "provider", "type": "address" }, { "internalType": "bool", "name": "value", "type": "bool" } ], "name": "setOracleProviderEnabledAfterSignal", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "token", "type": "address" }, { "internalType": "address", "name": "provider", "type": "address" } ], "name": "setOracleProviderForTokenAfterSignal", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "token", "type": "address" }, { "internalType": "address", "name": "priceFeed", "type": "address" }, { "internalType": "uint256", "name": "priceFeedMultiplier", "type": "uint256" }, { "internalType": "uint256", "name": "priceFeedHeartbeatDuration", "type": "uint256" }, { "internalType": "uint256", "name": "stablePrice", "type": "uint256" } ], "name": "setPriceFeedAfterSignal", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "signalAddOracleSigner", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "bytes32", "name": "roleKey", "type": "bytes32" } ], "name": "signalGrantRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "signalRemoveOracleSigner", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "bytes32", "name": "roleKey", "type": "bytes32" } ], "name": "signalRevokeRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "provider", "type": "address" }, { "internalType": "bool", "name": "value", "type": "bool" } ], "name": "signalSetAtomicOracleProvider", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "token", "type": "address" }, { "internalType": "bytes32", "name": "feedId", "type": "bytes32" }, { "internalType": "uint256", "name": "dataStreamMultiplier", "type": "uint256" } ], "name": "signalSetDataStream", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "signalSetFeeReceiver", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "provider", "type": "address" }, { "internalType": "bool", "name": "value", "type": "bool" } ], "name": "signalSetOracleProviderEnabled", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "token", "type": "address" }, { "internalType": "address", "name": "provider", "type": "address" } ], "name": "signalSetOracleProviderForToken", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "token", "type": "address" }, { "internalType": "address", "name": "priceFeed", "type": "address" }, { "internalType": "uint256", "name": "priceFeedMultiplier", "type": "uint256" }, { "internalType": "uint256", "name": "priceFeedHeartbeatDuration", "type": "uint256" }, { "internalType": "uint256", "name": "stablePrice", "type": "uint256" } ], "name": "signalSetPriceFeed", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "timelockDelay", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" } ], "transactionHash": "0xd33a2bf0a1a7e22be234fc3bcc41384870effeaf3e55449c05c006e347c4d53c", "receipt": { "to": null, "from": "0xE7BfFf2aB721264887230037940490351700a068", "contractAddress": "0x7A967D114B8676874FA2cFC1C14F3095C88418Eb", "transactionIndex": 3, "gasUsed": "6084311", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "blockHash": "0x5e9000ee858f22fa631e52a2fe0635c6cec868cfc6101dcf45eeb9cf2fdbe60d", "transactionHash": "0xd33a2bf0a1a7e22be234fc3bcc41384870effeaf3e55449c05c006e347c4d53c", "logs": [], "blockNumber": 266096833, "cumulativeGasUsed": "6407840", "status": 1, "byzantium": true }, "args": [ "0x3c3d99FD298f679DBC2CEcd132b4eC4d0F5e6e72", "0xFD70de6b91282D8017aA4E741e9Ae325CAb992d8", "0xC8ee91A54287DB53897056e12D9819156D3822Fb", "0xA8AF9B86fC47deAde1bc66B12673706615E2B011", 86400 ], "numDeployments": 5, "solcInputHash": "73a4ba2d8b31271a9616d3de18931f8d", "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract RoleStore\",\"name\":\"_roleStore\",\"type\":\"address\"},{\"internalType\":\"contract DataStore\",\"name\":\"_dataStore\",\"type\":\"address\"},{\"internalType\":\"contract EventEmitter\",\"name\":\"_eventEmitter\",\"type\":\"address\"},{\"internalType\":\"contract OracleStore\",\"name\":\"_oracleStore\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_timelockDelay\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ActionAlreadySignalled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ActionNotSignalled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"InvalidFeeReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"InvalidOracleSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"timelockDelay\",\"type\":\"uint256\"}],\"name\":\"InvalidTimelockDelay\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"timelockDelay\",\"type\":\"uint256\"}],\"name\":\"MaxTimelockDelayExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"signalTime\",\"type\":\"uint256\"}],\"name\":\"SignalTimeNotYetPassed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"msgSender\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"role\",\"type\":\"string\"}],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MAX_TIMELOCK_DELAY\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"addOracleSignerAfterSignal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"actionKey\",\"type\":\"bytes32\"}],\"name\":\"cancelAction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"dataStore\",\"outputs\":[{\"internalType\":\"contract DataStore\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eventEmitter\",\"outputs\":[{\"internalType\":\"contract EventEmitter\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"roleKey\",\"type\":\"bytes32\"}],\"name\":\"grantRoleAfterSignal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_timelockDelay\",\"type\":\"uint256\"}],\"name\":\"increaseTimelockDelay\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"multicall\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"oracleStore\",\"outputs\":[{\"internalType\":\"contract OracleStore\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"pendingActions\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"removeOracleSignerAfterSignal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"roleKey\",\"type\":\"bytes32\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"roleKey\",\"type\":\"bytes32\"}],\"name\":\"revokeRoleAfterSignal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"roleStore\",\"outputs\":[{\"internalType\":\"contract RoleStore\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"value\",\"type\":\"bool\"}],\"name\":\"setAtomicOracleProviderAfterSignal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"dataStreamMultiplier\",\"type\":\"uint256\"}],\"name\":\"setDataStreamAfterSignal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"setFeeReceiverAfterSignal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"value\",\"type\":\"bool\"}],\"name\":\"setOracleProviderEnabled\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"value\",\"type\":\"bool\"}],\"name\":\"setOracleProviderEnabledAfterSignal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"}],\"name\":\"setOracleProviderForTokenAfterSignal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceFeed\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"priceFeedMultiplier\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"priceFeedHeartbeatDuration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stablePrice\",\"type\":\"uint256\"}],\"name\":\"setPriceFeedAfterSignal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"signalAddOracleSigner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"roleKey\",\"type\":\"bytes32\"}],\"name\":\"signalGrantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"signalRemoveOracleSigner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"roleKey\",\"type\":\"bytes32\"}],\"name\":\"signalRevokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"value\",\"type\":\"bool\"}],\"name\":\"signalSetAtomicOracleProvider\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"dataStreamMultiplier\",\"type\":\"uint256\"}],\"name\":\"signalSetDataStream\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"signalSetFeeReceiver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"value\",\"type\":\"bool\"}],\"name\":\"signalSetOracleProviderEnabled\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"}],\"name\":\"signalSetOracleProviderForToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceFeed\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"priceFeedMultiplier\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"priceFeedHeartbeatDuration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stablePrice\",\"type\":\"uint256\"}],\"name\":\"signalSetPriceFeed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timelockDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"multicall(bytes[])\":{\"details\":\"Receives and executes a batch of function calls on this contract.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/config/Timelock.sol\":\"Timelock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n constructor() {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n _nonReentrantBefore();\\n _;\\n _nonReentrantAfter();\\n }\\n\\n function _nonReentrantBefore() private {\\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n }\\n\\n function _nonReentrantAfter() private {\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Returns true if the reentrancy guard is currently set to \\\"entered\\\", which indicates there is a\\n * `nonReentrant` function in the call stack.\\n */\\n function _reentrancyGuardEntered() internal view returns (bool) {\\n return _status == _ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0xa535a5df777d44e945dd24aa43a11e44b024140fc340ad0dfe42acf4002aade1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SafeCast.sol)\\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\\n * checks.\\n *\\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\\n * easily result in undesired exploitation or bugs, since developers usually\\n * assume that overflows raise errors. `SafeCast` restores this intuition by\\n * reverting the transaction when such an operation overflows.\\n *\\n * Using this library instead of the unchecked operations eliminates an entire\\n * class of bugs, so it's recommended to use it always.\\n *\\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\\n * all math on `uint256` and `int256` and then downcasting.\\n */\\nlibrary SafeCast {\\n /**\\n * @dev Returns the downcasted uint248 from uint256, reverting on\\n * overflow (when the input is greater than largest uint248).\\n *\\n * Counterpart to Solidity's `uint248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint248(uint256 value) internal pure returns (uint248) {\\n require(value <= type(uint248).max, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n return uint248(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint240 from uint256, reverting on\\n * overflow (when the input is greater than largest uint240).\\n *\\n * Counterpart to Solidity's `uint240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint240(uint256 value) internal pure returns (uint240) {\\n require(value <= type(uint240).max, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n return uint240(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint232 from uint256, reverting on\\n * overflow (when the input is greater than largest uint232).\\n *\\n * Counterpart to Solidity's `uint232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint232(uint256 value) internal pure returns (uint232) {\\n require(value <= type(uint232).max, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n return uint232(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint224 from uint256, reverting on\\n * overflow (when the input is greater than largest uint224).\\n *\\n * Counterpart to Solidity's `uint224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint224(uint256 value) internal pure returns (uint224) {\\n require(value <= type(uint224).max, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n return uint224(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint216 from uint256, reverting on\\n * overflow (when the input is greater than largest uint216).\\n *\\n * Counterpart to Solidity's `uint216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint216(uint256 value) internal pure returns (uint216) {\\n require(value <= type(uint216).max, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n return uint216(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint208 from uint256, reverting on\\n * overflow (when the input is greater than largest uint208).\\n *\\n * Counterpart to Solidity's `uint208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint208(uint256 value) internal pure returns (uint208) {\\n require(value <= type(uint208).max, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n return uint208(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint200 from uint256, reverting on\\n * overflow (when the input is greater than largest uint200).\\n *\\n * Counterpart to Solidity's `uint200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint200(uint256 value) internal pure returns (uint200) {\\n require(value <= type(uint200).max, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n return uint200(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint192 from uint256, reverting on\\n * overflow (when the input is greater than largest uint192).\\n *\\n * Counterpart to Solidity's `uint192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint192(uint256 value) internal pure returns (uint192) {\\n require(value <= type(uint192).max, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n return uint192(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint184 from uint256, reverting on\\n * overflow (when the input is greater than largest uint184).\\n *\\n * Counterpart to Solidity's `uint184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint184(uint256 value) internal pure returns (uint184) {\\n require(value <= type(uint184).max, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n return uint184(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint176 from uint256, reverting on\\n * overflow (when the input is greater than largest uint176).\\n *\\n * Counterpart to Solidity's `uint176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint176(uint256 value) internal pure returns (uint176) {\\n require(value <= type(uint176).max, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n return uint176(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint168 from uint256, reverting on\\n * overflow (when the input is greater than largest uint168).\\n *\\n * Counterpart to Solidity's `uint168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint168(uint256 value) internal pure returns (uint168) {\\n require(value <= type(uint168).max, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n return uint168(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint160 from uint256, reverting on\\n * overflow (when the input is greater than largest uint160).\\n *\\n * Counterpart to Solidity's `uint160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint160(uint256 value) internal pure returns (uint160) {\\n require(value <= type(uint160).max, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n return uint160(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint152 from uint256, reverting on\\n * overflow (when the input is greater than largest uint152).\\n *\\n * Counterpart to Solidity's `uint152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint152(uint256 value) internal pure returns (uint152) {\\n require(value <= type(uint152).max, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n return uint152(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint144 from uint256, reverting on\\n * overflow (when the input is greater than largest uint144).\\n *\\n * Counterpart to Solidity's `uint144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint144(uint256 value) internal pure returns (uint144) {\\n require(value <= type(uint144).max, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n return uint144(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint136 from uint256, reverting on\\n * overflow (when the input is greater than largest uint136).\\n *\\n * Counterpart to Solidity's `uint136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint136(uint256 value) internal pure returns (uint136) {\\n require(value <= type(uint136).max, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n return uint136(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint128 from uint256, reverting on\\n * overflow (when the input is greater than largest uint128).\\n *\\n * Counterpart to Solidity's `uint128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint128(uint256 value) internal pure returns (uint128) {\\n require(value <= type(uint128).max, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n return uint128(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint120 from uint256, reverting on\\n * overflow (when the input is greater than largest uint120).\\n *\\n * Counterpart to Solidity's `uint120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint120(uint256 value) internal pure returns (uint120) {\\n require(value <= type(uint120).max, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n return uint120(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint112 from uint256, reverting on\\n * overflow (when the input is greater than largest uint112).\\n *\\n * Counterpart to Solidity's `uint112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint112(uint256 value) internal pure returns (uint112) {\\n require(value <= type(uint112).max, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n return uint112(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint104 from uint256, reverting on\\n * overflow (when the input is greater than largest uint104).\\n *\\n * Counterpart to Solidity's `uint104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint104(uint256 value) internal pure returns (uint104) {\\n require(value <= type(uint104).max, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n return uint104(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint96 from uint256, reverting on\\n * overflow (when the input is greater than largest uint96).\\n *\\n * Counterpart to Solidity's `uint96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.2._\\n */\\n function toUint96(uint256 value) internal pure returns (uint96) {\\n require(value <= type(uint96).max, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n return uint96(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint88 from uint256, reverting on\\n * overflow (when the input is greater than largest uint88).\\n *\\n * Counterpart to Solidity's `uint88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint88(uint256 value) internal pure returns (uint88) {\\n require(value <= type(uint88).max, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n return uint88(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint80 from uint256, reverting on\\n * overflow (when the input is greater than largest uint80).\\n *\\n * Counterpart to Solidity's `uint80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint80(uint256 value) internal pure returns (uint80) {\\n require(value <= type(uint80).max, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n return uint80(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint72 from uint256, reverting on\\n * overflow (when the input is greater than largest uint72).\\n *\\n * Counterpart to Solidity's `uint72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint72(uint256 value) internal pure returns (uint72) {\\n require(value <= type(uint72).max, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n return uint72(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint64 from uint256, reverting on\\n * overflow (when the input is greater than largest uint64).\\n *\\n * Counterpart to Solidity's `uint64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint64(uint256 value) internal pure returns (uint64) {\\n require(value <= type(uint64).max, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n return uint64(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint56 from uint256, reverting on\\n * overflow (when the input is greater than largest uint56).\\n *\\n * Counterpart to Solidity's `uint56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint56(uint256 value) internal pure returns (uint56) {\\n require(value <= type(uint56).max, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n return uint56(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint48 from uint256, reverting on\\n * overflow (when the input is greater than largest uint48).\\n *\\n * Counterpart to Solidity's `uint48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint48(uint256 value) internal pure returns (uint48) {\\n require(value <= type(uint48).max, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n return uint48(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint40 from uint256, reverting on\\n * overflow (when the input is greater than largest uint40).\\n *\\n * Counterpart to Solidity's `uint40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint40(uint256 value) internal pure returns (uint40) {\\n require(value <= type(uint40).max, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n return uint40(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint32 from uint256, reverting on\\n * overflow (when the input is greater than largest uint32).\\n *\\n * Counterpart to Solidity's `uint32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint32(uint256 value) internal pure returns (uint32) {\\n require(value <= type(uint32).max, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n return uint32(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint24 from uint256, reverting on\\n * overflow (when the input is greater than largest uint24).\\n *\\n * Counterpart to Solidity's `uint24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toUint24(uint256 value) internal pure returns (uint24) {\\n require(value <= type(uint24).max, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n return uint24(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint16 from uint256, reverting on\\n * overflow (when the input is greater than largest uint16).\\n *\\n * Counterpart to Solidity's `uint16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint16(uint256 value) internal pure returns (uint16) {\\n require(value <= type(uint16).max, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n return uint16(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted uint8 from uint256, reverting on\\n * overflow (when the input is greater than largest uint8).\\n *\\n * Counterpart to Solidity's `uint8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v2.5._\\n */\\n function toUint8(uint256 value) internal pure returns (uint8) {\\n require(value <= type(uint8).max, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n return uint8(value);\\n }\\n\\n /**\\n * @dev Converts a signed int256 into an unsigned uint256.\\n *\\n * Requirements:\\n *\\n * - input must be greater than or equal to 0.\\n *\\n * _Available since v3.0._\\n */\\n function toUint256(int256 value) internal pure returns (uint256) {\\n require(value >= 0, \\\"SafeCast: value must be positive\\\");\\n return uint256(value);\\n }\\n\\n /**\\n * @dev Returns the downcasted int248 from int256, reverting on\\n * overflow (when the input is less than smallest int248 or\\n * greater than largest int248).\\n *\\n * Counterpart to Solidity's `int248` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 248 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt248(int256 value) internal pure returns (int248 downcasted) {\\n downcasted = int248(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 248 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int240 from int256, reverting on\\n * overflow (when the input is less than smallest int240 or\\n * greater than largest int240).\\n *\\n * Counterpart to Solidity's `int240` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 240 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt240(int256 value) internal pure returns (int240 downcasted) {\\n downcasted = int240(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 240 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int232 from int256, reverting on\\n * overflow (when the input is less than smallest int232 or\\n * greater than largest int232).\\n *\\n * Counterpart to Solidity's `int232` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 232 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt232(int256 value) internal pure returns (int232 downcasted) {\\n downcasted = int232(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 232 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int224 from int256, reverting on\\n * overflow (when the input is less than smallest int224 or\\n * greater than largest int224).\\n *\\n * Counterpart to Solidity's `int224` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 224 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt224(int256 value) internal pure returns (int224 downcasted) {\\n downcasted = int224(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 224 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int216 from int256, reverting on\\n * overflow (when the input is less than smallest int216 or\\n * greater than largest int216).\\n *\\n * Counterpart to Solidity's `int216` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 216 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt216(int256 value) internal pure returns (int216 downcasted) {\\n downcasted = int216(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 216 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int208 from int256, reverting on\\n * overflow (when the input is less than smallest int208 or\\n * greater than largest int208).\\n *\\n * Counterpart to Solidity's `int208` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 208 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt208(int256 value) internal pure returns (int208 downcasted) {\\n downcasted = int208(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 208 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int200 from int256, reverting on\\n * overflow (when the input is less than smallest int200 or\\n * greater than largest int200).\\n *\\n * Counterpart to Solidity's `int200` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 200 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt200(int256 value) internal pure returns (int200 downcasted) {\\n downcasted = int200(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 200 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int192 from int256, reverting on\\n * overflow (when the input is less than smallest int192 or\\n * greater than largest int192).\\n *\\n * Counterpart to Solidity's `int192` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 192 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt192(int256 value) internal pure returns (int192 downcasted) {\\n downcasted = int192(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 192 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int184 from int256, reverting on\\n * overflow (when the input is less than smallest int184 or\\n * greater than largest int184).\\n *\\n * Counterpart to Solidity's `int184` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 184 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt184(int256 value) internal pure returns (int184 downcasted) {\\n downcasted = int184(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 184 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int176 from int256, reverting on\\n * overflow (when the input is less than smallest int176 or\\n * greater than largest int176).\\n *\\n * Counterpart to Solidity's `int176` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 176 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt176(int256 value) internal pure returns (int176 downcasted) {\\n downcasted = int176(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 176 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int168 from int256, reverting on\\n * overflow (when the input is less than smallest int168 or\\n * greater than largest int168).\\n *\\n * Counterpart to Solidity's `int168` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 168 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt168(int256 value) internal pure returns (int168 downcasted) {\\n downcasted = int168(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 168 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int160 from int256, reverting on\\n * overflow (when the input is less than smallest int160 or\\n * greater than largest int160).\\n *\\n * Counterpart to Solidity's `int160` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 160 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt160(int256 value) internal pure returns (int160 downcasted) {\\n downcasted = int160(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 160 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int152 from int256, reverting on\\n * overflow (when the input is less than smallest int152 or\\n * greater than largest int152).\\n *\\n * Counterpart to Solidity's `int152` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 152 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt152(int256 value) internal pure returns (int152 downcasted) {\\n downcasted = int152(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 152 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int144 from int256, reverting on\\n * overflow (when the input is less than smallest int144 or\\n * greater than largest int144).\\n *\\n * Counterpart to Solidity's `int144` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 144 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt144(int256 value) internal pure returns (int144 downcasted) {\\n downcasted = int144(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 144 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int136 from int256, reverting on\\n * overflow (when the input is less than smallest int136 or\\n * greater than largest int136).\\n *\\n * Counterpart to Solidity's `int136` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 136 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt136(int256 value) internal pure returns (int136 downcasted) {\\n downcasted = int136(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 136 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int128 from int256, reverting on\\n * overflow (when the input is less than smallest int128 or\\n * greater than largest int128).\\n *\\n * Counterpart to Solidity's `int128` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 128 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt128(int256 value) internal pure returns (int128 downcasted) {\\n downcasted = int128(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 128 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int120 from int256, reverting on\\n * overflow (when the input is less than smallest int120 or\\n * greater than largest int120).\\n *\\n * Counterpart to Solidity's `int120` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 120 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt120(int256 value) internal pure returns (int120 downcasted) {\\n downcasted = int120(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 120 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int112 from int256, reverting on\\n * overflow (when the input is less than smallest int112 or\\n * greater than largest int112).\\n *\\n * Counterpart to Solidity's `int112` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 112 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt112(int256 value) internal pure returns (int112 downcasted) {\\n downcasted = int112(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 112 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int104 from int256, reverting on\\n * overflow (when the input is less than smallest int104 or\\n * greater than largest int104).\\n *\\n * Counterpart to Solidity's `int104` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 104 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt104(int256 value) internal pure returns (int104 downcasted) {\\n downcasted = int104(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 104 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int96 from int256, reverting on\\n * overflow (when the input is less than smallest int96 or\\n * greater than largest int96).\\n *\\n * Counterpart to Solidity's `int96` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 96 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt96(int256 value) internal pure returns (int96 downcasted) {\\n downcasted = int96(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 96 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int88 from int256, reverting on\\n * overflow (when the input is less than smallest int88 or\\n * greater than largest int88).\\n *\\n * Counterpart to Solidity's `int88` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 88 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt88(int256 value) internal pure returns (int88 downcasted) {\\n downcasted = int88(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 88 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int80 from int256, reverting on\\n * overflow (when the input is less than smallest int80 or\\n * greater than largest int80).\\n *\\n * Counterpart to Solidity's `int80` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 80 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt80(int256 value) internal pure returns (int80 downcasted) {\\n downcasted = int80(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 80 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int72 from int256, reverting on\\n * overflow (when the input is less than smallest int72 or\\n * greater than largest int72).\\n *\\n * Counterpart to Solidity's `int72` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 72 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt72(int256 value) internal pure returns (int72 downcasted) {\\n downcasted = int72(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 72 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int64 from int256, reverting on\\n * overflow (when the input is less than smallest int64 or\\n * greater than largest int64).\\n *\\n * Counterpart to Solidity's `int64` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 64 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt64(int256 value) internal pure returns (int64 downcasted) {\\n downcasted = int64(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 64 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int56 from int256, reverting on\\n * overflow (when the input is less than smallest int56 or\\n * greater than largest int56).\\n *\\n * Counterpart to Solidity's `int56` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 56 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt56(int256 value) internal pure returns (int56 downcasted) {\\n downcasted = int56(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 56 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int48 from int256, reverting on\\n * overflow (when the input is less than smallest int48 or\\n * greater than largest int48).\\n *\\n * Counterpart to Solidity's `int48` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 48 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt48(int256 value) internal pure returns (int48 downcasted) {\\n downcasted = int48(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 48 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int40 from int256, reverting on\\n * overflow (when the input is less than smallest int40 or\\n * greater than largest int40).\\n *\\n * Counterpart to Solidity's `int40` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 40 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt40(int256 value) internal pure returns (int40 downcasted) {\\n downcasted = int40(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 40 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int32 from int256, reverting on\\n * overflow (when the input is less than smallest int32 or\\n * greater than largest int32).\\n *\\n * Counterpart to Solidity's `int32` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 32 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt32(int256 value) internal pure returns (int32 downcasted) {\\n downcasted = int32(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 32 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int24 from int256, reverting on\\n * overflow (when the input is less than smallest int24 or\\n * greater than largest int24).\\n *\\n * Counterpart to Solidity's `int24` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 24 bits\\n *\\n * _Available since v4.7._\\n */\\n function toInt24(int256 value) internal pure returns (int24 downcasted) {\\n downcasted = int24(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 24 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int16 from int256, reverting on\\n * overflow (when the input is less than smallest int16 or\\n * greater than largest int16).\\n *\\n * Counterpart to Solidity's `int16` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 16 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt16(int256 value) internal pure returns (int16 downcasted) {\\n downcasted = int16(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 16 bits\\\");\\n }\\n\\n /**\\n * @dev Returns the downcasted int8 from int256, reverting on\\n * overflow (when the input is less than smallest int8 or\\n * greater than largest int8).\\n *\\n * Counterpart to Solidity's `int8` operator.\\n *\\n * Requirements:\\n *\\n * - input must fit into 8 bits\\n *\\n * _Available since v3.1._\\n */\\n function toInt8(int256 value) internal pure returns (int8 downcasted) {\\n downcasted = int8(value);\\n require(downcasted == value, \\\"SafeCast: value doesn't fit in 8 bits\\\");\\n }\\n\\n /**\\n * @dev Converts an unsigned uint256 into a signed int256.\\n *\\n * Requirements:\\n *\\n * - input must be less than or equal to maxInt256.\\n *\\n * _Available since v3.0._\\n */\\n function toInt256(uint256 value) internal pure returns (int256) {\\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\\n require(value <= uint256(type(int256).max), \\\"SafeCast: value doesn't fit in an int256\\\");\\n return int256(value);\\n }\\n}\\n\",\"keccak256\":\"0x52a8cfb0f5239d11b457dcdd1b326992ef672714ca8da71a157255bddd13f3ad\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol)\\n// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for managing\\n * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive\\n * types.\\n *\\n * Sets have the following properties:\\n *\\n * - Elements are added, removed, and checked for existence in constant time\\n * (O(1)).\\n * - Elements are enumerated in O(n). No guarantees are made on the ordering.\\n *\\n * ```solidity\\n * contract Example {\\n * // Add the library methods\\n * using EnumerableSet for EnumerableSet.AddressSet;\\n *\\n * // Declare a set state variable\\n * EnumerableSet.AddressSet private mySet;\\n * }\\n * ```\\n *\\n * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)\\n * and `uint256` (`UintSet`) are supported.\\n *\\n * [WARNING]\\n * ====\\n * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure\\n * unusable.\\n * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.\\n *\\n * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an\\n * array of EnumerableSet.\\n * ====\\n */\\nlibrary EnumerableSet {\\n // To implement this library for multiple types with as little code\\n // repetition as possible, we write it in terms of a generic Set type with\\n // bytes32 values.\\n // The Set implementation uses private functions, and user-facing\\n // implementations (such as AddressSet) are just wrappers around the\\n // underlying Set.\\n // This means that we can only create new EnumerableSets for types that fit\\n // in bytes32.\\n\\n struct Set {\\n // Storage of set values\\n bytes32[] _values;\\n // Position of the value in the `values` array, plus 1 because index 0\\n // means a value is not in the set.\\n mapping(bytes32 => uint256) _indexes;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function _add(Set storage set, bytes32 value) private returns (bool) {\\n if (!_contains(set, value)) {\\n set._values.push(value);\\n // The value is stored at length-1, but we add 1 to all indexes\\n // and use 0 as a sentinel value\\n set._indexes[value] = set._values.length;\\n return true;\\n } else {\\n return false;\\n }\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function _remove(Set storage set, bytes32 value) private returns (bool) {\\n // We read and store the value's index to prevent multiple reads from the same storage slot\\n uint256 valueIndex = set._indexes[value];\\n\\n if (valueIndex != 0) {\\n // Equivalent to contains(set, value)\\n // To delete an element from the _values array in O(1), we swap the element to delete with the last one in\\n // the array, and then remove the last element (sometimes called as 'swap and pop').\\n // This modifies the order of the array, as noted in {at}.\\n\\n uint256 toDeleteIndex = valueIndex - 1;\\n uint256 lastIndex = set._values.length - 1;\\n\\n if (lastIndex != toDeleteIndex) {\\n bytes32 lastValue = set._values[lastIndex];\\n\\n // Move the last value to the index where the value to delete is\\n set._values[toDeleteIndex] = lastValue;\\n // Update the index for the moved value\\n set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex\\n }\\n\\n // Delete the slot where the moved value was stored\\n set._values.pop();\\n\\n // Delete the index for the deleted slot\\n delete set._indexes[value];\\n\\n return true;\\n } else {\\n return false;\\n }\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function _contains(Set storage set, bytes32 value) private view returns (bool) {\\n return set._indexes[value] != 0;\\n }\\n\\n /**\\n * @dev Returns the number of values on the set. O(1).\\n */\\n function _length(Set storage set) private view returns (uint256) {\\n return set._values.length;\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function _at(Set storage set, uint256 index) private view returns (bytes32) {\\n return set._values[index];\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function _values(Set storage set) private view returns (bytes32[] memory) {\\n return set._values;\\n }\\n\\n // Bytes32Set\\n\\n struct Bytes32Set {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n return _add(set._inner, value);\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n return _remove(set._inner, value);\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {\\n return _contains(set._inner, value);\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(Bytes32Set storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {\\n return _at(set._inner, index);\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n bytes32[] memory result;\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n\\n // AddressSet\\n\\n struct AddressSet {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(AddressSet storage set, address value) internal returns (bool) {\\n return _add(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(AddressSet storage set, address value) internal returns (bool) {\\n return _remove(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(AddressSet storage set, address value) internal view returns (bool) {\\n return _contains(set._inner, bytes32(uint256(uint160(value))));\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(AddressSet storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(AddressSet storage set, uint256 index) internal view returns (address) {\\n return address(uint160(uint256(_at(set._inner, index))));\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(AddressSet storage set) internal view returns (address[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n address[] memory result;\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n\\n // UintSet\\n\\n struct UintSet {\\n Set _inner;\\n }\\n\\n /**\\n * @dev Add a value to a set. O(1).\\n *\\n * Returns true if the value was added to the set, that is if it was not\\n * already present.\\n */\\n function add(UintSet storage set, uint256 value) internal returns (bool) {\\n return _add(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Removes a value from a set. O(1).\\n *\\n * Returns true if the value was removed from the set, that is if it was\\n * present.\\n */\\n function remove(UintSet storage set, uint256 value) internal returns (bool) {\\n return _remove(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Returns true if the value is in the set. O(1).\\n */\\n function contains(UintSet storage set, uint256 value) internal view returns (bool) {\\n return _contains(set._inner, bytes32(value));\\n }\\n\\n /**\\n * @dev Returns the number of values in the set. O(1).\\n */\\n function length(UintSet storage set) internal view returns (uint256) {\\n return _length(set._inner);\\n }\\n\\n /**\\n * @dev Returns the value stored at position `index` in the set. O(1).\\n *\\n * Note that there are no guarantees on the ordering of values inside the\\n * array, and it may change when more values are added or removed.\\n *\\n * Requirements:\\n *\\n * - `index` must be strictly less than {length}.\\n */\\n function at(UintSet storage set, uint256 index) internal view returns (uint256) {\\n return uint256(_at(set._inner, index));\\n }\\n\\n /**\\n * @dev Return the entire set in an array\\n *\\n * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n */\\n function values(UintSet storage set) internal view returns (uint256[] memory) {\\n bytes32[] memory store = _values(set._inner);\\n uint256[] memory result;\\n\\n /// @solidity memory-safe-assembly\\n assembly {\\n result := store\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x9f4357008a8f7d8c8bf5d48902e789637538d8c016be5766610901b4bba81514\",\"license\":\"MIT\"},\"contracts/chain/ArbSys.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity ^0.8.0;\\n\\n// @title ArbSys\\n// @dev Globally available variables for Arbitrum may have both an L1 and an L2\\n// value, the ArbSys interface is used to retrieve the L2 value\\ninterface ArbSys {\\n function arbBlockNumber() external view returns (uint256);\\n function arbBlockHash(uint256 blockNumber) external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0x97a2fcc4828af974d9e763db893b1188fec4d964ec3896611284678631dc5ffd\",\"license\":\"BUSL-1.1\"},\"contracts/chain/Chain.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./ArbSys.sol\\\";\\n\\n// @title Chain\\n// @dev Wrap the calls to retrieve chain variables to handle differences\\n// between chain implementations\\nlibrary Chain {\\n // if the ARBITRUM_CHAIN_ID changes, a new version of this library\\n // and contracts depending on it would need to be deployed\\n uint256 public constant ARBITRUM_CHAIN_ID = 42161;\\n uint256 public constant ARBITRUM_SEPOLIA_CHAIN_ID = 421614;\\n\\n ArbSys public constant arbSys = ArbSys(address(100));\\n\\n // @dev return the current block's timestamp\\n // @return the current block's timestamp\\n function currentTimestamp() internal view returns (uint256) {\\n return block.timestamp;\\n }\\n\\n // @dev return the current block's number\\n // @return the current block's number\\n function currentBlockNumber() internal view returns (uint256) {\\n if (shouldUseArbSysValues()) {\\n return arbSys.arbBlockNumber();\\n }\\n\\n return block.number;\\n }\\n\\n // @dev return the current block's hash\\n // @return the current block's hash\\n function getBlockHash(uint256 blockNumber) internal view returns (bytes32) {\\n if (shouldUseArbSysValues()) {\\n return arbSys.arbBlockHash(blockNumber);\\n }\\n\\n return blockhash(blockNumber);\\n }\\n\\n function shouldUseArbSysValues() internal view returns (bool) {\\n return block.chainid == ARBITRUM_CHAIN_ID || block.chainid == ARBITRUM_SEPOLIA_CHAIN_ID;\\n }\\n}\\n\",\"keccak256\":\"0xd426e6135ef3d529232a2b6101e388a353ad2a3474b7b79cbf1e73825427a646\",\"license\":\"BUSL-1.1\"},\"contracts/config/Timelock.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\";\\n\\nimport \\\"../role/RoleModule.sol\\\";\\nimport \\\"../event/EventEmitter.sol\\\";\\nimport \\\"../utils/BasicMulticall.sol\\\";\\nimport \\\"../oracle/OracleStore.sol\\\";\\nimport \\\"../data/DataStore.sol\\\";\\nimport \\\"../data/Keys.sol\\\";\\nimport \\\"../chain/Chain.sol\\\";\\n\\n// @title Timelock\\ncontract Timelock is ReentrancyGuard, RoleModule, BasicMulticall {\\n using EventUtils for EventUtils.AddressItems;\\n using EventUtils for EventUtils.UintItems;\\n using EventUtils for EventUtils.IntItems;\\n using EventUtils for EventUtils.BoolItems;\\n using EventUtils for EventUtils.Bytes32Items;\\n using EventUtils for EventUtils.BytesItems;\\n using EventUtils for EventUtils.StringItems;\\n\\n using EnumerableSet for EnumerableSet.Bytes32Set;\\n using EnumerableValues for EnumerableSet.Bytes32Set;\\n\\n uint256 public constant MAX_TIMELOCK_DELAY = 5 days;\\n\\n DataStore public immutable dataStore;\\n EventEmitter public immutable eventEmitter;\\n OracleStore public immutable oracleStore;\\n uint256 public timelockDelay;\\n\\n mapping (bytes32 => uint256) public pendingActions;\\n EnumerableSet.Bytes32Set internal pendingActionsList;\\n\\n constructor(\\n RoleStore _roleStore,\\n DataStore _dataStore,\\n EventEmitter _eventEmitter,\\n OracleStore _oracleStore,\\n uint256 _timelockDelay\\n ) RoleModule(_roleStore) {\\n dataStore = _dataStore;\\n eventEmitter = _eventEmitter;\\n oracleStore = _oracleStore;\\n timelockDelay = _timelockDelay;\\n\\n _validateTimelockDelay();\\n }\\n\\n function getPendingActionsCount() internal view returns (uint256) {\\n return pendingActionsList.length();\\n }\\n\\n function getPendingActionsList(uint256 start, uint256 end) internal view returns (bytes32[] memory) {\\n return pendingActionsList.valuesAt(start, end);\\n }\\n\\n // @dev immediately revoke the role of an account\\n // @param account the account to revoke the role for\\n // @param roleKey the role to revoke\\n function revokeRole(address account, bytes32 roleKey) external onlyTimelockMultisig nonReentrant {\\n roleStore.revokeRole(account, roleKey);\\n\\n EventUtils.EventLogData memory eventData;\\n eventData.addressItems.initItems(1);\\n eventData.addressItems.setItem(0, \\\"account\\\", account);\\n eventData.bytes32Items.initItems(1);\\n eventData.bytes32Items.setItem(0, \\\"roleKey\\\", roleKey);\\n eventEmitter.emitEventLog(\\n \\\"RevokeRole\\\",\\n eventData\\n );\\n }\\n\\n // @dev increase the timelock delay\\n // @param the new timelock delay\\n function increaseTimelockDelay(uint256 _timelockDelay) external onlyTimelockAdmin nonReentrant {\\n if (_timelockDelay <= timelockDelay) {\\n revert Errors.InvalidTimelockDelay(_timelockDelay);\\n }\\n\\n timelockDelay = _timelockDelay;\\n\\n _validateTimelockDelay();\\n\\n EventUtils.EventLogData memory eventData;\\n eventData.uintItems.initItems(1);\\n eventData.uintItems.setItem(0, \\\"_timelockDelay\\\", _timelockDelay);\\n eventEmitter.emitEventLog(\\n \\\"IncreaseTimelockDelay\\\",\\n eventData\\n );\\n }\\n\\n function setOracleProviderEnabled(address provider, bool value) external onlyTimelockMultisig nonReentrant {\\n dataStore.setBool(Keys.isOracleProviderEnabledKey(provider), value);\\n\\n EventUtils.EventLogData memory eventData;\\n eventData.addressItems.initItems(1);\\n eventData.addressItems.setItem(0, \\\"provider\\\", provider);\\n eventData.boolItems.initItems(1);\\n eventData.boolItems.setItem(0, \\\"value\\\", value);\\n eventEmitter.emitEventLog(\\n \\\"SetOracleProviderEnabled\\\",\\n eventData\\n );\\n }\\n\\n function signalSetOracleProviderForToken(address token, address provider) external onlyTimelockAdmin nonReentrant {\\n bytes32 actionKey = _setOracleProviderForTokenKey(token, provider);\\n _signalPendingAction(actionKey, \\\"setOracleProviderForToken\\\");\\n\\n EventUtils.EventLogData memory eventData;\\n eventData.addressItems.initItems(2);\\n eventData.addressItems.setItem(0, \\\"token\\\", token);\\n eventData.addressItems.setItem(1, \\\"provider\\\", provider);\\n eventEmitter.emitEventLog(\\n \\\"SignalSetOracleProviderForToken\\\",\\n eventData\\n );\\n }\\n\\n function setOracleProviderForTokenAfterSignal(address token, address provider) external onlyTimelockAdmin nonReentrant {\\n bytes32 actionKey = _setOracleProviderForTokenKey(token, provider);\\n _validateAndClearAction(actionKey, \\\"setOracleProviderForToken\\\");\\n\\n dataStore.setAddress(Keys.oracleProviderForTokenKey(token), provider);\\n\\n EventUtils.EventLogData memory eventData;\\n eventData.addressItems.initItems(2);\\n eventData.addressItems.setItem(0, \\\"token\\\", token);\\n eventData.addressItems.setItem(1, \\\"provider\\\", provider);\\n eventEmitter.emitEventLog(\\n \\\"SetOracleProviderForToken\\\",\\n eventData\\n );\\n }\\n\\n function signalSetOracleProviderEnabled(address provider, bool value) external onlyTimelockAdmin nonReentrant {\\n bytes32 actionKey = _setOracleProviderEnabledKey(provider, value);\\n _signalPendingAction(actionKey, \\\"setOracleProviderEnabled\\\");\\n\\n EventUtils.EventLogData memory eventData;\\n eventData.addressItems.initItems(1);\\n eventData.addressItems.setItem(0, \\\"provider\\\", provider);\\n eventData.boolItems.initItems(1);\\n eventData.boolItems.setItem(0, \\\"value\\\", value);\\n eventEmitter.emitEventLog(\\n \\\"SignalSetOracleProviderEnabled\\\",\\n eventData\\n );\\n }\\n\\n function setOracleProviderEnabledAfterSignal(address provider, bool value) external onlyTimelockAdmin nonReentrant {\\n bytes32 actionKey = _setOracleProviderEnabledKey(provider, value);\\n _validateAndClearAction(actionKey, \\\"setOracleProviderEnabled\\\");\\n\\n dataStore.setBool(Keys.isOracleProviderEnabledKey(provider), value);\\n\\n EventUtils.EventLogData memory eventData;\\n eventData.addressItems.initItems(1);\\n eventData.addressItems.setItem(0, \\\"provider\\\", provider);\\n eventData.boolItems.initItems(1);\\n eventData.boolItems.setItem(0, \\\"value\\\", value);\\n eventEmitter.emitEventLog(\\n \\\"SetOracleProviderEnabled\\\",\\n eventData\\n );\\n }\\n\\n function signalSetAtomicOracleProvider(address provider, bool value) external onlyTimelockAdmin nonReentrant {\\n bytes32 actionKey = _setAtomicOracleProviderKey(provider, value);\\n _signalPendingAction(actionKey, \\\"setAtomicOracleProvider\\\");\\n\\n EventUtils.EventLogData memory eventData;\\n eventData.addressItems.initItems(1);\\n eventData.addressItems.setItem(0, \\\"provider\\\", provider);\\n eventData.boolItems.initItems(1);\\n eventData.boolItems.setItem(0, \\\"value\\\", value);\\n eventEmitter.emitEventLog(\\n \\\"SignalSetAtomicOracleProvider\\\",\\n eventData\\n );\\n }\\n\\n function setAtomicOracleProviderAfterSignal(address provider, bool value) external onlyTimelockAdmin nonReentrant {\\n bytes32 actionKey = _setAtomicOracleProviderKey(provider, value);\\n _validateAndClearAction(actionKey, \\\"setAtomicOracleProvider\\\");\\n\\n dataStore.setBool(Keys.isAtomicOracleProviderKey(provider), value);\\n\\n EventUtils.EventLogData memory eventData;\\n eventData.addressItems.initItems(1);\\n eventData.addressItems.setItem(0, \\\"provider\\\", provider);\\n eventData.boolItems.initItems(1);\\n eventData.boolItems.setItem(0, \\\"value\\\", value);\\n eventEmitter.emitEventLog(\\n \\\"SetAtomicOracleProvider\\\",\\n eventData\\n );\\n }\\n\\n function signalAddOracleSigner(address account) external onlyTimelockAdmin nonReentrant {\\n if (account == address(0)) {\\n revert Errors.InvalidOracleSigner(account);\\n }\\n\\n bytes32 actionKey = _addOracleSignerActionKey(account);\\n _signalPendingAction(actionKey, \\\"addOracleSigner\\\");\\n\\n EventUtils.EventLogData memory eventData;\\n eventData.addressItems.initItems(1);\\n eventData.addressItems.setItem(0, \\\"account\\\", account);\\n eventEmitter.emitEventLog1(\\n \\\"SignalAddOracleSigner\\\",\\n actionKey,\\n eventData\\n );\\n }\\n\\n function addOracleSignerAfterSignal(address account) external onlyTimelockAdmin nonReentrant {\\n bytes32 actionKey = _addOracleSignerActionKey(account);\\n _validateAndClearAction(actionKey, \\\"addOracleSigner\\\");\\n\\n oracleStore.addSigner(account);\\n\\n EventUtils.EventLogData memory eventData;\\n eventData.addressItems.initItems(1);\\n eventData.addressItems.setItem(0, \\\"account\\\", account);\\n eventEmitter.emitEventLog1(\\n \\\"AddOracleSigner\\\",\\n actionKey,\\n eventData\\n );\\n }\\n\\n function signalRemoveOracleSigner(address account) external onlyTimelockAdmin nonReentrant {\\n if (account == address(0)) {\\n revert Errors.InvalidOracleSigner(account);\\n }\\n\\n bytes32 actionKey = _removeOracleSignerActionKey(account);\\n _signalPendingAction(actionKey, \\\"removeOracleSigner\\\");\\n\\n EventUtils.EventLogData memory eventData;\\n eventData.addressItems.initItems(1);\\n eventData.addressItems.setItem(0, \\\"account\\\", account);\\n eventEmitter.emitEventLog1(\\n \\\"SignalRemoveOracleSigner\\\",\\n actionKey,\\n eventData\\n );\\n }\\n\\n function removeOracleSignerAfterSignal(address account) external onlyTimelockAdmin nonReentrant {\\n bytes32 actionKey = _removeOracleSignerActionKey(account);\\n _validateAndClearAction(actionKey, \\\"removeOracleSigner\\\");\\n\\n oracleStore.removeSigner(account);\\n\\n EventUtils.EventLogData memory eventData;\\n eventData.addressItems.initItems(1);\\n eventData.addressItems.setItem(0, \\\"account\\\", account);\\n eventEmitter.emitEventLog1(\\n \\\"RemoveOracleSigner\\\",\\n actionKey,\\n eventData\\n );\\n }\\n\\n // @dev signal setting of the fee receiver\\n // @param account the new fee receiver\\n function signalSetFeeReceiver(address account) external onlyTimelockAdmin nonReentrant {\\n if (account == address(0)) {\\n revert Errors.InvalidFeeReceiver(account);\\n }\\n\\n bytes32 actionKey = _setFeeReceiverActionKey(account);\\n _signalPendingAction(actionKey, \\\"setFeeReceiver\\\");\\n\\n EventUtils.EventLogData memory eventData;\\n eventData.addressItems.initItems(1);\\n eventData.addressItems.setItem(0, \\\"account\\\", account);\\n eventEmitter.emitEventLog1(\\n \\\"SignalSetFeeReceiver\\\",\\n actionKey,\\n eventData\\n );\\n }\\n\\n // @dev set the fee receiver\\n // @param account the new fee receiver\\n function setFeeReceiverAfterSignal(address account) external onlyTimelockAdmin nonReentrant {\\n bytes32 actionKey = _setFeeReceiverActionKey(account);\\n _validateAndClearAction(actionKey, \\\"setFeeReceiver\\\");\\n\\n dataStore.setAddress(Keys.FEE_RECEIVER, account);\\n\\n EventUtils.EventLogData memory eventData;\\n eventData.addressItems.initItems(1);\\n eventData.addressItems.setItem(0, \\\"account\\\", account);\\n eventEmitter.emitEventLog1(\\n \\\"SetFeeReceiver\\\",\\n actionKey,\\n eventData\\n );\\n }\\n\\n // @dev signal granting of a role\\n // @param account the account to grant the role\\n // @param roleKey the role to grant\\n function signalGrantRole(address account, bytes32 roleKey) external onlyTimelockAdmin nonReentrant {\\n bytes32 actionKey = _grantRoleActionKey(account, roleKey);\\n _signalPendingAction(actionKey, \\\"grantRole\\\");\\n\\n EventUtils.EventLogData memory eventData;\\n eventData.addressItems.initItems(1);\\n eventData.addressItems.setItem(0, \\\"account\\\", account);\\n eventData.bytes32Items.initItems(1);\\n eventData.bytes32Items.setItem(0, \\\"roleKey\\\", roleKey);\\n eventEmitter.emitEventLog1(\\n \\\"SignalGrantRole\\\",\\n actionKey,\\n eventData\\n );\\n }\\n\\n // @dev grant a role\\n // @param account the account to grant the role\\n // @param roleKey the role to grant\\n function grantRoleAfterSignal(address account, bytes32 roleKey) external onlyTimelockAdmin nonReentrant {\\n bytes32 actionKey = _grantRoleActionKey(account, roleKey);\\n _validateAndClearAction(actionKey, \\\"grantRole\\\");\\n\\n roleStore.grantRole(account, roleKey);\\n\\n EventUtils.EventLogData memory eventData;\\n eventData.addressItems.initItems(1);\\n eventData.addressItems.setItem(0, \\\"account\\\", account);\\n eventData.bytes32Items.initItems(1);\\n eventData.bytes32Items.setItem(0, \\\"roleKey\\\", roleKey);\\n eventEmitter.emitEventLog1(\\n \\\"GrantRole\\\",\\n actionKey,\\n eventData\\n );\\n }\\n\\n // @dev signal revoking of a role\\n // @param account the account to revoke the role for\\n // @param roleKey the role to revoke\\n function signalRevokeRole(address account, bytes32 roleKey) external onlyTimelockAdmin nonReentrant {\\n bytes32 actionKey = _revokeRoleActionKey(account, roleKey);\\n _signalPendingAction(actionKey, \\\"revokeRole\\\");\\n\\n EventUtils.EventLogData memory eventData;\\n eventData.addressItems.initItems(1);\\n eventData.addressItems.setItem(0, \\\"account\\\", account);\\n eventData.bytes32Items.initItems(1);\\n eventData.bytes32Items.setItem(0, \\\"roleKey\\\", roleKey);\\n eventEmitter.emitEventLog1(\\n \\\"SignalRevokeRole\\\",\\n actionKey,\\n eventData\\n );\\n }\\n\\n // @dev revoke a role\\n // @param account the account to revoke the role for\\n // @param roleKey the role to revoke\\n function revokeRoleAfterSignal(address account, bytes32 roleKey) external onlyTimelockAdmin nonReentrant {\\n bytes32 actionKey = _revokeRoleActionKey(account, roleKey);\\n _validateAndClearAction(actionKey, \\\"revokeRole\\\");\\n\\n roleStore.revokeRole(account, roleKey);\\n\\n EventUtils.EventLogData memory eventData;\\n eventData.addressItems.initItems(1);\\n eventData.addressItems.setItem(0, \\\"account\\\", account);\\n eventData.bytes32Items.initItems(1);\\n eventData.bytes32Items.setItem(0, \\\"roleKey\\\", roleKey);\\n eventEmitter.emitEventLog1(\\n \\\"RevokeRole\\\",\\n actionKey,\\n eventData\\n );\\n }\\n\\n // @dev signal setting of a price feed\\n // @param token the token to set the price feed for\\n // @param priceFeed the address of the price feed\\n // @param priceFeedMultiplier the multiplier to apply to the price feed results\\n // @param stablePrice the stable price to set a range for the price feed results\\n function signalSetPriceFeed(\\n address token,\\n address priceFeed,\\n uint256 priceFeedMultiplier,\\n uint256 priceFeedHeartbeatDuration,\\n uint256 stablePrice\\n ) external onlyTimelockAdmin nonReentrant {\\n bytes32 actionKey = _setPriceFeedActionKey(\\n token,\\n priceFeed,\\n priceFeedMultiplier,\\n priceFeedHeartbeatDuration,\\n stablePrice\\n );\\n\\n _signalPendingAction(actionKey, \\\"setPriceFeed\\\");\\n\\n EventUtils.EventLogData memory eventData;\\n eventData.addressItems.initItems(2);\\n eventData.addressItems.setItem(0, \\\"token\\\", token);\\n eventData.addressItems.setItem(1, \\\"priceFeed\\\", priceFeed);\\n eventData.uintItems.initItems(3);\\n eventData.uintItems.setItem(0, \\\"priceFeedMultiplier\\\", priceFeedMultiplier);\\n eventData.uintItems.setItem(1, \\\"priceFeedHeartbeatDuration\\\", priceFeedHeartbeatDuration);\\n eventData.uintItems.setItem(2, \\\"stablePrice\\\", stablePrice);\\n eventEmitter.emitEventLog1(\\n \\\"SignalSetPriceFeed\\\",\\n actionKey,\\n eventData\\n );\\n }\\n\\n // @dev sets a price feed\\n // @param token the token to set the price feed for\\n // @param priceFeed the address of the price feed\\n // @param priceFeedMultiplier the multiplier to apply to the price feed results\\n // @param stablePrice the stable price to set a range for the price feed results\\n function setPriceFeedAfterSignal(\\n address token,\\n address priceFeed,\\n uint256 priceFeedMultiplier,\\n uint256 priceFeedHeartbeatDuration,\\n uint256 stablePrice\\n ) external onlyTimelockAdmin nonReentrant {\\n bytes32 actionKey = _setPriceFeedActionKey(\\n token,\\n priceFeed,\\n priceFeedMultiplier,\\n priceFeedHeartbeatDuration,\\n stablePrice\\n );\\n\\n _validateAndClearAction(actionKey, \\\"setPriceFeed\\\");\\n\\n dataStore.setAddress(Keys.priceFeedKey(token), priceFeed);\\n dataStore.setUint(Keys.priceFeedMultiplierKey(token), priceFeedMultiplier);\\n dataStore.setUint(Keys.priceFeedHeartbeatDurationKey(token), priceFeedHeartbeatDuration);\\n dataStore.setUint(Keys.stablePriceKey(token), stablePrice);\\n\\n EventUtils.EventLogData memory eventData;\\n eventData.addressItems.initItems(2);\\n eventData.addressItems.setItem(0, \\\"token\\\", token);\\n eventData.addressItems.setItem(1, \\\"priceFeed\\\", priceFeed);\\n eventData.uintItems.initItems(3);\\n eventData.uintItems.setItem(0, \\\"priceFeedMultiplier\\\", priceFeedMultiplier);\\n eventData.uintItems.setItem(1, \\\"priceFeedHeartbeatDuration\\\", priceFeedHeartbeatDuration);\\n eventData.uintItems.setItem(2, \\\"stablePrice\\\", stablePrice);\\n eventEmitter.emitEventLog1(\\n \\\"SetPriceFeed\\\",\\n actionKey,\\n eventData\\n );\\n }\\n\\n // @dev signal setting of a data stream feed\\n // @param token the token to set the data stream feed for\\n // @param feedId the ID of the data stream feed\\n // @param dataStreamMultiplier the multiplier to apply to the data stream feed results\\n function signalSetDataStream(\\n address token,\\n bytes32 feedId,\\n uint256 dataStreamMultiplier\\n ) external onlyTimelockAdmin nonReentrant {\\n bytes32 actionKey = _setDataStreamActionKey(\\n token,\\n feedId,\\n dataStreamMultiplier\\n );\\n\\n _signalPendingAction(actionKey, \\\"setDataStream\\\");\\n\\n EventUtils.EventLogData memory eventData;\\n eventData.addressItems.initItems(1);\\n eventData.addressItems.setItem(0, \\\"token\\\", token);\\n eventData.bytes32Items.initItems(1);\\n eventData.bytes32Items.setItem(0, \\\"feedId\\\", feedId);\\n eventData.uintItems.initItems(1);\\n eventData.uintItems.setItem(0, \\\"dataStreamMultiplier\\\", dataStreamMultiplier);\\n eventEmitter.emitEventLog1(\\n \\\"SignalSetDataStream\\\",\\n actionKey,\\n eventData\\n );\\n }\\n\\n // @dev sets a data stream feed\\n // @param token the token to set the data stream feed for\\n // @param feedId the ID of the data stream feed\\n // @param dataStreamMultiplier the multiplier to apply to the data stream feed results\\n function setDataStreamAfterSignal(\\n address token,\\n bytes32 feedId,\\n uint256 dataStreamMultiplier\\n ) external onlyTimelockAdmin nonReentrant {\\n bytes32 actionKey = _setDataStreamActionKey(\\n token,\\n feedId,\\n dataStreamMultiplier\\n );\\n\\n _validateAndClearAction(actionKey, \\\"setDataStream\\\");\\n\\n dataStore.setBytes32(Keys.dataStreamIdKey(token), feedId);\\n dataStore.setUint(Keys.dataStreamMultiplierKey(token), dataStreamMultiplier);\\n\\n EventUtils.EventLogData memory eventData;\\n eventData.addressItems.initItems(1);\\n eventData.addressItems.setItem(0, \\\"token\\\", token);\\n eventData.bytes32Items.initItems(1);\\n eventData.bytes32Items.setItem(0, \\\"feedId\\\", feedId);\\n eventData.uintItems.initItems(1);\\n eventData.uintItems.setItem(0, \\\"dataStreamMultiplier\\\", dataStreamMultiplier);\\n eventEmitter.emitEventLog1(\\n \\\"SetDataStream\\\",\\n actionKey,\\n eventData\\n );\\n }\\n\\n // @dev cancels a previously signalled pending action\\n // @param actionKey the key of the action to cancel\\n function cancelAction(bytes32 actionKey) external onlyTimelockAdmin nonReentrant {\\n _clearAction(actionKey, \\\"cancelAction\\\");\\n }\\n\\n // @dev signal a pending action\\n // @param actionKey the key of the action\\n // @param actionLabel a label for the action\\n function _signalPendingAction(bytes32 actionKey, string memory actionLabel) internal {\\n if (pendingActions[actionKey] != 0) {\\n revert Errors.ActionAlreadySignalled();\\n }\\n\\n pendingActions[actionKey] = Chain.currentTimestamp() + timelockDelay;\\n pendingActionsList.add(actionKey);\\n\\n EventUtils.EventLogData memory eventData;\\n\\n eventData.bytes32Items.initItems(1);\\n eventData.bytes32Items.setItem(0, \\\"actionKey\\\", actionKey);\\n\\n eventData.stringItems.initItems(1);\\n eventData.stringItems.setItem(0, \\\"actionLabel\\\", actionLabel);\\n\\n eventEmitter.emitEventLog1(\\n \\\"SignalPendingAction\\\",\\n actionKey,\\n eventData\\n );\\n }\\n\\n function _setOracleProviderForTokenKey(address token, address provider) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"setOracleProviderForToken\\\", token, provider));\\n }\\n\\n function _setOracleProviderEnabledKey(address provider, bool value) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"setOracleProviderEnabled\\\", provider, value));\\n }\\n\\n function _setAtomicOracleProviderKey(address provider, bool value) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"setAtomicOracleProvider\\\", provider, value));\\n }\\n\\n function _addOracleSignerActionKey(address account) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"addOracleSigner\\\", account));\\n }\\n\\n function _removeOracleSignerActionKey(address account) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"removeOracleSigner\\\", account));\\n }\\n\\n function _setFeeReceiverActionKey(address account) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"setFeeReceiver\\\", account));\\n }\\n\\n function _grantRoleActionKey(address account, bytes32 roleKey) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"grantRole\\\", account, roleKey));\\n }\\n\\n function _revokeRoleActionKey(address account, bytes32 roleKey) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"revokeRole\\\", account, roleKey));\\n }\\n\\n function _setPriceFeedActionKey(\\n address token,\\n address priceFeed,\\n uint256 priceFeedMultiplier,\\n uint256 priceFeedHeartbeatDuration,\\n uint256 stablePrice\\n ) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\n \\\"setPriceFeed\\\",\\n token,\\n priceFeed,\\n priceFeedMultiplier,\\n priceFeedHeartbeatDuration,\\n stablePrice\\n ));\\n }\\n\\n function _setDataStreamActionKey(\\n address token,\\n bytes32 feedId,\\n uint256 dataStreamMultiplier\\n ) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\n \\\"setDataStream\\\",\\n token,\\n feedId,\\n dataStreamMultiplier\\n ));\\n }\\n\\n // @dev validate that the action has been signalled and sufficient time has\\n // passed, clear the action after\\n function _validateAndClearAction(bytes32 actionKey, string memory actionLabel) internal {\\n _validateAction(actionKey);\\n _clearAction(actionKey, actionLabel);\\n }\\n\\n // @dev validate that the action has been signalled and sufficient time has passed\\n function _validateAction(bytes32 actionKey) internal view {\\n if (pendingActions[actionKey] == 0) {\\n revert Errors.ActionNotSignalled();\\n }\\n\\n if (pendingActions[actionKey] > Chain.currentTimestamp()) {\\n revert Errors.SignalTimeNotYetPassed(pendingActions[actionKey]);\\n }\\n }\\n\\n // @dev clear a previously signalled action\\n function _clearAction(bytes32 actionKey, string memory actionLabel) internal {\\n if (pendingActions[actionKey] == 0) {\\n revert Errors.ActionNotSignalled();\\n }\\n delete pendingActions[actionKey];\\n pendingActionsList.remove(actionKey);\\n\\n EventUtils.EventLogData memory eventData;\\n\\n eventData.bytes32Items.initItems(1);\\n eventData.bytes32Items.setItem(0, \\\"actionKey\\\", actionKey);\\n\\n eventData.stringItems.initItems(1);\\n eventData.stringItems.setItem(0, \\\"actionLabel\\\", actionLabel);\\n\\n eventEmitter.emitEventLog1(\\n \\\"ClearPendingAction\\\",\\n actionKey,\\n eventData\\n );\\n }\\n\\n function _validateTimelockDelay() internal view {\\n if (timelockDelay > MAX_TIMELOCK_DELAY) {\\n revert Errors.MaxTimelockDelayExceeded(timelockDelay);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x8335802f6be209fd13c317abea555d68d36c6d0b2123cf71f4c381af6ac37c46\",\"license\":\"BUSL-1.1\"},\"contracts/data/DataStore.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../role/RoleModule.sol\\\";\\nimport \\\"../utils/Calc.sol\\\";\\n\\n// @title DataStore\\n// @dev DataStore for all general state values\\ncontract DataStore is RoleModule {\\n using SafeCast for int256;\\n\\n using EnumerableSet for EnumerableSet.Bytes32Set;\\n using EnumerableSet for EnumerableSet.AddressSet;\\n using EnumerableSet for EnumerableSet.UintSet;\\n using EnumerableValues for EnumerableSet.Bytes32Set;\\n using EnumerableValues for EnumerableSet.AddressSet;\\n using EnumerableValues for EnumerableSet.UintSet;\\n\\n // store for uint values\\n mapping(bytes32 => uint256) public uintValues;\\n // store for int values\\n mapping(bytes32 => int256) public intValues;\\n // store for address values\\n mapping(bytes32 => address) public addressValues;\\n // store for bool values\\n mapping(bytes32 => bool) public boolValues;\\n // store for string values\\n mapping(bytes32 => string) public stringValues;\\n // store for bytes32 values\\n mapping(bytes32 => bytes32) public bytes32Values;\\n\\n // store for uint[] values\\n mapping(bytes32 => uint256[]) public uintArrayValues;\\n // store for int[] values\\n mapping(bytes32 => int256[]) public intArrayValues;\\n // store for address[] values\\n mapping(bytes32 => address[]) public addressArrayValues;\\n // store for bool[] values\\n mapping(bytes32 => bool[]) public boolArrayValues;\\n // store for string[] values\\n mapping(bytes32 => string[]) public stringArrayValues;\\n // store for bytes32[] values\\n mapping(bytes32 => bytes32[]) public bytes32ArrayValues;\\n\\n // store for bytes32 sets\\n mapping(bytes32 => EnumerableSet.Bytes32Set) internal bytes32Sets;\\n // store for address sets\\n mapping(bytes32 => EnumerableSet.AddressSet) internal addressSets;\\n // store for uint256 sets\\n mapping(bytes32 => EnumerableSet.UintSet) internal uintSets;\\n\\n constructor(RoleStore _roleStore) RoleModule(_roleStore) {}\\n\\n // @dev get the uint value for the given key\\n // @param key the key of the value\\n // @return the uint value for the key\\n function getUint(bytes32 key) external view returns (uint256) {\\n return uintValues[key];\\n }\\n\\n // @dev set the uint value for the given key\\n // @param key the key of the value\\n // @param value the value to set\\n // @return the uint value for the key\\n function setUint(bytes32 key, uint256 value) external onlyController returns (uint256) {\\n uintValues[key] = value;\\n return value;\\n }\\n\\n // @dev delete the uint value for the given key\\n // @param key the key of the value\\n function removeUint(bytes32 key) external onlyController {\\n delete uintValues[key];\\n }\\n\\n // @dev add the input int value to the existing uint value\\n // @param key the key of the value\\n // @param value the input int value\\n // @return the new uint value\\n function applyDeltaToUint(bytes32 key, int256 value, string memory errorMessage) external onlyController returns (uint256) {\\n uint256 currValue = uintValues[key];\\n if (value < 0 && (-value).toUint256() > currValue) {\\n revert(errorMessage);\\n }\\n uint256 nextUint = Calc.sumReturnUint256(currValue, value);\\n uintValues[key] = nextUint;\\n return nextUint;\\n }\\n\\n // @dev add the input uint value to the existing uint value\\n // @param key the key of the value\\n // @param value the input int value\\n // @return the new uint value\\n function applyDeltaToUint(bytes32 key, uint256 value) external onlyController returns (uint256) {\\n uint256 currValue = uintValues[key];\\n uint256 nextUint = currValue + value;\\n uintValues[key] = nextUint;\\n return nextUint;\\n }\\n\\n // @dev add the input int value to the existing uint value, prevent the uint\\n // value from becoming negative\\n // @param key the key of the value\\n // @param value the input int value\\n // @return the new uint value\\n function applyBoundedDeltaToUint(bytes32 key, int256 value) external onlyController returns (uint256) {\\n uint256 uintValue = uintValues[key];\\n if (value < 0 && (-value).toUint256() > uintValue) {\\n uintValues[key] = 0;\\n return 0;\\n }\\n\\n uint256 nextUint = Calc.sumReturnUint256(uintValue, value);\\n uintValues[key] = nextUint;\\n return nextUint;\\n }\\n\\n // @dev add the input uint value to the existing uint value\\n // @param key the key of the value\\n // @param value the input uint value\\n // @return the new uint value\\n function incrementUint(bytes32 key, uint256 value) external onlyController returns (uint256) {\\n uint256 nextUint = uintValues[key] + value;\\n uintValues[key] = nextUint;\\n return nextUint;\\n }\\n\\n // @dev subtract the input uint value from the existing uint value\\n // @param key the key of the value\\n // @param value the input uint value\\n // @return the new uint value\\n function decrementUint(bytes32 key, uint256 value) external onlyController returns (uint256) {\\n uint256 nextUint = uintValues[key] - value;\\n uintValues[key] = nextUint;\\n return nextUint;\\n }\\n\\n // @dev get the int value for the given key\\n // @param key the key of the value\\n // @return the int value for the key\\n function getInt(bytes32 key) external view returns (int256) {\\n return intValues[key];\\n }\\n\\n // @dev set the int value for the given key\\n // @param key the key of the value\\n // @param value the value to set\\n // @return the int value for the key\\n function setInt(bytes32 key, int256 value) external onlyController returns (int256) {\\n intValues[key] = value;\\n return value;\\n }\\n\\n function removeInt(bytes32 key) external onlyController {\\n delete intValues[key];\\n }\\n\\n // @dev add the input int value to the existing int value\\n // @param key the key of the value\\n // @param value the input int value\\n // @return the new int value\\n function applyDeltaToInt(bytes32 key, int256 value) external onlyController returns (int256) {\\n int256 nextInt = intValues[key] + value;\\n intValues[key] = nextInt;\\n return nextInt;\\n }\\n\\n // @dev add the input int value to the existing int value\\n // @param key the key of the value\\n // @param value the input int value\\n // @return the new int value\\n function incrementInt(bytes32 key, int256 value) external onlyController returns (int256) {\\n int256 nextInt = intValues[key] + value;\\n intValues[key] = nextInt;\\n return nextInt;\\n }\\n\\n // @dev subtract the input int value from the existing int value\\n // @param key the key of the value\\n // @param value the input int value\\n // @return the new int value\\n function decrementInt(bytes32 key, int256 value) external onlyController returns (int256) {\\n int256 nextInt = intValues[key] - value;\\n intValues[key] = nextInt;\\n return nextInt;\\n }\\n\\n // @dev get the address value for the given key\\n // @param key the key of the value\\n // @return the address value for the key\\n function getAddress(bytes32 key) external view returns (address) {\\n return addressValues[key];\\n }\\n\\n // @dev set the address value for the given key\\n // @param key the key of the value\\n // @param value the value to set\\n // @return the address value for the key\\n function setAddress(bytes32 key, address value) external onlyController returns (address) {\\n addressValues[key] = value;\\n return value;\\n }\\n\\n // @dev delete the address value for the given key\\n // @param key the key of the value\\n function removeAddress(bytes32 key) external onlyController {\\n delete addressValues[key];\\n }\\n\\n // @dev get the bool value for the given key\\n // @param key the key of the value\\n // @return the bool value for the key\\n function getBool(bytes32 key) external view returns (bool) {\\n return boolValues[key];\\n }\\n\\n // @dev set the bool value for the given key\\n // @param key the key of the value\\n // @param value the value to set\\n // @return the bool value for the key\\n function setBool(bytes32 key, bool value) external onlyController returns (bool) {\\n boolValues[key] = value;\\n return value;\\n }\\n\\n // @dev delete the bool value for the given key\\n // @param key the key of the value\\n function removeBool(bytes32 key) external onlyController {\\n delete boolValues[key];\\n }\\n\\n // @dev get the string value for the given key\\n // @param key the key of the value\\n // @return the string value for the key\\n function getString(bytes32 key) external view returns (string memory) {\\n return stringValues[key];\\n }\\n\\n // @dev set the string value for the given key\\n // @param key the key of the value\\n // @param value the value to set\\n // @return the string value for the key\\n function setString(bytes32 key, string memory value) external onlyController returns (string memory) {\\n stringValues[key] = value;\\n return value;\\n }\\n\\n // @dev delete the string value for the given key\\n // @param key the key of the value\\n function removeString(bytes32 key) external onlyController {\\n delete stringValues[key];\\n }\\n\\n // @dev get the bytes32 value for the given key\\n // @param key the key of the value\\n // @return the bytes32 value for the key\\n function getBytes32(bytes32 key) external view returns (bytes32) {\\n return bytes32Values[key];\\n }\\n\\n // @dev set the bytes32 value for the given key\\n // @param key the key of the value\\n // @param value the value to set\\n // @return the bytes32 value for the key\\n function setBytes32(bytes32 key, bytes32 value) external onlyController returns (bytes32) {\\n bytes32Values[key] = value;\\n return value;\\n }\\n\\n // @dev delete the bytes32 value for the given key\\n // @param key the key of the value\\n function removeBytes32(bytes32 key) external onlyController {\\n delete bytes32Values[key];\\n }\\n\\n // @dev get the uint array for the given key\\n // @param key the key of the uint array\\n // @return the uint array for the key\\n function getUintArray(bytes32 key) external view returns (uint256[] memory) {\\n return uintArrayValues[key];\\n }\\n\\n // @dev set the uint array for the given key\\n // @param key the key of the uint array\\n // @param value the value of the uint array\\n function setUintArray(bytes32 key, uint256[] memory value) external onlyController {\\n uintArrayValues[key] = value;\\n }\\n\\n // @dev delete the uint array for the given key\\n // @param key the key of the uint array\\n // @param value the value of the uint array\\n function removeUintArray(bytes32 key) external onlyController {\\n delete uintArrayValues[key];\\n }\\n\\n // @dev get the int array for the given key\\n // @param key the key of the int array\\n // @return the int array for the key\\n function getIntArray(bytes32 key) external view returns (int256[] memory) {\\n return intArrayValues[key];\\n }\\n\\n // @dev set the int array for the given key\\n // @param key the key of the int array\\n // @param value the value of the int array\\n function setIntArray(bytes32 key, int256[] memory value) external onlyController {\\n intArrayValues[key] = value;\\n }\\n\\n // @dev delete the int array for the given key\\n // @param key the key of the int array\\n // @param value the value of the int array\\n function removeIntArray(bytes32 key) external onlyController {\\n delete intArrayValues[key];\\n }\\n\\n // @dev get the address array for the given key\\n // @param key the key of the address array\\n // @return the address array for the key\\n function getAddressArray(bytes32 key) external view returns (address[] memory) {\\n return addressArrayValues[key];\\n }\\n\\n // @dev set the address array for the given key\\n // @param key the key of the address array\\n // @param value the value of the address array\\n function setAddressArray(bytes32 key, address[] memory value) external onlyController {\\n addressArrayValues[key] = value;\\n }\\n\\n // @dev delete the address array for the given key\\n // @param key the key of the address array\\n // @param value the value of the address array\\n function removeAddressArray(bytes32 key) external onlyController {\\n delete addressArrayValues[key];\\n }\\n\\n // @dev get the bool array for the given key\\n // @param key the key of the bool array\\n // @return the bool array for the key\\n function getBoolArray(bytes32 key) external view returns (bool[] memory) {\\n return boolArrayValues[key];\\n }\\n\\n // @dev set the bool array for the given key\\n // @param key the key of the bool array\\n // @param value the value of the bool array\\n function setBoolArray(bytes32 key, bool[] memory value) external onlyController {\\n boolArrayValues[key] = value;\\n }\\n\\n // @dev delete the bool array for the given key\\n // @param key the key of the bool array\\n // @param value the value of the bool array\\n function removeBoolArray(bytes32 key) external onlyController {\\n delete boolArrayValues[key];\\n }\\n\\n // @dev get the string array for the given key\\n // @param key the key of the string array\\n // @return the string array for the key\\n function getStringArray(bytes32 key) external view returns (string[] memory) {\\n return stringArrayValues[key];\\n }\\n\\n // @dev set the string array for the given key\\n // @param key the key of the string array\\n // @param value the value of the string array\\n function setStringArray(bytes32 key, string[] memory value) external onlyController {\\n stringArrayValues[key] = value;\\n }\\n\\n // @dev delete the string array for the given key\\n // @param key the key of the string array\\n // @param value the value of the string array\\n function removeStringArray(bytes32 key) external onlyController {\\n delete stringArrayValues[key];\\n }\\n\\n // @dev get the bytes32 array for the given key\\n // @param key the key of the bytes32 array\\n // @return the bytes32 array for the key\\n function getBytes32Array(bytes32 key) external view returns (bytes32[] memory) {\\n return bytes32ArrayValues[key];\\n }\\n\\n // @dev set the bytes32 array for the given key\\n // @param key the key of the bytes32 array\\n // @param value the value of the bytes32 array\\n function setBytes32Array(bytes32 key, bytes32[] memory value) external onlyController {\\n bytes32ArrayValues[key] = value;\\n }\\n\\n // @dev delete the bytes32 array for the given key\\n // @param key the key of the bytes32 array\\n // @param value the value of the bytes32 array\\n function removeBytes32Array(bytes32 key) external onlyController {\\n delete bytes32ArrayValues[key];\\n }\\n\\n // @dev check whether the given value exists in the set\\n // @param setKey the key of the set\\n // @param value the value to check\\n function containsBytes32(bytes32 setKey, bytes32 value) external view returns (bool) {\\n return bytes32Sets[setKey].contains(value);\\n }\\n\\n // @dev get the length of the set\\n // @param setKey the key of the set\\n function getBytes32Count(bytes32 setKey) external view returns (uint256) {\\n return bytes32Sets[setKey].length();\\n }\\n\\n // @dev get the values of the set in the given range\\n // @param setKey the key of the set\\n // @param the start of the range, values at the start index will be returned\\n // in the result\\n // @param the end of the range, values at the end index will not be returned\\n // in the result\\n function getBytes32ValuesAt(bytes32 setKey, uint256 start, uint256 end) external view returns (bytes32[] memory) {\\n return bytes32Sets[setKey].valuesAt(start, end);\\n }\\n\\n // @dev add the given value to the set\\n // @param setKey the key of the set\\n // @param value the value to add\\n function addBytes32(bytes32 setKey, bytes32 value) external onlyController {\\n bytes32Sets[setKey].add(value);\\n }\\n\\n // @dev remove the given value from the set\\n // @param setKey the key of the set\\n // @param value the value to remove\\n function removeBytes32(bytes32 setKey, bytes32 value) external onlyController {\\n bytes32Sets[setKey].remove(value);\\n }\\n\\n // @dev check whether the given value exists in the set\\n // @param setKey the key of the set\\n // @param value the value to check\\n function containsAddress(bytes32 setKey, address value) external view returns (bool) {\\n return addressSets[setKey].contains(value);\\n }\\n\\n // @dev get the length of the set\\n // @param setKey the key of the set\\n function getAddressCount(bytes32 setKey) external view returns (uint256) {\\n return addressSets[setKey].length();\\n }\\n\\n // @dev get the values of the set in the given range\\n // @param setKey the key of the set\\n // @param the start of the range, values at the start index will be returned\\n // in the result\\n // @param the end of the range, values at the end index will not be returned\\n // in the result\\n function getAddressValuesAt(bytes32 setKey, uint256 start, uint256 end) external view returns (address[] memory) {\\n return addressSets[setKey].valuesAt(start, end);\\n }\\n\\n // @dev add the given value to the set\\n // @param setKey the key of the set\\n // @param value the value to add\\n function addAddress(bytes32 setKey, address value) external onlyController {\\n addressSets[setKey].add(value);\\n }\\n\\n // @dev remove the given value from the set\\n // @param setKey the key of the set\\n // @param value the value to remove\\n function removeAddress(bytes32 setKey, address value) external onlyController {\\n addressSets[setKey].remove(value);\\n }\\n\\n // @dev check whether the given value exists in the set\\n // @param setKey the key of the set\\n // @param value the value to check\\n function containsUint(bytes32 setKey, uint256 value) external view returns (bool) {\\n return uintSets[setKey].contains(value);\\n }\\n\\n // @dev get the length of the set\\n // @param setKey the key of the set\\n function getUintCount(bytes32 setKey) external view returns (uint256) {\\n return uintSets[setKey].length();\\n }\\n\\n // @dev get the values of the set in the given range\\n // @param setKey the key of the set\\n // @param the start of the range, values at the start index will be returned\\n // in the result\\n // @param the end of the range, values at the end index will not be returned\\n // in the result\\n function getUintValuesAt(bytes32 setKey, uint256 start, uint256 end) external view returns (uint256[] memory) {\\n return uintSets[setKey].valuesAt(start, end);\\n }\\n\\n // @dev add the given value to the set\\n // @param setKey the key of the set\\n // @param value the value to add\\n function addUint(bytes32 setKey, uint256 value) external onlyController {\\n uintSets[setKey].add(value);\\n }\\n\\n // @dev remove the given value from the set\\n // @param setKey the key of the set\\n // @param value the value to remove\\n function removeUint(bytes32 setKey, uint256 value) external onlyController {\\n uintSets[setKey].remove(value);\\n }\\n}\\n\",\"keccak256\":\"0x38684fbf5eaa5e5c4ae0d220b28b7ceb3ddd6be8d983f162ac4430e7479dd90c\",\"license\":\"BUSL-1.1\"},\"contracts/data/Keys.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity ^0.8.0;\\n\\n// @title Keys\\n// @dev Keys for values in the DataStore\\nlibrary Keys {\\n // @dev key for the address of the wrapped native token\\n bytes32 public constant WNT = keccak256(abi.encode(\\\"WNT\\\"));\\n // @dev key for the nonce value used in NonceUtils\\n bytes32 public constant NONCE = keccak256(abi.encode(\\\"NONCE\\\"));\\n\\n // @dev for sending received fees\\n bytes32 public constant FEE_RECEIVER = keccak256(abi.encode(\\\"FEE_RECEIVER\\\"));\\n\\n // @dev for holding tokens that could not be sent out\\n bytes32 public constant HOLDING_ADDRESS = keccak256(abi.encode(\\\"HOLDING_ADDRESS\\\"));\\n\\n // @dev key for the minimum gas for execution error\\n bytes32 public constant MIN_HANDLE_EXECUTION_ERROR_GAS = keccak256(abi.encode(\\\"MIN_HANDLE_EXECUTION_ERROR_GAS\\\"));\\n\\n // @dev key for the minimum gas that should be forwarded for execution error handling\\n bytes32 public constant MIN_HANDLE_EXECUTION_ERROR_GAS_TO_FORWARD = keccak256(abi.encode(\\\"MIN_HANDLE_EXECUTION_ERROR_GAS_TO_FORWARD\\\"));\\n\\n // @dev key for the min additional gas for execution\\n bytes32 public constant MIN_ADDITIONAL_GAS_FOR_EXECUTION = keccak256(abi.encode(\\\"MIN_ADDITIONAL_GAS_FOR_EXECUTION\\\"));\\n\\n // @dev for a global reentrancy guard\\n bytes32 public constant REENTRANCY_GUARD_STATUS = keccak256(abi.encode(\\\"REENTRANCY_GUARD_STATUS\\\"));\\n\\n // @dev key for deposit fees\\n bytes32 public constant DEPOSIT_FEE_TYPE = keccak256(abi.encode(\\\"DEPOSIT_FEE_TYPE\\\"));\\n // @dev key for withdrawal fees\\n bytes32 public constant WITHDRAWAL_FEE_TYPE = keccak256(abi.encode(\\\"WITHDRAWAL_FEE_TYPE\\\"));\\n // @dev key for swap fees\\n bytes32 public constant SWAP_FEE_TYPE = keccak256(abi.encode(\\\"SWAP_FEE_TYPE\\\"));\\n // @dev key for position fees\\n bytes32 public constant POSITION_FEE_TYPE = keccak256(abi.encode(\\\"POSITION_FEE_TYPE\\\"));\\n // @dev key for ui deposit fees\\n bytes32 public constant UI_DEPOSIT_FEE_TYPE = keccak256(abi.encode(\\\"UI_DEPOSIT_FEE_TYPE\\\"));\\n // @dev key for ui withdrawal fees\\n bytes32 public constant UI_WITHDRAWAL_FEE_TYPE = keccak256(abi.encode(\\\"UI_WITHDRAWAL_FEE_TYPE\\\"));\\n // @dev key for ui swap fees\\n bytes32 public constant UI_SWAP_FEE_TYPE = keccak256(abi.encode(\\\"UI_SWAP_FEE_TYPE\\\"));\\n // @dev key for ui position fees\\n bytes32 public constant UI_POSITION_FEE_TYPE = keccak256(abi.encode(\\\"UI_POSITION_FEE_TYPE\\\"));\\n\\n // @dev key for ui fee factor\\n bytes32 public constant UI_FEE_FACTOR = keccak256(abi.encode(\\\"UI_FEE_FACTOR\\\"));\\n // @dev key for max ui fee receiver factor\\n bytes32 public constant MAX_UI_FEE_FACTOR = keccak256(abi.encode(\\\"MAX_UI_FEE_FACTOR\\\"));\\n\\n // @dev key for the claimable fee amount\\n bytes32 public constant CLAIMABLE_FEE_AMOUNT = keccak256(abi.encode(\\\"CLAIMABLE_FEE_AMOUNT\\\"));\\n // @dev key for the claimable ui fee amount\\n bytes32 public constant CLAIMABLE_UI_FEE_AMOUNT = keccak256(abi.encode(\\\"CLAIMABLE_UI_FEE_AMOUNT\\\"));\\n // @dev key for the max number of auto cancel orders\\n bytes32 public constant MAX_AUTO_CANCEL_ORDERS = keccak256(abi.encode(\\\"MAX_AUTO_CANCEL_ORDERS\\\"));\\n // @dev key for the max total callback gas limit for auto cancel orders\\n bytes32 public constant MAX_TOTAL_CALLBACK_GAS_LIMIT_FOR_AUTO_CANCEL_ORDERS = keccak256(abi.encode(\\\"MAX_TOTAL_CALLBACK_GAS_LIMIT_FOR_AUTO_CANCEL_ORDERS\\\"));\\n\\n // @dev key for the market list\\n bytes32 public constant MARKET_LIST = keccak256(abi.encode(\\\"MARKET_LIST\\\"));\\n\\n // @dev key for the fee batch list\\n bytes32 public constant FEE_BATCH_LIST = keccak256(abi.encode(\\\"FEE_BATCH_LIST\\\"));\\n\\n // @dev key for the deposit list\\n bytes32 public constant DEPOSIT_LIST = keccak256(abi.encode(\\\"DEPOSIT_LIST\\\"));\\n // @dev key for the account deposit list\\n bytes32 public constant ACCOUNT_DEPOSIT_LIST = keccak256(abi.encode(\\\"ACCOUNT_DEPOSIT_LIST\\\"));\\n\\n // @dev key for the withdrawal list\\n bytes32 public constant WITHDRAWAL_LIST = keccak256(abi.encode(\\\"WITHDRAWAL_LIST\\\"));\\n // @dev key for the account withdrawal list\\n bytes32 public constant ACCOUNT_WITHDRAWAL_LIST = keccak256(abi.encode(\\\"ACCOUNT_WITHDRAWAL_LIST\\\"));\\n\\n // @dev key for the shift list\\n bytes32 public constant SHIFT_LIST = keccak256(abi.encode(\\\"SHIFT_LIST\\\"));\\n // @dev key for the account shift list\\n bytes32 public constant ACCOUNT_SHIFT_LIST = keccak256(abi.encode(\\\"ACCOUNT_SHIFT_LIST\\\"));\\n\\n bytes32 public constant GLV_LIST = keccak256(abi.encode(\\\"GLV_LIST\\\"));\\n bytes32 public constant GLV_DEPOSIT_LIST = keccak256(abi.encode(\\\"GLV_DEPOSIT_LIST\\\"));\\n bytes32 public constant GLV_SHIFT_LIST = keccak256(abi.encode(\\\"GLV_SHIFT_LIST\\\"));\\n bytes32 public constant ACCOUNT_GLV_DEPOSIT_LIST = keccak256(abi.encode(\\\"ACCOUNT_GLV_DEPOSIT_LIST\\\"));\\n bytes32 public constant GLV_WITHDRAWAL_LIST = keccak256(abi.encode(\\\"GLV_WITHDRAWAL_LIST\\\"));\\n bytes32 public constant ACCOUNT_GLV_WITHDRAWAL_LIST = keccak256(abi.encode(\\\"ACCOUNT_GLV_WITHDRAWAL_LIST\\\"));\\n bytes32 public constant GLV_SUPPORTED_MARKET_LIST = keccak256(abi.encode(\\\"GLV_SUPPORTED_MARKET_LIST\\\"));\\n\\n // @dev key for the position list\\n bytes32 public constant POSITION_LIST = keccak256(abi.encode(\\\"POSITION_LIST\\\"));\\n // @dev key for the account position list\\n bytes32 public constant ACCOUNT_POSITION_LIST = keccak256(abi.encode(\\\"ACCOUNT_POSITION_LIST\\\"));\\n\\n // @dev key for the order list\\n bytes32 public constant ORDER_LIST = keccak256(abi.encode(\\\"ORDER_LIST\\\"));\\n // @dev key for the account order list\\n bytes32 public constant ACCOUNT_ORDER_LIST = keccak256(abi.encode(\\\"ACCOUNT_ORDER_LIST\\\"));\\n\\n // @dev key for the subaccount list\\n bytes32 public constant SUBACCOUNT_LIST = keccak256(abi.encode(\\\"SUBACCOUNT_LIST\\\"));\\n\\n // @dev key for the auto cancel order list\\n bytes32 public constant AUTO_CANCEL_ORDER_LIST = keccak256(abi.encode(\\\"AUTO_CANCEL_ORDER_LIST\\\"));\\n\\n // @dev key for is market disabled\\n bytes32 public constant IS_MARKET_DISABLED = keccak256(abi.encode(\\\"IS_MARKET_DISABLED\\\"));\\n\\n // @dev key for the max swap path length allowed\\n bytes32 public constant MAX_SWAP_PATH_LENGTH = keccak256(abi.encode(\\\"MAX_SWAP_PATH_LENGTH\\\"));\\n // @dev key used to store markets observed in a swap path, to ensure that a swap path contains unique markets\\n bytes32 public constant SWAP_PATH_MARKET_FLAG = keccak256(abi.encode(\\\"SWAP_PATH_MARKET_FLAG\\\"));\\n // @dev key used to store the min market tokens for the first deposit for a market\\n bytes32 public constant MIN_MARKET_TOKENS_FOR_FIRST_DEPOSIT = keccak256(abi.encode(\\\"MIN_MARKET_TOKENS_FOR_FIRST_DEPOSIT\\\"));\\n\\n bytes32 public constant CREATE_GLV_DEPOSIT_FEATURE_DISABLED = keccak256(abi.encode(\\\"CREATE_GLV_DEPOSIT_FEATURE_DISABLED\\\"));\\n bytes32 public constant CANCEL_GLV_DEPOSIT_FEATURE_DISABLED = keccak256(abi.encode(\\\"CANCEL_GLV_DEPOSIT_FEATURE_DISABLED\\\"));\\n bytes32 public constant EXECUTE_GLV_DEPOSIT_FEATURE_DISABLED = keccak256(abi.encode(\\\"EXECUTE_GLV_DEPOSIT_FEATURE_DISABLED\\\"));\\n\\n bytes32 public constant CREATE_GLV_WITHDRAWAL_FEATURE_DISABLED = keccak256(abi.encode(\\\"CREATE_GLV_WITHDRAWAL_FEATURE_DISABLED\\\"));\\n bytes32 public constant CANCEL_GLV_WITHDRAWAL_FEATURE_DISABLED = keccak256(abi.encode(\\\"CANCEL_GLV_WITHDRAWAL_FEATURE_DISABLED\\\"));\\n bytes32 public constant EXECUTE_GLV_WITHDRAWAL_FEATURE_DISABLED = keccak256(abi.encode(\\\"EXECUTE_GLV_WITHDRAWAL_FEATURE_DISABLED\\\"));\\n\\n bytes32 public constant CREATE_GLV_SHIFT_FEATURE_DISABLED = keccak256(abi.encode(\\\"CREATE_GLV_SHIFT_FEATURE_DISABLED\\\"));\\n bytes32 public constant EXECUTE_GLV_SHIFT_FEATURE_DISABLED = keccak256(abi.encode(\\\"EXECUTE_GLV_SHIFT_FEATURE_DISABLED\\\"));\\n\\n // @dev key for whether the create deposit feature is disabled\\n bytes32 public constant CREATE_DEPOSIT_FEATURE_DISABLED = keccak256(abi.encode(\\\"CREATE_DEPOSIT_FEATURE_DISABLED\\\"));\\n // @dev key for whether the cancel deposit feature is disabled\\n bytes32 public constant CANCEL_DEPOSIT_FEATURE_DISABLED = keccak256(abi.encode(\\\"CANCEL_DEPOSIT_FEATURE_DISABLED\\\"));\\n // @dev key for whether the execute deposit feature is disabled\\n bytes32 public constant EXECUTE_DEPOSIT_FEATURE_DISABLED = keccak256(abi.encode(\\\"EXECUTE_DEPOSIT_FEATURE_DISABLED\\\"));\\n\\n // @dev key for whether the create withdrawal feature is disabled\\n bytes32 public constant CREATE_WITHDRAWAL_FEATURE_DISABLED = keccak256(abi.encode(\\\"CREATE_WITHDRAWAL_FEATURE_DISABLED\\\"));\\n // @dev key for whether the cancel withdrawal feature is disabled\\n bytes32 public constant CANCEL_WITHDRAWAL_FEATURE_DISABLED = keccak256(abi.encode(\\\"CANCEL_WITHDRAWAL_FEATURE_DISABLED\\\"));\\n // @dev key for whether the execute withdrawal feature is disabled\\n bytes32 public constant EXECUTE_WITHDRAWAL_FEATURE_DISABLED = keccak256(abi.encode(\\\"EXECUTE_WITHDRAWAL_FEATURE_DISABLED\\\"));\\n // @dev key for whether the execute atomic withdrawal feature is disabled\\n bytes32 public constant EXECUTE_ATOMIC_WITHDRAWAL_FEATURE_DISABLED = keccak256(abi.encode(\\\"EXECUTE_ATOMIC_WITHDRAWAL_FEATURE_DISABLED\\\"));\\n\\n // @dev key for whether the create shift feature is disabled\\n bytes32 public constant CREATE_SHIFT_FEATURE_DISABLED = keccak256(abi.encode(\\\"CREATE_SHIFT_FEATURE_DISABLED\\\"));\\n // @dev key for whether the cancel shift feature is disabled\\n bytes32 public constant CANCEL_SHIFT_FEATURE_DISABLED = keccak256(abi.encode(\\\"CANCEL_SHIFT_FEATURE_DISABLED\\\"));\\n // @dev key for whether the execute shift feature is disabled\\n bytes32 public constant EXECUTE_SHIFT_FEATURE_DISABLED = keccak256(abi.encode(\\\"EXECUTE_SHIFT_FEATURE_DISABLED\\\"));\\n\\n // @dev key for whether the create order feature is disabled\\n bytes32 public constant CREATE_ORDER_FEATURE_DISABLED = keccak256(abi.encode(\\\"CREATE_ORDER_FEATURE_DISABLED\\\"));\\n // @dev key for whether the execute order feature is disabled\\n bytes32 public constant EXECUTE_ORDER_FEATURE_DISABLED = keccak256(abi.encode(\\\"EXECUTE_ORDER_FEATURE_DISABLED\\\"));\\n // @dev key for whether the execute adl feature is disabled\\n // for liquidations, it can be disabled by using the EXECUTE_ORDER_FEATURE_DISABLED key with the Liquidation\\n // order type, ADL orders have a MarketDecrease order type, so a separate key is needed to disable it\\n bytes32 public constant EXECUTE_ADL_FEATURE_DISABLED = keccak256(abi.encode(\\\"EXECUTE_ADL_FEATURE_DISABLED\\\"));\\n // @dev key for whether the update order feature is disabled\\n bytes32 public constant UPDATE_ORDER_FEATURE_DISABLED = keccak256(abi.encode(\\\"UPDATE_ORDER_FEATURE_DISABLED\\\"));\\n // @dev key for whether the cancel order feature is disabled\\n bytes32 public constant CANCEL_ORDER_FEATURE_DISABLED = keccak256(abi.encode(\\\"CANCEL_ORDER_FEATURE_DISABLED\\\"));\\n\\n // @dev key for whether the claim funding fees feature is disabled\\n bytes32 public constant CLAIM_FUNDING_FEES_FEATURE_DISABLED = keccak256(abi.encode(\\\"CLAIM_FUNDING_FEES_FEATURE_DISABLED\\\"));\\n // @dev key for whether the claim collateral feature is disabled\\n bytes32 public constant CLAIM_COLLATERAL_FEATURE_DISABLED = keccak256(abi.encode(\\\"CLAIM_COLLATERAL_FEATURE_DISABLED\\\"));\\n // @dev key for whether the claim affiliate rewards feature is disabled\\n bytes32 public constant CLAIM_AFFILIATE_REWARDS_FEATURE_DISABLED = keccak256(abi.encode(\\\"CLAIM_AFFILIATE_REWARDS_FEATURE_DISABLED\\\"));\\n // @dev key for whether the claim ui fees feature is disabled\\n bytes32 public constant CLAIM_UI_FEES_FEATURE_DISABLED = keccak256(abi.encode(\\\"CLAIM_UI_FEES_FEATURE_DISABLED\\\"));\\n // @dev key for whether the subaccount feature is disabled\\n bytes32 public constant SUBACCOUNT_FEATURE_DISABLED = keccak256(abi.encode(\\\"SUBACCOUNT_FEATURE_DISABLED\\\"));\\n\\n // @dev key for the minimum required oracle signers for an oracle observation\\n bytes32 public constant MIN_ORACLE_SIGNERS = keccak256(abi.encode(\\\"MIN_ORACLE_SIGNERS\\\"));\\n // @dev key for the minimum block confirmations before blockhash can be excluded for oracle signature validation\\n bytes32 public constant MIN_ORACLE_BLOCK_CONFIRMATIONS = keccak256(abi.encode(\\\"MIN_ORACLE_BLOCK_CONFIRMATIONS\\\"));\\n // @dev key for the maximum usable oracle price age in seconds\\n bytes32 public constant MAX_ORACLE_PRICE_AGE = keccak256(abi.encode(\\\"MAX_ORACLE_PRICE_AGE\\\"));\\n // @dev key for the maximum oracle timestamp range\\n bytes32 public constant MAX_ORACLE_TIMESTAMP_RANGE = keccak256(abi.encode(\\\"MAX_ORACLE_TIMESTAMP_RANGE\\\"));\\n // @dev key for the maximum oracle price deviation factor from the ref price\\n bytes32 public constant MAX_ORACLE_REF_PRICE_DEVIATION_FACTOR = keccak256(abi.encode(\\\"MAX_ORACLE_REF_PRICE_DEVIATION_FACTOR\\\"));\\n // @dev key for whether an oracle provider is enabled\\n bytes32 public constant IS_ORACLE_PROVIDER_ENABLED = keccak256(abi.encode(\\\"IS_ORACLE_PROVIDER_ENABLED\\\"));\\n // @dev key for whether an oracle provider can be used for atomic actions\\n bytes32 public constant IS_ATOMIC_ORACLE_PROVIDER = keccak256(abi.encode(\\\"IS_ATOMIC_ORACLE_PROVIDER\\\"));\\n // @dev key for oracle timestamp adjustment\\n bytes32 public constant ORACLE_TIMESTAMP_ADJUSTMENT = keccak256(abi.encode(\\\"ORACLE_TIMESTAMP_ADJUSTMENT\\\"));\\n // @dev key for oracle provider for token\\n bytes32 public constant ORACLE_PROVIDER_FOR_TOKEN = keccak256(abi.encode(\\\"ORACLE_PROVIDER_FOR_TOKEN\\\"));\\n // @dev key for the chainlink payment token\\n bytes32 public constant CHAINLINK_PAYMENT_TOKEN = keccak256(abi.encode(\\\"CHAINLINK_PAYMENT_TOKEN\\\"));\\n // @dev key for the sequencer grace duration\\n bytes32 public constant SEQUENCER_GRACE_DURATION = keccak256(abi.encode(\\\"SEQUENCER_GRACE_DURATION\\\"));\\n\\n // @dev key for the percentage amount of position fees to be received\\n bytes32 public constant POSITION_FEE_RECEIVER_FACTOR = keccak256(abi.encode(\\\"POSITION_FEE_RECEIVER_FACTOR\\\"));\\n // @dev key for the percentage amount of liquidation fees to be received\\n bytes32 public constant LIQUIDATION_FEE_RECEIVER_FACTOR = keccak256(abi.encode(\\\"LIQUIDATION_FEE_RECEIVER_FACTOR\\\"));\\n // @dev key for the percentage amount of swap fees to be received\\n bytes32 public constant SWAP_FEE_RECEIVER_FACTOR = keccak256(abi.encode(\\\"SWAP_FEE_RECEIVER_FACTOR\\\"));\\n // @dev key for the percentage amount of borrowing fees to be received\\n bytes32 public constant BORROWING_FEE_RECEIVER_FACTOR = keccak256(abi.encode(\\\"BORROWING_FEE_RECEIVER_FACTOR\\\"));\\n\\n // @dev key for the base gas limit used when estimating execution fee\\n bytes32 public constant ESTIMATED_GAS_FEE_BASE_AMOUNT_V2_1 = keccak256(abi.encode(\\\"ESTIMATED_GAS_FEE_BASE_AMOUNT_V2_1\\\"));\\n // @dev key for the gas limit used for each oracle price when estimating execution fee\\n bytes32 public constant ESTIMATED_GAS_FEE_PER_ORACLE_PRICE = keccak256(abi.encode(\\\"ESTIMATED_GAS_FEE_PER_ORACLE_PRICE\\\"));\\n // @dev key for the multiplier used when estimating execution fee\\n bytes32 public constant ESTIMATED_GAS_FEE_MULTIPLIER_FACTOR = keccak256(abi.encode(\\\"ESTIMATED_GAS_FEE_MULTIPLIER_FACTOR\\\"));\\n\\n // @dev key for the base gas limit used when calculating execution fee\\n bytes32 public constant EXECUTION_GAS_FEE_BASE_AMOUNT_V2_1 = keccak256(abi.encode(\\\"EXECUTION_GAS_FEE_BASE_AMOUNT_V2_1\\\"));\\n // @dev key for the gas limit used for each oracle price\\n bytes32 public constant EXECUTION_GAS_FEE_PER_ORACLE_PRICE = keccak256(abi.encode(\\\"EXECUTION_GAS_FEE_PER_ORACLE_PRICE\\\"));\\n // @dev key for the multiplier used when calculating execution fee\\n bytes32 public constant EXECUTION_GAS_FEE_MULTIPLIER_FACTOR = keccak256(abi.encode(\\\"EXECUTION_GAS_FEE_MULTIPLIER_FACTOR\\\"));\\n\\n // @dev key for the estimated gas limit for deposits\\n bytes32 public constant DEPOSIT_GAS_LIMIT = keccak256(abi.encode(\\\"DEPOSIT_GAS_LIMIT\\\"));\\n // @dev key for the estimated gas limit for withdrawals\\n bytes32 public constant WITHDRAWAL_GAS_LIMIT = keccak256(abi.encode(\\\"WITHDRAWAL_GAS_LIMIT\\\"));\\n bytes32 public constant GLV_DEPOSIT_GAS_LIMIT = keccak256(abi.encode(\\\"GLV_DEPOSIT_GAS_LIMIT\\\"));\\n bytes32 public constant GLV_WITHDRAWAL_GAS_LIMIT = keccak256(abi.encode(\\\"GLV_WITHDRAWAL_GAS_LIMIT\\\"));\\n bytes32 public constant GLV_SHIFT_GAS_LIMIT = keccak256(abi.encode(\\\"GLV_SHIFT_GAS_LIMIT\\\"));\\n bytes32 public constant GLV_PER_MARKET_GAS_LIMIT = keccak256(abi.encode(\\\"GLV_PER_MARKET_GAS_LIMIT\\\"));\\n // @dev key for the estimated gas limit for shifts\\n bytes32 public constant SHIFT_GAS_LIMIT = keccak256(abi.encode(\\\"SHIFT_GAS_LIMIT\\\"));\\n // @dev key for the estimated gas limit for single swaps\\n bytes32 public constant SINGLE_SWAP_GAS_LIMIT = keccak256(abi.encode(\\\"SINGLE_SWAP_GAS_LIMIT\\\"));\\n // @dev key for the estimated gas limit for increase orders\\n bytes32 public constant INCREASE_ORDER_GAS_LIMIT = keccak256(abi.encode(\\\"INCREASE_ORDER_GAS_LIMIT\\\"));\\n // @dev key for the estimated gas limit for decrease orders\\n bytes32 public constant DECREASE_ORDER_GAS_LIMIT = keccak256(abi.encode(\\\"DECREASE_ORDER_GAS_LIMIT\\\"));\\n // @dev key for the estimated gas limit for swap orders\\n bytes32 public constant SWAP_ORDER_GAS_LIMIT = keccak256(abi.encode(\\\"SWAP_ORDER_GAS_LIMIT\\\"));\\n // @dev key for the amount of gas to forward for token transfers\\n bytes32 public constant TOKEN_TRANSFER_GAS_LIMIT = keccak256(abi.encode(\\\"TOKEN_TRANSFER_GAS_LIMIT\\\"));\\n // @dev key for the amount of gas to forward for native token transfers\\n bytes32 public constant NATIVE_TOKEN_TRANSFER_GAS_LIMIT = keccak256(abi.encode(\\\"NATIVE_TOKEN_TRANSFER_GAS_LIMIT\\\"));\\n // @dev key for the request expiration time, after which the request will be considered expired\\n bytes32 public constant REQUEST_EXPIRATION_TIME = keccak256(abi.encode(\\\"REQUEST_EXPIRATION_TIME\\\"));\\n\\n bytes32 public constant MAX_CALLBACK_GAS_LIMIT = keccak256(abi.encode(\\\"MAX_CALLBACK_GAS_LIMIT\\\"));\\n bytes32 public constant REFUND_EXECUTION_FEE_GAS_LIMIT = keccak256(abi.encode(\\\"REFUND_EXECUTION_FEE_GAS_LIMIT\\\"));\\n bytes32 public constant SAVED_CALLBACK_CONTRACT = keccak256(abi.encode(\\\"SAVED_CALLBACK_CONTRACT\\\"));\\n\\n // @dev key for the min collateral factor\\n bytes32 public constant MIN_COLLATERAL_FACTOR = keccak256(abi.encode(\\\"MIN_COLLATERAL_FACTOR\\\"));\\n // @dev key for the min collateral factor for open interest multiplier\\n bytes32 public constant MIN_COLLATERAL_FACTOR_FOR_OPEN_INTEREST_MULTIPLIER = keccak256(abi.encode(\\\"MIN_COLLATERAL_FACTOR_FOR_OPEN_INTEREST_MULTIPLIER\\\"));\\n // @dev key for the min allowed collateral in USD\\n bytes32 public constant MIN_COLLATERAL_USD = keccak256(abi.encode(\\\"MIN_COLLATERAL_USD\\\"));\\n // @dev key for the min allowed position size in USD\\n bytes32 public constant MIN_POSITION_SIZE_USD = keccak256(abi.encode(\\\"MIN_POSITION_SIZE_USD\\\"));\\n\\n // @dev key for the virtual id of tokens\\n bytes32 public constant VIRTUAL_TOKEN_ID = keccak256(abi.encode(\\\"VIRTUAL_TOKEN_ID\\\"));\\n // @dev key for the virtual id of markets\\n bytes32 public constant VIRTUAL_MARKET_ID = keccak256(abi.encode(\\\"VIRTUAL_MARKET_ID\\\"));\\n // @dev key for the virtual inventory for swaps\\n bytes32 public constant VIRTUAL_INVENTORY_FOR_SWAPS = keccak256(abi.encode(\\\"VIRTUAL_INVENTORY_FOR_SWAPS\\\"));\\n // @dev key for the virtual inventory for positions\\n bytes32 public constant VIRTUAL_INVENTORY_FOR_POSITIONS = keccak256(abi.encode(\\\"VIRTUAL_INVENTORY_FOR_POSITIONS\\\"));\\n\\n // @dev key for the position impact factor\\n bytes32 public constant POSITION_IMPACT_FACTOR = keccak256(abi.encode(\\\"POSITION_IMPACT_FACTOR\\\"));\\n // @dev key for the position impact exponent factor\\n bytes32 public constant POSITION_IMPACT_EXPONENT_FACTOR = keccak256(abi.encode(\\\"POSITION_IMPACT_EXPONENT_FACTOR\\\"));\\n // @dev key for the max decrease position impact factor\\n bytes32 public constant MAX_POSITION_IMPACT_FACTOR = keccak256(abi.encode(\\\"MAX_POSITION_IMPACT_FACTOR\\\"));\\n // @dev key for the max position impact factor for liquidations\\n bytes32 public constant MAX_POSITION_IMPACT_FACTOR_FOR_LIQUIDATIONS = keccak256(abi.encode(\\\"MAX_POSITION_IMPACT_FACTOR_FOR_LIQUIDATIONS\\\"));\\n // @dev key for the position fee factor\\n bytes32 public constant POSITION_FEE_FACTOR = keccak256(abi.encode(\\\"POSITION_FEE_FACTOR\\\"));\\n bytes32 public constant PRO_TRADER_TIER = keccak256(abi.encode(\\\"PRO_TRADER_TIER\\\"));\\n bytes32 public constant PRO_DISCOUNT_FACTOR = keccak256(abi.encode(\\\"PRO_DISCOUNT_FACTOR\\\"));\\n // @dev key for the liquidation fee factor\\n bytes32 public constant LIQUIDATION_FEE_FACTOR = keccak256(abi.encode(\\\"LIQUIDATION_FEE_FACTOR\\\"));\\n // @dev key for the swap impact factor\\n bytes32 public constant SWAP_IMPACT_FACTOR = keccak256(abi.encode(\\\"SWAP_IMPACT_FACTOR\\\"));\\n // @dev key for the swap impact exponent factor\\n bytes32 public constant SWAP_IMPACT_EXPONENT_FACTOR = keccak256(abi.encode(\\\"SWAP_IMPACT_EXPONENT_FACTOR\\\"));\\n // @dev key for the swap fee factor\\n bytes32 public constant SWAP_FEE_FACTOR = keccak256(abi.encode(\\\"SWAP_FEE_FACTOR\\\"));\\n // @dev key for the atomic swap fee factor\\n bytes32 public constant ATOMIC_SWAP_FEE_FACTOR = keccak256(abi.encode(\\\"ATOMIC_SWAP_FEE_FACTOR\\\"));\\n bytes32 public constant DEPOSIT_FEE_FACTOR = keccak256(abi.encode(\\\"DEPOSIT_FEE_FACTOR\\\"));\\n bytes32 public constant WITHDRAWAL_FEE_FACTOR = keccak256(abi.encode(\\\"WITHDRAWAL_FEE_FACTOR\\\"));\\n // @dev key for the oracle type\\n bytes32 public constant ORACLE_TYPE = keccak256(abi.encode(\\\"ORACLE_TYPE\\\"));\\n // @dev key for open interest\\n bytes32 public constant OPEN_INTEREST = keccak256(abi.encode(\\\"OPEN_INTEREST\\\"));\\n // @dev key for open interest in tokens\\n bytes32 public constant OPEN_INTEREST_IN_TOKENS = keccak256(abi.encode(\\\"OPEN_INTEREST_IN_TOKENS\\\"));\\n // @dev key for collateral sum for a market\\n bytes32 public constant COLLATERAL_SUM = keccak256(abi.encode(\\\"COLLATERAL_SUM\\\"));\\n // @dev key for pool amount\\n bytes32 public constant POOL_AMOUNT = keccak256(abi.encode(\\\"POOL_AMOUNT\\\"));\\n // @dev key for max pool amount\\n bytes32 public constant MAX_POOL_AMOUNT = keccak256(abi.encode(\\\"MAX_POOL_AMOUNT\\\"));\\n // @dev key for max pool usd for deposit\\n bytes32 public constant MAX_POOL_USD_FOR_DEPOSIT = keccak256(abi.encode(\\\"MAX_POOL_USD_FOR_DEPOSIT\\\"));\\n // @dev key for max open interest\\n bytes32 public constant MAX_OPEN_INTEREST = keccak256(abi.encode(\\\"MAX_OPEN_INTEREST\\\"));\\n // @dev key for position impact pool amount\\n bytes32 public constant POSITION_IMPACT_POOL_AMOUNT = keccak256(abi.encode(\\\"POSITION_IMPACT_POOL_AMOUNT\\\"));\\n // @dev key for min position impact pool amount\\n bytes32 public constant MIN_POSITION_IMPACT_POOL_AMOUNT = keccak256(abi.encode(\\\"MIN_POSITION_IMPACT_POOL_AMOUNT\\\"));\\n // @dev key for position impact pool distribution rate\\n bytes32 public constant POSITION_IMPACT_POOL_DISTRIBUTION_RATE = keccak256(abi.encode(\\\"POSITION_IMPACT_POOL_DISTRIBUTION_RATE\\\"));\\n // @dev key for position impact pool distributed at\\n bytes32 public constant POSITION_IMPACT_POOL_DISTRIBUTED_AT = keccak256(abi.encode(\\\"POSITION_IMPACT_POOL_DISTRIBUTED_AT\\\"));\\n // @dev key for swap impact pool amount\\n bytes32 public constant SWAP_IMPACT_POOL_AMOUNT = keccak256(abi.encode(\\\"SWAP_IMPACT_POOL_AMOUNT\\\"));\\n // @dev key for price feed\\n bytes32 public constant PRICE_FEED = keccak256(abi.encode(\\\"PRICE_FEED\\\"));\\n // @dev key for price feed multiplier\\n bytes32 public constant PRICE_FEED_MULTIPLIER = keccak256(abi.encode(\\\"PRICE_FEED_MULTIPLIER\\\"));\\n // @dev key for price feed heartbeat\\n bytes32 public constant PRICE_FEED_HEARTBEAT_DURATION = keccak256(abi.encode(\\\"PRICE_FEED_HEARTBEAT_DURATION\\\"));\\n // @dev key for data stream feed id\\n bytes32 public constant DATA_STREAM_ID = keccak256(abi.encode(\\\"DATA_STREAM_ID\\\"));\\n // @dev key for data stream feed multipler\\n bytes32 public constant DATA_STREAM_MULTIPLIER = keccak256(abi.encode(\\\"DATA_STREAM_MULTIPLIER\\\"));\\n // @dev key for stable price\\n bytes32 public constant STABLE_PRICE = keccak256(abi.encode(\\\"STABLE_PRICE\\\"));\\n // @dev key for reserve factor\\n bytes32 public constant RESERVE_FACTOR = keccak256(abi.encode(\\\"RESERVE_FACTOR\\\"));\\n // @dev key for open interest reserve factor\\n bytes32 public constant OPEN_INTEREST_RESERVE_FACTOR = keccak256(abi.encode(\\\"OPEN_INTEREST_RESERVE_FACTOR\\\"));\\n // @dev key for max pnl factor\\n bytes32 public constant MAX_PNL_FACTOR = keccak256(abi.encode(\\\"MAX_PNL_FACTOR\\\"));\\n // @dev key for max pnl factor\\n bytes32 public constant MAX_PNL_FACTOR_FOR_TRADERS = keccak256(abi.encode(\\\"MAX_PNL_FACTOR_FOR_TRADERS\\\"));\\n // @dev key for max pnl factor for adl\\n bytes32 public constant MAX_PNL_FACTOR_FOR_ADL = keccak256(abi.encode(\\\"MAX_PNL_FACTOR_FOR_ADL\\\"));\\n // @dev key for min pnl factor for adl\\n bytes32 public constant MIN_PNL_FACTOR_AFTER_ADL = keccak256(abi.encode(\\\"MIN_PNL_FACTOR_AFTER_ADL\\\"));\\n // @dev key for max pnl factor\\n bytes32 public constant MAX_PNL_FACTOR_FOR_DEPOSITS = keccak256(abi.encode(\\\"MAX_PNL_FACTOR_FOR_DEPOSITS\\\"));\\n // @dev key for max pnl factor for withdrawals\\n bytes32 public constant MAX_PNL_FACTOR_FOR_WITHDRAWALS = keccak256(abi.encode(\\\"MAX_PNL_FACTOR_FOR_WITHDRAWALS\\\"));\\n // @dev key for latest ADL at\\n bytes32 public constant LATEST_ADL_AT = keccak256(abi.encode(\\\"LATEST_ADL_AT\\\"));\\n // @dev key for whether ADL is enabled\\n bytes32 public constant IS_ADL_ENABLED = keccak256(abi.encode(\\\"IS_ADL_ENABLED\\\"));\\n // @dev key for funding factor\\n bytes32 public constant FUNDING_FACTOR = keccak256(abi.encode(\\\"FUNDING_FACTOR\\\"));\\n // @dev key for funding exponent factor\\n bytes32 public constant FUNDING_EXPONENT_FACTOR = keccak256(abi.encode(\\\"FUNDING_EXPONENT_FACTOR\\\"));\\n // @dev key for saved funding factor\\n bytes32 public constant SAVED_FUNDING_FACTOR_PER_SECOND = keccak256(abi.encode(\\\"SAVED_FUNDING_FACTOR_PER_SECOND\\\"));\\n // @dev key for funding increase factor\\n bytes32 public constant FUNDING_INCREASE_FACTOR_PER_SECOND = keccak256(abi.encode(\\\"FUNDING_INCREASE_FACTOR_PER_SECOND\\\"));\\n // @dev key for funding decrease factor\\n bytes32 public constant FUNDING_DECREASE_FACTOR_PER_SECOND = keccak256(abi.encode(\\\"FUNDING_DECREASE_FACTOR_PER_SECOND\\\"));\\n // @dev key for min funding factor\\n bytes32 public constant MIN_FUNDING_FACTOR_PER_SECOND = keccak256(abi.encode(\\\"MIN_FUNDING_FACTOR_PER_SECOND\\\"));\\n // @dev key for max funding factor\\n bytes32 public constant MAX_FUNDING_FACTOR_PER_SECOND = keccak256(abi.encode(\\\"MAX_FUNDING_FACTOR_PER_SECOND\\\"));\\n // @dev key for threshold for stable funding\\n bytes32 public constant THRESHOLD_FOR_STABLE_FUNDING = keccak256(abi.encode(\\\"THRESHOLD_FOR_STABLE_FUNDING\\\"));\\n // @dev key for threshold for decrease funding\\n bytes32 public constant THRESHOLD_FOR_DECREASE_FUNDING = keccak256(abi.encode(\\\"THRESHOLD_FOR_DECREASE_FUNDING\\\"));\\n // @dev key for funding fee amount per size\\n bytes32 public constant FUNDING_FEE_AMOUNT_PER_SIZE = keccak256(abi.encode(\\\"FUNDING_FEE_AMOUNT_PER_SIZE\\\"));\\n // @dev key for claimable funding amount per size\\n bytes32 public constant CLAIMABLE_FUNDING_AMOUNT_PER_SIZE = keccak256(abi.encode(\\\"CLAIMABLE_FUNDING_AMOUNT_PER_SIZE\\\"));\\n // @dev key for when funding was last updated at\\n bytes32 public constant FUNDING_UPDATED_AT = keccak256(abi.encode(\\\"FUNDING_UPDATED_AT\\\"));\\n // @dev key for claimable funding amount\\n bytes32 public constant CLAIMABLE_FUNDING_AMOUNT = keccak256(abi.encode(\\\"CLAIMABLE_FUNDING_AMOUNT\\\"));\\n // @dev key for claimable collateral amount\\n bytes32 public constant CLAIMABLE_COLLATERAL_AMOUNT = keccak256(abi.encode(\\\"CLAIMABLE_COLLATERAL_AMOUNT\\\"));\\n // @dev key for claimable collateral factor\\n bytes32 public constant CLAIMABLE_COLLATERAL_FACTOR = keccak256(abi.encode(\\\"CLAIMABLE_COLLATERAL_FACTOR\\\"));\\n // @dev key for claimable collateral time divisor\\n bytes32 public constant CLAIMABLE_COLLATERAL_TIME_DIVISOR = keccak256(abi.encode(\\\"CLAIMABLE_COLLATERAL_TIME_DIVISOR\\\"));\\n // @dev key for claimed collateral amount\\n bytes32 public constant CLAIMED_COLLATERAL_AMOUNT = keccak256(abi.encode(\\\"CLAIMED_COLLATERAL_AMOUNT\\\"));\\n bytes32 public constant IGNORE_OPEN_INTEREST_FOR_USAGE_FACTOR = keccak256(abi.encode(\\\"IGNORE_OPEN_INTEREST_FOR_USAGE_FACTOR\\\"));\\n // @dev key for optimal usage factor\\n bytes32 public constant OPTIMAL_USAGE_FACTOR = keccak256(abi.encode(\\\"OPTIMAL_USAGE_FACTOR\\\"));\\n // @dev key for base borrowing factor\\n bytes32 public constant BASE_BORROWING_FACTOR = keccak256(abi.encode(\\\"BASE_BORROWING_FACTOR\\\"));\\n // @dev key for above optimal usage borrowing factor\\n bytes32 public constant ABOVE_OPTIMAL_USAGE_BORROWING_FACTOR = keccak256(abi.encode(\\\"ABOVE_OPTIMAL_USAGE_BORROWING_FACTOR\\\"));\\n // @dev key for borrowing factor\\n bytes32 public constant BORROWING_FACTOR = keccak256(abi.encode(\\\"BORROWING_FACTOR\\\"));\\n // @dev key for borrowing factor\\n bytes32 public constant BORROWING_EXPONENT_FACTOR = keccak256(abi.encode(\\\"BORROWING_EXPONENT_FACTOR\\\"));\\n // @dev key for skipping the borrowing factor for the smaller side\\n bytes32 public constant SKIP_BORROWING_FEE_FOR_SMALLER_SIDE = keccak256(abi.encode(\\\"SKIP_BORROWING_FEE_FOR_SMALLER_SIDE\\\"));\\n // @dev key for cumulative borrowing factor\\n bytes32 public constant CUMULATIVE_BORROWING_FACTOR = keccak256(abi.encode(\\\"CUMULATIVE_BORROWING_FACTOR\\\"));\\n // @dev key for when the cumulative borrowing factor was last updated at\\n bytes32 public constant CUMULATIVE_BORROWING_FACTOR_UPDATED_AT = keccak256(abi.encode(\\\"CUMULATIVE_BORROWING_FACTOR_UPDATED_AT\\\"));\\n // @dev key for total borrowing amount\\n bytes32 public constant TOTAL_BORROWING = keccak256(abi.encode(\\\"TOTAL_BORROWING\\\"));\\n // @dev key for affiliate reward\\n bytes32 public constant MIN_AFFILIATE_REWARD_FACTOR = keccak256(abi.encode(\\\"MIN_AFFILIATE_REWARD_FACTOR\\\"));\\n bytes32 public constant AFFILIATE_REWARD = keccak256(abi.encode(\\\"AFFILIATE_REWARD\\\"));\\n // @dev key for max allowed subaccount action count\\n bytes32 public constant MAX_ALLOWED_SUBACCOUNT_ACTION_COUNT = keccak256(abi.encode(\\\"MAX_ALLOWED_SUBACCOUNT_ACTION_COUNT\\\"));\\n // @dev key for subaccount action count\\n bytes32 public constant SUBACCOUNT_ACTION_COUNT = keccak256(abi.encode(\\\"SUBACCOUNT_ACTION_COUNT\\\"));\\n // @dev key for subaccount auto top up amount\\n bytes32 public constant SUBACCOUNT_AUTO_TOP_UP_AMOUNT = keccak256(abi.encode(\\\"SUBACCOUNT_AUTO_TOP_UP_AMOUNT\\\"));\\n // @dev key for subaccount order action\\n bytes32 public constant SUBACCOUNT_ORDER_ACTION = keccak256(abi.encode(\\\"SUBACCOUNT_ORDER_ACTION\\\"));\\n // @dev key for fee distributor swap order token index\\n bytes32 public constant FEE_DISTRIBUTOR_SWAP_TOKEN_INDEX = keccak256(abi.encode(\\\"FEE_DISTRIBUTOR_SWAP_TOKEN_INDEX\\\"));\\n // @dev key for fee distributor swap fee batch\\n bytes32 public constant FEE_DISTRIBUTOR_SWAP_FEE_BATCH = keccak256(abi.encode(\\\"FEE_DISTRIBUTOR_SWAP_FEE_BATCH\\\"));\\n\\n bytes32 public constant GLV_MAX_MARKET_COUNT = keccak256(abi.encode(\\\"GLV_MAX_MARKET_COUNT\\\"));\\n bytes32 public constant GLV_MAX_MARKET_TOKEN_BALANCE_USD = keccak256(abi.encode(\\\"GLV_MAX_MARKET_TOKEN_BALANCE_USD\\\"));\\n bytes32 public constant GLV_MAX_MARKET_TOKEN_BALANCE_AMOUNT = keccak256(abi.encode(\\\"GLV_MAX_MARKET_TOKEN_BALANCE_AMOUNT\\\"));\\n bytes32 public constant IS_GLV_MARKET_DISABLED = keccak256(abi.encode(\\\"IS_GLV_MARKET_DISABLED\\\"));\\n bytes32 public constant GLV_SHIFT_MAX_PRICE_IMPACT_FACTOR = keccak256(abi.encode(\\\"GLV_SHIFT_MAX_PRICE_IMPACT_FACTOR\\\"));\\n bytes32 public constant GLV_SHIFT_LAST_EXECUTED_AT = keccak256(abi.encode(\\\"GLV_SHIFT_LAST_EXECUTED_AT\\\"));\\n bytes32 public constant GLV_SHIFT_MIN_INTERVAL = keccak256(abi.encode(\\\"GLV_SHIFT_MIN_INTERVAL\\\"));\\n bytes32 public constant MIN_GLV_TOKENS_FOR_FIRST_DEPOSIT = keccak256(abi.encode(\\\"MIN_GLV_TOKENS_FOR_FIRST_DEPOSIT\\\"));\\n\\n // @dev key for disabling automatic parameter updates via ConfigSyncer\\n bytes32 public constant SYNC_CONFIG_FEATURE_DISABLED = keccak256(abi.encode(\\\"SYNC_CONFIG_FEATURE_DISABLED\\\"));\\n // @dev key for disabling all parameter updates for a specific market via ConfigSyncer\\n bytes32 public constant SYNC_CONFIG_MARKET_DISABLED = keccak256(abi.encode(\\\"SYNC_CONFIG_MARKET_DISABLED\\\"));\\n // @dev key for disabling all updates for a specific parameter via ConfigSyncer\\n bytes32 public constant SYNC_CONFIG_PARAMETER_DISABLED = keccak256(abi.encode(\\\"SYNC_CONFIG_PARAMETER_DISABLED\\\"));\\n // @dev key for disabling all updates for a specific market parameter via ConfigSyncer\\n bytes32 public constant SYNC_CONFIG_MARKET_PARAMETER_DISABLED = keccak256(abi.encode(\\\"SYNC_CONFIG_MARKET_PARAMETER_DISABLED\\\"));\\n // @dev key for tracking which updateIds have already been applied by ConfigSyncer\\n bytes32 public constant SYNC_CONFIG_UPDATE_COMPLETED = keccak256(abi.encode(\\\"SYNC_CONFIG_UPDATE_COMPLETED\\\"));\\n // @dev key for the latest updateId that has been applied by ConfigSyncer\\n bytes32 public constant SYNC_CONFIG_LATEST_UPDATE_ID = keccak256(abi.encode(\\\"SYNC_CONFIG_LATEST_UPDATE_ID\\\"));\\n\\n // @dev key for the contributor account list\\n bytes32 public constant CONTRIBUTOR_ACCOUNT_LIST = keccak256(abi.encode(\\\"CONTRIBUTOR_ACCOUNT_LIST\\\"));\\n // @dev key for the contributor token list\\n bytes32 public constant CONTRIBUTOR_TOKEN_LIST = keccak256(abi.encode(\\\"CONTRIBUTOR_TOKEN_LIST\\\"));\\n // @dev key for the contributor token amount\\n bytes32 public constant CONTRIBUTOR_TOKEN_AMOUNT = keccak256(abi.encode(\\\"CONTRIBUTOR_TOKEN_AMOUNT\\\"));\\n // @dev key for the max total contributor token amount\\n bytes32 public constant MAX_TOTAL_CONTRIBUTOR_TOKEN_AMOUNT = keccak256(abi.encode(\\\"MAX_TOTAL_CONTRIBUTOR_TOKEN_AMOUNT\\\"));\\n // @dev key for the contributor token vault\\n bytes32 public constant CONTRIBUTOR_TOKEN_VAULT = keccak256(abi.encode(\\\"CONTRIBUTOR_TOKEN_VAULT\\\"));\\n // @dev key for the contributor last payment at\\n bytes32 public constant CONTRIBUTOR_LAST_PAYMENT_AT = keccak256(abi.encode(\\\"CONTRIBUTOR_LAST_PAYMENT_AT\\\"));\\n // @dev key for the min contributor payment interval\\n bytes32 public constant MIN_CONTRIBUTOR_PAYMENT_INTERVAL = keccak256(abi.encode(\\\"MIN_CONTRIBUTOR_PAYMENT_INTERVAL\\\"));\\n\\n // @dev key for the buyback batch amount used when claiming and swapping fees\\n bytes32 public constant BUYBACK_BATCH_AMOUNT = keccak256(abi.encode(\\\"BUYBACK_BATCH_AMOUNT\\\"));\\n // @dev key for the buyback available fees\\n bytes32 public constant BUYBACK_AVAILABLE_FEE_AMOUNT = keccak256(abi.encode(\\\"BUYBACK_AVAILABLE_FEE_AMOUNT\\\"));\\n // @dev key for the buyback gmx fee factor used in calculating fees by GMX/WNT\\n bytes32 public constant BUYBACK_GMX_FACTOR = keccak256(abi.encode(\\\"BUYBACK_GMX_FACTOR\\\"));\\n // @dev key for the FeeHandler max price impact when buying back fees\\n bytes32 public constant BUYBACK_MAX_PRICE_IMPACT_FACTOR = keccak256(abi.encode(\\\"BUYBACK_MAX_PRICE_IMPACT_FACTOR\\\"));\\n // @dev key for the maximum price delay in seconds when buying back fees\\n bytes32 public constant BUYBACK_MAX_PRICE_AGE = keccak256(abi.encode(\\\"BUYBACK_MAX_PRICE_AGE\\\"));\\n // @dev key for the buyback withdrawable fees\\n bytes32 public constant WITHDRAWABLE_BUYBACK_TOKEN_AMOUNT = keccak256(abi.encode(\\\"WITHDRAWABLE_BUYBACK_TOKEN_AMOUNT\\\"));\\n\\n // @dev constant for user initiated cancel reason\\n string public constant USER_INITIATED_CANCEL = \\\"USER_INITIATED_CANCEL\\\";\\n\\n // @dev function used to calculate fullKey for a given market parameter\\n // @param baseKey the base key for the market parameter\\n // @param data the additional data for the market parameter\\n function getFullKey(bytes32 baseKey, bytes memory data) internal pure returns (bytes32) {\\n if (data.length == 0) {\\n return baseKey;\\n }\\n\\n return keccak256(bytes.concat(baseKey, data));\\n }\\n\\n // @dev key for the account deposit list\\n // @param account the account for the list\\n function accountDepositListKey(address account) internal pure returns (bytes32) {\\n return keccak256(abi.encode(ACCOUNT_DEPOSIT_LIST, account));\\n }\\n\\n // @dev key for the account withdrawal list\\n // @param account the account for the list\\n function accountWithdrawalListKey(address account) internal pure returns (bytes32) {\\n return keccak256(abi.encode(ACCOUNT_WITHDRAWAL_LIST, account));\\n }\\n\\n // @dev key for the account shift list\\n // @param account the account for the list\\n function accountShiftListKey(address account) internal pure returns (bytes32) {\\n return keccak256(abi.encode(ACCOUNT_SHIFT_LIST, account));\\n }\\n\\n // @dev key for the account glv deposit list\\n // @param account the account for the list\\n function accountGlvDepositListKey(address account) internal pure returns (bytes32) {\\n return keccak256(abi.encode(ACCOUNT_GLV_DEPOSIT_LIST, account));\\n }\\n\\n // @dev key for the account glv deposit list\\n // @param account the account for the list\\n function accountGlvWithdrawalListKey(address account) internal pure returns (bytes32) {\\n return keccak256(abi.encode(ACCOUNT_GLV_WITHDRAWAL_LIST, account));\\n }\\n\\n // @dev key for the glv supported market list\\n // @param glv the glv for the supported market list\\n function glvSupportedMarketListKey(address glv) internal pure returns (bytes32) {\\n return keccak256(abi.encode(GLV_SUPPORTED_MARKET_LIST, glv));\\n }\\n\\n // @dev key for the account position list\\n // @param account the account for the list\\n function accountPositionListKey(address account) internal pure returns (bytes32) {\\n return keccak256(abi.encode(ACCOUNT_POSITION_LIST, account));\\n }\\n\\n // @dev key for the account order list\\n // @param account the account for the list\\n function accountOrderListKey(address account) internal pure returns (bytes32) {\\n return keccak256(abi.encode(ACCOUNT_ORDER_LIST, account));\\n }\\n\\n // @dev key for the subaccount list\\n // @param account the account for the list\\n function subaccountListKey(address account) internal pure returns (bytes32) {\\n return keccak256(abi.encode(SUBACCOUNT_LIST, account));\\n }\\n\\n // @dev key for the auto cancel order list\\n // @param position key the position key for the list\\n function autoCancelOrderListKey(bytes32 positionKey) internal pure returns (bytes32) {\\n return keccak256(abi.encode(AUTO_CANCEL_ORDER_LIST, positionKey));\\n }\\n\\n // @dev key for the claimable fee amount\\n // @param market the market for the fee\\n // @param token the token for the fee\\n function claimableFeeAmountKey(address market, address token) internal pure returns (bytes32) {\\n return keccak256(abi.encode(CLAIMABLE_FEE_AMOUNT, market, token));\\n }\\n\\n // @dev key for the claimable ui fee amount\\n // @param market the market for the fee\\n // @param token the token for the fee\\n // @param account the account that can claim the ui fee\\n function claimableUiFeeAmountKey(address market, address token) internal pure returns (bytes32) {\\n return keccak256(abi.encode(CLAIMABLE_UI_FEE_AMOUNT, market, token));\\n }\\n\\n // @dev key for the claimable ui fee amount for account\\n // @param market the market for the fee\\n // @param token the token for the fee\\n // @param account the account that can claim the ui fee\\n function claimableUiFeeAmountKey(address market, address token, address account) internal pure returns (bytes32) {\\n return keccak256(abi.encode(CLAIMABLE_UI_FEE_AMOUNT, market, token, account));\\n }\\n\\n // @dev key for deposit gas limit\\n // @param singleToken whether a single token or pair tokens are being deposited\\n // @return key for deposit gas limit\\n function depositGasLimitKey() internal pure returns (bytes32) {\\n return DEPOSIT_GAS_LIMIT;\\n }\\n\\n // @dev key for withdrawal gas limit\\n // @return key for withdrawal gas limit\\n function withdrawalGasLimitKey() internal pure returns (bytes32) {\\n return WITHDRAWAL_GAS_LIMIT;\\n }\\n\\n // @dev key for shift gas limit\\n // @return key for shift gas limit\\n function shiftGasLimitKey() internal pure returns (bytes32) {\\n return SHIFT_GAS_LIMIT;\\n }\\n\\n function glvDepositGasLimitKey() internal pure returns (bytes32) {\\n return GLV_DEPOSIT_GAS_LIMIT;\\n }\\n\\n function glvWithdrawalGasLimitKey() internal pure returns (bytes32) {\\n return GLV_WITHDRAWAL_GAS_LIMIT;\\n }\\n\\n function glvShiftGasLimitKey() internal pure returns (bytes32) {\\n return GLV_SHIFT_GAS_LIMIT;\\n }\\n\\n function glvPerMarketGasLimitKey() internal pure returns (bytes32) {\\n return GLV_PER_MARKET_GAS_LIMIT;\\n }\\n\\n // @dev key for single swap gas limit\\n // @return key for single swap gas limit\\n function singleSwapGasLimitKey() internal pure returns (bytes32) {\\n return SINGLE_SWAP_GAS_LIMIT;\\n }\\n\\n // @dev key for increase order gas limit\\n // @return key for increase order gas limit\\n function increaseOrderGasLimitKey() internal pure returns (bytes32) {\\n return INCREASE_ORDER_GAS_LIMIT;\\n }\\n\\n // @dev key for decrease order gas limit\\n // @return key for decrease order gas limit\\n function decreaseOrderGasLimitKey() internal pure returns (bytes32) {\\n return DECREASE_ORDER_GAS_LIMIT;\\n }\\n\\n // @dev key for swap order gas limit\\n // @return key for swap order gas limit\\n function swapOrderGasLimitKey() internal pure returns (bytes32) {\\n return SWAP_ORDER_GAS_LIMIT;\\n }\\n\\n function swapPathMarketFlagKey(address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n SWAP_PATH_MARKET_FLAG,\\n market\\n ));\\n }\\n\\n // @dev key for whether create glv deposit is disabled\\n // @param the create deposit module\\n // @return key for whether create deposit is disabled\\n function createGlvDepositFeatureDisabledKey(address module) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CREATE_GLV_DEPOSIT_FEATURE_DISABLED,\\n module\\n ));\\n }\\n\\n // @dev key for whether cancel glv deposit is disabled\\n // @param the cancel deposit module\\n // @return key for whether cancel deposit is disabled\\n function cancelGlvDepositFeatureDisabledKey(address module) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CANCEL_GLV_DEPOSIT_FEATURE_DISABLED,\\n module\\n ));\\n }\\n\\n // @dev key for whether execute glv deposit is disabled\\n // @param the execute deposit module\\n // @return key for whether execute deposit is disabled\\n function executeGlvDepositFeatureDisabledKey(address module) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n EXECUTE_GLV_DEPOSIT_FEATURE_DISABLED,\\n module\\n ));\\n }\\n\\n // @dev key for whether create glv withdrawal is disabled\\n // @param the create withdrawal module\\n // @return key for whether create withdrawal is disabled\\n function createGlvWithdrawalFeatureDisabledKey(address module) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CREATE_GLV_WITHDRAWAL_FEATURE_DISABLED,\\n module\\n ));\\n }\\n\\n // @dev key for whether cancel glv withdrawal is disabled\\n // @param the cancel withdrawal module\\n // @return key for whether cancel withdrawal is disabled\\n function cancelGlvWithdrawalFeatureDisabledKey(address module) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CANCEL_GLV_WITHDRAWAL_FEATURE_DISABLED,\\n module\\n ));\\n }\\n\\n // @dev key for whether execute glv withdrawal is disabled\\n // @param the execute withdrawal module\\n // @return key for whether execute withdrawal is disabled\\n function executeGlvWithdrawalFeatureDisabledKey(address module) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n EXECUTE_GLV_WITHDRAWAL_FEATURE_DISABLED,\\n module\\n ));\\n }\\n\\n function createGlvShiftFeatureDisabledKey(address module) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CREATE_GLV_SHIFT_FEATURE_DISABLED,\\n module\\n ));\\n }\\n\\n function executeGlvShiftFeatureDisabledKey(address module) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n EXECUTE_GLV_SHIFT_FEATURE_DISABLED,\\n module\\n ));\\n }\\n\\n\\n // @dev key for whether create deposit is disabled\\n // @param the create deposit module\\n // @return key for whether create deposit is disabled\\n function createDepositFeatureDisabledKey(address module) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CREATE_DEPOSIT_FEATURE_DISABLED,\\n module\\n ));\\n }\\n\\n // @dev key for whether cancel deposit is disabled\\n // @param the cancel deposit module\\n // @return key for whether cancel deposit is disabled\\n function cancelDepositFeatureDisabledKey(address module) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CANCEL_DEPOSIT_FEATURE_DISABLED,\\n module\\n ));\\n }\\n\\n // @dev key for whether execute deposit is disabled\\n // @param the execute deposit module\\n // @return key for whether execute deposit is disabled\\n function executeDepositFeatureDisabledKey(address module) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n EXECUTE_DEPOSIT_FEATURE_DISABLED,\\n module\\n ));\\n }\\n\\n // @dev key for whether create withdrawal is disabled\\n // @param the create withdrawal module\\n // @return key for whether create withdrawal is disabled\\n function createWithdrawalFeatureDisabledKey(address module) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CREATE_WITHDRAWAL_FEATURE_DISABLED,\\n module\\n ));\\n }\\n\\n // @dev key for whether cancel withdrawal is disabled\\n // @param the cancel withdrawal module\\n // @return key for whether cancel withdrawal is disabled\\n function cancelWithdrawalFeatureDisabledKey(address module) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CANCEL_WITHDRAWAL_FEATURE_DISABLED,\\n module\\n ));\\n }\\n\\n // @dev key for whether execute withdrawal is disabled\\n // @param the execute withdrawal module\\n // @return key for whether execute withdrawal is disabled\\n function executeWithdrawalFeatureDisabledKey(address module) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n EXECUTE_WITHDRAWAL_FEATURE_DISABLED,\\n module\\n ));\\n }\\n\\n // @dev key for whether execute atomic withdrawal is disabled\\n // @param the execute atomic withdrawal module\\n // @return key for whether execute atomic withdrawal is disabled\\n function executeAtomicWithdrawalFeatureDisabledKey(address module) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n EXECUTE_ATOMIC_WITHDRAWAL_FEATURE_DISABLED,\\n module\\n ));\\n }\\n\\n // @dev key for whether create shift is disabled\\n // @param the create shift module\\n // @return key for whether create shift is disabled\\n function createShiftFeatureDisabledKey(address module) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CREATE_SHIFT_FEATURE_DISABLED,\\n module\\n ));\\n }\\n\\n // @dev key for whether cancel shift is disabled\\n // @param the cancel shift module\\n // @return key for whether cancel shift is disabled\\n function cancelShiftFeatureDisabledKey(address module) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CANCEL_SHIFT_FEATURE_DISABLED,\\n module\\n ));\\n }\\n\\n // @dev key for whether execute shift is disabled\\n // @param the execute shift module\\n // @return key for whether execute shift is disabled\\n function executeShiftFeatureDisabledKey(address module) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n EXECUTE_SHIFT_FEATURE_DISABLED,\\n module\\n ));\\n }\\n\\n // @dev key for whether create order is disabled\\n // @param the create order module\\n // @return key for whether create order is disabled\\n function createOrderFeatureDisabledKey(address module, uint256 orderType) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CREATE_ORDER_FEATURE_DISABLED,\\n module,\\n orderType\\n ));\\n }\\n\\n // @dev key for whether execute order is disabled\\n // @param the execute order module\\n // @return key for whether execute order is disabled\\n function executeOrderFeatureDisabledKey(address module, uint256 orderType) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n EXECUTE_ORDER_FEATURE_DISABLED,\\n module,\\n orderType\\n ));\\n }\\n\\n // @dev key for whether execute adl is disabled\\n // @param the execute adl module\\n // @return key for whether execute adl is disabled\\n function executeAdlFeatureDisabledKey(address module, uint256 orderType) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n EXECUTE_ADL_FEATURE_DISABLED,\\n module,\\n orderType\\n ));\\n }\\n\\n // @dev key for whether update order is disabled\\n // @param the update order module\\n // @return key for whether update order is disabled\\n function updateOrderFeatureDisabledKey(address module, uint256 orderType) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n UPDATE_ORDER_FEATURE_DISABLED,\\n module,\\n orderType\\n ));\\n }\\n\\n // @dev key for whether cancel order is disabled\\n // @param the cancel order module\\n // @return key for whether cancel order is disabled\\n function cancelOrderFeatureDisabledKey(address module, uint256 orderType) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CANCEL_ORDER_FEATURE_DISABLED,\\n module,\\n orderType\\n ));\\n }\\n\\n // @dev key for whether claim funding fees is disabled\\n // @param the claim funding fees module\\n function claimFundingFeesFeatureDisabledKey(address module) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CLAIM_FUNDING_FEES_FEATURE_DISABLED,\\n module\\n ));\\n }\\n\\n // @dev key for whether claim colltareral is disabled\\n // @param the claim funding fees module\\n function claimCollateralFeatureDisabledKey(address module) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CLAIM_COLLATERAL_FEATURE_DISABLED,\\n module\\n ));\\n }\\n\\n // @dev key for whether claim affiliate rewards is disabled\\n // @param the claim affiliate rewards module\\n function claimAffiliateRewardsFeatureDisabledKey(address module) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CLAIM_AFFILIATE_REWARDS_FEATURE_DISABLED,\\n module\\n ));\\n }\\n\\n // @dev key for whether claim ui fees is disabled\\n // @param the claim ui fees module\\n function claimUiFeesFeatureDisabledKey(address module) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CLAIM_UI_FEES_FEATURE_DISABLED,\\n module\\n ));\\n }\\n\\n // @dev key for whether subaccounts are disabled\\n // @param the subaccount module\\n function subaccountFeatureDisabledKey(address module) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n SUBACCOUNT_FEATURE_DISABLED,\\n module\\n ));\\n }\\n\\n // @dev key for ui fee factor\\n // @param account the fee receiver account\\n // @return key for ui fee factor\\n function uiFeeFactorKey(address account) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n UI_FEE_FACTOR,\\n account\\n ));\\n }\\n\\n // @dev key for whether an oracle provider is enabled\\n // @param provider the oracle provider\\n // @return key for whether an oracle provider is enabled\\n function isOracleProviderEnabledKey(address provider) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n IS_ORACLE_PROVIDER_ENABLED,\\n provider\\n ));\\n }\\n\\n // @dev key for whether an oracle provider is allowed to be used for atomic actions\\n // @param provider the oracle provider\\n // @return key for whether an oracle provider is allowed to be used for atomic actions\\n function isAtomicOracleProviderKey(address provider) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n IS_ATOMIC_ORACLE_PROVIDER,\\n provider\\n ));\\n }\\n\\n // @dev key for oracle timestamp adjustment\\n // @param provider the oracle provider\\n // @param token the token\\n // @return key for oracle timestamp adjustment\\n function oracleTimestampAdjustmentKey(address provider, address token) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n ORACLE_TIMESTAMP_ADJUSTMENT,\\n provider,\\n token\\n ));\\n }\\n\\n // @dev key for oracle provider for token\\n // @param token the token\\n // @return key for oracle provider for token\\n function oracleProviderForTokenKey(address token) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n ORACLE_PROVIDER_FOR_TOKEN,\\n token\\n ));\\n }\\n\\n // @dev key for gas to forward for token transfer\\n // @param the token to check\\n // @return key for gas to forward for token transfer\\n function tokenTransferGasLimit(address token) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n TOKEN_TRANSFER_GAS_LIMIT,\\n token\\n ));\\n }\\n\\n // @dev the default callback contract\\n // @param account the user's account\\n // @param market the address of the market\\n // @param callbackContract the callback contract\\n function savedCallbackContract(address account, address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n SAVED_CALLBACK_CONTRACT,\\n account,\\n market\\n ));\\n }\\n\\n // @dev the min collateral factor key\\n // @param the market for the min collateral factor\\n function minCollateralFactorKey(address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n MIN_COLLATERAL_FACTOR,\\n market\\n ));\\n }\\n\\n // @dev the min collateral factor for open interest multiplier key\\n // @param the market for the factor\\n function minCollateralFactorForOpenInterestMultiplierKey(address market, bool isLong) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n MIN_COLLATERAL_FACTOR_FOR_OPEN_INTEREST_MULTIPLIER,\\n market,\\n isLong\\n ));\\n }\\n\\n // @dev the key for the virtual token id\\n // @param the token to get the virtual id for\\n function virtualTokenIdKey(address token) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n VIRTUAL_TOKEN_ID,\\n token\\n ));\\n }\\n\\n // @dev the key for the virtual market id\\n // @param the market to get the virtual id for\\n function virtualMarketIdKey(address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n VIRTUAL_MARKET_ID,\\n market\\n ));\\n }\\n\\n // @dev the key for the virtual inventory for positions\\n // @param the virtualTokenId the virtual token id\\n function virtualInventoryForPositionsKey(bytes32 virtualTokenId) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n VIRTUAL_INVENTORY_FOR_POSITIONS,\\n virtualTokenId\\n ));\\n }\\n\\n // @dev the key for the virtual inventory for swaps\\n // @param the virtualMarketId the virtual market id\\n // @param the token to check the inventory for\\n function virtualInventoryForSwapsKey(bytes32 virtualMarketId, bool isLongToken) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n VIRTUAL_INVENTORY_FOR_SWAPS,\\n virtualMarketId,\\n isLongToken\\n ));\\n }\\n\\n // @dev key for position impact factor\\n // @param market the market address to check\\n // @param isPositive whether the impact is positive or negative\\n // @return key for position impact factor\\n function positionImpactFactorKey(address market, bool isPositive) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n POSITION_IMPACT_FACTOR,\\n market,\\n isPositive\\n ));\\n }\\n\\n // @dev key for position impact exponent factor\\n // @param market the market address to check\\n // @return key for position impact exponent factor\\n function positionImpactExponentFactorKey(address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n POSITION_IMPACT_EXPONENT_FACTOR,\\n market\\n ));\\n }\\n\\n // @dev key for the max position impact factor\\n // @param market the market address to check\\n // @return key for the max position impact factor\\n function maxPositionImpactFactorKey(address market, bool isPositive) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n MAX_POSITION_IMPACT_FACTOR,\\n market,\\n isPositive\\n ));\\n }\\n\\n // @dev key for the max position impact factor for liquidations\\n // @param market the market address to check\\n // @return key for the max position impact factor\\n function maxPositionImpactFactorForLiquidationsKey(address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n MAX_POSITION_IMPACT_FACTOR_FOR_LIQUIDATIONS,\\n market\\n ));\\n }\\n\\n // @dev key for position fee factor\\n // @param market the market address to check\\n // @param forPositiveImpact whether the fee is for an action that has a positive price impact\\n // @return key for position fee factor\\n function positionFeeFactorKey(address market, bool forPositiveImpact) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n POSITION_FEE_FACTOR,\\n market,\\n forPositiveImpact\\n ));\\n }\\n\\n // @dev key for pro trader's tier\\n function proTraderTierKey(address account) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n PRO_TRADER_TIER,\\n account\\n ));\\n }\\n\\n\\n // @dev key for pro discount factor for specific tier\\n function proDiscountFactorKey(uint256 proTier) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n PRO_DISCOUNT_FACTOR,\\n proTier\\n ));\\n }\\n\\n // @dev key for liquidation fee factor\\n // @param market the market address to check\\n // @param forPositiveImpact whether the fee is for an action that has a positive price impact\\n // @return key for liquidation fee factor\\n function liquidationFeeFactorKey(address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n LIQUIDATION_FEE_FACTOR,\\n market\\n ));\\n }\\n\\n // @dev key for swap impact factor\\n // @param market the market address to check\\n // @param isPositive whether the impact is positive or negative\\n // @return key for swap impact factor\\n function swapImpactFactorKey(address market, bool isPositive) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n SWAP_IMPACT_FACTOR,\\n market,\\n isPositive\\n ));\\n }\\n\\n // @dev key for swap impact exponent factor\\n // @param market the market address to check\\n // @return key for swap impact exponent factor\\n function swapImpactExponentFactorKey(address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n SWAP_IMPACT_EXPONENT_FACTOR,\\n market\\n ));\\n }\\n\\n\\n // @dev key for swap fee factor\\n // @param market the market address to check\\n // @return key for swap fee factor\\n function swapFeeFactorKey(address market, bool forPositiveImpact) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n SWAP_FEE_FACTOR,\\n market,\\n forPositiveImpact\\n ));\\n }\\n\\n // @dev key for atomic swap fee factor\\n // @param market the market address to check\\n // @return key for atomic swap fee factor\\n function atomicSwapFeeFactorKey(address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n ATOMIC_SWAP_FEE_FACTOR,\\n market\\n ));\\n }\\n\\n function depositFeeFactorKey(address market, bool forPositiveImpact) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n DEPOSIT_FEE_FACTOR,\\n market,\\n forPositiveImpact\\n ));\\n }\\n\\n function withdrawalFeeFactorKey(address market, bool forPositiveImpact) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n WITHDRAWAL_FEE_FACTOR,\\n market,\\n forPositiveImpact\\n ));\\n }\\n\\n // @dev key for oracle type\\n // @param token the token to check\\n // @return key for oracle type\\n function oracleTypeKey(address token) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n ORACLE_TYPE,\\n token\\n ));\\n }\\n\\n // @dev key for open interest\\n // @param market the market to check\\n // @param collateralToken the collateralToken to check\\n // @param isLong whether to check the long or short open interest\\n // @return key for open interest\\n function openInterestKey(address market, address collateralToken, bool isLong) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n OPEN_INTEREST,\\n market,\\n collateralToken,\\n isLong\\n ));\\n }\\n\\n // @dev key for open interest in tokens\\n // @param market the market to check\\n // @param collateralToken the collateralToken to check\\n // @param isLong whether to check the long or short open interest\\n // @return key for open interest in tokens\\n function openInterestInTokensKey(address market, address collateralToken, bool isLong) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n OPEN_INTEREST_IN_TOKENS,\\n market,\\n collateralToken,\\n isLong\\n ));\\n }\\n\\n // @dev key for collateral sum for a market\\n // @param market the market to check\\n // @param collateralToken the collateralToken to check\\n // @param isLong whether to check the long or short open interest\\n // @return key for collateral sum\\n function collateralSumKey(address market, address collateralToken, bool isLong) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n COLLATERAL_SUM,\\n market,\\n collateralToken,\\n isLong\\n ));\\n }\\n\\n // @dev key for amount of tokens in a market's pool\\n // @param market the market to check\\n // @param token the token to check\\n // @return key for amount of tokens in a market's pool\\n function poolAmountKey(address market, address token) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n POOL_AMOUNT,\\n market,\\n token\\n ));\\n }\\n\\n // @dev the key for the max amount of pool tokens\\n // @param market the market for the pool\\n // @param token the token for the pool\\n function maxPoolAmountKey(address market, address token) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n MAX_POOL_AMOUNT,\\n market,\\n token\\n ));\\n }\\n\\n // @dev the key for the max usd of pool tokens for deposits\\n // @param market the market for the pool\\n // @param token the token for the pool\\n function maxPoolUsdForDepositKey(address market, address token) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n MAX_POOL_USD_FOR_DEPOSIT,\\n market,\\n token\\n ));\\n }\\n\\n // @dev the key for the max open interest\\n // @param market the market for the pool\\n // @param isLong whether the key is for the long or short side\\n function maxOpenInterestKey(address market, bool isLong) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n MAX_OPEN_INTEREST,\\n market,\\n isLong\\n ));\\n }\\n\\n // @dev key for amount of tokens in a market's position impact pool\\n // @param market the market to check\\n // @return key for amount of tokens in a market's position impact pool\\n function positionImpactPoolAmountKey(address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n POSITION_IMPACT_POOL_AMOUNT,\\n market\\n ));\\n }\\n\\n // @dev key for min amount of tokens in a market's position impact pool\\n // @param market the market to check\\n // @return key for min amount of tokens in a market's position impact pool\\n function minPositionImpactPoolAmountKey(address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n MIN_POSITION_IMPACT_POOL_AMOUNT,\\n market\\n ));\\n }\\n\\n // @dev key for position impact pool distribution rate\\n // @param market the market to check\\n // @return key for position impact pool distribution rate\\n function positionImpactPoolDistributionRateKey(address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n POSITION_IMPACT_POOL_DISTRIBUTION_RATE,\\n market\\n ));\\n }\\n\\n // @dev key for position impact pool distributed at\\n // @param market the market to check\\n // @return key for position impact pool distributed at\\n function positionImpactPoolDistributedAtKey(address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n POSITION_IMPACT_POOL_DISTRIBUTED_AT,\\n market\\n ));\\n }\\n\\n // @dev key for amount of tokens in a market's swap impact pool\\n // @param market the market to check\\n // @param token the token to check\\n // @return key for amount of tokens in a market's swap impact pool\\n function swapImpactPoolAmountKey(address market, address token) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n SWAP_IMPACT_POOL_AMOUNT,\\n market,\\n token\\n ));\\n }\\n\\n // @dev key for reserve factor\\n // @param market the market to check\\n // @param isLong whether to get the key for the long or short side\\n // @return key for reserve factor\\n function reserveFactorKey(address market, bool isLong) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n RESERVE_FACTOR,\\n market,\\n isLong\\n ));\\n }\\n\\n // @dev key for open interest reserve factor\\n // @param market the market to check\\n // @param isLong whether to get the key for the long or short side\\n // @return key for open interest reserve factor\\n function openInterestReserveFactorKey(address market, bool isLong) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n OPEN_INTEREST_RESERVE_FACTOR,\\n market,\\n isLong\\n ));\\n }\\n\\n // @dev key for max pnl factor\\n // @param market the market to check\\n // @param isLong whether to get the key for the long or short side\\n // @return key for max pnl factor\\n function maxPnlFactorKey(bytes32 pnlFactorType, address market, bool isLong) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n MAX_PNL_FACTOR,\\n pnlFactorType,\\n market,\\n isLong\\n ));\\n }\\n\\n // @dev the key for min PnL factor after ADL\\n // @param market the market for the pool\\n // @param isLong whether the key is for the long or short side\\n function minPnlFactorAfterAdlKey(address market, bool isLong) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n MIN_PNL_FACTOR_AFTER_ADL,\\n market,\\n isLong\\n ));\\n }\\n\\n // @dev key for latest adl time\\n // @param market the market to check\\n // @param isLong whether to get the key for the long or short side\\n // @return key for latest adl time\\n function latestAdlAtKey(address market, bool isLong) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n LATEST_ADL_AT,\\n market,\\n isLong\\n ));\\n }\\n\\n // @dev key for whether adl is enabled\\n // @param market the market to check\\n // @param isLong whether to get the key for the long or short side\\n // @return key for whether adl is enabled\\n function isAdlEnabledKey(address market, bool isLong) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n IS_ADL_ENABLED,\\n market,\\n isLong\\n ));\\n }\\n\\n // @dev key for funding factor\\n // @param market the market to check\\n // @return key for funding factor\\n function fundingFactorKey(address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n FUNDING_FACTOR,\\n market\\n ));\\n }\\n\\n // @dev the key for funding exponent\\n // @param market the market for the pool\\n function fundingExponentFactorKey(address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n FUNDING_EXPONENT_FACTOR,\\n market\\n ));\\n }\\n\\n // @dev the key for saved funding factor\\n // @param market the market for the pool\\n function savedFundingFactorPerSecondKey(address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n SAVED_FUNDING_FACTOR_PER_SECOND,\\n market\\n ));\\n }\\n\\n // @dev the key for funding increase factor\\n // @param market the market for the pool\\n function fundingIncreaseFactorPerSecondKey(address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n FUNDING_INCREASE_FACTOR_PER_SECOND,\\n market\\n ));\\n }\\n\\n // @dev the key for funding decrease factor\\n // @param market the market for the pool\\n function fundingDecreaseFactorPerSecondKey(address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n FUNDING_DECREASE_FACTOR_PER_SECOND,\\n market\\n ));\\n }\\n\\n // @dev the key for min funding factor\\n // @param market the market for the pool\\n function minFundingFactorPerSecondKey(address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n MIN_FUNDING_FACTOR_PER_SECOND,\\n market\\n ));\\n }\\n\\n // @dev the key for max funding factor\\n // @param market the market for the pool\\n function maxFundingFactorPerSecondKey(address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n MAX_FUNDING_FACTOR_PER_SECOND,\\n market\\n ));\\n }\\n\\n // @dev the key for threshold for stable funding\\n // @param market the market for the pool\\n function thresholdForStableFundingKey(address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n THRESHOLD_FOR_STABLE_FUNDING,\\n market\\n ));\\n }\\n\\n // @dev the key for threshold for decreasing funding\\n // @param market the market for the pool\\n function thresholdForDecreaseFundingKey(address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n THRESHOLD_FOR_DECREASE_FUNDING,\\n market\\n ));\\n }\\n\\n // @dev key for funding fee amount per size\\n // @param market the market to check\\n // @param collateralToken the collateralToken to get the key for\\n // @param isLong whether to get the key for the long or short side\\n // @return key for funding fee amount per size\\n function fundingFeeAmountPerSizeKey(address market, address collateralToken, bool isLong) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n FUNDING_FEE_AMOUNT_PER_SIZE,\\n market,\\n collateralToken,\\n isLong\\n ));\\n }\\n\\n // @dev key for claimabel funding amount per size\\n // @param market the market to check\\n // @param collateralToken the collateralToken to get the key for\\n // @param isLong whether to get the key for the long or short side\\n // @return key for claimable funding amount per size\\n function claimableFundingAmountPerSizeKey(address market, address collateralToken, bool isLong) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CLAIMABLE_FUNDING_AMOUNT_PER_SIZE,\\n market,\\n collateralToken,\\n isLong\\n ));\\n }\\n\\n // @dev key for when funding was last updated\\n // @param market the market to check\\n // @return key for when funding was last updated\\n function fundingUpdatedAtKey(address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n FUNDING_UPDATED_AT,\\n market\\n ));\\n }\\n\\n // @dev key for claimable funding amount\\n // @param market the market to check\\n // @param token the token to check\\n // @return key for claimable funding amount\\n function claimableFundingAmountKey(address market, address token) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CLAIMABLE_FUNDING_AMOUNT,\\n market,\\n token\\n ));\\n }\\n\\n // @dev key for claimable funding amount by account\\n // @param market the market to check\\n // @param token the token to check\\n // @param account the account to check\\n // @return key for claimable funding amount\\n function claimableFundingAmountKey(address market, address token, address account) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CLAIMABLE_FUNDING_AMOUNT,\\n market,\\n token,\\n account\\n ));\\n }\\n\\n // @dev key for claimable collateral amount\\n // @param market the market to check\\n // @param token the token to check\\n // @param account the account to check\\n // @param timeKey the time key for the claimable amount\\n // @return key for claimable funding amount\\n function claimableCollateralAmountKey(address market, address token) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CLAIMABLE_COLLATERAL_AMOUNT,\\n market,\\n token\\n ));\\n }\\n\\n // @dev key for claimable collateral amount for a timeKey for an account\\n // @param market the market to check\\n // @param token the token to check\\n // @param account the account to check\\n // @param timeKey the time key for the claimable amount\\n // @return key for claimable funding amount\\n function claimableCollateralAmountKey(address market, address token, uint256 timeKey, address account) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CLAIMABLE_COLLATERAL_AMOUNT,\\n market,\\n token,\\n timeKey,\\n account\\n ));\\n }\\n\\n // @dev key for claimable collateral factor for a timeKey\\n // @param market the market to check\\n // @param token the token to check\\n // @param timeKey the time key for the claimable amount\\n // @return key for claimable funding amount\\n function claimableCollateralFactorKey(address market, address token, uint256 timeKey) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CLAIMABLE_COLLATERAL_FACTOR,\\n market,\\n token,\\n timeKey\\n ));\\n }\\n\\n // @dev key for claimable collateral factor for a timeKey for an account\\n // @param market the market to check\\n // @param token the token to check\\n // @param timeKey the time key for the claimable amount\\n // @param account the account to check\\n // @return key for claimable funding amount\\n function claimableCollateralFactorKey(address market, address token, uint256 timeKey, address account) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CLAIMABLE_COLLATERAL_FACTOR,\\n market,\\n token,\\n timeKey,\\n account\\n ));\\n }\\n\\n // @dev key for claimable collateral factor\\n // @param market the market to check\\n // @param token the token to check\\n // @param account the account to check\\n // @param timeKey the time key for the claimable amount\\n // @return key for claimable funding amount\\n function claimedCollateralAmountKey(address market, address token, uint256 timeKey, address account) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CLAIMED_COLLATERAL_AMOUNT,\\n market,\\n token,\\n timeKey,\\n account\\n ));\\n }\\n\\n // @dev key for optimal usage factor\\n // @param market the market to check\\n // @param isLong whether to get the key for the long or short side\\n // @return key for optimal usage factor\\n function optimalUsageFactorKey(address market, bool isLong) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n OPTIMAL_USAGE_FACTOR,\\n market,\\n isLong\\n ));\\n }\\n\\n // @dev key for base borrowing factor\\n // @param market the market to check\\n // @param isLong whether to get the key for the long or short side\\n // @return key for base borrowing factor\\n function baseBorrowingFactorKey(address market, bool isLong) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n BASE_BORROWING_FACTOR,\\n market,\\n isLong\\n ));\\n }\\n\\n // @dev key for above optimal usage borrowing factor\\n // @param market the market to check\\n // @param isLong whether to get the key for the long or short side\\n // @return key for above optimal usage borrowing factor\\n function aboveOptimalUsageBorrowingFactorKey(address market, bool isLong) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n ABOVE_OPTIMAL_USAGE_BORROWING_FACTOR,\\n market,\\n isLong\\n ));\\n }\\n\\n // @dev key for borrowing factor\\n // @param market the market to check\\n // @param isLong whether to get the key for the long or short side\\n // @return key for borrowing factor\\n function borrowingFactorKey(address market, bool isLong) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n BORROWING_FACTOR,\\n market,\\n isLong\\n ));\\n }\\n\\n // @dev the key for borrowing exponent\\n // @param market the market for the pool\\n // @param isLong whether to get the key for the long or short side\\n function borrowingExponentFactorKey(address market, bool isLong) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n BORROWING_EXPONENT_FACTOR,\\n market,\\n isLong\\n ));\\n }\\n\\n // @dev key for cumulative borrowing factor\\n // @param market the market to check\\n // @param isLong whether to get the key for the long or short side\\n // @return key for cumulative borrowing factor\\n function cumulativeBorrowingFactorKey(address market, bool isLong) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CUMULATIVE_BORROWING_FACTOR,\\n market,\\n isLong\\n ));\\n }\\n\\n // @dev key for cumulative borrowing factor updated at\\n // @param market the market to check\\n // @param isLong whether to get the key for the long or short side\\n // @return key for cumulative borrowing factor updated at\\n function cumulativeBorrowingFactorUpdatedAtKey(address market, bool isLong) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CUMULATIVE_BORROWING_FACTOR_UPDATED_AT,\\n market,\\n isLong\\n ));\\n }\\n\\n // @dev key for total borrowing amount\\n // @param market the market to check\\n // @param isLong whether to get the key for the long or short side\\n // @return key for total borrowing amount\\n function totalBorrowingKey(address market, bool isLong) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n TOTAL_BORROWING,\\n market,\\n isLong\\n ));\\n }\\n\\n // @dev key for affiliate reward amount\\n // @param market the market to check\\n // @param token the token to get the key for\\n // @param account the account to get the key for\\n // @return key for affiliate reward amount\\n function affiliateRewardKey(address market, address token) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n AFFILIATE_REWARD,\\n market,\\n token\\n ));\\n }\\n\\n function minAffiliateRewardFactorKey(uint256 referralTierLevel) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n MIN_AFFILIATE_REWARD_FACTOR,\\n referralTierLevel\\n ));\\n }\\n\\n function maxAllowedSubaccountActionCountKey(address account, address subaccount, bytes32 actionType) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n MAX_ALLOWED_SUBACCOUNT_ACTION_COUNT,\\n account,\\n subaccount,\\n actionType\\n ));\\n }\\n\\n function subaccountActionCountKey(address account, address subaccount, bytes32 actionType) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n SUBACCOUNT_ACTION_COUNT,\\n account,\\n subaccount,\\n actionType\\n ));\\n }\\n\\n function subaccountAutoTopUpAmountKey(address account, address subaccount) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n SUBACCOUNT_AUTO_TOP_UP_AMOUNT,\\n account,\\n subaccount\\n ));\\n }\\n\\n // @dev key for affiliate reward amount for an account\\n // @param market the market to check\\n // @param token the token to get the key for\\n // @param account the account to get the key for\\n // @return key for affiliate reward amount\\n function affiliateRewardKey(address market, address token, address account) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n AFFILIATE_REWARD,\\n market,\\n token,\\n account\\n ));\\n }\\n\\n // @dev key for is market disabled\\n // @param market the market to check\\n // @return key for is market disabled\\n function isMarketDisabledKey(address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n IS_MARKET_DISABLED,\\n market\\n ));\\n }\\n\\n // @dev key for min market tokens for first deposit\\n // @param market the market to check\\n // @return key for min market tokens for first deposit\\n function minMarketTokensForFirstDepositKey(address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n MIN_MARKET_TOKENS_FOR_FIRST_DEPOSIT,\\n market\\n ));\\n }\\n\\n // @dev key for price feed address\\n // @param token the token to get the key for\\n // @return key for price feed address\\n function priceFeedKey(address token) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n PRICE_FEED,\\n token\\n ));\\n }\\n\\n // @dev key for data stream feed ID\\n // @param token the token to get the key for\\n // @return key for data stream feed ID\\n function dataStreamIdKey(address token) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n DATA_STREAM_ID,\\n token\\n ));\\n }\\n\\n // @dev key for data stream feed multiplier\\n // @param token the token to get the key for\\n // @return key for data stream feed multiplier\\n function dataStreamMultiplierKey(address token) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n DATA_STREAM_MULTIPLIER,\\n token\\n ));\\n }\\n\\n // @dev key for price feed multiplier\\n // @param token the token to get the key for\\n // @return key for price feed multiplier\\n function priceFeedMultiplierKey(address token) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n PRICE_FEED_MULTIPLIER,\\n token\\n ));\\n }\\n\\n function priceFeedHeartbeatDurationKey(address token) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n PRICE_FEED_HEARTBEAT_DURATION,\\n token\\n ));\\n }\\n\\n // @dev key for stable price value\\n // @param token the token to get the key for\\n // @return key for stable price value\\n function stablePriceKey(address token) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n STABLE_PRICE,\\n token\\n ));\\n }\\n\\n // @dev key for fee distributor swap token index\\n // @param orderKey the swap order key\\n // @return key for fee distributor swap token index\\n function feeDistributorSwapTokenIndexKey(bytes32 orderKey) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n FEE_DISTRIBUTOR_SWAP_TOKEN_INDEX,\\n orderKey\\n ));\\n }\\n\\n // @dev key for fee distributor swap fee batch key\\n // @param orderKey the swap order key\\n // @return key for fee distributor swap fee batch key\\n function feeDistributorSwapFeeBatchKey(bytes32 orderKey) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n FEE_DISTRIBUTOR_SWAP_FEE_BATCH,\\n orderKey\\n ));\\n }\\n\\n // @dev key for max market token balance usd\\n // it is used to limit amount of funds deposited into each market\\n function glvMaxMarketTokenBalanceUsdKey(address glv, address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(GLV_MAX_MARKET_TOKEN_BALANCE_USD, glv, market));\\n }\\n\\n // @dev key for max market token balance amount\\n // it is used to limit amount of funds deposited into each market\\n function glvMaxMarketTokenBalanceAmountKey(address glv, address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(GLV_MAX_MARKET_TOKEN_BALANCE_AMOUNT, glv, market));\\n }\\n\\n // @dev key for is glv market disabled\\n function isGlvMarketDisabledKey(address glv, address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n IS_GLV_MARKET_DISABLED,\\n glv,\\n market\\n ));\\n }\\n\\n // @dev key for max allowed price impact for glv shifts\\n // if effective price impact exceeds max price impact then glv shift fails\\n function glvShiftMaxPriceImpactFactorKey(address glv) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n GLV_SHIFT_MAX_PRICE_IMPACT_FACTOR,\\n glv\\n ));\\n }\\n\\n // @dev key for time when glv shift was executed last\\n // used to validate glv shifts are not executed too frequently\\n function glvShiftLastExecutedAtKey(address glv) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n GLV_SHIFT_LAST_EXECUTED_AT,\\n glv\\n ));\\n }\\n\\n // @dev key for min time interval between glv shifts in seconds\\n function glvShiftMinIntervalKey(address glv) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n GLV_SHIFT_MIN_INTERVAL,\\n glv\\n ));\\n }\\n\\n function minGlvTokensForFirstGlvDepositKey(address glv) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n MIN_GLV_TOKENS_FOR_FIRST_DEPOSIT,\\n glv\\n ));\\n }\\n\\n // @dev key for whether the sync config feature is disabled\\n // @param module the sync config module\\n // @return key for sync config feature disabled\\n function syncConfigFeatureDisabledKey(address module) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n SYNC_CONFIG_FEATURE_DISABLED,\\n module\\n ));\\n }\\n\\n // @dev key for whether sync config updates are disabled for a market\\n // @param market the market to check\\n // @return key for sync config market disabled\\n function syncConfigMarketDisabledKey(address market) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n SYNC_CONFIG_MARKET_DISABLED,\\n market\\n ));\\n }\\n\\n // @dev key for whether sync config updates are disabled for a parameter\\n // @param parameter the parameter to check\\n // @return key for sync config parameter disabled\\n function syncConfigParameterDisabledKey(string memory parameter) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n SYNC_CONFIG_PARAMETER_DISABLED,\\n parameter\\n ));\\n }\\n\\n // @dev key for whether sync config updates are disabled for a market parameter\\n // @param market the market to check\\n // @param parameter the parameter to check\\n // @return key for sync config market parameter disabled\\n function syncConfigMarketParameterDisabledKey(address market, string memory parameter) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n SYNC_CONFIG_MARKET_PARAMETER_DISABLED,\\n market,\\n parameter\\n ));\\n }\\n\\n // @dev key for whether a sync config update is completed\\n // @param updateId the update id to check\\n // @return key for sync config market update completed\\n function syncConfigUpdateCompletedKey(uint256 updateId) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n SYNC_CONFIG_UPDATE_COMPLETED,\\n updateId\\n ));\\n }\\n\\n // @dev key for the latest sync config update that was completed\\n // @return key for sync config latest update id\\n function syncConfigLatestUpdateIdKey() internal pure returns (bytes32) {\\n return SYNC_CONFIG_LATEST_UPDATE_ID;\\n }\\n\\n // @dev key for the contributor token amount\\n // @param account the contributor account\\n // @param token the contributor token\\n // @return key for the contributor token amount\\n function contributorTokenAmountKey(address account, address token) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CONTRIBUTOR_TOKEN_AMOUNT,\\n account,\\n token\\n ));\\n }\\n\\n // @dev key for the max total contributor token amount\\n // @param token the contributor token\\n // @return key for the max contributor token amount\\n function maxTotalContributorTokenAmountKey(address token) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n MAX_TOTAL_CONTRIBUTOR_TOKEN_AMOUNT,\\n token\\n ));\\n }\\n\\n // @dev key for the contributor token vault\\n // @param token the contributor token\\n // @return key for the contributor token vault\\n function contributorTokenVaultKey(address token) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n CONTRIBUTOR_TOKEN_VAULT,\\n token\\n ));\\n }\\n\\n // @dev key for the buyback batch amount\\n // @param token the token for which to retrieve batch amount (GMX or WNT)\\n // @return key for buyback batch amount for a given token\\n function buybackBatchAmountKey(address token) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n BUYBACK_BATCH_AMOUNT,\\n token\\n ));\\n }\\n\\n // @dev key for the buyback available fee amount\\n // @param feeToken the token in which the fees are denominated\\n // @param swapToken the token for which fees are accumulated (GMX or WNT)\\n // @return key for buyback available fee amount for a given token and feeToken\\n function buybackAvailableFeeAmountKey(address feeToken, address swapToken) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n BUYBACK_AVAILABLE_FEE_AMOUNT,\\n feeToken,\\n swapToken\\n ));\\n }\\n\\n // @dev key for the buyback withdrawable fee amount\\n // @param buybackToken the token that was bought back\\n // @return key for the buyback withdrawable fee amount\\n function withdrawableBuybackTokenAmountKey(address buybackToken) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n WITHDRAWABLE_BUYBACK_TOKEN_AMOUNT,\\n buybackToken\\n ));\\n }\\n\\n // @dev key for the buyback gmx fee factor\\n // @param version the version for which to retrieve the fee numerator\\n // @return key for buyback gmx fee factor for a given version\\n function buybackGmxFactorKey(uint256 version) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n BUYBACK_GMX_FACTOR,\\n version\\n ));\\n }\\n\\n // @dev key for the buyback max price impact factor\\n // @param token the token for which to retrieve the max price impact factor key\\n // @return key for buyback max price impact factor for a given token\\n function buybackMaxPriceImpactFactorKey(address token) internal pure returns (bytes32) {\\n return keccak256(abi.encode(\\n BUYBACK_MAX_PRICE_IMPACT_FACTOR,\\n token\\n ));\\n }\\n}\\n\",\"keccak256\":\"0xa3ba9e7c1e2d29c6d56f110945819e4799ea1154fac273a6a1cb362893ea6182\",\"license\":\"BUSL-1.1\"},\"contracts/error/ErrorUtils.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity ^0.8.0;\\n\\nlibrary ErrorUtils {\\n // To get the revert reason, referenced from https://ethereum.stackexchange.com/a/83577\\n function getRevertMessage(bytes memory result) internal pure returns (string memory, bool) {\\n // If the result length is less than 68, then the transaction either panicked or failed silently\\n if (result.length < 68) {\\n return (\\\"\\\", false);\\n }\\n\\n bytes4 errorSelector = getErrorSelectorFromData(result);\\n\\n // 0x08c379a0 is the selector for Error(string)\\n // referenced from https://blog.soliditylang.org/2021/04/21/custom-errors/\\n if (errorSelector == bytes4(0x08c379a0)) {\\n assembly {\\n result := add(result, 0x04)\\n }\\n\\n return (abi.decode(result, (string)), true);\\n }\\n\\n // error may be a custom error, return an empty string for this case\\n return (\\\"\\\", false);\\n }\\n\\n function getErrorSelectorFromData(bytes memory data) internal pure returns (bytes4) {\\n bytes4 errorSelector;\\n\\n assembly {\\n errorSelector := mload(add(data, 0x20))\\n }\\n\\n return errorSelector;\\n }\\n\\n function revertWithParsedMessage(bytes memory result) internal pure {\\n (string memory revertMessage, bool hasRevertMessage) = getRevertMessage(result);\\n\\n if (hasRevertMessage) {\\n revert(revertMessage);\\n } else {\\n revertWithCustomError(result);\\n }\\n }\\n\\n function revertWithCustomError(bytes memory result) internal pure {\\n // referenced from https://ethereum.stackexchange.com/a/123588\\n uint256 length = result.length;\\n assembly {\\n revert(add(result, 0x20), length)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x8dad7020da39ccf5759e4d9cefeb8a943cab645ea96f3a27a4f6ce3168f3dcbc\",\"license\":\"BUSL-1.1\"},\"contracts/error/Errors.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity ^0.8.0;\\n\\nlibrary Errors {\\n // AdlHandler errors\\n error AdlNotRequired(int256 pnlToPoolFactor, uint256 maxPnlFactorForAdl);\\n error InvalidAdl(int256 nextPnlToPoolFactor, int256 pnlToPoolFactor);\\n error PnlOvercorrected(int256 nextPnlToPoolFactor, uint256 minPnlFactorForAdl);\\n\\n // AdlUtils errors\\n error InvalidSizeDeltaForAdl(uint256 sizeDeltaUsd, uint256 positionSizeInUsd);\\n error AdlNotEnabled();\\n\\n // AutoCancelUtils errors\\n error MaxAutoCancelOrdersExceeded(uint256 count, uint256 maxAutoCancelOrders);\\n\\n // Bank errors\\n error SelfTransferNotSupported(address receiver);\\n error InvalidNativeTokenSender(address msgSender);\\n\\n // BaseHandler errors\\n error RequestNotYetCancellable(uint256 requestAge, uint256 requestExpirationAge, string requestType);\\n\\n // CallbackUtils errors\\n error MaxCallbackGasLimitExceeded(uint256 callbackGasLimit, uint256 maxCallbackGasLimit);\\n error InsufficientGasLeftForCallback(uint256 gasToBeForwarded, uint256 callbackGasLimit);\\n\\n // Config errors\\n error InvalidBaseKey(bytes32 baseKey);\\n error ConfigValueExceedsAllowedRange(bytes32 baseKey, uint256 value);\\n error InvalidClaimableFactor(uint256 value);\\n error OracleProviderAlreadyExistsForToken(address token);\\n error PriceFeedAlreadyExistsForToken(address token);\\n error DataStreamIdAlreadyExistsForToken(address token);\\n error MaxFundingFactorPerSecondLimitExceeded(uint256 maxFundingFactorPerSecond, uint256 limit);\\n\\n // ContributorHandler errors\\n error InvalidSetContributorPaymentInput(uint256 tokensLength, uint256 amountsLength);\\n error InvalidContributorToken(address token);\\n error MaxTotalContributorTokenAmountExceeded(address token, uint256 totalAmount, uint256 maxTotalAmount);\\n error MinContributorPaymentIntervalNotYetPassed(uint256 minPaymentInterval);\\n error MinContributorPaymentIntervalBelowAllowedRange(uint256 interval);\\n error InvalidSetMaxTotalContributorTokenAmountInput(uint256 tokensLength, uint256 amountsLength);\\n\\n // Timelock errors\\n error ActionAlreadySignalled();\\n error ActionNotSignalled();\\n error SignalTimeNotYetPassed(uint256 signalTime);\\n error InvalidTimelockDelay(uint256 timelockDelay);\\n error MaxTimelockDelayExceeded(uint256 timelockDelay);\\n error InvalidFeeReceiver(address receiver);\\n error InvalidOracleSigner(address receiver);\\n\\n // GlvDepositStoreUtils errors\\n error GlvDepositNotFound(bytes32 key);\\n // GlvShiftStoreUtils errors\\n error GlvShiftNotFound(bytes32 key);\\n // GlvWithdrawalStoreUtils errors\\n error GlvWithdrawalNotFound(bytes32 key);\\n // GlvDepositUtils errors\\n error EmptyGlvDepositAmounts();\\n error EmptyGlvMarketAmount();\\n error EmptyGlvDeposit();\\n error InvalidMinGlvTokensForFirstGlvDeposit(uint256 minGlvTokens, uint256 expectedMinGlvTokens);\\n error InvalidReceiverForFirstGlvDeposit(address receiver, address expectedReceiver);\\n // GlvWithdrawalUtils errors\\n error EmptyGlvWithdrawal();\\n error EmptyGlvWithdrawalAmount();\\n // GlvUtils errors\\n error EmptyGlv(address glv);\\n error EmptyGlvTokenSupply();\\n error GlvNegativeMarketPoolValue(address glv, address market);\\n error GlvUnsupportedMarket(address glv, address market);\\n error GlvDisabledMarket(address glv, address market);\\n error GlvEnabledMarket(address glv, address market);\\n error GlvNonZeroMarketBalance(address glv, address market);\\n error GlvMaxMarketCountExceeded(address glv, uint256 glvMaxMarketCount);\\n error GlvMaxMarketTokenBalanceUsdExceeded(address glv, address market, uint256 maxMarketTokenBalanceUsd, uint256 marketTokenBalanceUsd);\\n error GlvMaxMarketTokenBalanceAmountExceeded(address glv, address market, uint256 maxMarketTokenBalanceAmount, uint256 marketTokenBalanceAmount);\\n error GlvInsufficientMarketTokenBalance(address glv, address market, uint256 marketTokenBalance, uint256 marketTokenAmount);\\n error GlvMarketAlreadyExists(address glv, address market);\\n error GlvInvalidLongToken(address glv, address provided, address expected);\\n error GlvInvalidShortToken(address glv, address provided, address expected);\\n // GlvShiftUtils\\n error GlvShiftMaxPriceImpactExceeded(uint256 effectivePriceImpactFactor, uint256 glvMaxShiftPriceImpactFactor);\\n error GlvShiftIntervalNotYetPassed(uint256 currentTimestamp, uint256 lastGlvShiftExecutedAt, uint256 glvShiftMinInterval);\\n // GlvFactory\\n error GlvAlreadyExists(bytes32 salt, address glv);\\n error GlvSymbolTooLong();\\n error GlvNameTooLong();\\n // GlvStoreUtils\\n error GlvNotFound(address key);\\n\\n // DepositStoreUtils errors\\n error DepositNotFound(bytes32 key);\\n\\n // DepositUtils errors\\n error EmptyDeposit();\\n error EmptyDepositAmounts();\\n\\n // ExecuteDepositUtils errors\\n error MinMarketTokens(uint256 received, uint256 expected);\\n error EmptyDepositAmountsAfterSwap();\\n error InvalidPoolValueForDeposit(int256 poolValue);\\n error InvalidSwapOutputToken(address outputToken, address expectedOutputToken);\\n error InvalidReceiverForFirstDeposit(address receiver, address expectedReceiver);\\n error InvalidMinMarketTokensForFirstDeposit(uint256 minMarketTokens, uint256 expectedMinMarketTokens);\\n\\n // ExternalHandler errors\\n error ExternalCallFailed(bytes data);\\n error InvalidExternalCallInput(uint256 targetsLength, uint256 dataListLength);\\n error InvalidExternalReceiversInput(uint256 refundTokensLength, uint256 refundReceiversLength);\\n error InvalidExternalCallTarget(address target);\\n\\n // FeeBatchStoreUtils errors\\n error FeeBatchNotFound(bytes32 key);\\n\\n // FeeDistributor errors\\n error InvalidFeeBatchTokenIndex(uint256 tokenIndex, uint256 feeBatchTokensLength);\\n error InvalidAmountInForFeeBatch(uint256 amountIn, uint256 remainingAmount);\\n error InvalidSwapPathForV1(address[] path, address bridgingToken);\\n\\n // GlpMigrator errors\\n error InvalidGlpAmount(uint256 totalGlpAmountToRedeem, uint256 totalGlpAmount);\\n error InvalidExecutionFeeForMigration(uint256 totalExecutionFee, uint256 msgValue);\\n\\n // GlvHandler errors\\n error InvalidGlvDepositInitialLongToken(address initialLongToken);\\n error InvalidGlvDepositInitialShortToken(address initialShortToken);\\n error InvalidGlvDepositSwapPath(uint256 longTokenSwapPathLength, uint256 shortTokenSwapPathLength);\\n error MinGlvTokens(uint256 received, uint256 expected);\\n\\n // OrderHandler errors\\n error OrderNotUpdatable(uint256 orderType);\\n error InvalidKeeperForFrozenOrder(address keeper);\\n\\n // FeatureUtils errors\\n error DisabledFeature(bytes32 key);\\n\\n // FeeHandler errors\\n error InvalidBuybackToken(address buybackToken);\\n error InvalidVersion(uint256 version);\\n error InsufficientBuybackOutputAmount(address feeToken, address buybackToken, uint256 outputAmount, uint256 minOutputAmount);\\n error BuybackAndFeeTokenAreEqual(address feeToken, address buybackToken);\\n error AvailableFeeAmountIsZero(address feeToken, address buybackToken, uint256 availableFeeAmount);\\n error MaxBuybackPriceAgeExceeded(uint256 priceTimestamp, uint256 buybackMaxPriceAge, uint256 currentTimestamp);\\n error EmptyClaimFeesMarket();\\n\\n // GasUtils errors\\n error InsufficientExecutionFee(uint256 minExecutionFee, uint256 executionFee);\\n error InsufficientWntAmountForExecutionFee(uint256 wntAmount, uint256 executionFee);\\n error InsufficientExecutionGasForErrorHandling(uint256 startingGas, uint256 minHandleErrorGas);\\n error InsufficientExecutionGas(uint256 startingGas, uint256 estimatedGasLimit, uint256 minAdditionalGasForExecution);\\n error InsufficientHandleExecutionErrorGas(uint256 gas, uint256 minHandleExecutionErrorGas);\\n error InsufficientGasForCancellation(uint256 gas, uint256 minHandleExecutionErrorGas);\\n\\n // MarketFactory errors\\n error MarketAlreadyExists(bytes32 salt, address existingMarketAddress);\\n\\n // MarketStoreUtils errors\\n error MarketNotFound(address key);\\n\\n // MarketUtils errors\\n error EmptyMarket();\\n error DisabledMarket(address market);\\n error MaxSwapPathLengthExceeded(uint256 swapPathLengh, uint256 maxSwapPathLength);\\n error InsufficientPoolAmount(uint256 poolAmount, uint256 amount);\\n error InsufficientReserve(uint256 reservedUsd, uint256 maxReservedUsd);\\n error InsufficientReserveForOpenInterest(uint256 reservedUsd, uint256 maxReservedUsd);\\n error UnableToGetOppositeToken(address inputToken, address market);\\n error UnexpectedTokenForVirtualInventory(address token, address market);\\n error EmptyMarketTokenSupply();\\n error InvalidSwapMarket(address market);\\n error UnableToGetCachedTokenPrice(address token, address market);\\n error CollateralAlreadyClaimed(uint256 adjustedClaimableAmount, uint256 claimedAmount);\\n error OpenInterestCannotBeUpdatedForSwapOnlyMarket(address market);\\n error MaxOpenInterestExceeded(uint256 openInterest, uint256 maxOpenInterest);\\n error MaxPoolAmountExceeded(uint256 poolAmount, uint256 maxPoolAmount);\\n error MaxPoolUsdForDepositExceeded(uint256 poolUsd, uint256 maxPoolUsdForDeposit);\\n error UnexpectedBorrowingFactor(uint256 positionBorrowingFactor, uint256 cumulativeBorrowingFactor);\\n error UnableToGetBorrowingFactorEmptyPoolUsd();\\n error UnableToGetFundingFactorEmptyOpenInterest();\\n error InvalidPositionMarket(address market);\\n error InvalidCollateralTokenForMarket(address market, address token);\\n error PnlFactorExceededForLongs(int256 pnlToPoolFactor, uint256 maxPnlFactor);\\n error PnlFactorExceededForShorts(int256 pnlToPoolFactor, uint256 maxPnlFactor);\\n error InvalidUiFeeFactor(uint256 uiFeeFactor, uint256 maxUiFeeFactor);\\n error EmptyAddressInMarketTokenBalanceValidation(address market, address token);\\n error InvalidMarketTokenBalance(address market, address token, uint256 balance, uint256 expectedMinBalance);\\n error InvalidMarketTokenBalanceForCollateralAmount(address market, address token, uint256 balance, uint256 collateralAmount);\\n error InvalidMarketTokenBalanceForClaimableFunding(address market, address token, uint256 balance, uint256 claimableFundingFeeAmount);\\n error UnexpectedPoolValue(int256 poolValue);\\n\\n // Oracle errors\\n error SequencerDown();\\n error SequencerGraceDurationNotYetPassed(uint256 timeSinceUp, uint256 sequencerGraceDuration);\\n error EmptyValidatedPrices();\\n error InvalidOracleProvider(address provider);\\n error InvalidOracleProviderForToken(address provider, address expectedProvider);\\n error GmEmptySigner(uint256 signerIndex);\\n error InvalidOracleSetPricesProvidersParam(uint256 tokensLength, uint256 providersLength);\\n error InvalidOracleSetPricesDataParam(uint256 tokensLength, uint256 dataLength);\\n error GmInvalidBlockNumber(uint256 minOracleBlockNumber, uint256 currentBlockNumber);\\n error GmInvalidMinMaxBlockNumber(uint256 minOracleBlockNumber, uint256 maxOracleBlockNumber);\\n error EmptyDataStreamFeedId(address token);\\n error InvalidDataStreamFeedId(address token, bytes32 feedId, bytes32 expectedFeedId);\\n error InvalidDataStreamBidAsk(address token, int192 bid, int192 ask);\\n error InvalidDataStreamPrices(address token, int192 bid, int192 ask);\\n error MaxPriceAgeExceeded(uint256 oracleTimestamp, uint256 currentTimestamp);\\n error MaxOracleTimestampRangeExceeded(uint256 range, uint256 maxRange);\\n error GmMinOracleSigners(uint256 oracleSigners, uint256 minOracleSigners);\\n error GmMaxOracleSigners(uint256 oracleSigners, uint256 maxOracleSigners);\\n error BlockNumbersNotSorted(uint256 minOracleBlockNumber, uint256 prevMinOracleBlockNumber);\\n error GmMinPricesNotSorted(address token, uint256 price, uint256 prevPrice);\\n error GmMaxPricesNotSorted(address token, uint256 price, uint256 prevPrice);\\n error EmptyChainlinkPriceFeedMultiplier(address token);\\n error EmptyDataStreamMultiplier(address token);\\n error InvalidFeedPrice(address token, int256 price);\\n error ChainlinkPriceFeedNotUpdated(address token, uint256 timestamp, uint256 heartbeatDuration);\\n error GmMaxSignerIndex(uint256 signerIndex, uint256 maxSignerIndex);\\n error InvalidGmOraclePrice(address token);\\n error InvalidGmSignerMinMaxPrice(uint256 minPrice, uint256 maxPrice);\\n error InvalidGmMedianMinMaxPrice(uint256 minPrice, uint256 maxPrice);\\n error NonEmptyTokensWithPrices(uint256 tokensWithPricesLength);\\n error InvalidMinMaxForPrice(address token, uint256 min, uint256 max);\\n error EmptyChainlinkPriceFeed(address token);\\n error PriceAlreadySet(address token, uint256 minPrice, uint256 maxPrice);\\n error MaxRefPriceDeviationExceeded(\\n address token,\\n uint256 price,\\n uint256 refPrice,\\n uint256 maxRefPriceDeviationFactor\\n );\\n error InvalidBlockRangeSet(uint256 largestMinBlockNumber, uint256 smallestMaxBlockNumber);\\n error EmptyChainlinkPaymentToken();\\n error NonAtomicOracleProvider(address provider);\\n\\n // OracleModule errors\\n error InvalidPrimaryPricesForSimulation(uint256 primaryTokensLength, uint256 primaryPricesLength);\\n error EndOfOracleSimulation();\\n\\n // OracleUtils errors\\n error InvalidGmSignature(address recoveredSigner, address expectedSigner);\\n\\n error EmptyPrimaryPrice(address token);\\n\\n error OracleTimestampsAreSmallerThanRequired(uint256 minOracleTimestamp, uint256 expectedTimestamp);\\n error OracleTimestampsAreLargerThanRequestExpirationTime(uint256 maxOracleTimestamp, uint256 requestTimestamp, uint256 requestExpirationTime);\\n\\n // BaseOrderUtils errors\\n error EmptyOrder();\\n error UnsupportedOrderType(uint256 orderType);\\n error InvalidOrderPrices(\\n uint256 primaryPriceMin,\\n uint256 primaryPriceMax,\\n uint256 triggerPrice,\\n uint256 orderType\\n );\\n error EmptySizeDeltaInTokens();\\n error PriceImpactLargerThanOrderSize(int256 priceImpactUsd, uint256 sizeDeltaUsd);\\n error NegativeExecutionPrice(int256 executionPrice, uint256 price, uint256 positionSizeInUsd, int256 priceImpactUsd, uint256 sizeDeltaUsd);\\n error OrderNotFulfillableAtAcceptablePrice(uint256 price, uint256 acceptablePrice);\\n error OrderValidFromTimeNotReached(uint256 validFromTime, uint256 currentTimestamp);\\n\\n // IncreaseOrderUtils errors\\n error UnexpectedPositionState();\\n\\n // OrderUtils errors\\n error OrderTypeCannotBeCreated(uint256 orderType);\\n error OrderAlreadyFrozen();\\n error MaxTotalCallbackGasLimitForAutoCancelOrdersExceeded(uint256 totalCallbackGasLimit, uint256 maxTotalCallbackGasLimit);\\n error InvalidReceiver(address receiver);\\n error UnexpectedValidFromTime(uint256 orderType);\\n\\n // OrderStoreUtils errors\\n error OrderNotFound(bytes32 key);\\n\\n // SwapOrderUtils errors\\n error UnexpectedMarket();\\n\\n // DecreasePositionCollateralUtils errors\\n error InsufficientFundsToPayForCosts(uint256 remainingCostUsd, string step);\\n error InvalidOutputToken(address tokenOut, address expectedTokenOut);\\n\\n // DecreasePositionUtils errors\\n error InvalidDecreaseOrderSize(uint256 sizeDeltaUsd, uint256 positionSizeInUsd);\\n error UnableToWithdrawCollateral(int256 estimatedRemainingCollateralUsd);\\n error InvalidDecreasePositionSwapType(uint256 decreasePositionSwapType);\\n error PositionShouldNotBeLiquidated(\\n string reason,\\n int256 remainingCollateralUsd,\\n int256 minCollateralUsd,\\n int256 minCollateralUsdForLeverage\\n );\\n\\n // IncreasePositionUtils errors\\n error InsufficientCollateralAmount(uint256 collateralAmount, int256 collateralDeltaAmount);\\n error InsufficientCollateralUsd(int256 remainingCollateralUsd);\\n\\n // PositionStoreUtils errors\\n error PositionNotFound(bytes32 key);\\n\\n // PositionUtils errors\\n error LiquidatablePosition(\\n string reason,\\n int256 remainingCollateralUsd,\\n int256 minCollateralUsd,\\n int256 minCollateralUsdForLeverage\\n );\\n\\n error EmptyPosition();\\n error InvalidPositionSizeValues(uint256 sizeInUsd, uint256 sizeInTokens);\\n error MinPositionSize(uint256 positionSizeInUsd, uint256 minPositionSizeUsd);\\n\\n // PositionPricingUtils errors\\n error UsdDeltaExceedsLongOpenInterest(int256 usdDelta, uint256 longOpenInterest);\\n error UsdDeltaExceedsShortOpenInterest(int256 usdDelta, uint256 shortOpenInterest);\\n\\n // ShiftStoreUtils errors\\n error ShiftNotFound(bytes32 key);\\n\\n // ShiftUtils errors\\n error EmptyShift();\\n error EmptyShiftAmount();\\n error ShiftFromAndToMarketAreEqual(address market);\\n error LongTokensAreNotEqual(address fromMarketLongToken, address toMarketLongToken);\\n error ShortTokensAreNotEqual(address fromMarketLongToken, address toMarketLongToken);\\n\\n // SwapPricingUtils errors\\n error UsdDeltaExceedsPoolValue(int256 usdDelta, uint256 poolUsd);\\n\\n // RoleModule errors\\n error Unauthorized(address msgSender, string role);\\n\\n // RoleStore errors\\n error ThereMustBeAtLeastOneRoleAdmin();\\n error ThereMustBeAtLeastOneTimelockMultiSig();\\n\\n // ExchangeRouter errors\\n error InvalidClaimFundingFeesInput(uint256 marketsLength, uint256 tokensLength);\\n error InvalidClaimCollateralInput(uint256 marketsLength, uint256 tokensLength, uint256 timeKeysLength);\\n error InvalidClaimAffiliateRewardsInput(uint256 marketsLength, uint256 tokensLength);\\n error InvalidClaimUiFeesInput(uint256 marketsLength, uint256 tokensLength);\\n\\n // SwapUtils errors\\n error InvalidTokenIn(address tokenIn, address market);\\n error InsufficientOutputAmount(uint256 outputAmount, uint256 minOutputAmount);\\n error InsufficientSwapOutputAmount(uint256 outputAmount, uint256 minOutputAmount);\\n error DuplicatedMarketInSwapPath(address market);\\n error SwapPriceImpactExceedsAmountIn(uint256 amountAfterFees, int256 negativeImpactAmount);\\n\\n // SubaccountRouter errors\\n error InvalidReceiverForSubaccountOrder(address receiver, address expectedReceiver);\\n\\n // SubaccountUtils errors\\n error SubaccountNotAuthorized(address account, address subaccount);\\n error MaxSubaccountActionCountExceeded(address account, address subaccount, uint256 count, uint256 maxCount);\\n\\n // TokenUtils errors\\n error TokenTransferError(address token, address receiver, uint256 amount);\\n error EmptyHoldingAddress();\\n // Note that Transfer is misspelled as Tranfer in the EmptyTokenTranferGasLimit error\\n // some contracts with this error cannot be re-deployed so it has been left as is\\n error EmptyTokenTranferGasLimit(address token);\\n\\n // AccountUtils errors\\n error EmptyAccount();\\n error EmptyReceiver();\\n\\n // Array errors\\n error CompactedArrayOutOfBounds(\\n uint256[] compactedValues,\\n uint256 index,\\n uint256 slotIndex,\\n string label\\n );\\n\\n error ArrayOutOfBoundsUint256(\\n uint256[] values,\\n uint256 index,\\n string label\\n );\\n\\n error ArrayOutOfBoundsBytes(\\n bytes[] values,\\n uint256 index,\\n string label\\n );\\n\\n // WithdrawalHandler errors\\n error SwapsNotAllowedForAtomicWithdrawal(uint256 longTokenSwapPathLength, uint256 shortTokenSwapPathLength);\\n\\n // WithdrawalStoreUtils errors\\n error WithdrawalNotFound(bytes32 key);\\n\\n // WithdrawalUtils errors\\n error EmptyWithdrawal();\\n error EmptyWithdrawalAmount();\\n error MinLongTokens(uint256 received, uint256 expected);\\n error MinShortTokens(uint256 received, uint256 expected);\\n error InsufficientMarketTokens(uint256 balance, uint256 expected);\\n error InsufficientWntAmount(uint256 wntAmount, uint256 executionFee);\\n error InvalidPoolValueForWithdrawal(int256 poolValue);\\n\\n // Uint256Mask errors\\n error MaskIndexOutOfBounds(uint256 index, string label);\\n error DuplicatedIndex(uint256 index, string label);\\n\\n // Cast errors\\n error Uint256AsBytesLengthExceeds32Bytes(uint256 length);\\n\\n // ConfigSyncer errors\\n error SyncConfigInvalidInputLengths(uint256 marketsLength, uint256 parametersLength);\\n error SyncConfigUpdatesDisabledForMarket(address market);\\n error SyncConfigUpdatesDisabledForParameter(string parameter);\\n error SyncConfigUpdatesDisabledForMarketParameter(address market, string parameter);\\n error SyncConfigInvalidMarketFromData(address market, address marketFromData);\\n\\n // Reader errors\\n error EmptyMarketPrice(address market);\\n}\\n\",\"keccak256\":\"0xf51e8d4125d8067361486d61ba8f856fab711f93174d9ea3ed9f9154a28447c7\",\"license\":\"BUSL-1.1\"},\"contracts/event/EventEmitter.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../role/RoleModule.sol\\\";\\nimport \\\"./EventUtils.sol\\\";\\n\\n// @title EventEmitter\\n// @dev Contract to emit events\\n// This allows main events to be emitted from a single contract\\n// Logic contracts can be updated while re-using the same eventEmitter contract\\n// Peripheral services like monitoring or analytics would be able to continue\\n// to work without an update and without segregating historical data\\ncontract EventEmitter is RoleModule {\\n event EventLog(\\n address msgSender,\\n string eventName,\\n string indexed eventNameHash,\\n EventUtils.EventLogData eventData\\n );\\n\\n event EventLog1(\\n address msgSender,\\n string eventName,\\n string indexed eventNameHash,\\n bytes32 indexed topic1,\\n EventUtils.EventLogData eventData\\n );\\n\\n event EventLog2(\\n address msgSender,\\n string eventName,\\n string indexed eventNameHash,\\n bytes32 indexed topic1,\\n bytes32 indexed topic2,\\n EventUtils.EventLogData eventData\\n );\\n\\n constructor(RoleStore _roleStore) RoleModule(_roleStore) {}\\n\\n // @dev emit a general event log\\n // @param eventName the name of the event\\n // @param eventData the event data\\n function emitEventLog(\\n string memory eventName,\\n EventUtils.EventLogData memory eventData\\n ) external onlyController {\\n emit EventLog(\\n msg.sender,\\n eventName,\\n eventName,\\n eventData\\n );\\n }\\n\\n // @dev emit a general event log\\n // @param eventName the name of the event\\n // @param topic1 topic1 for indexing\\n // @param eventData the event data\\n function emitEventLog1(\\n string memory eventName,\\n bytes32 topic1,\\n EventUtils.EventLogData memory eventData\\n ) external onlyController {\\n emit EventLog1(\\n msg.sender,\\n eventName,\\n eventName,\\n topic1,\\n eventData\\n );\\n }\\n\\n // @dev emit a general event log\\n // @param eventName the name of the event\\n // @param topic1 topic1 for indexing\\n // @param topic2 topic2 for indexing\\n // @param eventData the event data\\n function emitEventLog2(\\n string memory eventName,\\n bytes32 topic1,\\n bytes32 topic2,\\n EventUtils.EventLogData memory eventData\\n ) external onlyController {\\n emit EventLog2(\\n msg.sender,\\n eventName,\\n eventName,\\n topic1,\\n topic2,\\n eventData\\n );\\n }\\n // @dev event log for general use\\n // @param topic1 event topic 1\\n // @param data additional data\\n function emitDataLog1(bytes32 topic1, bytes memory data) external onlyController {\\n uint256 len = data.length;\\n assembly {\\n log1(add(data, 32), len, topic1)\\n }\\n }\\n\\n // @dev event log for general use\\n // @param topic1 event topic 1\\n // @param topic2 event topic 2\\n // @param data additional data\\n function emitDataLog2(bytes32 topic1, bytes32 topic2, bytes memory data) external onlyController {\\n uint256 len = data.length;\\n assembly {\\n log2(add(data, 32), len, topic1, topic2)\\n }\\n }\\n\\n // @dev event log for general use\\n // @param topic1 event topic 1\\n // @param topic2 event topic 2\\n // @param topic3 event topic 3\\n // @param data additional data\\n function emitDataLog3(bytes32 topic1, bytes32 topic2, bytes32 topic3, bytes memory data) external onlyController {\\n uint256 len = data.length;\\n assembly {\\n log3(add(data, 32), len, topic1, topic2, topic3)\\n }\\n }\\n\\n // @dev event log for general use\\n // @param topic1 event topic 1\\n // @param topic2 event topic 2\\n // @param topic3 event topic 3\\n // @param topic4 event topic 4\\n // @param data additional data\\n function emitDataLog4(bytes32 topic1, bytes32 topic2, bytes32 topic3, bytes32 topic4, bytes memory data) external onlyController {\\n uint256 len = data.length;\\n assembly {\\n log4(add(data, 32), len, topic1, topic2, topic3, topic4)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x160c1835150b3cc703cfc9ffdb74138b3c4939a0f6988171113e37cbf1f0f90e\",\"license\":\"BUSL-1.1\"},\"contracts/event/EventUtils.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity ^0.8.0;\\n\\nlibrary EventUtils {\\n struct EmitPositionDecreaseParams {\\n bytes32 key;\\n address account;\\n address market;\\n address collateralToken;\\n bool isLong;\\n }\\n\\n struct EventLogData {\\n AddressItems addressItems;\\n UintItems uintItems;\\n IntItems intItems;\\n BoolItems boolItems;\\n Bytes32Items bytes32Items;\\n BytesItems bytesItems;\\n StringItems stringItems;\\n }\\n\\n struct AddressItems {\\n AddressKeyValue[] items;\\n AddressArrayKeyValue[] arrayItems;\\n }\\n\\n struct UintItems {\\n UintKeyValue[] items;\\n UintArrayKeyValue[] arrayItems;\\n }\\n\\n struct IntItems {\\n IntKeyValue[] items;\\n IntArrayKeyValue[] arrayItems;\\n }\\n\\n struct BoolItems {\\n BoolKeyValue[] items;\\n BoolArrayKeyValue[] arrayItems;\\n }\\n\\n struct Bytes32Items {\\n Bytes32KeyValue[] items;\\n Bytes32ArrayKeyValue[] arrayItems;\\n }\\n\\n struct BytesItems {\\n BytesKeyValue[] items;\\n BytesArrayKeyValue[] arrayItems;\\n }\\n\\n struct StringItems {\\n StringKeyValue[] items;\\n StringArrayKeyValue[] arrayItems;\\n }\\n\\n struct AddressKeyValue {\\n string key;\\n address value;\\n }\\n\\n struct AddressArrayKeyValue {\\n string key;\\n address[] value;\\n }\\n\\n struct UintKeyValue {\\n string key;\\n uint256 value;\\n }\\n\\n struct UintArrayKeyValue {\\n string key;\\n uint256[] value;\\n }\\n\\n struct IntKeyValue {\\n string key;\\n int256 value;\\n }\\n\\n struct IntArrayKeyValue {\\n string key;\\n int256[] value;\\n }\\n\\n struct BoolKeyValue {\\n string key;\\n bool value;\\n }\\n\\n struct BoolArrayKeyValue {\\n string key;\\n bool[] value;\\n }\\n\\n struct Bytes32KeyValue {\\n string key;\\n bytes32 value;\\n }\\n\\n struct Bytes32ArrayKeyValue {\\n string key;\\n bytes32[] value;\\n }\\n\\n struct BytesKeyValue {\\n string key;\\n bytes value;\\n }\\n\\n struct BytesArrayKeyValue {\\n string key;\\n bytes[] value;\\n }\\n\\n struct StringKeyValue {\\n string key;\\n string value;\\n }\\n\\n struct StringArrayKeyValue {\\n string key;\\n string[] value;\\n }\\n\\n function initItems(AddressItems memory items, uint256 size) internal pure {\\n items.items = new EventUtils.AddressKeyValue[](size);\\n }\\n\\n function initArrayItems(AddressItems memory items, uint256 size) internal pure {\\n items.arrayItems = new EventUtils.AddressArrayKeyValue[](size);\\n }\\n\\n function setItem(AddressItems memory items, uint256 index, string memory key, address value) internal pure {\\n items.items[index].key = key;\\n items.items[index].value = value;\\n }\\n\\n function setItem(AddressItems memory items, uint256 index, string memory key, address[] memory value) internal pure {\\n items.arrayItems[index].key = key;\\n items.arrayItems[index].value = value;\\n }\\n\\n function initItems(UintItems memory items, uint256 size) internal pure {\\n items.items = new EventUtils.UintKeyValue[](size);\\n }\\n\\n function initArrayItems(UintItems memory items, uint256 size) internal pure {\\n items.arrayItems = new EventUtils.UintArrayKeyValue[](size);\\n }\\n\\n function setItem(UintItems memory items, uint256 index, string memory key, uint256 value) internal pure {\\n items.items[index].key = key;\\n items.items[index].value = value;\\n }\\n\\n function setItem(UintItems memory items, uint256 index, string memory key, uint256[] memory value) internal pure {\\n items.arrayItems[index].key = key;\\n items.arrayItems[index].value = value;\\n }\\n\\n function initItems(IntItems memory items, uint256 size) internal pure {\\n items.items = new EventUtils.IntKeyValue[](size);\\n }\\n\\n function initArrayItems(IntItems memory items, uint256 size) internal pure {\\n items.arrayItems = new EventUtils.IntArrayKeyValue[](size);\\n }\\n\\n function setItem(IntItems memory items, uint256 index, string memory key, int256 value) internal pure {\\n items.items[index].key = key;\\n items.items[index].value = value;\\n }\\n\\n function setItem(IntItems memory items, uint256 index, string memory key, int256[] memory value) internal pure {\\n items.arrayItems[index].key = key;\\n items.arrayItems[index].value = value;\\n }\\n\\n function initItems(BoolItems memory items, uint256 size) internal pure {\\n items.items = new EventUtils.BoolKeyValue[](size);\\n }\\n\\n function initArrayItems(BoolItems memory items, uint256 size) internal pure {\\n items.arrayItems = new EventUtils.BoolArrayKeyValue[](size);\\n }\\n\\n function setItem(BoolItems memory items, uint256 index, string memory key, bool value) internal pure {\\n items.items[index].key = key;\\n items.items[index].value = value;\\n }\\n\\n function setItem(BoolItems memory items, uint256 index, string memory key, bool[] memory value) internal pure {\\n items.arrayItems[index].key = key;\\n items.arrayItems[index].value = value;\\n }\\n\\n function initItems(Bytes32Items memory items, uint256 size) internal pure {\\n items.items = new EventUtils.Bytes32KeyValue[](size);\\n }\\n\\n function initArrayItems(Bytes32Items memory items, uint256 size) internal pure {\\n items.arrayItems = new EventUtils.Bytes32ArrayKeyValue[](size);\\n }\\n\\n function setItem(Bytes32Items memory items, uint256 index, string memory key, bytes32 value) internal pure {\\n items.items[index].key = key;\\n items.items[index].value = value;\\n }\\n\\n function setItem(Bytes32Items memory items, uint256 index, string memory key, bytes32[] memory value) internal pure {\\n items.arrayItems[index].key = key;\\n items.arrayItems[index].value = value;\\n }\\n\\n function initItems(BytesItems memory items, uint256 size) internal pure {\\n items.items = new EventUtils.BytesKeyValue[](size);\\n }\\n\\n function initArrayItems(BytesItems memory items, uint256 size) internal pure {\\n items.arrayItems = new EventUtils.BytesArrayKeyValue[](size);\\n }\\n\\n function setItem(BytesItems memory items, uint256 index, string memory key, bytes memory value) internal pure {\\n items.items[index].key = key;\\n items.items[index].value = value;\\n }\\n\\n function setItem(BytesItems memory items, uint256 index, string memory key, bytes[] memory value) internal pure {\\n items.arrayItems[index].key = key;\\n items.arrayItems[index].value = value;\\n }\\n\\n function initItems(StringItems memory items, uint256 size) internal pure {\\n items.items = new EventUtils.StringKeyValue[](size);\\n }\\n\\n function initArrayItems(StringItems memory items, uint256 size) internal pure {\\n items.arrayItems = new EventUtils.StringArrayKeyValue[](size);\\n }\\n\\n function setItem(StringItems memory items, uint256 index, string memory key, string memory value) internal pure {\\n items.items[index].key = key;\\n items.items[index].value = value;\\n }\\n\\n function setItem(StringItems memory items, uint256 index, string memory key, string[] memory value) internal pure {\\n items.arrayItems[index].key = key;\\n items.arrayItems[index].value = value;\\n }\\n}\\n\",\"keccak256\":\"0x42c23cd06e17a2eb9c6d86015316f42acef002eaab1010aad9df98450523bad9\",\"license\":\"BUSL-1.1\"},\"contracts/oracle/OracleStore.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../role/RoleModule.sol\\\";\\nimport \\\"../event/EventEmitter.sol\\\";\\nimport \\\"../event/EventUtils.sol\\\";\\nimport \\\"../utils/Cast.sol\\\";\\n\\n// @title OracleStore\\n// @dev Stores the list of oracle signers\\ncontract OracleStore is RoleModule {\\n using EnumerableSet for EnumerableSet.AddressSet;\\n using EnumerableValues for EnumerableSet.AddressSet;\\n\\n using EventUtils for EventUtils.AddressItems;\\n using EventUtils for EventUtils.UintItems;\\n using EventUtils for EventUtils.IntItems;\\n using EventUtils for EventUtils.BoolItems;\\n using EventUtils for EventUtils.Bytes32Items;\\n using EventUtils for EventUtils.BytesItems;\\n using EventUtils for EventUtils.StringItems;\\n\\n EventEmitter public immutable eventEmitter;\\n\\n EnumerableSet.AddressSet internal signers;\\n\\n constructor(RoleStore _roleStore, EventEmitter _eventEmitter) RoleModule(_roleStore) {\\n eventEmitter = _eventEmitter;\\n }\\n\\n // @dev adds a signer\\n // @param account address of the signer to add\\n function addSigner(address account) external onlyController {\\n signers.add(account);\\n\\n EventUtils.EventLogData memory eventData;\\n eventData.addressItems.initItems(1);\\n eventData.addressItems.setItem(0, \\\"account\\\", account);\\n\\n eventEmitter.emitEventLog1(\\n \\\"SignerAdded\\\",\\n Cast.toBytes32(account),\\n eventData\\n );\\n }\\n\\n // @dev removes a signer\\n // @param account address of the signer to remove\\n function removeSigner(address account) external onlyController {\\n signers.remove(account);\\n\\n EventUtils.EventLogData memory eventData;\\n eventData.addressItems.initItems(1);\\n eventData.addressItems.setItem(0, \\\"account\\\", account);\\n\\n eventEmitter.emitEventLog1(\\n \\\"SignerRemoved\\\",\\n Cast.toBytes32(account),\\n eventData\\n );\\n }\\n\\n // @dev get the total number of signers\\n // @return the total number of signers\\n function getSignerCount() external view returns (uint256) {\\n return signers.length();\\n }\\n\\n // @dev get the signer at the specified index\\n // @param index the index of the signer to get\\n // @return the signer at the specified index\\n function getSigner(uint256 index) external view returns (address) {\\n return signers.at(index);\\n }\\n\\n // @dev get the signers for the specified indexes\\n // @param start the start index, the value for this index will be included\\n // @param end the end index, the value for this index will not be included\\n // @return the signers for the specified indexes\\n function getSigners(uint256 start, uint256 end) external view returns (address[] memory) {\\n return signers.valuesAt(start, end);\\n }\\n}\\n\",\"keccak256\":\"0x5b9c2917e29aa696a8385f9f8b6a0cd0f1ef9a0b08d8096a2f19367e89cc09e7\",\"license\":\"BUSL-1.1\"},\"contracts/role/Role.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title Role\\n * @dev Library for role keys\\n */\\nlibrary Role {\\n /**\\n * @dev The ROLE_ADMIN role.\\n * Hash: 0x56908b85b56869d7c69cd020749874f238259af9646ca930287866cdd660b7d9\\n */\\n bytes32 public constant ROLE_ADMIN = keccak256(abi.encode(\\\"ROLE_ADMIN\\\"));\\n\\n /**\\n * @dev The TIMELOCK_ADMIN role.\\n * Hash: 0xf49b0c86b385620e25b0985905d1a112a5f1bc1d51a7a292a8cdf112b3a7c47c\\n */\\n bytes32 public constant TIMELOCK_ADMIN = keccak256(abi.encode(\\\"TIMELOCK_ADMIN\\\"));\\n\\n /**\\n * @dev The TIMELOCK_MULTISIG role.\\n * Hash: 0xe068a8d811c3c8290a8be34607cfa3184b26ffb8dea4dde7a451adfba9fa173a\\n */\\n bytes32 public constant TIMELOCK_MULTISIG = keccak256(abi.encode(\\\"TIMELOCK_MULTISIG\\\"));\\n\\n /**\\n * @dev The CONFIG_KEEPER role.\\n * Hash: 0x901fb3de937a1dcb6ecaf26886fda47a088e74f36232a0673eade97079dc225b\\n */\\n bytes32 public constant CONFIG_KEEPER = keccak256(abi.encode(\\\"CONFIG_KEEPER\\\"));\\n\\n /**\\n * @dev The LIMITED_CONFIG_KEEPER role.\\n * Hash: 0xb49beded4d572a2d32002662fc5c735817329f4337b3a488aab0b5e835c01ba7\\n */\\n bytes32 public constant LIMITED_CONFIG_KEEPER = keccak256(abi.encode(\\\"LIMITED_CONFIG_KEEPER\\\"));\\n\\n /**\\n * @dev The CONTROLLER role.\\n * Hash: 0x97adf037b2472f4a6a9825eff7d2dd45e37f2dc308df2a260d6a72af4189a65b\\n */\\n bytes32 public constant CONTROLLER = keccak256(abi.encode(\\\"CONTROLLER\\\"));\\n\\n /**\\n * @dev The GOV_TOKEN_CONTROLLER role.\\n * Hash: 0x16a157db08319d4eaf6b157a71f5d2e18c6500cab8a25bee0b4f9c753cb13690\\n */\\n bytes32 public constant GOV_TOKEN_CONTROLLER = keccak256(abi.encode(\\\"GOV_TOKEN_CONTROLLER\\\"));\\n\\n /**\\n * @dev The ROUTER_PLUGIN role.\\n * Hash: 0xc82e6cc76072f8edb32d42796e58e13ab6e145524eb6b36c073be82f20d410f3\\n */\\n bytes32 public constant ROUTER_PLUGIN = keccak256(abi.encode(\\\"ROUTER_PLUGIN\\\"));\\n\\n /**\\n * @dev The MARKET_KEEPER role.\\n * Hash: 0xd66692c70b60cf1337e643d6a6473f6865d8c03f3c26b460df3d19b504fb46ae\\n */\\n bytes32 public constant MARKET_KEEPER = keccak256(abi.encode(\\\"MARKET_KEEPER\\\"));\\n\\n /**\\n * @dev The FEE_KEEPER role.\\n * Hash: 0xe0ff4cc0c6ecffab6db3f63ea62dd53f8091919ac57669f1bb3d9828278081d8\\n */\\n bytes32 public constant FEE_KEEPER = keccak256(abi.encode(\\\"FEE_KEEPER\\\"));\\n\\n /**\\n * @dev The FEE_DISTRIBUTION_KEEPER role.\\n * Hash: 0xc23a98a1bf683201c11eeeb8344052ad3bc603c8ddcad06093edc1e8dafa96a2\\n */\\n bytes32 public constant FEE_DISTRIBUTION_KEEPER = keccak256(abi.encode(\\\"FEE_DISTRIBUTION_KEEPER\\\"));\\n\\n /**\\n * @dev The ORDER_KEEPER role.\\n * Hash: 0x40a07f8f0fc57fcf18b093d96362a8e661eaac7b7e6edbf66f242111f83a6794\\n */\\n bytes32 public constant ORDER_KEEPER = keccak256(abi.encode(\\\"ORDER_KEEPER\\\"));\\n\\n /**\\n * @dev The FROZEN_ORDER_KEEPER role.\\n * Hash: 0xcb6c7bc0d25d73c91008af44527b80c56dee4db8965845d926a25659a4a8bc07\\n */\\n bytes32 public constant FROZEN_ORDER_KEEPER = keccak256(abi.encode(\\\"FROZEN_ORDER_KEEPER\\\"));\\n\\n /**\\n * @dev The PRICING_KEEPER role.\\n * Hash: 0x2700e36dc4e6a0daa977bffd4368adbd48f8058da74152919f91f58eddb42103\\n */\\n bytes32 public constant PRICING_KEEPER = keccak256(abi.encode(\\\"PRICING_KEEPER\\\"));\\n /**\\n * @dev The LIQUIDATION_KEEPER role.\\n * Hash: 0x556c788ffc0574ec93966d808c170833d96489c9c58f5bcb3dadf711ba28720e\\n */\\n bytes32 public constant LIQUIDATION_KEEPER = keccak256(abi.encode(\\\"LIQUIDATION_KEEPER\\\"));\\n /**\\n * @dev The ADL_KEEPER role.\\n * Hash: 0xb37d64edaeaf5e634c13682dbd813f5a12fec9eb4f74433a089e7a3c3289af91\\n */\\n bytes32 public constant ADL_KEEPER = keccak256(abi.encode(\\\"ADL_KEEPER\\\"));\\n /**\\n * @dev The CONTRIBUTOR_KEEPER role.\\n * Hash: 0xfa89e7b5ea0a346d73c71d7d6a3512b9f2ea2c2e6c5fb8211ec351d35deef0f4\\n */\\n bytes32 public constant CONTRIBUTOR_KEEPER = keccak256(abi.encode(\\\"CONTRIBUTOR_KEEPER\\\"));\\n /**\\n * @dev The CONTRIBUTOR_DISTRIBUTOR role.\\n * Hash: 0xcdf6da7ad30d8b9afea66fb1cb11b1b7d0b50e9b30b69561a3ca52c39251360c\\n */\\n bytes32 public constant CONTRIBUTOR_DISTRIBUTOR = keccak256(abi.encode(\\\"CONTRIBUTOR_DISTRIBUTOR\\\"));\\n}\\n\",\"keccak256\":\"0xf82e35db50f74b43c8598bacd2df901f3c1a292302680a1b02b076fdb387a6ef\",\"license\":\"BUSL-1.1\"},\"contracts/role/RoleModule.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./RoleStore.sol\\\";\\n\\n/**\\n * @title RoleModule\\n * @dev Contract for role validation functions\\n */\\ncontract RoleModule {\\n RoleStore public immutable roleStore;\\n\\n /**\\n * @dev Constructor that initializes the role store for this contract.\\n *\\n * @param _roleStore The contract instance to use as the role store.\\n */\\n constructor(RoleStore _roleStore) {\\n roleStore = _roleStore;\\n }\\n\\n /**\\n * @dev Only allows the contract's own address to call the function.\\n */\\n modifier onlySelf() {\\n if (msg.sender != address(this)) {\\n revert Errors.Unauthorized(msg.sender, \\\"SELF\\\");\\n }\\n _;\\n }\\n\\n /**\\n * @dev Only allows addresses with the TIMELOCK_MULTISIG role to call the function.\\n */\\n modifier onlyTimelockMultisig() {\\n _validateRole(Role.TIMELOCK_MULTISIG, \\\"TIMELOCK_MULTISIG\\\");\\n _;\\n }\\n\\n /**\\n * @dev Only allows addresses with the TIMELOCK_ADMIN role to call the function.\\n */\\n modifier onlyTimelockAdmin() {\\n _validateRole(Role.TIMELOCK_ADMIN, \\\"TIMELOCK_ADMIN\\\");\\n _;\\n }\\n\\n /**\\n * @dev Only allows addresses with the CONFIG_KEEPER role to call the function.\\n */\\n modifier onlyConfigKeeper() {\\n _validateRole(Role.CONFIG_KEEPER, \\\"CONFIG_KEEPER\\\");\\n _;\\n }\\n\\n /**\\n * @dev Only allows addresses with the LIMITED_CONFIG_KEEPER role to call the function.\\n */\\n modifier onlyLimitedConfigKeeper() {\\n _validateRole(Role.LIMITED_CONFIG_KEEPER, \\\"LIMITED_CONFIG_KEEPER\\\");\\n _;\\n }\\n\\n /**\\n * @dev Only allows addresses with the CONTROLLER role to call the function.\\n */\\n modifier onlyController() {\\n _validateRole(Role.CONTROLLER, \\\"CONTROLLER\\\");\\n _;\\n }\\n\\n /**\\n * @dev Only allows addresses with the GOV_TOKEN_CONTROLLER role to call the function.\\n */\\n modifier onlyGovTokenController() {\\n _validateRole(Role.GOV_TOKEN_CONTROLLER, \\\"GOV_TOKEN_CONTROLLER\\\");\\n _;\\n }\\n\\n /**\\n * @dev Only allows addresses with the ROUTER_PLUGIN role to call the function.\\n */\\n modifier onlyRouterPlugin() {\\n _validateRole(Role.ROUTER_PLUGIN, \\\"ROUTER_PLUGIN\\\");\\n _;\\n }\\n\\n /**\\n * @dev Only allows addresses with the MARKET_KEEPER role to call the function.\\n */\\n modifier onlyMarketKeeper() {\\n _validateRole(Role.MARKET_KEEPER, \\\"MARKET_KEEPER\\\");\\n _;\\n }\\n\\n /**\\n * @dev Only allows addresses with the FEE_KEEPER role to call the function.\\n */\\n modifier onlyFeeKeeper() {\\n _validateRole(Role.FEE_KEEPER, \\\"FEE_KEEPER\\\");\\n _;\\n }\\n\\n /**\\n * @dev Only allows addresses with the FEE_DISTRIBUTION_KEEPER role to call the function.\\n */\\n modifier onlyFeeDistributionKeeper() {\\n _validateRole(Role.FEE_DISTRIBUTION_KEEPER, \\\"FEE_DISTRIBUTION_KEEPER\\\");\\n _;\\n }\\n\\n /**\\n * @dev Only allows addresses with the ORDER_KEEPER role to call the function.\\n */\\n modifier onlyOrderKeeper() {\\n _validateRole(Role.ORDER_KEEPER, \\\"ORDER_KEEPER\\\");\\n _;\\n }\\n\\n /**\\n * @dev Only allows addresses with the PRICING_KEEPER role to call the function.\\n */\\n modifier onlyPricingKeeper() {\\n _validateRole(Role.PRICING_KEEPER, \\\"PRICING_KEEPER\\\");\\n _;\\n }\\n\\n /**\\n * @dev Only allows addresses with the LIQUIDATION_KEEPER role to call the function.\\n */\\n modifier onlyLiquidationKeeper() {\\n _validateRole(Role.LIQUIDATION_KEEPER, \\\"LIQUIDATION_KEEPER\\\");\\n _;\\n }\\n\\n /**\\n * @dev Only allows addresses with the ADL_KEEPER role to call the function.\\n */\\n modifier onlyAdlKeeper() {\\n _validateRole(Role.ADL_KEEPER, \\\"ADL_KEEPER\\\");\\n _;\\n }\\n\\n /**\\n * @dev Only allows addresses with the CONTRIBUTOR_KEEPER role to call the function.\\n */\\n modifier onlyContributorKeeper() {\\n _validateRole(Role.CONTRIBUTOR_KEEPER, \\\"CONTRIBUTOR_KEEPER\\\");\\n _;\\n }\\n\\n /**\\n * @dev Only allows addresses with the CONTRIBUTOR_DISTRIBUTOR role to call the function.\\n */\\n modifier onlyContributorDistributor() {\\n _validateRole(Role.CONTRIBUTOR_DISTRIBUTOR, \\\"CONTRIBUTOR_DISTRIBUTOR\\\");\\n _;\\n }\\n\\n /**\\n * @dev Validates that the caller has the specified role.\\n *\\n * If the caller does not have the specified role, the transaction is reverted.\\n *\\n * @param role The key of the role to validate.\\n * @param roleName The name of the role to validate.\\n */\\n function _validateRole(bytes32 role, string memory roleName) internal view {\\n if (!roleStore.hasRole(msg.sender, role)) {\\n revert Errors.Unauthorized(msg.sender, roleName);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xbd5f2168b69a6c70dc6aacf850491a4eb7c3eaf7b9078deaa83aee0febb9b5ab\",\"license\":\"BUSL-1.1\"},\"contracts/role/RoleStore.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/utils/structs/EnumerableSet.sol\\\";\\nimport \\\"../utils/EnumerableValues.sol\\\";\\nimport \\\"./Role.sol\\\";\\nimport \\\"../error/Errors.sol\\\";\\n\\n/**\\n * @title RoleStore\\n * @dev Stores roles and their members.\\n */\\ncontract RoleStore {\\n using EnumerableSet for EnumerableSet.AddressSet;\\n using EnumerableSet for EnumerableSet.Bytes32Set;\\n using EnumerableValues for EnumerableSet.AddressSet;\\n using EnumerableValues for EnumerableSet.Bytes32Set;\\n\\n EnumerableSet.Bytes32Set internal roles;\\n mapping(bytes32 => EnumerableSet.AddressSet) internal roleMembers;\\n // checking if an account has a role is a frequently used function\\n // roleCache helps to save gas by offering a more efficient lookup\\n // vs calling roleMembers[key].contains(account)\\n mapping(address => mapping (bytes32 => bool)) roleCache;\\n\\n modifier onlyRoleAdmin() {\\n if (!hasRole(msg.sender, Role.ROLE_ADMIN)) {\\n revert Errors.Unauthorized(msg.sender, \\\"ROLE_ADMIN\\\");\\n }\\n _;\\n }\\n\\n constructor() {\\n _grantRole(msg.sender, Role.ROLE_ADMIN);\\n }\\n\\n /**\\n * @dev Grants the specified role to the given account.\\n *\\n * @param account The address of the account.\\n * @param roleKey The key of the role to grant.\\n */\\n function grantRole(address account, bytes32 roleKey) external onlyRoleAdmin {\\n _grantRole(account, roleKey);\\n }\\n\\n /**\\n * @dev Revokes the specified role from the given account.\\n *\\n * @param account The address of the account.\\n * @param roleKey The key of the role to revoke.\\n */\\n function revokeRole(address account, bytes32 roleKey) external onlyRoleAdmin {\\n _revokeRole(account, roleKey);\\n }\\n\\n /**\\n * @dev Returns true if the given account has the specified role.\\n *\\n * @param account The address of the account.\\n * @param roleKey The key of the role.\\n * @return True if the account has the role, false otherwise.\\n */\\n function hasRole(address account, bytes32 roleKey) public view returns (bool) {\\n return roleCache[account][roleKey];\\n }\\n\\n /**\\n * @dev Returns the number of roles stored in the contract.\\n *\\n * @return The number of roles.\\n */\\n function getRoleCount() external view returns (uint256) {\\n return roles.length();\\n }\\n\\n /**\\n * @dev Returns the keys of the roles stored in the contract.\\n *\\n * @param start The starting index of the range of roles to return.\\n * @param end The ending index of the range of roles to return.\\n * @return The keys of the roles.\\n */\\n function getRoles(uint256 start, uint256 end) external view returns (bytes32[] memory) {\\n return roles.valuesAt(start, end);\\n }\\n\\n /**\\n * @dev Returns the number of members of the specified role.\\n *\\n * @param roleKey The key of the role.\\n * @return The number of members of the role.\\n */\\n function getRoleMemberCount(bytes32 roleKey) external view returns (uint256) {\\n return roleMembers[roleKey].length();\\n }\\n\\n /**\\n * @dev Returns the members of the specified role.\\n *\\n * @param roleKey The key of the role.\\n * @param start the start index, the value for this index will be included.\\n * @param end the end index, the value for this index will not be included.\\n * @return The members of the role.\\n */\\n function getRoleMembers(bytes32 roleKey, uint256 start, uint256 end) external view returns (address[] memory) {\\n return roleMembers[roleKey].valuesAt(start, end);\\n }\\n\\n function _grantRole(address account, bytes32 roleKey) internal {\\n roles.add(roleKey);\\n roleMembers[roleKey].add(account);\\n roleCache[account][roleKey] = true;\\n }\\n\\n function _revokeRole(address account, bytes32 roleKey) internal {\\n roleMembers[roleKey].remove(account);\\n roleCache[account][roleKey] = false;\\n\\n if (roleMembers[roleKey].length() == 0) {\\n if (roleKey == Role.ROLE_ADMIN) {\\n revert Errors.ThereMustBeAtLeastOneRoleAdmin();\\n }\\n if (roleKey == Role.TIMELOCK_MULTISIG) {\\n revert Errors.ThereMustBeAtLeastOneTimelockMultiSig();\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xaa7be1876450ec19568c0e12e4238332c96eb921974a19c0e4a6fe1fb943bf6d\",\"license\":\"BUSL-1.1\"},\"contracts/utils/BasicMulticall.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../error/ErrorUtils.sol\\\";\\n\\n/**\\n * @title BasicMulticall\\n */\\nabstract contract BasicMulticall {\\n /**\\n * @dev Receives and executes a batch of function calls on this contract.\\n */\\n function multicall(bytes[] calldata data) external virtual returns (bytes[] memory results) {\\n results = new bytes[](data.length);\\n\\n for (uint256 i; i < data.length; i++) {\\n (bool success, bytes memory result) = address(this).delegatecall(data[i]);\\n\\n if (!success) {\\n ErrorUtils.revertWithParsedMessage(result);\\n }\\n\\n results[i] = result;\\n }\\n\\n return results;\\n }\\n}\\n\",\"keccak256\":\"0xdf9d58a9b7d7b28be24bd2668da62ca377f6e1aa1e65111fd6da7cc6b5db1851\",\"license\":\"BUSL-1.1\"},\"contracts/utils/Calc.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/utils/math/SignedMath.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/math/SafeCast.sol\\\";\\n\\n/**\\n * @title Calc\\n * @dev Library for math functions\\n */\\nlibrary Calc {\\n using SignedMath for int256;\\n using SafeCast for uint256;\\n\\n // this method assumes that min is less than max\\n function boundMagnitude(int256 value, uint256 min, uint256 max) internal pure returns (int256) {\\n uint256 magnitude = value.abs();\\n\\n if (magnitude < min) {\\n magnitude = min;\\n }\\n\\n if (magnitude > max) {\\n magnitude = max;\\n }\\n\\n int256 sign = value == 0 ? int256(1) : value / value.abs().toInt256();\\n\\n return magnitude.toInt256() * sign;\\n }\\n\\n /**\\n * @dev Calculates the result of dividing the first number by the second number,\\n * rounded up to the nearest integer.\\n *\\n * @param a the dividend\\n * @param b the divisor\\n * @return the result of dividing the first number by the second number, rounded up to the nearest integer\\n */\\n function roundUpDivision(uint256 a, uint256 b) internal pure returns (uint256) {\\n return (a + b - 1) / b;\\n }\\n\\n /**\\n * Calculates the result of dividing the first number by the second number,\\n * rounded up to the nearest integer.\\n * The rounding is purely on the magnitude of a, if a is negative the result\\n * is a larger magnitude negative\\n *\\n * @param a the dividend\\n * @param b the divisor\\n * @return the result of dividing the first number by the second number, rounded up to the nearest integer\\n */\\n function roundUpMagnitudeDivision(int256 a, uint256 b) internal pure returns (int256) {\\n if (a < 0) {\\n return (a - b.toInt256() + 1) / b.toInt256();\\n }\\n\\n return (a + b.toInt256() - 1) / b.toInt256();\\n }\\n\\n /**\\n * Adds two numbers together and return a uint256 value, treating the second number as a signed integer.\\n *\\n * @param a the first number\\n * @param b the second number\\n * @return the result of adding the two numbers together\\n */\\n function sumReturnUint256(uint256 a, int256 b) internal pure returns (uint256) {\\n if (b > 0) {\\n return a + b.abs();\\n }\\n\\n return a - b.abs();\\n }\\n\\n /**\\n * Adds two numbers together and return an int256 value, treating the second number as a signed integer.\\n *\\n * @param a the first number\\n * @param b the second number\\n * @return the result of adding the two numbers together\\n */\\n function sumReturnInt256(uint256 a, int256 b) internal pure returns (int256) {\\n return a.toInt256() + b;\\n }\\n\\n /**\\n * @dev Calculates the absolute difference between two numbers.\\n *\\n * @param a the first number\\n * @param b the second number\\n * @return the absolute difference between the two numbers\\n */\\n function diff(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a - b : b - a;\\n }\\n\\n /**\\n * Adds two numbers together, the result is bounded to prevent overflows.\\n *\\n * @param a the first number\\n * @param b the second number\\n * @return the result of adding the two numbers together\\n */\\n function boundedAdd(int256 a, int256 b) internal pure returns (int256) {\\n // if either a or b is zero or if the signs are different there should not be any overflows\\n if (a == 0 || b == 0 || (a < 0 && b > 0) || (a > 0 && b < 0)) {\\n return a + b;\\n }\\n\\n // if adding `b` to `a` would result in a value less than the min int256 value\\n // then return the min int256 value\\n if (a < 0 && b <= type(int256).min - a) {\\n return type(int256).min;\\n }\\n\\n // if adding `b` to `a` would result in a value more than the max int256 value\\n // then return the max int256 value\\n if (a > 0 && b >= type(int256).max - a) {\\n return type(int256).max;\\n }\\n\\n return a + b;\\n }\\n\\n /**\\n * Returns a - b, the result is bounded to prevent overflows.\\n * Note that this will revert if b is type(int256).min because of the usage of \\\"-b\\\".\\n *\\n * @param a the first number\\n * @param b the second number\\n * @return the bounded result of a - b\\n */\\n function boundedSub(int256 a, int256 b) internal pure returns (int256) {\\n // if either a or b is zero or the signs are the same there should not be any overflow\\n if (a == 0 || b == 0 || (a > 0 && b > 0) || (a < 0 && b < 0)) {\\n return a - b;\\n }\\n\\n // if adding `-b` to `a` would result in a value greater than the max int256 value\\n // then return the max int256 value\\n if (a > 0 && -b >= type(int256).max - a) {\\n return type(int256).max;\\n }\\n\\n // if subtracting `b` from `a` would result in a value less than the min int256 value\\n // then return the min int256 value\\n if (a < 0 && -b <= type(int256).min - a) {\\n return type(int256).min;\\n }\\n\\n return a - b;\\n }\\n\\n\\n /**\\n * Converts the given unsigned integer to a signed integer, using the given\\n * flag to determine whether the result should be positive or negative.\\n *\\n * @param a the unsigned integer to convert\\n * @param isPositive whether the result should be positive (if true) or negative (if false)\\n * @return the signed integer representation of the given unsigned integer\\n */\\n function toSigned(uint256 a, bool isPositive) internal pure returns (int256) {\\n if (isPositive) {\\n return a.toInt256();\\n } else {\\n return -a.toInt256();\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3848e1c51a6c77a1d6ec30bb052e97f6c39437110c773ebc06956ce5e4a54370\",\"license\":\"BUSL-1.1\"},\"contracts/utils/Cast.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../error/Errors.sol\\\";\\n\\n/**\\n * @title Cast\\n * @dev Library for casting functions\\n */\\nlibrary Cast {\\n function toBytes32(address value) internal pure returns (bytes32) {\\n return bytes32(uint256(uint160(value)));\\n }\\n\\n /**\\n * @dev Converts a bytes array to a uint256.\\n * Handles cases where the uint256 stored in bytes is stored with or without padding.\\n * @param uint256AsBytes The bytes array representing the uint256 value.\\n * @return value The uint256 value obtained from the bytes array.\\n */\\n function bytesToUint256(bytes memory uint256AsBytes) internal pure returns (uint256) {\\n uint256 length = uint256AsBytes.length;\\n \\n if(length > 32) {\\n revert Errors.Uint256AsBytesLengthExceeds32Bytes(length);\\n }\\n\\n if (length == 0) {\\n return 0;\\n }\\n\\n uint256 value;\\n \\n assembly {\\n value := mload(add(uint256AsBytes, 32))\\n }\\n\\n return value = value >> (8 * (32 - length));\\n }\\n}\\n\",\"keccak256\":\"0x5bd163b5e95891a6359555e4d5784bc4d56a61c832cda28fe91fbf0632cf2d14\",\"license\":\"BUSL-1.1\"},\"contracts/utils/EnumerableValues.sol\":{\"content\":\"// SPDX-License-Identifier: BUSL-1.1\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/utils/structs/EnumerableSet.sol\\\";\\n\\n/**\\n * @title EnumerableValues\\n * @dev Library to extend the EnumerableSet library with functions to get\\n * valuesAt for a range\\n */\\nlibrary EnumerableValues {\\n using EnumerableSet for EnumerableSet.Bytes32Set;\\n using EnumerableSet for EnumerableSet.AddressSet;\\n using EnumerableSet for EnumerableSet.UintSet;\\n\\n /**\\n * Returns an array of bytes32 values from the given set, starting at the given\\n * start index and ending before the given end index.\\n *\\n * @param set The set to get the values from.\\n * @param start The starting index.\\n * @param end The ending index.\\n * @return An array of bytes32 values.\\n */\\n function valuesAt(EnumerableSet.Bytes32Set storage set, uint256 start, uint256 end) internal view returns (bytes32[] memory) {\\n uint256 max = set.length();\\n if (end > max) { end = max; }\\n\\n bytes32[] memory items = new bytes32[](end - start);\\n for (uint256 i = start; i < end; i++) {\\n items[i - start] = set.at(i);\\n }\\n\\n return items;\\n }\\n\\n\\n /**\\n * Returns an array of address values from the given set, starting at the given\\n * start index and ending before the given end index.\\n *\\n * @param set The set to get the values from.\\n * @param start The starting index.\\n * @param end The ending index.\\n * @return An array of address values.\\n */\\n function valuesAt(EnumerableSet.AddressSet storage set, uint256 start, uint256 end) internal view returns (address[] memory) {\\n uint256 max = set.length();\\n if (end > max) { end = max; }\\n\\n address[] memory items = new address[](end - start);\\n for (uint256 i = start; i < end; i++) {\\n items[i - start] = set.at(i);\\n }\\n\\n return items;\\n }\\n\\n\\n /**\\n * Returns an array of uint256 values from the given set, starting at the given\\n * start index and ending before the given end index, the item at the end index will not be returned.\\n *\\n * @param set The set to get the values from.\\n * @param start The starting index (inclusive, item at the start index will be returned).\\n * @param end The ending index (exclusive, item at the end index will not be returned).\\n * @return An array of uint256 values.\\n */\\n function valuesAt(EnumerableSet.UintSet storage set, uint256 start, uint256 end) internal view returns (uint256[] memory) {\\n if (start >= set.length()) {\\n return new uint256[](0);\\n }\\n\\n uint256 max = set.length();\\n if (end > max) { end = max; }\\n\\n uint256[] memory items = new uint256[](end - start);\\n for (uint256 i = start; i < end; i++) {\\n items[i - start] = set.at(i);\\n }\\n\\n return items;\\n }\\n}\\n\",\"keccak256\":\"0x1e525ad5645bc649551fa3a7d000af1cec96221d7fe1cdc17cedaf942b018f0d\",\"license\":\"BUSL-1.1\"}},\"version\":1}", "bytecode": "0x6101006040523480156200001257600080fd5b5060405162005258380380620052588339810160408190526200003591620000c5565b600160008190556001600160a01b0380871660805285811660a05284811660c052831660e0528190556200006862000073565b505050505062000139565b620697806001541115620000aa57600154604051633ebd9bc360e21b8152600401620000a191815260200190565b60405180910390fd5b565b6001600160a01b0381168114620000c257600080fd5b50565b600080600080600060a08688031215620000de57600080fd5b8551620000eb81620000ac565b6020870151909550620000fe81620000ac565b60408701519094506200011181620000ac565b60608701519093506200012481620000ac565b80925050608086015190509295509295909350565b60805160a05160c05160e051614fbf620002996000396000818161021b01528181610f6c015261211a0152600081816103350152818161071a0152818161087701528181610ab201528181610c9a01528181610e8b0152818161102c015281816111b80152818161136101528181611526015281816116380152818161175c01528181611bbe01528181611d2101528181611e4201528181612071015281816121da015281816122fe015281816124ba01528181612637015281816127db015281816129ae01528181612aa001528181612c0b015281816130ba015261358e0152600081816102af015281816104fa015281816105940152818161107f01528181611244015281816113ed015281816117ee0152818161188801528181611922015281816119bc0152818161238c015261287501526000818161026201528181610b9801528181610d89015281816126d90152612c570152614fbf6000f3fe608060405234801561001057600080fd5b50600436106101805760003560e01c80630eaf7fc4146101855780630f43905d1461019a5780630fe29bbc146101ad5780630ffc3cf6146101c0578063208dd1ff146101d35780632a083ca3146101e65780632d6b4cc614610203578063392bf7f61461021657806349c73bca1461024a5780634a4a7b041461025d5780635077e242146102845780635bb70a2014610297578063660d0d67146102aa57806369bc0f3b146102d1578063728ca574146102e457806375fa1913146102f7578063781cc3d31461030a5780637c326db61461031d5780639ff78c3014610330578063a9765cae14610357578063ac9650d81461036a578063b6b9b02f1461038a578063bcb151e41461039d578063c15ab4ec146103b0578063c4fe486c146103c3578063ccdd6bb0146103d6578063d59ba7e4146103e9578063d5b0083b146103fc578063e30569e51461040f578063eef09bad1461042f578063f03278d414610438578063f2ee93771461044b575b600080fd5b610198610193366004613b16565b61045e565b005b6101986101a8366004613b4b565b610794565b6101986101bb366004613b68565b6108ef565b6101986101ce366004613bb9565b610b2e565b6101986101e1366004613bb9565b610d13565b6101f06206978081565b6040519081526020015b60405180910390f35b610198610211366004613b4b565b610efd565b61023d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516101fa9190613be5565b610198610258366004613c07565b611063565b61023d7f000000000000000000000000000000000000000000000000000000000000000081565b610198610292366004613c40565b6111ed565b6101986102a5366004613c07565b611396565b61023d7f000000000000000000000000000000000000000000000000000000000000000081565b6101986102df366004613b4b565b61155b565b6101986102f2366004613bb9565b61166f565b610198610305366004613b68565b611793565b610198610318366004613c6e565b611bf5565b61019861032b366004613c40565b611c47565b61023d7f000000000000000000000000000000000000000000000000000000000000000081565b610198610365366004613bb9565b611d56565b61037d610378366004613c87565b611e79565b6040516101fa9190613da0565b610198610398366004613b4b565b611f98565b6101986103ab366004613b4b565b6120a8565b6101986103be366004613c07565b612211565b6101986103d1366004613b4b565b612333565b6101986103e4366004613b16565b6124f1565b6101986103f7366004613bb9565b61266e565b61019861040a366004613c07565b612812565b6101f061041d366004613c6e565b60026020526000908152604090205481565b6101f060015481565b610198610446366004613c6e565b6129e3565b610198610459366004613c07565b612b12565b6104b260405160200161047090613db3565b604051602081830303815290604052805190602001206040518060400160405280600e81526020016d2a24a6a2a627a1a5afa0a226a4a760911b815250612c40565b6104ba612cf0565b60006104c7848484612d49565b90506104f8816040518060400160405280600d81526020016c7365744461746153747265616d60981b815250612da9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634e91db0861053086612dbc565b856040518363ffffffff1660e01b815260040161054e929190613ddb565b6020604051808303816000875af115801561056d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105919190613de9565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e2a4853a6105ca86612e35565b846040518363ffffffff1660e01b81526004016105e8929190613ddb565b6020604051808303816000875af1158015610607573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062b9190613de9565b50610634613a10565b8051610641906001612e71565b6040805180820190915260058152643a37b5b2b760d91b6020820152815161066c9160009088612ed6565b608081015161067c906001612e71565b60408051808201909152600681526519995959125960d21b602082015260808201516106ab9160009087612f33565b60208101516106bb906001612e71565b6107036000604051806040016040528060148152602001733230ba30a9ba3932b0b6a6bab63a34b83634b2b960611b815250858460200151612f33909392919063ffffffff16565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e49061075190859085906004016146c5565b600060405180830381600087803b15801561076b57600080fd5b505af115801561077f573d6000803e3d6000fd5b50505050505061078f6001600055565b505050565b6107a660405160200161047090613db3565b6107ae612cf0565b6001600160a01b0381166107e0578060405163c1b14c9160e01b81526004016107d79190613be5565b60405180910390fd5b60006107eb82612f86565b905061081e816040518060400160405280600f81526020016e30b23227b930b1b632a9b4b3b732b960891b815250612fc0565b610826613a10565b8051610833906001612e71565b6040805180820190915260078152661858d8dbdd5b9d60ca1b602082015281516108609160009086612ed6565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e4906108ae908590859060040161470a565b600060405180830381600087803b1580156108c857600080fd5b505af11580156108dc573d6000803e3d6000fd5b5050505050506108ec6001600055565b50565b61090160405160200161047090613db3565b610909612cf0565b60006109188686868686613128565b9050610948816040518060400160405280600c81526020016b1cd95d141c9a58d95199595960a21b815250612fc0565b610950613a10565b805161095d906002612e71565b6040805180820190915260058152643a37b5b2b760d91b60208201528151610988916000908a612ed6565b6040805180820190915260098152681c1c9a58d95199595960ba1b602082015281516109b79160019089612ed6565b60208101516109c7906003612e71565b610a0e600060405180604001604052806013815260200172383934b1b2a332b2b226bab63a34b83634b2b960691b815250878460200151612f33909392919063ffffffff16565b610a5c60016040518060400160405280601a815260200179383934b1b2a332b2b22432b0b93a3132b0ba223ab930ba34b7b760311b815250868460200151612f33909392919063ffffffff16565b610a9b60026040518060400160405280600b81526020016a737461626c65507269636560a81b815250858460200151612f33909392919063ffffffff16565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e490610ae9908590859060040161474f565b600060405180830381600087803b158015610b0357600080fd5b505af1158015610b17573d6000803e3d6000fd5b505050505050610b276001600055565b5050505050565b610b4060405160200161047090613db3565b610b48612cf0565b6000610b54838361319d565b9050610b8181604051806040016040528060098152602001686772616e74526f6c6560b81b815250612da9565b604051632ac9d0b760e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ab2742dc90610bcf9086908690600401614791565b600060405180830381600087803b158015610be957600080fd5b505af1158015610bfd573d6000803e3d6000fd5b50505050610c09613a10565b8051610c16906001612e71565b6040805180820190915260078152661858d8dbdd5b9d60ca1b60208201528151610c439160009087612ed6565b6080810151610c53906001612e71565b604080518082019091526007815266726f6c654b657960c81b60208201526080820151610c839160009086612f33565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e490610cd190859085906004016147aa565b600060405180830381600087803b158015610ceb57600080fd5b505af1158015610cff573d6000803e3d6000fd5b505050505050610d0f6001600055565b5050565b610d6a604051602001610d25906147e3565b604051602081830303815290604052805190602001206040518060400160405280601181526020017054494d454c4f434b5f4d554c544953494760781b815250612c40565b610d72612cf0565b60405163208dd1ff60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063208dd1ff90610dc09085908590600401614791565b600060405180830381600087803b158015610dda57600080fd5b505af1158015610dee573d6000803e3d6000fd5b50505050610dfa613a10565b8051610e07906001612e71565b6040805180820190915260078152661858d8dbdd5b9d60ca1b60208201528151610e349160009086612ed6565b6080810151610e44906001612e71565b604080518082019091526007815266726f6c654b657960c81b60208201526080820151610e749160009085612f33565b60405163483624fb60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063906c49f690610ec090849060040161482b565b600060405180830381600087803b158015610eda57600080fd5b505af1158015610eee573d6000803e3d6000fd5b5050505050610d0f6001600055565b610f0f60405160200161047090613db3565b610f17612cf0565b6000610f2282612f86565b9050610f55816040518060400160405280600f81526020016e30b23227b930b1b632a9b4b3b732b960891b815250612da9565b6040516375896b0f60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063eb12d61e90610fa1908590600401613be5565b600060405180830381600087803b158015610fbb57600080fd5b505af1158015610fcf573d6000803e3d6000fd5b50505050610fdb613a10565b8051610fe8906001612e71565b6040805180820190915260078152661858d8dbdd5b9d60ca1b602082015281516110159160009086612ed6565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e4906108ae908590859060040161484f565b611075604051602001610d25906147e3565b61107d612cf0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663abfdcced6110b5846131f2565b6040516001600160e01b031960e084901b168152600481019190915283151560248201526044016020604051808303816000875af11580156110fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111f919061488e565b50611128613a10565b8051611135906001612e71565b604080518082019091526008815267383937bb34b232b960c11b602082015281516111639160009086612ed6565b6060810151611173906001612e71565b60408051808201909152600581526476616c756560d81b602082015260608201516111a19160009085613232565b60405163483624fb60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063906c49f690610ec09084906004016148ab565b6111ff60405160200161047090613db3565b611207612cf0565b60006112138383613287565b905061124281604051806040016040528060198152602001600080516020614f4a833981519152815250612da9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ca446dd961127a856132c7565b846040518363ffffffff1660e01b81526004016112989291906148ed565b6020604051808303816000875af11580156112b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112db9190614904565b506112e4613a10565b80516112f1906002612e71565b6040805180820190915260058152643a37b5b2b760d91b6020820152815161131c9160009087612ed6565b604080518082019091526008815267383937bb34b232b960c11b6020820152815161134a9160019086612ed6565b60405163483624fb60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063906c49f690610cd1908490600401614921565b6113a860405160200161047090613db3565b6113b0612cf0565b60006113bc8383613306565b90506113eb81604051806040016040528060188152602001600080516020614f6a833981519152815250612da9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663abfdcced611423856131f2565b6040516001600160e01b031960e084901b168152600481019190915284151560248201526044016020604051808303816000875af1158015611469573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148d919061488e565b50611496613a10565b80516114a3906001612e71565b604080518082019091526008815267383937bb34b232b960c11b602082015281516114d19160009087612ed6565b60608101516114e1906001612e71565b60408051808201909152600581526476616c756560d81b6020820152606082015161150f9160009086613232565b60405163483624fb60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063906c49f690610cd19084906004016148ab565b61156d60405160200161047090613db3565b611575612cf0565b6001600160a01b03811661159e578060405163c1b14c9160e01b81526004016107d79190613be5565b60006115a982613347565b90506115df81604051806040016040528060128152602001713932b6b7bb32a7b930b1b632a9b4b3b732b960711b815250612fc0565b6115e7613a10565b80516115f4906001612e71565b6040805180820190915260078152661858d8dbdd5b9d60ca1b602082015281516116219160009086612ed6565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e4906108ae9085908590600401614964565b61168160405160200161047090613db3565b611689612cf0565b60006116958383613384565b90506116c3816040518060400160405280600a8152602001697265766f6b65526f6c6560b01b815250612fc0565b6116cb613a10565b80516116d8906001612e71565b6040805180820190915260078152661858d8dbdd5b9d60ca1b602082015281516117059160009087612ed6565b6080810151611715906001612e71565b604080518082019091526007815266726f6c654b657960c81b602082015260808201516117459160009086612f33565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e490610cd190859085906004016149ac565b6117a560405160200161047090613db3565b6117ad612cf0565b60006117bc8686868686613128565b90506117ec816040518060400160405280600c81526020016b1cd95d141c9a58d95199595960a21b815250612da9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ca446dd9611824886133c0565b876040518363ffffffff1660e01b81526004016118429291906148ed565b6020604051808303816000875af1158015611861573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118859190614904565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e2a4853a6118be886133f0565b866040518363ffffffff1660e01b81526004016118dc929190613ddb565b6020604051808303816000875af11580156118fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191f9190613de9565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e2a4853a6119588861342b565b856040518363ffffffff1660e01b8152600401611976929190613ddb565b6020604051808303816000875af1158015611995573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b99190613de9565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e2a4853a6119f28861346e565b846040518363ffffffff1660e01b8152600401611a10929190613ddb565b6020604051808303816000875af1158015611a2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a539190613de9565b50611a5c613a10565b8051611a69906002612e71565b6040805180820190915260058152643a37b5b2b760d91b60208201528151611a94916000908a612ed6565b6040805180820190915260098152681c1c9a58d95199595960ba1b60208201528151611ac39160019089612ed6565b6020810151611ad3906003612e71565b611b1a600060405180604001604052806013815260200172383934b1b2a332b2b226bab63a34b83634b2b960691b815250878460200151612f33909392919063ffffffff16565b611b6860016040518060400160405280601a815260200179383934b1b2a332b2b22432b0b93a3132b0ba223ab930ba34b7b760311b815250868460200151612f33909392919063ffffffff16565b611ba760026040518060400160405280600b81526020016a737461626c65507269636560a81b815250858460200151612f33909392919063ffffffff16565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e490610ae990859085906004016149ec565b611c0760405160200161047090613db3565b611c0f612cf0565b611c3d816040518060400160405280600c81526020016b31b0b731b2b620b1ba34b7b760a11b8152506134a0565b6108ec6001600055565b611c5960405160200161047090613db3565b611c61612cf0565b6000611c6d8383613287565b9050611c9c81604051806040016040528060198152602001600080516020614f4a833981519152815250612fc0565b611ca4613a10565b8051611cb1906002612e71565b6040805180820190915260058152643a37b5b2b760d91b60208201528151611cdc9160009087612ed6565b604080518082019091526008815267383937bb34b232b960c11b60208201528151611d0a9160019086612ed6565b60405163483624fb60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063906c49f690610cd1908490600401614a28565b611d6860405160200161047090613db3565b611d70612cf0565b6000611d7c838361319d565b9050611da981604051806040016040528060098152602001686772616e74526f6c6560b81b815250612fc0565b611db1613a10565b8051611dbe906001612e71565b6040805180820190915260078152661858d8dbdd5b9d60ca1b60208201528151611deb9160009087612ed6565b6080810151611dfb906001612e71565b604080518082019091526007815266726f6c654b657960c81b60208201526080820151611e2b9160009086612f33565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e490610cd19085908590600401614a6f565b6060816001600160401b03811115611e9357611e93614aae565b604051908082528060200260200182016040528015611ec657816020015b6060815260200190600190039081611eb15790505b50905060005b82811015611f905760008030868685818110611eea57611eea614ac4565b9050602002810190611efc9190614ada565b604051611f0a929190614b27565b600060405180830381855af49150503d8060008114611f45576040519150601f19603f3d011682016040523d82523d6000602084013e611f4a565b606091505b509150915081611f5d57611f5d816135c5565b80848481518110611f7057611f70614ac4565b602002602001018190525050508080611f8890614b4d565b915050611ecc565b505b92915050565b611faa60405160200161047090613db3565b611fb2612cf0565b6001600160a01b038116611fdb578060405163cb9339d560e01b81526004016107d79190613be5565b6000611fe6826135fe565b9050612018816040518060400160405280600e81526020016d39b2ba2332b2a932b1b2b4bb32b960911b815250612fc0565b612020613a10565b805161202d906001612e71565b6040805180820190915260078152661858d8dbdd5b9d60ca1b6020820152815161205a9160009086612ed6565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e4906108ae9085908590600401614b66565b6120ba60405160200161047090613db3565b6120c2612cf0565b60006120cd82613347565b905061210381604051806040016040528060128152602001713932b6b7bb32a7b930b1b632a9b4b3b732b960711b815250612da9565b604051630e316ab760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630e316ab79061214f908590600401613be5565b600060405180830381600087803b15801561216957600080fd5b505af115801561217d573d6000803e3d6000fd5b50505050612189613a10565b8051612196906001612e71565b6040805180820190915260078152661858d8dbdd5b9d60ca1b602082015281516121c39160009086612ed6565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e4906108ae9085908590600401614baa565b61222360405160200161047090613db3565b61222b612cf0565b60006122378383613306565b905061226681604051806040016040528060188152602001600080516020614f6a833981519152815250612fc0565b61226e613a10565b805161227b906001612e71565b604080518082019091526008815267383937bb34b232b960c11b602082015281516122a99160009087612ed6565b60608101516122b9906001612e71565b60408051808201909152600581526476616c756560d81b602082015260608201516122e79160009086613232565b60405163483624fb60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063906c49f690610cd1908490600401614bec565b61234560405160200161047090613db3565b61234d612cf0565b6000612358826135fe565b905061238a816040518060400160405280600e81526020016d39b2ba2332b2a932b1b2b4bb32b960911b815250612da9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ca446dd96040516020016123e9906020808252600c908201526b2322a2afa922a1a2a4ab22a960a11b604082015260600190565b60405160208183030381529060405280519060200120846040518363ffffffff1660e01b815260040161241d9291906148ed565b6020604051808303816000875af115801561243c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124609190614904565b50612469613a10565b8051612476906001612e71565b6040805180820190915260078152661858d8dbdd5b9d60ca1b602082015281516124a39160009086612ed6565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e4906108ae9085908590600401614c33565b61250360405160200161047090613db3565b61250b612cf0565b6000612518848484612d49565b9050612549816040518060400160405280600d81526020016c7365744461746153747265616d60981b815250612fc0565b612551613a10565b805161255e906001612e71565b6040805180820190915260058152643a37b5b2b760d91b602082015281516125899160009088612ed6565b6080810151612599906001612e71565b60408051808201909152600681526519995959125960d21b602082015260808201516125c89160009087612f33565b60208101516125d8906001612e71565b6126206000604051806040016040528060148152602001733230ba30a9ba3932b0b6a6bab63a34b83634b2b960611b815250858460200151612f33909392919063ffffffff16565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e4906107519085908590600401614c71565b61268060405160200161047090613db3565b612688612cf0565b60006126948383613384565b90506126c2816040518060400160405280600a8152602001697265766f6b65526f6c6560b01b815250612da9565b60405163208dd1ff60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063208dd1ff906127109086908690600401614791565b600060405180830381600087803b15801561272a57600080fd5b505af115801561273e573d6000803e3d6000fd5b5050505061274a613a10565b8051612757906001612e71565b6040805180820190915260078152661858d8dbdd5b9d60ca1b602082015281516127849160009087612ed6565b6080810151612794906001612e71565b604080518082019091526007815266726f6c654b657960c81b602082015260808201516127c49160009086612f33565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e490610cd19085908590600401614cb4565b61282460405160200161047090613db3565b61282c612cf0565b60006128388383613637565b9050612873816040518060400160405280601781526020017639b2ba20ba37b6b4b1a7b930b1b632a83937bb34b232b960491b815250612da9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663abfdcced6128ab85613684565b6040516001600160e01b031960e084901b168152600481019190915284151560248201526044016020604051808303816000875af11580156128f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612915919061488e565b5061291e613a10565b805161292b906001612e71565b604080518082019091526008815267383937bb34b232b960c11b602082015281516129599160009087612ed6565b6060810151612969906001612e71565b60408051808201909152600581526476616c756560d81b602082015260608201516129979160009086613232565b60405163483624fb60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063906c49f690610cd1908490600401614cde565b6129f560405160200161047090613db3565b6129fd612cf0565b6001548111612a22576040516373586edb60e11b8152600481018290526024016107d7565b6001819055612a2f6136c3565b612a37613a10565b6020810151612a47906001612e71565b612a8960006040518060400160405280600e81526020016d5f74696d656c6f636b44656c617960901b815250848460200151612f33909392919063ffffffff16565b60405163483624fb60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063906c49f690612ad5908490600401614d1f565b600060405180830381600087803b158015612aef57600080fd5b505af1158015612b03573d6000803e3d6000fd5b50505050506108ec6001600055565b612b2460405160200161047090613db3565b612b2c612cf0565b6000612b388383613637565b9050612b73816040518060400160405280601781526020017639b2ba20ba37b6b4b1a7b930b1b632a83937bb34b232b960491b815250612fc0565b612b7b613a10565b8051612b88906001612e71565b604080518082019091526008815267383937bb34b232b960c11b60208201528151612bb69160009087612ed6565b6060810151612bc6906001612e71565b60408051808201909152600581526476616c756560d81b60208201526060820151612bf49160009086613232565b60405163483624fb60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063906c49f690610cd1908490600401614d5e565b60405163ac4ab3fb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ac4ab3fb90612c8e9033908690600401614791565b602060405180830381865afa158015612cab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ccf919061488e565b610d0f57338160405163a35b150b60e01b81526004016107d7929190614da5565b600260005403612d425760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107d7565b6002600055565b6040516c7365744461746153747265616d60981b60208201526001600160601b0319606085901b16602d82015260418101839052606181018290526000906081016040516020818303038152906040528051906020012090509392505050565b612db2826136f1565b610d0f82826134a0565b6000604051602001612df0906020808252600e908201526d1110551057d4d51491505357d25160921b604082015260600190565b6040516020818303038152906040528051906020012082604051602001612e189291906148ed565b604051602081830303815290604052805190602001209050919050565b6000604051602001612df0906020808252601690820152752220aa20afa9aa2922a0a6afa6aaa62a24a82624a2a960511b604082015260600190565b806001600160401b03811115612e8957612e89614aae565b604051908082528060200260200182016040528015612ecf57816020015b604080518082019091526060815260006020820152815260200190600190039081612ea75790505b5090915250565b8184600001518481518110612eed57612eed614ac4565b6020026020010151600001819052508084600001518481518110612f1357612f13614ac4565b6020908102919091018101516001600160a01b0390921691015250505050565b8184600001518481518110612f4a57612f4a614ac4565b6020026020010151600001819052508084600001518481518110612f7057612f70614ac4565b6020026020010151602001818152505050505050565b6040516e30b23227b930b1b632a9b4b3b732b960891b60208201526001600160601b0319606083901b16602f820152600090604301612e18565b60008281526002602052604090205415612fed5760405163b244a10760e01b815260040160405180910390fd5b600154612ffa9042614dc9565b600083815260026020526040902055613014600383613762565b5061301d613a10565b608081015161302d906001612e71565b604080518082019091526009815268616374696f6e4b657960b81b6020820152608082015161305f9160009086612f33565b60c081015161306f906001613775565b60408051808201909152600b81526a1858dd1a5bdb931858995b60aa1b602082015260c08201516130a391600090856137d7565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e4906130f19086908590600401614ddc565b600060405180830381600087803b15801561310b57600080fd5b505af115801561311f573d6000803e3d6000fd5b50505050505050565b604080516b1cd95d141c9a58d95199595960a21b60208201526001600160601b0319606088811b8216602c84015287901b169181019190915260548101849052607481018390526094810182905260009060b40160405160208183030381529060405280519060200120905095945050505050565b604051686772616e74526f6c6560b81b60208201526001600160601b0319606084901b166029820152603d8101829052600090605d015b60405160208183030381529060405280519060200120905092915050565b6000604051602001612df0906020808252601a90820152791254d7d3d49050d31157d41493d59251115497d153905093115160321b604082015260600190565b818460000151848151811061324957613249614ac4565b602002602001015160000181905250808460000151848151811061326f5761326f614ac4565b60209081029190910181015191151591015250505050565b604051600080516020614f4a83398151915260208201526001600160601b0319606084811b8216603984015283901b16604d8201526000906061016131d4565b6000604051602001612df09060208082526019908201527827a920a1a622afa82927ab24a222a92fa327a92faa27a5a2a760391b604082015260600190565b604051600080516020614f6a83398151915260208201526001600160601b0319606084901b16603882015281151560f81b604c820152600090604d016131d4565b604051713932b6b7bb32a7b930b1b632a9b4b3b732b960711b60208201526001600160601b0319606083901b166032820152600090604601612e18565b604051697265766f6b65526f6c6560b01b60208201526001600160601b0319606084901b16602a820152603e8101829052600090605e016131d4565b6000604051602001612df0906020808252600a908201526914149250d157d191515160b21b604082015260600190565b6000604051602001612df090602080825260159082015274282924a1a2afa322a2a22fa6aaa62a24a82624a2a960591b604082015260600190565b6000604051602001612df0906020808252601d908201527f50524943455f464545445f4845415254424541545f4455524154494f4e000000604082015260600190565b6000604051602001612df0906020808252600c908201526b535441424c455f505249434560a01b604082015260600190565b60008281526002602052604081205490036134ce57604051634a7ed75160e11b815260040160405180910390fd5b6000828152600260205260408120556134e8600383613829565b506134f1613a10565b6080810151613501906001612e71565b604080518082019091526009815268616374696f6e4b657960b81b602082015260808201516135339160009086612f33565b60c0810151613543906001613775565b60408051808201909152600b81526a1858dd1a5bdb931858995b60aa1b602082015260c082015161357791600090856137d7565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e4906130f19086908590600401614e1f565b6000806135d183613835565b9150915080156135f5578160405162461bcd60e51b81526004016107d79190614e61565b61078f836138c5565b6040516d39b2ba2332b2a932b1b2b4bb32b960911b60208201526001600160601b0319606083901b16602e820152600090604201612e18565b6040517639b2ba20ba37b6b4b1a7b930b1b632a83937bb34b232b960491b60208201526001600160601b0319606084901b16603782015281151560f81b604b820152600090604c016131d4565b6000604051602001612df09060208082526019908201527824a9afa0aa27a6a4a1afa7a920a1a622afa82927ab24a222a960391b604082015260600190565b6206978060015411156136ef57600154604051633ebd9bc360e21b81526004016107d791815260200190565b565b600081815260026020526040812054900361371f57604051634a7ed75160e11b815260040160405180910390fd5b4260008281526002602052604090205411156108ec576000818152600260205260409081902054905163082c8d6160e21b815260048101919091526024016107d7565b600061376e83836138ce565b9392505050565b806001600160401b0381111561378d5761378d614aae565b604051908082528060200260200182016040528015612ecf57816020015b60408051808201909152606080825260208201528152602001906001900390816137ab57505090915250565b81846000015184815181106137ee576137ee614ac4565b602002602001015160000181905250808460000151848151811061381457613814614ac4565b60200260200101516020018190525050505050565b600061376e838361391d565b6060600060448351101561385c575050604080516020810190915260008082529092909150565b6000613869846020015190565b90506307b9e43360e51b6001600160e01b03198216016138a8576004840193508380602001905181019061389d9190614e74565b946001945092505050565b600060405180602001604052806000815250909250925050915091565b80518060208301fd5b600081815260018301602052604081205461391557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611f92565b506000611f92565b60008181526001830160205260408120548015613a06576000613941600183614f20565b855490915060009061395590600190614f20565b90508181146139ba57600086600001828154811061397557613975614ac4565b906000526020600020015490508087600001848154811061399857613998614ac4565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806139cb576139cb614f33565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611f92565b6000915050611f92565b604080516101208101909152606060e0820181815261010083019190915281908152602001613a52604051806040016040528060608152602001606081525090565b8152602001613a74604051806040016040528060608152602001606081525090565b8152602001613a96604051806040016040528060608152602001606081525090565b8152602001613ab8604051806040016040528060608152602001606081525090565b8152602001613ada604051806040016040528060608152602001606081525090565b8152602001613afc604051806040016040528060608152602001606081525090565b905290565b6001600160a01b03811681146108ec57600080fd5b600080600060608486031215613b2b57600080fd5b8335613b3681613b01565b95602085013595506040909401359392505050565b600060208284031215613b5d57600080fd5b813561376e81613b01565b600080600080600060a08688031215613b8057600080fd5b8535613b8b81613b01565b94506020860135613b9b81613b01565b94979496505050506040830135926060810135926080909101359150565b60008060408385031215613bcc57600080fd5b8235613bd781613b01565b946020939093013593505050565b6001600160a01b0391909116815260200190565b80151581146108ec57600080fd5b60008060408385031215613c1a57600080fd5b8235613c2581613b01565b91506020830135613c3581613bf9565b809150509250929050565b60008060408385031215613c5357600080fd5b8235613c5e81613b01565b91506020830135613c3581613b01565b600060208284031215613c8057600080fd5b5035919050565b60008060208385031215613c9a57600080fd5b82356001600160401b0380821115613cb157600080fd5b818501915085601f830112613cc557600080fd5b813581811115613cd457600080fd5b8660208260051b8501011115613ce957600080fd5b60209290920196919550909350505050565b60005b83811015613d16578181015183820152602001613cfe565b50506000910152565b60008151808452613d37816020860160208601613cfb565b601f01601f19169290920160200192915050565b600081518084526020808501808196508360051b8101915082860160005b85811015613d93578284038952613d81848351613d1f565b98850198935090840190600101613d69565b5091979650505050505050565b60208152600061376e6020830184613d4b565b6020808252600e908201526d2a24a6a2a627a1a5afa0a226a4a760911b604082015260600190565b918252602082015260400190565b600060208284031215613dfb57600080fd5b5051919050565b600081518084526020808501808196508360051b810191508286016000805b86811015613e9d578385038a52825160408151818852613e4382890182613d1f565b92890151888403898b01528051808552908a01938693508a0191505b80831015613e885783516001600160a01b03168252928901926001929092019190890190613e5f565b509b88019b9650505091850191600101613e21565b509298975050505050505050565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b82811015613f2257898603605f1901845284518051888852613efc89890182613d1f565b918401516001600160a01b03169784019790975295509381019392810192600101613ed8565b50808801519550888503818a015250505050613f3e8183613e02565b95945050505050565b600081518084526020808501808196508360051b810191508286016000805b86811015613e9d578385038a52825160408151818852613f8882890182613d1f565b92890151888403898b01528051808552908a01938693508a0191505b80831015613fc45783518252928901926001929092019190890190613fa4565b509b88019b9650505091850191600101613f66565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b8281101561404757898603605f190184528451805188885261402a89890182613d1f565b918401519784019790975295509381019392810192600101614006565b50808801519550888503818a015250505050613f3e8183613f47565b600081518084526020808501808196508360051b810191508286016000805b86811015613e9d578385038a528251604081518188526140a482890182613d1f565b92890151888403898b01528051808552908a01938693508a0191505b808310156140e057835182529289019260019290920191908901906140c0565b509b88019b9650505091850191600101614082565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b8281101561416357898603605f190184528451805188885261414689890182613d1f565b918401519784019790975295509381019392810192600101614122565b50808801519550888503818a015250505050613f3e8183614063565b600081518084526020808501808196508360051b810191508286016000805b86811015613e9d578385038a528251604081518188526141c082890182613d1f565b92890151888403898b01528051808552908a01938693508a0191505b808310156141fe578351151582529289019260019290920191908901906141dc565b509b88019b965050509185019160010161419e565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b8281101561428357898603605f190184528451805188885261426489890182613d1f565b9184015115159784019790975295509381019392810192600101614240565b50808801519550888503818a015250505050613f3e818361417f565b600081518084526020808501808196508360051b810191508286016000805b86811015613e9d578385038a528251604081518188526142e082890182613d1f565b92890151888403898b01528051808552908a01938693508a0191505b8083101561431c57835182529289019260019290920191908901906142fc565b509b88019b96505050918501916001016142be565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b8281101561439f57898603605f190184528451805188885261438289890182613d1f565b91840151978401979097529550938101939281019260010161435e565b50808801519550888503818a015250505050613f3e818361429f565b600081518084526020808501808196508360051b8101915082860160005b85811015613d935782840389528151604081518187526143fb82880182613d1f565b915050868201519150858103878701526144158183613d4b565b9a87019a95505050908401906001016143d9565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b828110156144a657898603605f190184528451805188885261447a89890182613d1f565b91840151888303898601529190506144928183613d1f565b975050509381019392810192600101614456565b50808801519550888503818a015250505050613f3e81836143bb565b600081518084526020808501808196506005915083821b81018387016000805b8781101561456d578484038b5282516040815181875261450482880182613d1f565b928a0151878403888c01528051808552908b019392508a83019150808a1b83018b01865b8281101561455657601f19858303018452614544828751613d1f565b958d0195938d01939150600101614528565b509e8b019e975050509388019350506001016144e2565b50919998505050505050505050565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b828110156145f957898603605f19018452845180518888526145cd89890182613d1f565b91840151888303898601529190506145e58183613d1f565b9750505093810193928101926001016145a9565b50808801519550888503818a015250505050613f3e81836144c2565b6000815160e0845261462a60e0850182613eab565b9050602083015184820360208601526146438282613fd9565b9150506040830151848203604086015261465d82826140f5565b915050606083015184820360608601526146778282614213565b915050608083015184820360808601526146918282614331565b91505060a083015184820360a08601526146ab8282614429565b91505060c083015184820360c0860152613f3e828261457c565b60608152600d60608201526c5365744461746153747265616d60981b608082015282602082015260a06040820152600061470260a0830184614615565b949350505050565b60608152601560608201527429b4b3b730b620b23227b930b1b632a9b4b3b732b960591b608082015282602082015260a06040820152600061470260a0830184614615565b60608152601260608201527114da59db985b14d95d141c9a58d95199595960721b608082015282602082015260a06040820152600061470260a0830184614615565b6001600160a01b03929092168252602082015260400190565b6060815260096060820152684772616e74526f6c6560b81b608082015282602082015260a06040820152600061470260a0830184614615565b60208082526011908201527054494d454c4f434b5f4d554c544953494760781b604082015260600190565b600a8152695265766f6b65526f6c6560b01b602082015260400190565b60408152600061483d6040830161480e565b82810360208401526147028185614615565b60608152600f60608201526e20b23227b930b1b632a9b4b3b732b960891b608082015282602082015260a06040820152600061470260a0830184614615565b6000602082840312156148a057600080fd5b815161376e81613bf9565b60408152601860408201527714d95d13dc9858db19541c9bdd9a59195c915b98589b195960421b606082015260806020820152600061376e6080830184614615565b9182526001600160a01b0316602082015260400190565b60006020828403121561491657600080fd5b815161376e81613b01565b60408152601960408201527829b2ba27b930b1b632a83937bb34b232b92337b92a37b5b2b760391b606082015260806020820152600061376e6080830184614615565b60608152601860608201527729b4b3b730b62932b6b7bb32a7b930b1b632a9b4b3b732b960411b608082015282602082015260a06040820152600061470260a0830184614615565b60608152601060608201526f5369676e616c5265766f6b65526f6c6560801b608082015282602082015260a06040820152600061470260a0830184614615565b60608152600c60608201526b14d95d141c9a58d95199595960a21b608082015282602082015260a06040820152600061470260a0830184614615565b60408152601f60408201527f5369676e616c5365744f7261636c6550726f7669646572466f72546f6b656e00606082015260806020820152600061376e6080830184614615565b60608152600f60608201526e5369676e616c4772616e74526f6c6560881b608082015282602082015260a06040820152600061470260a0830184614615565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112614af157600080fd5b8301803591506001600160401b03821115614b0b57600080fd5b602001915036819003821315614b2057600080fd5b9250929050565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b600060018201614b5f57614b5f614b37565b5060010190565b60608152601460608201527329b4b3b730b629b2ba2332b2a932b1b2b4bb32b960611b608082015282602082015260a06040820152600061470260a0830184614615565b6060815260126060820152712932b6b7bb32a7b930b1b632a9b4b3b732b960711b608082015282602082015260a06040820152600061470260a0830184614615565b60408152601e60408201527f5369676e616c5365744f7261636c6550726f7669646572456e61626c65640000606082015260806020820152600061376e6080830184614615565b60608152600e60608201526d29b2ba2332b2a932b1b2b4bb32b960911b608082015282602082015260a06040820152600061470260a0830184614615565b6060815260136060820152725369676e616c5365744461746153747265616d60681b608082015282602082015260a06040820152600061470260a0830184614615565b606081526000614cc66060830161480e565b8460208401528281036040840152613f3e8185614615565b60408152601760408201527629b2ba20ba37b6b4b1a7b930b1b632a83937bb34b232b960491b606082015260806020820152600061376e6080830184614615565b604081526015604082015274496e63726561736554696d656c6f636b44656c617960581b606082015260806020820152600061376e6080830184614615565b60408152601d60408201527f5369676e616c53657441746f6d69634f7261636c6550726f7669646572000000606082015260806020820152600061376e6080830184614615565b6001600160a01b038316815260406020820181905260009061470290830184613d1f565b80820180821115611f9257611f92614b37565b60608152601360608201527229b4b3b730b62832b73234b733a0b1ba34b7b760691b608082015282602082015260a06040820152600061470260a0830184614615565b60608152601260608201527121b632b0b92832b73234b733a0b1ba34b7b760711b608082015282602082015260a06040820152600061470260a0830184614615565b60208152600061376e6020830184613d1f565b600060208284031215614e8657600080fd5b81516001600160401b0380821115614e9d57600080fd5b818401915084601f830112614eb157600080fd5b815181811115614ec357614ec3614aae565b604051601f8201601f19908116603f01168101908382118183101715614eeb57614eeb614aae565b81604052828152876020848701011115614f0457600080fd5b614f15836020830160208801613cfb565b979650505050505050565b81810381811115611f9257611f92614b37565b634e487b7160e01b600052603160045260246000fdfe7365744f7261636c6550726f7669646572466f72546f6b656e000000000000007365744f7261636c6550726f7669646572456e61626c65640000000000000000a2646970667358221220f14607a41a42bd05cbe939d17742b48c265f3b87f92c77561416b59b1fee46d164736f6c63430008120033", "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101805760003560e01c80630eaf7fc4146101855780630f43905d1461019a5780630fe29bbc146101ad5780630ffc3cf6146101c0578063208dd1ff146101d35780632a083ca3146101e65780632d6b4cc614610203578063392bf7f61461021657806349c73bca1461024a5780634a4a7b041461025d5780635077e242146102845780635bb70a2014610297578063660d0d67146102aa57806369bc0f3b146102d1578063728ca574146102e457806375fa1913146102f7578063781cc3d31461030a5780637c326db61461031d5780639ff78c3014610330578063a9765cae14610357578063ac9650d81461036a578063b6b9b02f1461038a578063bcb151e41461039d578063c15ab4ec146103b0578063c4fe486c146103c3578063ccdd6bb0146103d6578063d59ba7e4146103e9578063d5b0083b146103fc578063e30569e51461040f578063eef09bad1461042f578063f03278d414610438578063f2ee93771461044b575b600080fd5b610198610193366004613b16565b61045e565b005b6101986101a8366004613b4b565b610794565b6101986101bb366004613b68565b6108ef565b6101986101ce366004613bb9565b610b2e565b6101986101e1366004613bb9565b610d13565b6101f06206978081565b6040519081526020015b60405180910390f35b610198610211366004613b4b565b610efd565b61023d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516101fa9190613be5565b610198610258366004613c07565b611063565b61023d7f000000000000000000000000000000000000000000000000000000000000000081565b610198610292366004613c40565b6111ed565b6101986102a5366004613c07565b611396565b61023d7f000000000000000000000000000000000000000000000000000000000000000081565b6101986102df366004613b4b565b61155b565b6101986102f2366004613bb9565b61166f565b610198610305366004613b68565b611793565b610198610318366004613c6e565b611bf5565b61019861032b366004613c40565b611c47565b61023d7f000000000000000000000000000000000000000000000000000000000000000081565b610198610365366004613bb9565b611d56565b61037d610378366004613c87565b611e79565b6040516101fa9190613da0565b610198610398366004613b4b565b611f98565b6101986103ab366004613b4b565b6120a8565b6101986103be366004613c07565b612211565b6101986103d1366004613b4b565b612333565b6101986103e4366004613b16565b6124f1565b6101986103f7366004613bb9565b61266e565b61019861040a366004613c07565b612812565b6101f061041d366004613c6e565b60026020526000908152604090205481565b6101f060015481565b610198610446366004613c6e565b6129e3565b610198610459366004613c07565b612b12565b6104b260405160200161047090613db3565b604051602081830303815290604052805190602001206040518060400160405280600e81526020016d2a24a6a2a627a1a5afa0a226a4a760911b815250612c40565b6104ba612cf0565b60006104c7848484612d49565b90506104f8816040518060400160405280600d81526020016c7365744461746153747265616d60981b815250612da9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634e91db0861053086612dbc565b856040518363ffffffff1660e01b815260040161054e929190613ddb565b6020604051808303816000875af115801561056d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105919190613de9565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e2a4853a6105ca86612e35565b846040518363ffffffff1660e01b81526004016105e8929190613ddb565b6020604051808303816000875af1158015610607573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062b9190613de9565b50610634613a10565b8051610641906001612e71565b6040805180820190915260058152643a37b5b2b760d91b6020820152815161066c9160009088612ed6565b608081015161067c906001612e71565b60408051808201909152600681526519995959125960d21b602082015260808201516106ab9160009087612f33565b60208101516106bb906001612e71565b6107036000604051806040016040528060148152602001733230ba30a9ba3932b0b6a6bab63a34b83634b2b960611b815250858460200151612f33909392919063ffffffff16565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e49061075190859085906004016146c5565b600060405180830381600087803b15801561076b57600080fd5b505af115801561077f573d6000803e3d6000fd5b50505050505061078f6001600055565b505050565b6107a660405160200161047090613db3565b6107ae612cf0565b6001600160a01b0381166107e0578060405163c1b14c9160e01b81526004016107d79190613be5565b60405180910390fd5b60006107eb82612f86565b905061081e816040518060400160405280600f81526020016e30b23227b930b1b632a9b4b3b732b960891b815250612fc0565b610826613a10565b8051610833906001612e71565b6040805180820190915260078152661858d8dbdd5b9d60ca1b602082015281516108609160009086612ed6565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e4906108ae908590859060040161470a565b600060405180830381600087803b1580156108c857600080fd5b505af11580156108dc573d6000803e3d6000fd5b5050505050506108ec6001600055565b50565b61090160405160200161047090613db3565b610909612cf0565b60006109188686868686613128565b9050610948816040518060400160405280600c81526020016b1cd95d141c9a58d95199595960a21b815250612fc0565b610950613a10565b805161095d906002612e71565b6040805180820190915260058152643a37b5b2b760d91b60208201528151610988916000908a612ed6565b6040805180820190915260098152681c1c9a58d95199595960ba1b602082015281516109b79160019089612ed6565b60208101516109c7906003612e71565b610a0e600060405180604001604052806013815260200172383934b1b2a332b2b226bab63a34b83634b2b960691b815250878460200151612f33909392919063ffffffff16565b610a5c60016040518060400160405280601a815260200179383934b1b2a332b2b22432b0b93a3132b0ba223ab930ba34b7b760311b815250868460200151612f33909392919063ffffffff16565b610a9b60026040518060400160405280600b81526020016a737461626c65507269636560a81b815250858460200151612f33909392919063ffffffff16565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e490610ae9908590859060040161474f565b600060405180830381600087803b158015610b0357600080fd5b505af1158015610b17573d6000803e3d6000fd5b505050505050610b276001600055565b5050505050565b610b4060405160200161047090613db3565b610b48612cf0565b6000610b54838361319d565b9050610b8181604051806040016040528060098152602001686772616e74526f6c6560b81b815250612da9565b604051632ac9d0b760e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ab2742dc90610bcf9086908690600401614791565b600060405180830381600087803b158015610be957600080fd5b505af1158015610bfd573d6000803e3d6000fd5b50505050610c09613a10565b8051610c16906001612e71565b6040805180820190915260078152661858d8dbdd5b9d60ca1b60208201528151610c439160009087612ed6565b6080810151610c53906001612e71565b604080518082019091526007815266726f6c654b657960c81b60208201526080820151610c839160009086612f33565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e490610cd190859085906004016147aa565b600060405180830381600087803b158015610ceb57600080fd5b505af1158015610cff573d6000803e3d6000fd5b505050505050610d0f6001600055565b5050565b610d6a604051602001610d25906147e3565b604051602081830303815290604052805190602001206040518060400160405280601181526020017054494d454c4f434b5f4d554c544953494760781b815250612c40565b610d72612cf0565b60405163208dd1ff60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063208dd1ff90610dc09085908590600401614791565b600060405180830381600087803b158015610dda57600080fd5b505af1158015610dee573d6000803e3d6000fd5b50505050610dfa613a10565b8051610e07906001612e71565b6040805180820190915260078152661858d8dbdd5b9d60ca1b60208201528151610e349160009086612ed6565b6080810151610e44906001612e71565b604080518082019091526007815266726f6c654b657960c81b60208201526080820151610e749160009085612f33565b60405163483624fb60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063906c49f690610ec090849060040161482b565b600060405180830381600087803b158015610eda57600080fd5b505af1158015610eee573d6000803e3d6000fd5b5050505050610d0f6001600055565b610f0f60405160200161047090613db3565b610f17612cf0565b6000610f2282612f86565b9050610f55816040518060400160405280600f81526020016e30b23227b930b1b632a9b4b3b732b960891b815250612da9565b6040516375896b0f60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063eb12d61e90610fa1908590600401613be5565b600060405180830381600087803b158015610fbb57600080fd5b505af1158015610fcf573d6000803e3d6000fd5b50505050610fdb613a10565b8051610fe8906001612e71565b6040805180820190915260078152661858d8dbdd5b9d60ca1b602082015281516110159160009086612ed6565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e4906108ae908590859060040161484f565b611075604051602001610d25906147e3565b61107d612cf0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663abfdcced6110b5846131f2565b6040516001600160e01b031960e084901b168152600481019190915283151560248201526044016020604051808303816000875af11580156110fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111f919061488e565b50611128613a10565b8051611135906001612e71565b604080518082019091526008815267383937bb34b232b960c11b602082015281516111639160009086612ed6565b6060810151611173906001612e71565b60408051808201909152600581526476616c756560d81b602082015260608201516111a19160009085613232565b60405163483624fb60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063906c49f690610ec09084906004016148ab565b6111ff60405160200161047090613db3565b611207612cf0565b60006112138383613287565b905061124281604051806040016040528060198152602001600080516020614f4a833981519152815250612da9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ca446dd961127a856132c7565b846040518363ffffffff1660e01b81526004016112989291906148ed565b6020604051808303816000875af11580156112b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112db9190614904565b506112e4613a10565b80516112f1906002612e71565b6040805180820190915260058152643a37b5b2b760d91b6020820152815161131c9160009087612ed6565b604080518082019091526008815267383937bb34b232b960c11b6020820152815161134a9160019086612ed6565b60405163483624fb60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063906c49f690610cd1908490600401614921565b6113a860405160200161047090613db3565b6113b0612cf0565b60006113bc8383613306565b90506113eb81604051806040016040528060188152602001600080516020614f6a833981519152815250612da9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663abfdcced611423856131f2565b6040516001600160e01b031960e084901b168152600481019190915284151560248201526044016020604051808303816000875af1158015611469573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148d919061488e565b50611496613a10565b80516114a3906001612e71565b604080518082019091526008815267383937bb34b232b960c11b602082015281516114d19160009087612ed6565b60608101516114e1906001612e71565b60408051808201909152600581526476616c756560d81b6020820152606082015161150f9160009086613232565b60405163483624fb60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063906c49f690610cd19084906004016148ab565b61156d60405160200161047090613db3565b611575612cf0565b6001600160a01b03811661159e578060405163c1b14c9160e01b81526004016107d79190613be5565b60006115a982613347565b90506115df81604051806040016040528060128152602001713932b6b7bb32a7b930b1b632a9b4b3b732b960711b815250612fc0565b6115e7613a10565b80516115f4906001612e71565b6040805180820190915260078152661858d8dbdd5b9d60ca1b602082015281516116219160009086612ed6565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e4906108ae9085908590600401614964565b61168160405160200161047090613db3565b611689612cf0565b60006116958383613384565b90506116c3816040518060400160405280600a8152602001697265766f6b65526f6c6560b01b815250612fc0565b6116cb613a10565b80516116d8906001612e71565b6040805180820190915260078152661858d8dbdd5b9d60ca1b602082015281516117059160009087612ed6565b6080810151611715906001612e71565b604080518082019091526007815266726f6c654b657960c81b602082015260808201516117459160009086612f33565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e490610cd190859085906004016149ac565b6117a560405160200161047090613db3565b6117ad612cf0565b60006117bc8686868686613128565b90506117ec816040518060400160405280600c81526020016b1cd95d141c9a58d95199595960a21b815250612da9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ca446dd9611824886133c0565b876040518363ffffffff1660e01b81526004016118429291906148ed565b6020604051808303816000875af1158015611861573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118859190614904565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e2a4853a6118be886133f0565b866040518363ffffffff1660e01b81526004016118dc929190613ddb565b6020604051808303816000875af11580156118fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191f9190613de9565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e2a4853a6119588861342b565b856040518363ffffffff1660e01b8152600401611976929190613ddb565b6020604051808303816000875af1158015611995573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b99190613de9565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e2a4853a6119f28861346e565b846040518363ffffffff1660e01b8152600401611a10929190613ddb565b6020604051808303816000875af1158015611a2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a539190613de9565b50611a5c613a10565b8051611a69906002612e71565b6040805180820190915260058152643a37b5b2b760d91b60208201528151611a94916000908a612ed6565b6040805180820190915260098152681c1c9a58d95199595960ba1b60208201528151611ac39160019089612ed6565b6020810151611ad3906003612e71565b611b1a600060405180604001604052806013815260200172383934b1b2a332b2b226bab63a34b83634b2b960691b815250878460200151612f33909392919063ffffffff16565b611b6860016040518060400160405280601a815260200179383934b1b2a332b2b22432b0b93a3132b0ba223ab930ba34b7b760311b815250868460200151612f33909392919063ffffffff16565b611ba760026040518060400160405280600b81526020016a737461626c65507269636560a81b815250858460200151612f33909392919063ffffffff16565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e490610ae990859085906004016149ec565b611c0760405160200161047090613db3565b611c0f612cf0565b611c3d816040518060400160405280600c81526020016b31b0b731b2b620b1ba34b7b760a11b8152506134a0565b6108ec6001600055565b611c5960405160200161047090613db3565b611c61612cf0565b6000611c6d8383613287565b9050611c9c81604051806040016040528060198152602001600080516020614f4a833981519152815250612fc0565b611ca4613a10565b8051611cb1906002612e71565b6040805180820190915260058152643a37b5b2b760d91b60208201528151611cdc9160009087612ed6565b604080518082019091526008815267383937bb34b232b960c11b60208201528151611d0a9160019086612ed6565b60405163483624fb60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063906c49f690610cd1908490600401614a28565b611d6860405160200161047090613db3565b611d70612cf0565b6000611d7c838361319d565b9050611da981604051806040016040528060098152602001686772616e74526f6c6560b81b815250612fc0565b611db1613a10565b8051611dbe906001612e71565b6040805180820190915260078152661858d8dbdd5b9d60ca1b60208201528151611deb9160009087612ed6565b6080810151611dfb906001612e71565b604080518082019091526007815266726f6c654b657960c81b60208201526080820151611e2b9160009086612f33565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e490610cd19085908590600401614a6f565b6060816001600160401b03811115611e9357611e93614aae565b604051908082528060200260200182016040528015611ec657816020015b6060815260200190600190039081611eb15790505b50905060005b82811015611f905760008030868685818110611eea57611eea614ac4565b9050602002810190611efc9190614ada565b604051611f0a929190614b27565b600060405180830381855af49150503d8060008114611f45576040519150601f19603f3d011682016040523d82523d6000602084013e611f4a565b606091505b509150915081611f5d57611f5d816135c5565b80848481518110611f7057611f70614ac4565b602002602001018190525050508080611f8890614b4d565b915050611ecc565b505b92915050565b611faa60405160200161047090613db3565b611fb2612cf0565b6001600160a01b038116611fdb578060405163cb9339d560e01b81526004016107d79190613be5565b6000611fe6826135fe565b9050612018816040518060400160405280600e81526020016d39b2ba2332b2a932b1b2b4bb32b960911b815250612fc0565b612020613a10565b805161202d906001612e71565b6040805180820190915260078152661858d8dbdd5b9d60ca1b6020820152815161205a9160009086612ed6565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e4906108ae9085908590600401614b66565b6120ba60405160200161047090613db3565b6120c2612cf0565b60006120cd82613347565b905061210381604051806040016040528060128152602001713932b6b7bb32a7b930b1b632a9b4b3b732b960711b815250612da9565b604051630e316ab760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630e316ab79061214f908590600401613be5565b600060405180830381600087803b15801561216957600080fd5b505af115801561217d573d6000803e3d6000fd5b50505050612189613a10565b8051612196906001612e71565b6040805180820190915260078152661858d8dbdd5b9d60ca1b602082015281516121c39160009086612ed6565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e4906108ae9085908590600401614baa565b61222360405160200161047090613db3565b61222b612cf0565b60006122378383613306565b905061226681604051806040016040528060188152602001600080516020614f6a833981519152815250612fc0565b61226e613a10565b805161227b906001612e71565b604080518082019091526008815267383937bb34b232b960c11b602082015281516122a99160009087612ed6565b60608101516122b9906001612e71565b60408051808201909152600581526476616c756560d81b602082015260608201516122e79160009086613232565b60405163483624fb60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063906c49f690610cd1908490600401614bec565b61234560405160200161047090613db3565b61234d612cf0565b6000612358826135fe565b905061238a816040518060400160405280600e81526020016d39b2ba2332b2a932b1b2b4bb32b960911b815250612da9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ca446dd96040516020016123e9906020808252600c908201526b2322a2afa922a1a2a4ab22a960a11b604082015260600190565b60405160208183030381529060405280519060200120846040518363ffffffff1660e01b815260040161241d9291906148ed565b6020604051808303816000875af115801561243c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124609190614904565b50612469613a10565b8051612476906001612e71565b6040805180820190915260078152661858d8dbdd5b9d60ca1b602082015281516124a39160009086612ed6565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e4906108ae9085908590600401614c33565b61250360405160200161047090613db3565b61250b612cf0565b6000612518848484612d49565b9050612549816040518060400160405280600d81526020016c7365744461746153747265616d60981b815250612fc0565b612551613a10565b805161255e906001612e71565b6040805180820190915260058152643a37b5b2b760d91b602082015281516125899160009088612ed6565b6080810151612599906001612e71565b60408051808201909152600681526519995959125960d21b602082015260808201516125c89160009087612f33565b60208101516125d8906001612e71565b6126206000604051806040016040528060148152602001733230ba30a9ba3932b0b6a6bab63a34b83634b2b960611b815250858460200151612f33909392919063ffffffff16565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e4906107519085908590600401614c71565b61268060405160200161047090613db3565b612688612cf0565b60006126948383613384565b90506126c2816040518060400160405280600a8152602001697265766f6b65526f6c6560b01b815250612da9565b60405163208dd1ff60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063208dd1ff906127109086908690600401614791565b600060405180830381600087803b15801561272a57600080fd5b505af115801561273e573d6000803e3d6000fd5b5050505061274a613a10565b8051612757906001612e71565b6040805180820190915260078152661858d8dbdd5b9d60ca1b602082015281516127849160009087612ed6565b6080810151612794906001612e71565b604080518082019091526007815266726f6c654b657960c81b602082015260808201516127c49160009086612f33565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e490610cd19085908590600401614cb4565b61282460405160200161047090613db3565b61282c612cf0565b60006128388383613637565b9050612873816040518060400160405280601781526020017639b2ba20ba37b6b4b1a7b930b1b632a83937bb34b232b960491b815250612da9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663abfdcced6128ab85613684565b6040516001600160e01b031960e084901b168152600481019190915284151560248201526044016020604051808303816000875af11580156128f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612915919061488e565b5061291e613a10565b805161292b906001612e71565b604080518082019091526008815267383937bb34b232b960c11b602082015281516129599160009087612ed6565b6060810151612969906001612e71565b60408051808201909152600581526476616c756560d81b602082015260608201516129979160009086613232565b60405163483624fb60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063906c49f690610cd1908490600401614cde565b6129f560405160200161047090613db3565b6129fd612cf0565b6001548111612a22576040516373586edb60e11b8152600481018290526024016107d7565b6001819055612a2f6136c3565b612a37613a10565b6020810151612a47906001612e71565b612a8960006040518060400160405280600e81526020016d5f74696d656c6f636b44656c617960901b815250848460200151612f33909392919063ffffffff16565b60405163483624fb60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063906c49f690612ad5908490600401614d1f565b600060405180830381600087803b158015612aef57600080fd5b505af1158015612b03573d6000803e3d6000fd5b50505050506108ec6001600055565b612b2460405160200161047090613db3565b612b2c612cf0565b6000612b388383613637565b9050612b73816040518060400160405280601781526020017639b2ba20ba37b6b4b1a7b930b1b632a83937bb34b232b960491b815250612fc0565b612b7b613a10565b8051612b88906001612e71565b604080518082019091526008815267383937bb34b232b960c11b60208201528151612bb69160009087612ed6565b6060810151612bc6906001612e71565b60408051808201909152600581526476616c756560d81b60208201526060820151612bf49160009086613232565b60405163483624fb60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063906c49f690610cd1908490600401614d5e565b60405163ac4ab3fb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ac4ab3fb90612c8e9033908690600401614791565b602060405180830381865afa158015612cab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ccf919061488e565b610d0f57338160405163a35b150b60e01b81526004016107d7929190614da5565b600260005403612d425760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107d7565b6002600055565b6040516c7365744461746153747265616d60981b60208201526001600160601b0319606085901b16602d82015260418101839052606181018290526000906081016040516020818303038152906040528051906020012090509392505050565b612db2826136f1565b610d0f82826134a0565b6000604051602001612df0906020808252600e908201526d1110551057d4d51491505357d25160921b604082015260600190565b6040516020818303038152906040528051906020012082604051602001612e189291906148ed565b604051602081830303815290604052805190602001209050919050565b6000604051602001612df0906020808252601690820152752220aa20afa9aa2922a0a6afa6aaa62a24a82624a2a960511b604082015260600190565b806001600160401b03811115612e8957612e89614aae565b604051908082528060200260200182016040528015612ecf57816020015b604080518082019091526060815260006020820152815260200190600190039081612ea75790505b5090915250565b8184600001518481518110612eed57612eed614ac4565b6020026020010151600001819052508084600001518481518110612f1357612f13614ac4565b6020908102919091018101516001600160a01b0390921691015250505050565b8184600001518481518110612f4a57612f4a614ac4565b6020026020010151600001819052508084600001518481518110612f7057612f70614ac4565b6020026020010151602001818152505050505050565b6040516e30b23227b930b1b632a9b4b3b732b960891b60208201526001600160601b0319606083901b16602f820152600090604301612e18565b60008281526002602052604090205415612fed5760405163b244a10760e01b815260040160405180910390fd5b600154612ffa9042614dc9565b600083815260026020526040902055613014600383613762565b5061301d613a10565b608081015161302d906001612e71565b604080518082019091526009815268616374696f6e4b657960b81b6020820152608082015161305f9160009086612f33565b60c081015161306f906001613775565b60408051808201909152600b81526a1858dd1a5bdb931858995b60aa1b602082015260c08201516130a391600090856137d7565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e4906130f19086908590600401614ddc565b600060405180830381600087803b15801561310b57600080fd5b505af115801561311f573d6000803e3d6000fd5b50505050505050565b604080516b1cd95d141c9a58d95199595960a21b60208201526001600160601b0319606088811b8216602c84015287901b169181019190915260548101849052607481018390526094810182905260009060b40160405160208183030381529060405280519060200120905095945050505050565b604051686772616e74526f6c6560b81b60208201526001600160601b0319606084901b166029820152603d8101829052600090605d015b60405160208183030381529060405280519060200120905092915050565b6000604051602001612df0906020808252601a90820152791254d7d3d49050d31157d41493d59251115497d153905093115160321b604082015260600190565b818460000151848151811061324957613249614ac4565b602002602001015160000181905250808460000151848151811061326f5761326f614ac4565b60209081029190910181015191151591015250505050565b604051600080516020614f4a83398151915260208201526001600160601b0319606084811b8216603984015283901b16604d8201526000906061016131d4565b6000604051602001612df09060208082526019908201527827a920a1a622afa82927ab24a222a92fa327a92faa27a5a2a760391b604082015260600190565b604051600080516020614f6a83398151915260208201526001600160601b0319606084901b16603882015281151560f81b604c820152600090604d016131d4565b604051713932b6b7bb32a7b930b1b632a9b4b3b732b960711b60208201526001600160601b0319606083901b166032820152600090604601612e18565b604051697265766f6b65526f6c6560b01b60208201526001600160601b0319606084901b16602a820152603e8101829052600090605e016131d4565b6000604051602001612df0906020808252600a908201526914149250d157d191515160b21b604082015260600190565b6000604051602001612df090602080825260159082015274282924a1a2afa322a2a22fa6aaa62a24a82624a2a960591b604082015260600190565b6000604051602001612df0906020808252601d908201527f50524943455f464545445f4845415254424541545f4455524154494f4e000000604082015260600190565b6000604051602001612df0906020808252600c908201526b535441424c455f505249434560a01b604082015260600190565b60008281526002602052604081205490036134ce57604051634a7ed75160e11b815260040160405180910390fd5b6000828152600260205260408120556134e8600383613829565b506134f1613a10565b6080810151613501906001612e71565b604080518082019091526009815268616374696f6e4b657960b81b602082015260808201516135339160009086612f33565b60c0810151613543906001613775565b60408051808201909152600b81526a1858dd1a5bdb931858995b60aa1b602082015260c082015161357791600090856137d7565b604051630937807960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906324de01e4906130f19086908590600401614e1f565b6000806135d183613835565b9150915080156135f5578160405162461bcd60e51b81526004016107d79190614e61565b61078f836138c5565b6040516d39b2ba2332b2a932b1b2b4bb32b960911b60208201526001600160601b0319606083901b16602e820152600090604201612e18565b6040517639b2ba20ba37b6b4b1a7b930b1b632a83937bb34b232b960491b60208201526001600160601b0319606084901b16603782015281151560f81b604b820152600090604c016131d4565b6000604051602001612df09060208082526019908201527824a9afa0aa27a6a4a1afa7a920a1a622afa82927ab24a222a960391b604082015260600190565b6206978060015411156136ef57600154604051633ebd9bc360e21b81526004016107d791815260200190565b565b600081815260026020526040812054900361371f57604051634a7ed75160e11b815260040160405180910390fd5b4260008281526002602052604090205411156108ec576000818152600260205260409081902054905163082c8d6160e21b815260048101919091526024016107d7565b600061376e83836138ce565b9392505050565b806001600160401b0381111561378d5761378d614aae565b604051908082528060200260200182016040528015612ecf57816020015b60408051808201909152606080825260208201528152602001906001900390816137ab57505090915250565b81846000015184815181106137ee576137ee614ac4565b602002602001015160000181905250808460000151848151811061381457613814614ac4565b60200260200101516020018190525050505050565b600061376e838361391d565b6060600060448351101561385c575050604080516020810190915260008082529092909150565b6000613869846020015190565b90506307b9e43360e51b6001600160e01b03198216016138a8576004840193508380602001905181019061389d9190614e74565b946001945092505050565b600060405180602001604052806000815250909250925050915091565b80518060208301fd5b600081815260018301602052604081205461391557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611f92565b506000611f92565b60008181526001830160205260408120548015613a06576000613941600183614f20565b855490915060009061395590600190614f20565b90508181146139ba57600086600001828154811061397557613975614ac4565b906000526020600020015490508087600001848154811061399857613998614ac4565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806139cb576139cb614f33565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611f92565b6000915050611f92565b604080516101208101909152606060e0820181815261010083019190915281908152602001613a52604051806040016040528060608152602001606081525090565b8152602001613a74604051806040016040528060608152602001606081525090565b8152602001613a96604051806040016040528060608152602001606081525090565b8152602001613ab8604051806040016040528060608152602001606081525090565b8152602001613ada604051806040016040528060608152602001606081525090565b8152602001613afc604051806040016040528060608152602001606081525090565b905290565b6001600160a01b03811681146108ec57600080fd5b600080600060608486031215613b2b57600080fd5b8335613b3681613b01565b95602085013595506040909401359392505050565b600060208284031215613b5d57600080fd5b813561376e81613b01565b600080600080600060a08688031215613b8057600080fd5b8535613b8b81613b01565b94506020860135613b9b81613b01565b94979496505050506040830135926060810135926080909101359150565b60008060408385031215613bcc57600080fd5b8235613bd781613b01565b946020939093013593505050565b6001600160a01b0391909116815260200190565b80151581146108ec57600080fd5b60008060408385031215613c1a57600080fd5b8235613c2581613b01565b91506020830135613c3581613bf9565b809150509250929050565b60008060408385031215613c5357600080fd5b8235613c5e81613b01565b91506020830135613c3581613b01565b600060208284031215613c8057600080fd5b5035919050565b60008060208385031215613c9a57600080fd5b82356001600160401b0380821115613cb157600080fd5b818501915085601f830112613cc557600080fd5b813581811115613cd457600080fd5b8660208260051b8501011115613ce957600080fd5b60209290920196919550909350505050565b60005b83811015613d16578181015183820152602001613cfe565b50506000910152565b60008151808452613d37816020860160208601613cfb565b601f01601f19169290920160200192915050565b600081518084526020808501808196508360051b8101915082860160005b85811015613d93578284038952613d81848351613d1f565b98850198935090840190600101613d69565b5091979650505050505050565b60208152600061376e6020830184613d4b565b6020808252600e908201526d2a24a6a2a627a1a5afa0a226a4a760911b604082015260600190565b918252602082015260400190565b600060208284031215613dfb57600080fd5b5051919050565b600081518084526020808501808196508360051b810191508286016000805b86811015613e9d578385038a52825160408151818852613e4382890182613d1f565b92890151888403898b01528051808552908a01938693508a0191505b80831015613e885783516001600160a01b03168252928901926001929092019190890190613e5f565b509b88019b9650505091850191600101613e21565b509298975050505050505050565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b82811015613f2257898603605f1901845284518051888852613efc89890182613d1f565b918401516001600160a01b03169784019790975295509381019392810192600101613ed8565b50808801519550888503818a015250505050613f3e8183613e02565b95945050505050565b600081518084526020808501808196508360051b810191508286016000805b86811015613e9d578385038a52825160408151818852613f8882890182613d1f565b92890151888403898b01528051808552908a01938693508a0191505b80831015613fc45783518252928901926001929092019190890190613fa4565b509b88019b9650505091850191600101613f66565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b8281101561404757898603605f190184528451805188885261402a89890182613d1f565b918401519784019790975295509381019392810192600101614006565b50808801519550888503818a015250505050613f3e8183613f47565b600081518084526020808501808196508360051b810191508286016000805b86811015613e9d578385038a528251604081518188526140a482890182613d1f565b92890151888403898b01528051808552908a01938693508a0191505b808310156140e057835182529289019260019290920191908901906140c0565b509b88019b9650505091850191600101614082565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b8281101561416357898603605f190184528451805188885261414689890182613d1f565b918401519784019790975295509381019392810192600101614122565b50808801519550888503818a015250505050613f3e8183614063565b600081518084526020808501808196508360051b810191508286016000805b86811015613e9d578385038a528251604081518188526141c082890182613d1f565b92890151888403898b01528051808552908a01938693508a0191505b808310156141fe578351151582529289019260019290920191908901906141dc565b509b88019b965050509185019160010161419e565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b8281101561428357898603605f190184528451805188885261426489890182613d1f565b9184015115159784019790975295509381019392810192600101614240565b50808801519550888503818a015250505050613f3e818361417f565b600081518084526020808501808196508360051b810191508286016000805b86811015613e9d578385038a528251604081518188526142e082890182613d1f565b92890151888403898b01528051808552908a01938693508a0191505b8083101561431c57835182529289019260019290920191908901906142fc565b509b88019b96505050918501916001016142be565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b8281101561439f57898603605f190184528451805188885261438289890182613d1f565b91840151978401979097529550938101939281019260010161435e565b50808801519550888503818a015250505050613f3e818361429f565b600081518084526020808501808196508360051b8101915082860160005b85811015613d935782840389528151604081518187526143fb82880182613d1f565b915050868201519150858103878701526144158183613d4b565b9a87019a95505050908401906001016143d9565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b828110156144a657898603605f190184528451805188885261447a89890182613d1f565b91840151888303898601529190506144928183613d1f565b975050509381019392810192600101614456565b50808801519550888503818a015250505050613f3e81836143bb565b600081518084526020808501808196506005915083821b81018387016000805b8781101561456d578484038b5282516040815181875261450482880182613d1f565b928a0151878403888c01528051808552908b019392508a83019150808a1b83018b01865b8281101561455657601f19858303018452614544828751613d1f565b958d0195938d01939150600101614528565b509e8b019e975050509388019350506001016144e2565b50919998505050505050505050565b60006040808401835182865281815180845260608801915060608160051b89010193506020808401935060005b828110156145f957898603605f19018452845180518888526145cd89890182613d1f565b91840151888303898601529190506145e58183613d1f565b9750505093810193928101926001016145a9565b50808801519550888503818a015250505050613f3e81836144c2565b6000815160e0845261462a60e0850182613eab565b9050602083015184820360208601526146438282613fd9565b9150506040830151848203604086015261465d82826140f5565b915050606083015184820360608601526146778282614213565b915050608083015184820360808601526146918282614331565b91505060a083015184820360a08601526146ab8282614429565b91505060c083015184820360c0860152613f3e828261457c565b60608152600d60608201526c5365744461746153747265616d60981b608082015282602082015260a06040820152600061470260a0830184614615565b949350505050565b60608152601560608201527429b4b3b730b620b23227b930b1b632a9b4b3b732b960591b608082015282602082015260a06040820152600061470260a0830184614615565b60608152601260608201527114da59db985b14d95d141c9a58d95199595960721b608082015282602082015260a06040820152600061470260a0830184614615565b6001600160a01b03929092168252602082015260400190565b6060815260096060820152684772616e74526f6c6560b81b608082015282602082015260a06040820152600061470260a0830184614615565b60208082526011908201527054494d454c4f434b5f4d554c544953494760781b604082015260600190565b600a8152695265766f6b65526f6c6560b01b602082015260400190565b60408152600061483d6040830161480e565b82810360208401526147028185614615565b60608152600f60608201526e20b23227b930b1b632a9b4b3b732b960891b608082015282602082015260a06040820152600061470260a0830184614615565b6000602082840312156148a057600080fd5b815161376e81613bf9565b60408152601860408201527714d95d13dc9858db19541c9bdd9a59195c915b98589b195960421b606082015260806020820152600061376e6080830184614615565b9182526001600160a01b0316602082015260400190565b60006020828403121561491657600080fd5b815161376e81613b01565b60408152601960408201527829b2ba27b930b1b632a83937bb34b232b92337b92a37b5b2b760391b606082015260806020820152600061376e6080830184614615565b60608152601860608201527729b4b3b730b62932b6b7bb32a7b930b1b632a9b4b3b732b960411b608082015282602082015260a06040820152600061470260a0830184614615565b60608152601060608201526f5369676e616c5265766f6b65526f6c6560801b608082015282602082015260a06040820152600061470260a0830184614615565b60608152600c60608201526b14d95d141c9a58d95199595960a21b608082015282602082015260a06040820152600061470260a0830184614615565b60408152601f60408201527f5369676e616c5365744f7261636c6550726f7669646572466f72546f6b656e00606082015260806020820152600061376e6080830184614615565b60608152600f60608201526e5369676e616c4772616e74526f6c6560881b608082015282602082015260a06040820152600061470260a0830184614615565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112614af157600080fd5b8301803591506001600160401b03821115614b0b57600080fd5b602001915036819003821315614b2057600080fd5b9250929050565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b600060018201614b5f57614b5f614b37565b5060010190565b60608152601460608201527329b4b3b730b629b2ba2332b2a932b1b2b4bb32b960611b608082015282602082015260a06040820152600061470260a0830184614615565b6060815260126060820152712932b6b7bb32a7b930b1b632a9b4b3b732b960711b608082015282602082015260a06040820152600061470260a0830184614615565b60408152601e60408201527f5369676e616c5365744f7261636c6550726f7669646572456e61626c65640000606082015260806020820152600061376e6080830184614615565b60608152600e60608201526d29b2ba2332b2a932b1b2b4bb32b960911b608082015282602082015260a06040820152600061470260a0830184614615565b6060815260136060820152725369676e616c5365744461746153747265616d60681b608082015282602082015260a06040820152600061470260a0830184614615565b606081526000614cc66060830161480e565b8460208401528281036040840152613f3e8185614615565b60408152601760408201527629b2ba20ba37b6b4b1a7b930b1b632a83937bb34b232b960491b606082015260806020820152600061376e6080830184614615565b604081526015604082015274496e63726561736554696d656c6f636b44656c617960581b606082015260806020820152600061376e6080830184614615565b60408152601d60408201527f5369676e616c53657441746f6d69634f7261636c6550726f7669646572000000606082015260806020820152600061376e6080830184614615565b6001600160a01b038316815260406020820181905260009061470290830184613d1f565b80820180821115611f9257611f92614b37565b60608152601360608201527229b4b3b730b62832b73234b733a0b1ba34b7b760691b608082015282602082015260a06040820152600061470260a0830184614615565b60608152601260608201527121b632b0b92832b73234b733a0b1ba34b7b760711b608082015282602082015260a06040820152600061470260a0830184614615565b60208152600061376e6020830184613d1f565b600060208284031215614e8657600080fd5b81516001600160401b0380821115614e9d57600080fd5b818401915084601f830112614eb157600080fd5b815181811115614ec357614ec3614aae565b604051601f8201601f19908116603f01168101908382118183101715614eeb57614eeb614aae565b81604052828152876020848701011115614f0457600080fd5b614f15836020830160208801613cfb565b979650505050505050565b81810381811115611f9257611f92614b37565b634e487b7160e01b600052603160045260246000fdfe7365744f7261636c6550726f7669646572466f72546f6b656e000000000000007365744f7261636c6550726f7669646572456e61626c65640000000000000000a2646970667358221220f14607a41a42bd05cbe939d17742b48c265f3b87f92c77561416b59b1fee46d164736f6c63430008120033", "libraries": {}, "devdoc": { "kind": "dev", "methods": { "multicall(bytes[])": { "details": "Receives and executes a batch of function calls on this contract." } }, "version": 1 }, "userdoc": { "kind": "user", "methods": {}, "version": 1 }, "storageLayout": { "storage": [ { "astId": 5544, "contract": "contracts/config/Timelock.sol:Timelock", "label": "_status", "offset": 0, "slot": "0", "type": "t_uint256" }, { "astId": 20465, "contract": "contracts/config/Timelock.sol:Timelock", "label": "timelockDelay", "offset": 0, "slot": "1", "type": "t_uint256" }, { "astId": 20469, "contract": "contracts/config/Timelock.sol:Timelock", "label": "pendingActions", "offset": 0, "slot": "2", "type": "t_mapping(t_bytes32,t_uint256)" }, { "astId": 20472, "contract": "contracts/config/Timelock.sol:Timelock", "label": "pendingActionsList", "offset": 0, "slot": "3", "type": "t_struct(Bytes32Set)13851_storage" } ], "types": { "t_array(t_bytes32)dyn_storage": { "base": "t_bytes32", "encoding": "dynamic_array", "label": "bytes32[]", "numberOfBytes": "32" }, "t_bytes32": { "encoding": "inplace", "label": "bytes32", "numberOfBytes": "32" }, "t_mapping(t_bytes32,t_uint256)": { "encoding": "mapping", "key": "t_bytes32", "label": "mapping(bytes32 => uint256)", "numberOfBytes": "32", "value": "t_uint256" }, "t_struct(Bytes32Set)13851_storage": { "encoding": "inplace", "label": "struct EnumerableSet.Bytes32Set", "members": [ { "astId": 13850, "contract": "contracts/config/Timelock.sol:Timelock", "label": "_inner", "offset": 0, "slot": "0", "type": "t_struct(Set)13657_storage" } ], "numberOfBytes": "64" }, "t_struct(Set)13657_storage": { "encoding": "inplace", "label": "struct EnumerableSet.Set", "members": [ { "astId": 13652, "contract": "contracts/config/Timelock.sol:Timelock", "label": "_values", "offset": 0, "slot": "0", "type": "t_array(t_bytes32)dyn_storage" }, { "astId": 13656, "contract": "contracts/config/Timelock.sol:Timelock", "label": "_indexes", "offset": 0, "slot": "1", "type": "t_mapping(t_bytes32,t_uint256)" } ], "numberOfBytes": "64" }, "t_uint256": { "encoding": "inplace", "label": "uint256", "numberOfBytes": "32" } } } }