@ensuro/extensions
Version:
Extension contracts that operate with the Ensuro Protocol
1,000 lines • 78.3 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "EuroCashFlowLender",
"sourceName": "contracts/EuroCashFlowLender.sol",
"abi": [
{
"inputs": [
{
"internalType": "contract TrustfulRiskModule",
"name": "riskModule_",
"type": "address"
},
{
"internalType": "contract AggregatorV3Interface",
"name": "assetOracle_",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "previousAdmin",
"type": "address"
},
{
"indexed": false,
"internalType": "address",
"name": "newAdmin",
"type": "address"
}
],
"name": "AdminChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "beacon",
"type": "address"
}
],
"name": "BeaconUpgraded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "destination",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "usdAmount",
"type": "uint256"
}
],
"name": "CashOutPayout",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "int256",
"name": "currentDebt",
"type": "int256"
}
],
"name": "DebtChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "newRiskBuffer",
"type": "uint256"
}
],
"name": "FxRiskBufferChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint8",
"name": "version",
"type": "uint8"
}
],
"name": "Initialized",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "previousAdminRole",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "newAdminRole",
"type": "bytes32"
}
],
"name": "RoleAdminChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "RoleGranted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "RoleRevoked",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "implementation",
"type": "address"
}
],
"name": "Upgraded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "destination",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "Withdrawal",
"type": "event"
},
{
"inputs": [],
"name": "CUSTOMER_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "DEFAULT_ADMIN_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "GUARDIAN_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "OWNER_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "POLICY_CREATOR_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "PRICER_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "RESOLVER_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "assetOracle",
"outputs": [
{
"internalType": "contract AggregatorV3Interface",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "address",
"name": "destination",
"type": "address"
}
],
"name": "cashOutPayouts",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "currentDebt",
"outputs": [
{
"internalType": "int256",
"name": "",
"type": "int256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "fxRiskBuffer",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "getEurUsdPrice",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
}
],
"name": "getRoleAdmin",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "grantRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "hasRole",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "fxRiskBuffer_",
"type": "uint256"
}
],
"name": "initialize",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "payout",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "premium",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lossProb",
"type": "uint256"
},
{
"internalType": "uint40",
"name": "expiration",
"type": "uint40"
},
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "bytes32",
"name": "policyData",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "quoteSignatureR",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "quoteSignatureVS",
"type": "bytes32"
},
{
"internalType": "uint40",
"name": "quoteValidUntil",
"type": "uint40"
}
],
"name": "newPolicy",
"outputs": [
{
"internalType": "uint256",
"name": "policyId",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "payout",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "premium",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lossProb",
"type": "uint256"
},
{
"internalType": "uint40",
"name": "expiration",
"type": "uint40"
},
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "bytes32",
"name": "policyData",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "quoteSignatureR",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "quoteSignatureVS",
"type": "bytes32"
},
{
"internalType": "uint40",
"name": "quoteValidUntil",
"type": "uint40"
}
],
"name": "newPolicyFull",
"outputs": [
{
"components": [
{
"internalType": "uint256",
"name": "id",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "payout",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "premium",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "jrScr",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "srScr",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lossProb",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "purePremium",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "ensuroCommission",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "partnerCommission",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "jrCoc",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "srCoc",
"type": "uint256"
},
{
"internalType": "contract IRiskModule",
"name": "riskModule",
"type": "address"
},
{
"internalType": "uint40",
"name": "start",
"type": "uint40"
},
{
"internalType": "uint40",
"name": "expiration",
"type": "uint40"
}
],
"internalType": "struct Policy.PolicyData",
"name": "createdPolicy",
"type": "tuple"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "",
"type": "bytes"
}
],
"name": "onERC721Received",
"outputs": [
{
"internalType": "bytes4",
"name": "",
"type": "bytes4"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "onPayoutReceived",
"outputs": [
{
"internalType": "bytes4",
"name": "",
"type": "bytes4"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "onPolicyExpired",
"outputs": [
{
"internalType": "bytes4",
"name": "",
"type": "bytes4"
}
],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [],
"name": "proxiableUUID",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "renounceRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "repayDebt",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "uint256",
"name": "id",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "payout",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "premium",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "jrScr",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "srScr",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lossProb",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "purePremium",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "ensuroCommission",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "partnerCommission",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "jrCoc",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "srCoc",
"type": "uint256"
},
{
"internalType": "contract IRiskModule",
"name": "riskModule",
"type": "address"
},
{
"internalType": "uint40",
"name": "start",
"type": "uint40"
},
{
"internalType": "uint40",
"name": "expiration",
"type": "uint40"
}
],
"internalType": "struct Policy.PolicyData",
"name": "policy",
"type": "tuple"
},
{
"internalType": "uint256",
"name": "payoutInEur",
"type": "uint256"
}
],
"name": "resolvePolicy",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "revokeRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "riskModule",
"outputs": [
{
"internalType": "contract TrustfulRiskModule",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "buffer_",
"type": "uint256"
}
],
"name": "setBuffer",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes4",
"name": "interfaceId",
"type": "bytes4"
}
],
"name": "supportsInterface",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newImplementation",
"type": "address"
}
],
"name": "upgradeTo",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newImplementation",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "upgradeToAndCall",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "address",
"name": "destination",
"type": "address"
}
],
"name": "withdraw",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
}
],
"bytecode": "0x60e0604052306080523480156200001557600080fd5b506040516200386338038062003863833981016040819052620000389162000231565b6001600160a01b038216620000ba5760405162461bcd60e51b815260206004820152603660248201527f4575726f43617368466c6f774c656e6465723a207269736b4d6f64756c655f2060448201527f63616e6e6f74206265207a65726f20616464726573730000000000000000000060648201526084015b60405180910390fd5b6001600160a01b038116620001385760405162461bcd60e51b815260206004820152603760248201527f4575726f43617368466c6f774c656e6465723a2061737365744f7261636c655f60448201527f2063616e6e6f74206265207a65726f20616464726573730000000000000000006064820152608401620000b1565b620001426200015a565b6001600160a01b0391821660a0521660c05262000270565b600054610100900460ff1615620001c45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000b1565b60005460ff9081161462000216576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200022e57600080fd5b50565b600080604083850312156200024557600080fd5b8251620002528162000218565b6020840151909250620002658162000218565b809150509250929050565b60805160a05160c05161357d620002e6600039600081816102be01528181611075015261116d01526000818161055b0152818161091601528181610c2a015281816117cd0152611d31015260008181610a7101528181610ab101528181610ccc01528181610d0c0152610d9b015261357d6000f3fe6080604052600436106101e25760003560e01c806373467c7611610102578063adc7ea3711610095578063e888b16711610064578063e888b16714610628578063e8e617b714610648578063fbb8127914610668578063fe4b84df1461069c57600080fd5b8063adc7ea3714610594578063d547741f146105b4578063d6281d3e146105d4578063e58378bb146105f457600080fd5b80637feb1d8a116100d15780637feb1d8a1461051757806391d148541461052c5780639ed1a9851461054c578063a217fddf1461057f57600080fd5b806373467c7614610499578063759076e5146104ae57806378fab260146104c35780637a702b3c146104f757600080fd5b80632f2ff15d1161017a57806345f739ff1161014957806345f739ff1461041d5780634f1ef2861461045157806352d1902d146104645780636b09de451461047957600080fd5b80632f2ff15d1461038e57806336568abe146103b05780633659cfe6146103d05780633711bbf5146103f057600080fd5b80631d4d3a5d116101b65780631d4d3a5d146102af578063204d7923146102f6578063248a9ca31461032a57806324ea54f41461035a57600080fd5b8062f714ce146101e757806301ffc9a71461021a57806305918a791461024a578063150b7a021461026a575b600080fd5b3480156101f357600080fd5b506102076102023660046128f1565b6106bc565b6040519081526020015b60405180910390f35b34801561022657600080fd5b5061023a610235366004612921565b61088e565b6040519015158152602001610211565b34801561025657600080fd5b5061020761026536600461296e565b6108b9565b34801561027657600080fd5b506102966102853660046129f4565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610211565b3480156102bb57600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b039091168152602001610211565b34801561030257600080fd5b506102077f288a15c4a15d470e4cd9cad2f113b91206b520c26dbd3dd74627f0c057baa19c81565b34801561033657600080fd5b50610207610345366004612a93565b60009081526065602052604090206001015490565b34801561036657600080fd5b506102077f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b34801561039a57600080fd5b506103ae6103a93660046128f1565b6109bf565b005b3480156103bc57600080fd5b506103ae6103cb3660046128f1565b6109e9565b3480156103dc57600080fd5b506103ae6103eb366004612aac565b610a67565b3480156103fc57600080fd5b5061041061040b36600461296e565b610b46565b6040516102119190612ac9565b34801561042957600080fd5b506102077f90fe2ba5da14f172ed5a0a0fec391dbf8f191c9a2f3557d79ede5d6b1c1c9ffb81565b6103ae61045f366004612bff565b610cc2565b34801561047057600080fd5b50610207610d8e565b34801561048557600080fd5b506103ae610494366004612a93565b610e41565b3480156104a557600080fd5b5060fb54610207565b3480156104ba57600080fd5b5060fc54610207565b3480156104cf57600080fd5b506102077f92a19c77d2ea87c7f81d50c74403cb2f401780f3ad919571121efe2bdb427eb181565b34801561050357600080fd5b506103ae610512366004612ca7565b610f0b565b34801561052357600080fd5b5061020761106e565b34801561053857600080fd5b5061023a6105473660046128f1565b6111fb565b34801561055857600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006102de565b34801561058b57600080fd5b50610207600081565b3480156105a057600080fd5b506103ae6105af366004612a93565b611226565b3480156105c057600080fd5b506103ae6105cf3660046128f1565b61128d565b3480156105e057600080fd5b506102966105ef366004612cd9565b6112b2565b34801561060057600080fd5b506102077fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e81565b34801561063457600080fd5b506103ae6106433660046128f1565b611363565b34801561065457600080fd5b50610296610663366004612d1f565b61150f565b34801561067457600080fd5b506102077fc6823861ee2bb2198ce6b1fd6faf4c8f44f745bc804aca4a762f67e0d507fd8a81565b3480156106a857600080fd5b506103ae6106b7366004612a93565b61151f565b60007fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e6106e88161162a565b6001600160a01b0383166107695760405162461bcd60e51b815260206004820152603a60248201527f4575726f43617368466c6f774c656e6465723a2064657374696e6174696f6e2060448201527f63616e6e6f7420626520746865207a65726f206164647265737300000000000060648201526084015b60405180910390fd5b600060fc5412156107f05760405162461bcd60e51b815260206004820152604560248201527f4575726f43617368466c6f774c656e6465723a2063616e6e6f7420776974686460448201527f72617720696620746865726527732064656274207769746820746865206375736064820152643a37b6b2b960d91b608482015260a401610760565b600019840361080857610801611634565b935061081c565b61081984610814611634565b6116ad565b93505b83156108835761083f838561082f6116c3565b6001600160a01b0316919061172e565b826001600160a01b03167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b658560405161087a91815260200190565b60405180910390a25b8391505b5092915050565b60006001600160e01b03198216633ece0a8960e01b14806108b357506108b382611791565b92915050565b60007f90fe2ba5da14f172ed5a0a0fec391dbf8f191c9a2f3557d79ede5d6b1c1c9ffb6108e58161162a565b6108f58b8b8b8b8a888b8b6117c6565b60008060006109058e8e8b6118a3565b9250925092506109148d6118f7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663406f7f6f84848f8f30876040518763ffffffff1660e01b815260040161096a96959493929190612d60565b6020604051808303816000875af1158015610989573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ad9190612da6565b9e9d5050505050505050505050505050565b6000828152606560205260409020600101546109da8161162a565b6109e48383611947565b505050565b6001600160a01b0381163314610a595760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610760565b610a6382826119cd565b5050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610aaf5760405162461bcd60e51b815260040161076090612dbf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610af8600080516020613501833981519152546001600160a01b031690565b6001600160a01b031614610b1e5760405162461bcd60e51b815260040161076090612e0b565b610b2781611a34565b60408051600080825260208201909252610b4391839190611a5e565b50565b610bcf604051806101c00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b03168152602001600064ffffffffff168152602001600064ffffffffff1681525090565b7f90fe2ba5da14f172ed5a0a0fec391dbf8f191c9a2f3557d79ede5d6b1c1c9ffb610bf98161162a565b610c098b8b8b8b8a888b8b6117c6565b6000806000610c198e8e8b6118a3565b925092509250610c288d6118f7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631d177dc484848f8f30876040518763ffffffff1660e01b8152600401610c7e96959493929190612d60565b6101c0604051808303816000875af1158015610c9e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ad9190612e6d565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610d0a5760405162461bcd60e51b815260040161076090612dbf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610d53600080516020613501833981519152546001600160a01b031690565b6001600160a01b031614610d795760405162461bcd60e51b815260040161076090612e0b565b610d8282611a34565b610a6382826001611a5e565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e2e5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610760565b5060008051602061350183398151915290565b600060fc5413610eab5760405162461bcd60e51b815260206004820152602f60248201527f4575726f43617368466c6f774c656e6465723a2064656274206d75737420626560448201526e02067726561746572207468616e203608c1b6064820152608401610760565b60fc54811315610ecd5760405162461bcd60e51b815260040161076090612f33565b610ed681611bc9565b6000610eea610ee361106e565b8390611bdb565b9050610a63333083610efa6116c3565b6001600160a01b0316929190611c13565b7f92a19c77d2ea87c7f81d50c74403cb2f401780f3ad919571121efe2bdb427eb1610f358161162a565b6000610f49610f4261106e565b8490611bdb565b905083602001358111610fcc57610f6861018085016101608601612aac565b6001600160a01b0316637a702b3c85836040518363ffffffff1660e01b8152600401610f95929190612f8f565b600060405180830381600087803b158015610faf57600080fd5b505af1158015610fc3573d6000803e3d6000fd5b50505050611068565b610fde61018085016101608601612aac565b6001600160a01b0316637a702b3c8586602001356040518363ffffffff1660e01b815260040161100f929190612f8f565b600060405180830381600087803b15801561102957600080fd5b505af115801561103d573d6000803e3d6000fd5b5050505061106861106361104f61106e565b61105d602088013585613078565b90611c4b565b611bc9565b50505050565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156110d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f591906130a5565b50935050925050610e1064ffffffffff16426111119190613078565b811161115f5760405162461bcd60e51b815260206004820152601d60248201527f5072696365206973206f6c646572207468616e20746f6c657261626c650000006044820152606401610760565b6111f461116b83611c82565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ed91906130f5565b6012611cd8565b9250505090565b60009182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b7fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e6112508161162a565b60fb8290556040518281527f1f2dbc31223d0f5dbff7d1ea226033a6c06356f9c5c64923fcede30229af39ae906020015b60405180910390a15050565b6000828152606560205260409020600101546112a88161162a565b6109e483836119cd565b60006112bc611d2d565b6001600160a01b0316336001600160a01b0316146113305760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c792074686520506f6c696379506f6f6c2073686f756c642063616c6c2060448201526a1d1a1a5cc81b595d1a1bd960aa1b6064820152608401610760565b600061134461133d61106e565b8490611c4b565b905061134f81611bc9565b50636b140e9f60e11b90505b949350505050565b7f288a15c4a15d470e4cd9cad2f113b91206b520c26dbd3dd74627f0c057baa19c61138d8161162a565b600060fc541280156113aa575060fc546113a690613118565b8313155b6113c65760405162461bcd60e51b815260040161076090612f33565b60006113da6113d361106e565b8590611bdb565b9050806113e5611634565b101561143e5760405162461bcd60e51b815260206004820152602260248201527f4e6f7420656e6f7567682062616c616e636520746f2070617920746865206465604482015261189d60f21b6064820152608401610760565b611447846118f7565b61144f6116c3565b60405163a9059cbb60e01b81526001600160a01b03858116600483015260248201849052919091169063a9059cbb906044016020604051808303816000875af11580156114a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c49190613134565b5060408051858152602081018390526001600160a01b038516917f9952e9b5359ae7ebcc98478e05ebb744b6783958ca3c605494e448d4bd1f1630910160405180910390a250505050565b63e8e617b760e01b5b9392505050565b600054610100900460ff161580801561153f5750600054600160ff909116105b806115595750303b158015611559575060005460ff166001145b6115bc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610760565b6000805460ff1916600117905580156115df576000805461ff0019166101001790555b6115e882611d8d565b8015610a63576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611281565b610b438133611dcd565b600061163e6116c3565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015611684573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a89190612da6565b905090565b60008183106116bc5781611518565b5090919050565b60006116cd611d2d565b6001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561170a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a89190613156565b6040516001600160a01b0383166024820152604481018290526109e490849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611e26565b60006001600160e01b03198216637965db0b60e01b14806108b357506301ffc9a760e01b6001600160e01b03198316146108b3565b600061185c7f000000000000000000000000000000000000000000000000000000000000000060405160609190911b6bffffffffffffffffffffffff19166020820152603481018b9052605481018a90526074810189905260d888811b6001600160d81b03199081166094840152609983018990529087901b1660b982015260be01604051602081830303815290604052611efb565b9050600061186b828585611f36565b90506118977fc6823861ee2bb2198ce6b1fd6faf4c8f44f745bc804aca4a762f67e0d507fd8a82611dcd565b50505050505050505050565b6000806000806118b161106e565b60fb549091506118cb906118c58984611bdb565b90611bdb565b96506118d78682611bdb565b955060006118e9600160601b87613189565b979896979695505050505050565b8060fc6000828254611909919061319d565b909155505060fc546040519081527fc7f3c2106cf3d0f81736749a1583b800014a964dc37d2f0eb8216c1b852317289060200160405180910390a150565b61195182826111fb565b610a635760008281526065602090815260408083206001600160a01b03851684529091529020805460ff191660011790556119893390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6119d782826111fb565b15610a635760008281526065602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a5041610a638161162a565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611a91576109e483611f5c565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611aeb575060408051601f3d908101601f19168201909252611ae891810190612da6565b60015b611b4e5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610760565b6000805160206135018339815191528114611bbd5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610760565b506109e4838383611ff8565b8060fc600082825461190991906131bd565b600081156706f05b59d3b200001983900484111517611bf957600080fd5b50670de0b6b3a764000091026706f05b59d3b20000010490565b6040516001600160a01b03808516602483015283166044820152606481018290526110689085906323b872dd60e01b9060840161175a565b60008115670de0b6b3a764000060028404190484111715611c6b57600080fd5b50670de0b6b3a76400009190910260028204010490565b600080821215611cd45760405162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f7369746976656044820152606401610760565b5090565b60008160ff168360ff161015611d0e57611cf283836131dd565b611cfd90600a6132da565b611d0790856132e9565b9050611518565b611d1882846131dd565b611d2390600a6132da565b611d079085613308565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634d15eb036040518163ffffffff1660e01b8152600401602060405180830381865afa15801561170a573d6000803e3d6000fd5b600054610100900460ff16611db45760405162461bcd60e51b81526004016107609061331c565b611dbc61201d565b611dc461201d565b610b4381612046565b611dd782826111fb565b610a6357611de48161210d565b611def83602061211f565b604051602001611e0092919061338b565b60408051601f198184030181529082905262461bcd60e51b825261076091600401613400565b6000611e7b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166122bb9092919063ffffffff16565b9050805160001480611e9c575080806020019051810190611e9c9190613134565b6109e45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610760565b6000611f0782516122ca565b82604051602001611f19929190613433565b604051602081830303815290604052805190602001209050919050565b6000806000611f4686868661235d565b91509150611f5381612396565b50949350505050565b6001600160a01b0381163b611fc95760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610760565b60008051602061350183398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b612001836124e0565b60008251118061200e5750805b156109e4576110688383612520565b600054610100900460ff166120445760405162461bcd60e51b81526004016107609061331c565b565b600054610100900460ff1661206d5760405162461bcd60e51b81526004016107609061331c565b612078600033612545565b60fb8190556120856116c3565b6001600160a01b031663095ea7b361209b611d2d565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260001960248201526044016020604051808303816000875af11580156120e9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a639190613134565b60606108b36001600160a01b03831660145b6060600061212e8360026132e9565b61213990600261348e565b67ffffffffffffffff81111561215157612151612b8e565b6040519080825280601f01601f19166020018201604052801561217b576020820181803683370190505b509050600360fc1b81600081518110612196576121966134a1565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106121c5576121c56134a1565b60200101906001600160f81b031916908160001a90535060006121e98460026132e9565b6121f490600161348e565b90505b600181111561226c576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612228576122286134a1565b1a60f81b82828151811061223e5761223e6134a1565b60200101906001600160f81b031916908160001a90535060049490941c93612265816134b7565b90506121f7565b5083156115185760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610760565b606061135b848460008561254f565b606060006122d78361262a565b600101905060008167ffffffffffffffff8111156122f7576122f7612b8e565b6040519080825280601f01601f191660200182016040528015612321576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461232b57509392505050565b6000806001600160ff1b0383168161237a60ff86901c601b61348e565b905061238887828885612702565b935093505050935093915050565b60008160048111156123aa576123aa6134ce565b036123b25750565b60018160048111156123c6576123c66134ce565b036124135760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610760565b6002816004811115612427576124276134ce565b036124745760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610760565b6003816004811115612488576124886134ce565b03610b435760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610760565b6124e981611f5c565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606115188383604051806060016040528060278152602001613521602791396127c6565b610a638282611947565b6060824710156125b05760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610760565b600080866001600160a01b031685876040516125cc91906134e4565b60006040518083038185875af1925050503d8060008114612609576040519150601f19603f3d011682016040523d82523d6000602084013e61260e565b606091505b509150915061261f8783838761283e565b979650505050505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106126695772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612695576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106126b357662386f26fc10000830492506010015b6305f5e10083106126cb576305f5e100830492506008015b61271083106126df57612710830492506004015b606483106126f1576064830492506002015b600a83106108b35760010192915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561273957506000905060036127bd565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561278d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166127b6576000600192509250506127bd565b9150600090505b94509492505050565b6060600080856001600160a01b0316856040516127e391906134e4565b600060405180830381855af49150503d806000811461281e576040519150601f19603f3d011682016040523d82523d6000602084013e612823565b606091505b50915091506128348683838761283e565b9695505050505050565b606083156128ad5782516000036128a6576001600160a01b0385163b6128a65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610760565b508161135b565b61135b83838151156128c25781518083602001fd5b8060405162461bcd60e51b81526004016107609190613400565b6001600160a01b0381168114610b4357600080fd5b6000806040838503121561290457600080fd5b823591506020830135612916816128dc565b809150509250929050565b60006020828403121561293357600080fd5b81356001600160e01b03198116811461151857600080fd5b64ffffffffff81168114610b4357600080fd5b80356129698161294b565b919050565b60008060008060008060008060006101208a8c03121561298d57600080fd5b8935985060208a0135975060408a0135965060608a01356129ad8161294b565b955060808a01356129bd816128dc565b945060a08a0135935060c08a0135925060e08a013591506101008a01356129e38161294b565b809150509295985092959850929598565b600080600080600060808688031215612a0c57600080fd5b8535612a17816128dc565b94506020860135612a27816128dc565b935060408601359250606086013567ffffffffffffffff80821115612a4b57600080fd5b818801915088601f830112612a5f57600080fd5b813581811115612a6e57600080fd5b896020828501011115612a8057600080fd5b9699959850939650602001949392505050565b600060208284031215612aa557600080fd5b5035919050565b600060208284031215612abe57600080fd5b8135611518816128dc565b60006101c082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151818401525061014080840151818401525061016080840151612b5b828501826001600160a01b03169052565b50506101808381015164ffffffffff81168483015250506101a08381015164ffffffffff8116848301525b505092915050565b634e487b7160e01b600052604160045260246000fd5b6040516101c0810167ffffffffffffffff81118282101715612bc857612bc8612b8e565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612bf757612bf7612b8e565b604052919050565b60008060408385031215612c1257600080fd5b8235612c1d816128dc565b915060208381013567ffffffffffffffff80821115612c3b57600080fd5b818601915086601f830112612c4f57600080fd5b813581811115612c6157612c61612b8e565b612c73601f8201601f19168501612bce565b91508082528784828501011115612c8957600080fd5b80848401858401376000848284010152508093505050509250929050565b6000808284036101e0811215612cbc57600080fd5b6101c080821215612ccc57600080fd5b9395938601359450505050565b60008060008060808587031215612cef57600080fd5b8435612cfa816128dc565b93506020850135612d0a816128dc565b93969395505050506040820135916060013590565b600080600060608486031215612d3457600080fd5b8335612d3f816128dc565b92506020840135612d4f816128dc565b929592945050506040919091013590565b9586526020860194909452604085019290925264ffffffffff1660608401526001600160a01b031660808301526bffffffffffffffffffffffff1660a082015260c00190565b600060208284031215612db857600080fd5b5051919050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b8051612969816128dc565b80516129698161294b565b60006101c08284031215612e8057600080fd5b612e88612ba4565b825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e0820152610100808401518183015250610120808401518183015250610140808401518183015250610160612f04818501612e57565b90820152610180612f16848201612e62565b908201526101a0612f28848201612e62565b908201529392505050565b60208082526031908201527f4575726f43617368466c6f774c656e6465723a20616d6f756e74206d757374206040820152701899481b195cdcc81d1a185b881919589d607a1b606082015260800190565b8035612969816128dc565b60006101e082019050833582526020840135602083015260408401356040830152606084013560608301526080840135608083015260a084013560a083015260c084013560c083015260e084013560e0830152610100808501358184015250610120808501358184015250610140808501358184015250610160613014818601612f84565b6001600160a01b03169083015261018061302f85820161295e565b64ffffffffff16908301526101a061304885820161295e565b64ffffffffff16908301526101c090910191909152919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156108b3576108b3613062565b805169ffffffffffffffffffff8116811461296957600080fd5b600080600080600060a086880312156130bd57600080fd5b6130c68661308b565b94506020860151935060408601519250606086015191506130e96080870161308b565b90509295509295909350565b60006020828403121561310757600080fd5b815160ff8116811461151857600080fd5b6000600160ff1b820161312d5761312d613062565b5060000390565b60006020828403121561314657600080fd5b8151801515811461151857600080fd5b60006020828403121561316857600080fd5b8151611518816128dc565b634e487b7160e01b600052601260045260246000fd5b60008261319857613198613173565b500690565b8082018281126000831280158216821582161715612b8657612b86613062565b818103600083128015838313168383128216171561088757610887613062565b60ff82811682821603908111156108b3576108b3613062565b600181815b8085111561323157816000190482111561321757613217613062565b8085161561322457918102915b93841c93908002906131fb565b509250929050565b600082613248575060016108b3565b81613255575060006108b3565b816001811461326b576002811461327557613291565b60019150506108b3565b60ff84111561328657613286613062565b50506001821b6108b3565b5060208310610133831016604e8410600b84101617156132b4575081810a6108b3565b6132be83836131f6565b80600019048211156132d2576132d2613062565b029392505050565b600061151860ff841683613239565b600081600019048311821515161561330357613303613062565b500290565b60008261331757613317613173565b500490565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b8381101561338257818101518382015260200161336a565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516133c3816017850160208801613367565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516133f4816028840