@volare.finance/volare.js
Version:
The SDK for Volare Protocol
786 lines • 91 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "MarginCalculator",
"sourceName": "contracts/vanilla/MarginCalculator.sol",
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "_oracle",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "collateral",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "dust",
"type": "uint256"
}
],
"name": "CollateralDustUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "productHash",
"type": "bytes32"
},
{
"indexed": false,
"internalType": "uint256",
"name": "timeToExpiry",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "MaxPriceAdded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "productHash",
"type": "bytes32"
},
{
"indexed": false,
"internalType": "uint256",
"name": "timeToExpiry",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "oldValue",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "newValue",
"type": "uint256"
}
],
"name": "MaxPriceUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "oracleDeviation",
"type": "uint256"
}
],
"name": "OracleDeviationUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "product",
"type": "bytes32"
},
{
"indexed": false,
"internalType": "uint256",
"name": "spotShock",
"type": "uint256"
}
],
"name": "SpotShockUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "productHash",
"type": "bytes32"
},
{
"indexed": false,
"internalType": "uint256",
"name": "timeToExpiry",
"type": "uint256"
}
],
"name": "TimeToExpiryAdded",
"type": "event"
},
{
"inputs": [],
"name": "AUCTION_TIME",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_collateral",
"type": "address"
}
],
"name": "getCollateralDust",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address[]",
"name": "shortVTokens",
"type": "address[]"
},
{
"internalType": "address[]",
"name": "longVTokens",
"type": "address[]"
},
{
"internalType": "address[]",
"name": "collateralAssets",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "shortAmounts",
"type": "uint256[]"
},
{
"internalType": "uint256[]",
"name": "longAmounts",
"type": "uint256[]"
},
{
"internalType": "uint256[]",
"name": "collateralAmounts",
"type": "uint256[]"
}
],
"internalType": "struct LibMarginVault.Vault",
"name": "_vault",
"type": "tuple"
},
{
"internalType": "uint256",
"name": "_vaultType",
"type": "uint256"
}
],
"name": "getExcessCollateral",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
},
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_vToken",
"type": "address"
}
],
"name": "getExpiredPayoutRate",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address[]",
"name": "shortVTokens",
"type": "address[]"
},
{
"internalType": "address[]",
"name": "longVTokens",
"type": "address[]"
},
{
"internalType": "address[]",
"name": "collateralAssets",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "shortAmounts",
"type": "uint256[]"
},
{
"internalType": "uint256[]",
"name": "longAmounts",
"type": "uint256[]"
},
{
"internalType": "uint256[]",
"name": "collateralAmounts",
"type": "uint256[]"
}
],
"internalType": "struct LibMarginVault.Vault",
"name": "_vault",
"type": "tuple"
},
{
"internalType": "uint256",
"name": "_vaultType",
"type": "uint256"
}
],
"name": "getMarginRequired",
"outputs": [
{
"components": [
{
"internalType": "int256",
"name": "value",
"type": "int256"
}
],
"internalType": "struct LibFixedPointInt256.FixedPointInt",
"name": "",
"type": "tuple"
},
{
"components": [
{
"internalType": "int256",
"name": "value",
"type": "int256"
}
],
"internalType": "struct LibFixedPointInt256.FixedPointInt",
"name": "",
"type": "tuple"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_underlying",
"type": "address"
},
{
"internalType": "address",
"name": "_strike",
"type": "address"
},
{
"internalType": "address",
"name": "_collateral",
"type": "address"
},
{
"internalType": "bool",
"name": "_isPut",
"type": "bool"
},
{
"internalType": "uint256",
"name": "_timeToExpiry",
"type": "uint256"
}
],
"name": "getMaxPrice",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_underlying",
"type": "address"
},
{
"internalType": "address",
"name": "_strike",
"type": "address"
},
{
"internalType": "address",
"name": "_collateral",
"type": "address"
},
{
"internalType": "uint256",
"name": "_shortAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_strikePrice",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_underlyingPrice",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_shortExpiryTimestamp",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_collateralDecimals",
"type": "uint256"
},
{
"internalType": "bool",
"name": "_isPut",
"type": "bool"
}
],
"name": "getNakedMarginRequired",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "getOracleDeviation",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_underlying",
"type": "address"
},
{
"internalType": "address",
"name": "_strike",
"type": "address"
},
{
"internalType": "address",
"name": "_collateral",
"type": "address"
},
{
"internalType": "bool",
"name": "_isPut",
"type": "bool"
}
],
"name": "getSpotShock",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_underlying",
"type": "address"
},
{
"internalType": "address",
"name": "_strike",
"type": "address"
},
{
"internalType": "address",
"name": "_collateral",
"type": "address"
},
{
"internalType": "bool",
"name": "_isPut",
"type": "bool"
}
],
"name": "getTimesToExpiry",
"outputs": [
{
"internalType": "uint256[]",
"name": "",
"type": "uint256[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address[]",
"name": "shortVTokens",
"type": "address[]"
},
{
"internalType": "address[]",
"name": "longVTokens",
"type": "address[]"
},
{
"internalType": "address[]",
"name": "collateralAssets",
"type": "address[]"
},
{
"internalType": "uint256[]",
"name": "shortAmounts",
"type": "uint256[]"
},
{
"internalType": "uint256[]",
"name": "longAmounts",
"type": "uint256[]"
},
{
"internalType": "uint256[]",
"name": "collateralAmounts",
"type": "uint256[]"
}
],
"internalType": "struct LibMarginVault.Vault",
"name": "_vault",
"type": "tuple"
},
{
"internalType": "uint256",
"name": "_vaultType",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_vaultLatestUpdate",
"type": "uint256"
}
],
"name": "isLiquidatable",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "oracle",
"outputs": [
{
"internalType": "contract IOracleV2",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_collateral",
"type": "address"
},
{
"internalType": "uint256",
"name": "_dust",
"type": "uint256"
}
],
"name": "setCollateralDust",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_deviation",
"type": "uint256"
}
],
"name": "setOracleDeviation",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_underlying",
"type": "address"
},
{
"internalType": "address",
"name": "_strike",
"type": "address"
},
{
"internalType": "address",
"name": "_collateral",
"type": "address"
},
{
"internalType": "bool",
"name": "_isPut",
"type": "bool"
},
{
"internalType": "uint256",
"name": "_shockValue",
"type": "uint256"
}
],
"name": "setSpotShock",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_underlying",
"type": "address"
},
{
"internalType": "address",
"name": "_strike",
"type": "address"
},
{
"internalType": "address",
"name": "_collateral",
"type": "address"
},
{
"internalType": "bool",
"name": "_isPut",
"type": "bool"
},
{
"internalType": "uint256[]",
"name": "_timesToExpiry",
"type": "uint256[]"
},
{
"internalType": "uint256[]",
"name": "_values",
"type": "uint256[]"
}
],
"name": "setUpperBoundValues",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_underlying",
"type": "address"
},
{
"internalType": "address",
"name": "_strike",
"type": "address"
},
{
"internalType": "address",
"name": "_collateral",
"type": "address"
},
{
"internalType": "bool",
"name": "_isPut",
"type": "bool"
},
{
"internalType": "uint256",
"name": "_timeToExpiry",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_value",
"type": "uint256"
}
],
"name": "updateUpperBoundValue",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"bytecode": "0x60806040526200001d60006008620000ef60201b620013271760201c565b516002553480156200002e57600080fd5b506040516200431f3803806200431f8339810160408190526200005191620002f9565b6200005c3362000216565b6001600160a01b038116620000c95760405162461bcd60e51b815260206004820152602860248201527f4d617267696e43616c63756c61746f723a20696e76616c6964206f7261636c65604482015267206164647265737360c01b60648201526084015b60405180910390fd5b600780546001600160a01b0319166001600160a01b03929092169190911790556200049a565b604080516020810190915260008152604080516020810190915260008152601b8314156200014257604051806020016040528062000138866200026660201b620013fb1760201c565b905290506200020d565b601b831115620001bf57600062000169601b85620002cf60201b620014621790919060201c565b90506040518060200160405280620001b3620001a284600a6200018d91906200038c565b89620002dd60201b6200146e1790919060201c565b6200026660201b620013fb1760201c565b8152509150506200020d565b6000620001ce84601b6200046a565b9050604051806020016040528062000207620001a284600a620001f291906200038c565b89620002eb60201b6200147a1790919060201c565b90529150505b90505b92915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000600160ff1b8210620002cb5760405162461bcd60e51b815260206004820152602560248201527f4c69624669786564506f696e74496e743235363a206f7574206f6620696e742060448201526472616e676560d81b6064820152608401620000c0565b5090565b60006200020d82846200046a565b60006200020d828462000322565b60006200020d828462000448565b6000602082840312156200030b578081fd5b81516001600160a01b03811681146200020d578182fd5b6000826200033e57634e487b7160e01b81526012600452602481fd5b500490565b600181815b808511156200038457816000190482111562000368576200036862000484565b808516156200037657918102915b93841c939080029062000348565b509250929050565b60006200020d8383600082620003a55750600162000210565b81620003b45750600062000210565b8160018114620003cd5760028114620003d857620003f8565b600191505062000210565b60ff841115620003ec57620003ec62000484565b50506001821b62000210565b5060208310610133831016604e8410600b84101617156200041d575081810a62000210565b62000429838362000343565b806000190482111562000440576200044062000484565b029392505050565b600081600019048311821515161562000465576200046562000484565b500290565b6000828210156200047f576200047f62000484565b500390565b634e487b7160e01b600052601160045260246000fd5b613e7580620004aa6000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c80638aab8fa5116100ad578063cd43fbfb11610071578063cd43fbfb1461029b578063dc1b3f00146102c3578063e2947194146102d6578063e592301a14610306578063f2fde38b1461030f57600080fd5b80638aab8fa5146102495780638da5cb5b1461025c5780639a783d111461026d578063b29d5ee814610280578063c73547e31461028857600080fd5b80636ccb9506116100f45780636ccb9506146101c5578063715018a6146101ee5780637ad7f800146101f85780637dc0d1d01461020b5780637f519b721461023657600080fd5b8063053fe57c146101315780630b0509fb1461015e578063463459001461017f578063478409301461019257806347d438a5146101a5575b600080fd5b61014461013f366004613951565b610322565b604080519251835290516020830152015b60405180910390f35b61017161016c36600461387c565b610365565b604051908152602001610155565b61017161018d366004613627565b6103ce565b6101716101a03660046135ef565b6103f8565b6101b86101b3366004613627565b610598565b6040516101559190613a31565b6101716101d33660046135ef565b6001600160a01b031660009081526003602052604090205490565b6101f6610610565b005b6101f661020636600461379c565b610624565b60075461021e906001600160a01b031681565b6040516001600160a01b039091168152602001610155565b6101f6610244366004613682565b61078c565b6101f6610257366004613739565b610c71565b6000546001600160a01b031661021e565b6101f661027b36600461390a565b610d42565b600154610171565b6101f66102963660046139e0565b610e19565b6102ae6102a9366004613951565b610e5c565b60408051928352901515602083015201610155565b6101716102d1366004613739565b610f58565b6102e96102e4366004613994565b610f8d565b604080519315158452602084019290925290820152606001610155565b610171610e1081565b6101f661031d3660046135ef565b6112ae565b604080516020810190915260008152604080516020810190915260008152600061034c8585611486565b90506103588582611895565b92509250505b9250929050565b6000806103748b8b8b86611dbd565b90506000610383896008611327565b90506000610392896008611327565b905060006103a1896008611327565b90506103bc6103b4858584868d8c611e0a565b886000611f4e565b9e9d5050505050505050505050505050565b6000806103dd86868686611dbd565b6000908152600660205260409020549150505b949350505050565b60006001600160a01b0382166104655760405162461bcd60e51b815260206004820152602760248201527f4d617267696e43616c63756c61746f723a20496e76616c696420746f6b656e206044820152666164647265737360c81b60648201526084015b60405180910390fd5b60008060008060008061047788612029565b955095509550955095509550814210156104e45760405162461bcd60e51b815260206004820152602860248201527f4d617267696e43616c63756c61746f723a2056546f6b656e206e6f74206578706044820152671a5c9959081e595d60c21b606482015260840161045c565b60006104f3868685878661237b565b9050600061050382878a876123d1565b90506000886001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561054057600080fd5b505afa158015610554573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105789190613a10565b60ff16905061058982826001611f4e565b9b9a5050505050505050505050565b606060006105a886868686611dbd565b600081815260046020908152604091829020805483518184028101840190945280845293945091929083018282801561060057602002820191906000526020600020905b8154815260200190600101908083116105ec575b5050505050915050949350505050565b610618612540565b610622600061259a565b565b61062c612540565b600081116106975760405162461bcd60e51b815260206004820152603260248201527f4d617267696e43616c63756c61746f723a20696e76616c6964206f7074696f6e60448201527120757070657220626f756e642076616c756560701b606482015260840161045c565b60006106a587878787611dbd565b6000818152600560209081526040808320878452909152902054909150806107255760405162461bcd60e51b815260206004820152602d60248201527f4d617267696e43616c63756c61746f723a20757070657220626f756e6420766160448201526c1b1d59481b9bdd08199bdd5b99609a1b606482015260840161045c565b6000828152600560209081526040808320878452825291829020859055815186815290810183905290810184905282907f39bab32d3b88604bdfbf6e8c3b1aaaf9bb6013da4fd5206dee9e3b00ee6f2cf99060600160405180910390a25050505050505050565b610794612540565b826107f95760405162461bcd60e51b815260206004820152602f60248201527f4d617267696e43616c63756c61746f723a20696e76616c69642074696d65732060448201526e746f2065787069727920617272617960881b606482015260840161045c565b8281146108575760405162461bcd60e51b815260206004820152602660248201527f4d617267696e43616c63756c61746f723a20696e76616c69642076616c75657360448201526520617272617960d01b606482015260840161045c565b600061086589898989611dbd565b600081815260046020526040902080549192509015806108e257508054819061088f906001611462565b815481106108ad57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154868660008181106108d957634e487b7160e01b600052603260045260246000fd5b90506020020135115b6109455760405162461bcd60e51b815260206004820152602e60248201527f4d617267696e43616c63756c61746f723a20657870697279206172726179206960448201526d39903737ba1034b71037b93232b960911b606482015260840161045c565b60005b85811015610c64578561095c8260016125ea565b1015610a1957868661096f8360016125ea565b81811061098c57634e487b7160e01b600052603260045260246000fd5b905060200201358787838181106109b357634e487b7160e01b600052603260045260246000fd5b9050602002013510610a195760405162461bcd60e51b815260206004820152602960248201527f4d617267696e43616c63756c61746f723a2074696d652073686f756c642062656044820152681034b71037b93232b960b91b606482015260840161045c565b6000858583818110610a3b57634e487b7160e01b600052603260045260246000fd5b9050602002013511610aab5760405162461bcd60e51b815260206004820152603360248201527f4d617267696e43616c63756c61746f723a206e6f2065787069727920757070656044820152721c88189bdd5b99081d985b1d5948199bdd5b99606a1b606482015260840161045c565b848482818110610acb57634e487b7160e01b600052603260045260246000fd5b90506020020135600560008581526020019081526020016000206000898985818110610b0757634e487b7160e01b600052603260045260246000fd5b9050602002013581526020019081526020016000208190555081878783818110610b4157634e487b7160e01b600052603260045260246000fd5b83546001810185556000948552602094859020919094029290920135919092015550827fcaae9881bd3ac6f531c9e6021f1f873b93a83648e348624eef8f9ba9757fcb62888884818110610ba557634e487b7160e01b600052603260045260246000fd5b90506020020135604051610bbb91815260200190565b60405180910390a2827fcbb8d688de73727385afee9d53a2771ae5fe45293ff6de0ba46b201ab29df115888884818110610c0557634e487b7160e01b600052603260045260246000fd5b90506020020135878785818110610c2c57634e487b7160e01b600052603260045260246000fd5b90506020020135604051610c4a929190918252602082015260400190565b60405180910390a280610c5c81613d71565b915050610948565b5050505050505050505050565b610c79612540565b60008111610cdc5760405162461bcd60e51b815260206004820152602a60248201527f4d617267696e43616c63756c61746f723a20696e76616c69642073706f742073604482015269686f636b2076616c756560b01b606482015260840161045c565b6000610cea86868686611dbd565b600081815260066020526040908190208490555190915081907f78d22b4a9e4e0e1db30e7762696456ca380dc80efc59f416a299b97213b6d31690610d329085815260200190565b60405180910390a2505050505050565b610d4a612540565b60008111610dc05760405162461bcd60e51b815260206004820152603960248201527f4d617267696e43616c63756c61746f723a206475737420616d6f756e7420736860448201527f6f756c642062652067726561746572207468616e207a65726f00000000000000606482015260840161045c565b6001600160a01b03821660008181526003602052604090819020839055517f8ef429e6cec4339c5f0187fb930764fb967114bf09bc8bb06a552ba32923fd8690610e0d9084815260200190565b60405180910390a25050565b610e21612540565b60018190556040518181527fe44c6dd1fc3826ad24b81f17cf04849cedd368e002a52e89a845d14d3474e20a9060200160405180910390a150565b6000806000610e6b8585611486565b9050610e7785826125f6565b806102200151158015610e8d5750806102000151155b15610ee1576000816102400151610ea5576000610ed3565b8560a00151600081518110610eca57634e487b7160e01b600052603260045260246000fd5b60200260200101515b93506001925061035e915050565b600080610eee8784611895565b90925090506000610eff83836129b6565b6040805160208101909152600254908190528151610200870151929350121590600090610f3157856101000151610f38565b8561016001515b90506000610f47848385611f4e565b9b929a509198505050505050505050565b600080610f6787878787611dbd565b600090815260056020908152604080832086845290915290205491505095945050505050565b600080600084600114610ffc5760405162461bcd60e51b815260206004820152603160248201527f4d617267696e43616c63756c61746f723a20696e76616c6964207661756c74206044820152707479706520746f206c697175696461746560781b606482015260840161045c565b60006110088787611486565b9050806102200151611025576000806000935093509350506112a5565b8060e0015142106110955760405162461bcd60e51b815260206004820152603460248201527f4d617267696e43616c63756c61746f723a2063616e206e6f74206c697175696460448201527330ba329032bc3834b932b2103837b9b4ba34b7b760611b606482015260840161045c565b60075481516040516341976e0960e01b81526001600160a01b03918216600482015260009291909116906341976e099060240160206040518083038186803b1580156110e057600080fd5b505afa1580156110f4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111891906139f8565b90506000604051806060016040528061115e8b6060015160008151811061114f57634e487b7160e01b600052603260045260246000fd5b60200260200101516008611327565b81526020016111728560c001516008611327565b8152602001611182846008611327565b815250905060006111a6846000015185602001518660400151876101c00151611dbd565b905060006111e58b60a001516000815181106111d257634e487b7160e01b600052603260045260246000fd5b6020026020010151866101800151611327565b9050600061120c838560000151866040015187602001518a60e001518b6101c00151611e0a565b905061121b8183519051131590565b156112365760008060009850985098505050505050506112a5565b600061125085602001518660400151896101c001516129e9565b90506000611275848760000151848960400151428d61018001518e6101c00151612a55565b6040988901516001600160a01b031660009081526003602052989098205460019b50979950969750505050505050505b93509350939050565b6112b6612540565b6001600160a01b03811661131b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161045c565b6113248161259a565b50565b604080516020810190915260008152604080516020810190915260008152601b83141561136b576040518060200160405280611362866113fb565b905290506113f2565b601b8311156113b857600061138184601b611462565b905060405180602001604052806113ad6113a884600a6113a19190613bd1565b899061146e565b6113fb565b8152509150506113f2565b60006113c584601b613d5a565b905060405180602001604052806113ec6113a884600a6113e59190613bd1565b899061147a565b90529150505b90505b92915050565b6000600160ff1b821061145e5760405162461bcd60e51b815260206004820152602560248201527f4c69624669786564506f696e74496e743235363a206f7574206f6620696e742060448201526472616e676560d81b606482015260840161045c565b5090565b60006113f28284613d5a565b60006113f28284613b7a565b60006113f28284613cfc565b6040805161026081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e0810182905261020081018290526102208101829052610240810191909152604080516102608101825260008082526020808301829052928201819052606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082018190526101408201819052610160820181905261018082018190526101a082018190526101c082018190526101e0820181905261020082018190526102208201819052610240820152908401516115c390612b60565b151561020082015283516115d690612b60565b151561022082015260408401516115ec90612b60565b15156102408201526101a08101839052610200810151156116ee576000846020015160008151811061162e57634e487b7160e01b600052603260045260246000fd5b6020026020010151905061164181612029565b15156101e08801526101408701526101208601526001600160a01b03908116608086015290811660608501521660a083018190526040805163313ce56760e01b8152905163313ce56791600480820192602092909190829003018186803b1580156116ab57600080fd5b505afa1580156116bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e39190613a10565b60ff16610160830152505b806102200151156117dd576000846000015160008151811061172057634e487b7160e01b600052603260045260246000fd5b6020026020010151905061173381612029565b15156101c088015260e087015260c08601526001600160a01b039081166020808701919091529181168552919091166040808501829052805163313ce56760e01b81529051919263313ce56792600480840193829003018186803b15801561179a57600080fd5b505afa1580156117ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d29190613a10565b60ff16610100830152505b806102400151156113f257836040015160008151811061180d57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561184d57600080fd5b505afa158015611861573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118859190613a10565b60ff166101808201529392505050565b60408051602081019091526000815260408051602081019091526000815260008361022001516118d457604080516020810190915260025481526118fc565b6118fc856060015160008151811061114f57634e487b7160e01b600052603260045260246000fd5b9050600084610200015161191f5760408051602081019091526002548152611947565b611947866080015160008151811061114f57634e487b7160e01b600052603260045260246000fd5b9050600085610240015161196a57604080516020810190915260025481526119a5565b6119a58760a0015160008151811061199257634e487b7160e01b600052603260045260246000fd5b6020026020010151876101800151611327565b905060008661022001516119c857604080516020810190915260025481526119d7565b6119d78760c001516008611327565b905060006040518060a001604052808961022001516119fa5789606001516119fd565b89515b6001600160a01b03168152602001896102200151611a1f578960a00151611a25565b89604001515b6001600160a01b03168152602001896102200151611a47578960800151611a4d565b89602001515b6001600160a01b03168152602001896102200151611a7057896101400151611a76565b8960e001515b8152602001896102200151611a9057896101e00151611a97565b896101c001515b151581525090508060600151421015611d0a57876101a0015160011415611c75576040808901516001600160a01b031660009081526003602052908120546101808a0151611ae59190611327565b60408051602081019091526002549081905285519192501215611b9f578051845113611b9f5760405162461bcd60e51b815260206004820152605b60248201527f4d617267696e43616c63756c61746f723a206e616b6564206d617267696e207660448201527f61756c742073686f756c64206861766520636f6c6c61746572616c20616d6f7560648201527f6e742067726561746572207468616e206475737420616d6f756e740000000000608482015260a40161045c565b60075489516040516341976e0960e01b81526001600160a01b039182166004820152600092611c2a9216906341976e099060240160206040518083038186803b158015611beb57600080fd5b505afa158015611bff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2391906139f8565b6008611327565b90506000611c4b8b600001518c602001518d604001518e6101c00151611dbd565b905085611c64828a858989606001518a60800151611e0a565b99509950505050505050505061035e565b6000886102000151611c965760408051602081019091526002548152611ca6565b611ca68961012001516008611327565b9050816080015115611ce6576000611cc087878685612bb2565b905084611cd68285604001518660200151612bf4565b985098505050505050505061035e565b6000611cf487878685612d54565b905084611cd68285600001518660200151612bf4565b6000886102200151611d2b5760408051602081019091526002548152611d4c565b611d4c89600001518a602001518b60e001518c60c00151866080015161237b565b90506000896102000151611d6f5760408051602081019091526002548152611d92565b611d928a606001518b608001518c61014001518d6101200151876080015161237b565b90506000611da288888585612dc1565b905085611c64828660400151876020015188606001516123d1565b604080516001600160a01b039586166020808301919091529486168183015292909416606083015215156080808301919091528351808303909101815260a0909101909252815191012090565b6040805160208101909152600081526000611e258885612de7565b604080516020808201835260008c81526006825283812054835283519182019093529182529192506040805160208101909152600081526040805160208101909152600081528615611ed957611e8489611e7f868d61302d565b61306e565b9250611eb2611e9d611e96868d61302d565b8b906129b6565b60408051602081019091526002548152613093565b9150611ed28b611ecc84611ec6898861302d565b906130b1565b9061302d565b9050610589565b6000611ef26b033b2e3c9fd0803ce8000000601b611327565b9050611f0c81611e7f8d611f068e8a61302d565b906130db565b9350611f29611e9d611f228d611f068e8a61302d565b83906129b6565b9250611f3d8c611ecc85611ec68a8961302d565b9d9c50505050505050505050505050565b600080601b841415611f6c578451611f6590613112565b905061201f565b601b841115611fab576000611f82601b86613d5a565b9050611fa3611f9282600a613bd1565b8751611f9d90613112565b9061147a565b91505061201f565b6000611fb885601b613d5a565b9050600084611ff1576000611fe2611fd184600a613bd1565b8951611fdc90613112565b90613125565b90508015611fef57600191505b505b61201a8161201461200385600a613bd1565b8a5161200e90613112565b9061146e565b906125ea565b925050505b90505b9392505050565b6000806000806000806000879050806001600160a01b0316630812c4526040518163ffffffff1660e01b815260040160c06040518083038186803b15801561207057600080fd5b505afa9250505080156120a0575060408051601f3d908101601f1916820190925261209d91810190613809565b60015b61235c57806001600160a01b031663aabaecd66040518163ffffffff1660e01b815260040160206040518083038186803b1580156120dd57600080fd5b505afa1580156120f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612115919061360b565b816001600160a01b0316637158da7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561214e57600080fd5b505afa158015612162573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612186919061360b565b826001600160a01b03166317d69bc86040518163ffffffff1660e01b815260040160206040518083038186803b1580156121bf57600080fd5b505afa1580156121d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f7919061360b565b836001600160a01b031663c52987cf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561223057600080fd5b505afa158015612244573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226891906139f8565b846001600160a01b031663ade6e2aa6040518163ffffffff1660e01b815260040160206040518083038186803b1580156122a157600080fd5b505afa1580156122b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122d991906139f8565b856001600160a01b031663f3c274a66040518163ffffffff1660e01b815260040160206040518083038186803b15801561231257600080fd5b505afa158015612326573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061234a9190613935565b96509650965096509650965050612372565b949b509299509097509550935091506123729050565b91939550919395565b6040805160208101909152600081526000612397846008611327565b905060006123a760016000611327565b905060006123b7828a8a8a6123d1565b90506123c48382876129e9565b9998505050505050505050565b604080516020810190915260008152826001600160a01b0316846001600160a01b031614156124015750836103f0565b6007546040516301957f8160e01b81526001600160a01b0386811660048301526024820185905260009216906301957f819060440160206040518083038186803b15801561244e57600080fd5b505afa158015612462573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061248691906139f8565b6007546040516301957f8160e01b81526001600160a01b03878116600483015260248201879052929350600092909116906301957f819060440160206040518083038186803b1580156124d857600080fd5b505afa1580156124ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061251091906139f8565b9050612535612520826008611327565b611f0661252e856008611327565b8a9061302d565b979650505050505050565b6000546001600160a01b031633146106225760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161045c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006113f28284613b34565b815151600110156126675760405162461bcd60e51b815260206004820152603560248201527f4d617267696e43616c63756c61746f723a20546f6f206d616e792073686f7274604482015274081d951bdad95b9cc81a5b881d1a19481d985d5b1d605a1b606482015260840161045c565b600182602001515111156126da5760405162461bcd60e51b815260206004820152603460248201527f4d617267696e43616c63756c61746f723a20546f6f206d616e79206c6f6e67206044820152731d951bdad95b9cc81a5b881d1a19481d985d5b1d60621b606482015260840161045c565b600182604001515111156127565760405162461bcd60e51b815260206004820152603960248201527f4d617267696e43616c63756c61746f723a20546f6f206d616e7920636f6c6c6160448201527f746572616c2061737365747320696e20746865207661756c7400000000000000606482015260840161045c565b606082015151825151146127c65760405162461bcd60e51b815260206004820152603160248201527f4d617267696e43616c63756c61746f723a2053686f727420617373657420616e6044820152700c840c2dadeeadce840dad2e6dac2e8c6d607b1b606482015260840161045c565b816080015151826020015151146128385760405162461bcd60e51b815260206004820152603060248201527f4d617267696e43616c63756c61746f723a204c6f6e6720617373657420616e6460448201526f040c2dadeeadce840dad2e6dac2e8c6d60831b606482015260840161045c565b8160a0015151826040015151146128b05760405162461bcd60e51b815260206004820152603660248201527f4d617267696e43616c63756c61746f723a20436f6c6c61746572616c206173736044820152750cae840c2dcc840c2dadeeadce840dad2e6dac2e8c6d60531b606482015260840161045c565b6128ba8282613131565b61292c5760405162461bcd60e51b815260206004820152603b60248201527f4d617267696e43616c63756c61746f723a206c6f6e67206173736574206e6f7460448201527f206d617267696e61626c6520666f722073686f72742061737365740000000000606482015260840161045c565b61293682826132e9565b6129b25760405162461bcd60e51b815260206004820152604160248201527f4d617267696e43616c63756c61746f723a20636f6c6c61746572616c2061737360448201527f6574206e6f74206d617267696e61626c6520666f722073686f727420617373656064820152601d60fa1b608482015260a40161045c565b5050565b60408051602081019091526000815260408051602081019091528251845182916129e091906133b1565b90529392505050565b6040805160208101909152600081528115612a2d578251845113612a1c5760408051602081019091526002548152612a26565b612a2684846129b6565b9050612022565b8351835113612a4b576040805160208101909152600254815261201f565b61201f83856129b6565b6000612a6d6040518060200160405280600081525090565b6000612a798a8a6130db565b90506000612a874288611462565b9050610e108110612a9a57819250612b54565b6040805160208101909152600081526000612ab8600154601b611327565b90508615612ade57612ad7611e9d612ad0838d61302d565b8d906129b6565b9150612afc565b612af98a611f06611e9d612af2858461302d565b8f906129b6565b91505b506000612b0a836012611327565b90506000612b1b610e106012611327565b9050612b39612b3282611f0685611ecc8a896129b6565b84906130b1565b9550612b4786865190511390565b15612b50578495505b5050505b61058983876001611f4e565b60008082511180156113f5575060006001600160a01b031682600081518110612b9957634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316141592915050565b604080516020810190915260008152612beb611e9d612bdb612bd4888861306e565b859061302d565b612be5888761302d565b906129b6565b95945050505050565b604080516020810190915260008152816001600160a01b0316836001600160a01b03161415612c24575082612022565b6007546040516341976e0960e01b81526001600160a01b03858116600483015260009216906341976e099060240160206040518083038186803b158015612c6a57600080fd5b505afa158015612c7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ca291906139f8565b6007546040516341976e0960e01b81526001600160a01b038681166004830152929350600092909116906341976e099060240160206040518083038186803b158015612ced57600080fd5b505afa158015612d01573d6000803e3d6000