[ { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [], "name": "ARRAY_LENGTH_MISMATCH", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "CONSUMER_ALREADY_SUBSCRIBED", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "subscription", "type": "uint256" }, { "internalType": "address", "name": "consumer", "type": "address" } ], "name": "CONSUMER_NOT_FOUND", "type": "error" }, { "inputs": [], "name": "CONSUMER_ZERO", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "total", "type": "uint256" }, { "internalType": "uint256", "name": "current", "type": "uint256" } ], "name": "MAX_CONSUMERS_ADDITION_REACHED", "type": "error" }, { "inputs": [], "name": "NOTHING_TO_PAY", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "token", "type": "address" } ], "name": "NOT_APPROVED_TOKEN", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "NOT_DATASET_OWNER", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "NOT_SUBSCRIPTION_OWNER", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "minimum", "type": "uint256" }, { "internalType": "uint256", "name": "maximum", "type": "uint256" }, { "internalType": "uint256", "name": "current", "type": "uint256" } ], "name": "SUBSCRIPTION_DURATION_INVALID", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "validTill", "type": "uint256" }, { "internalType": "uint256", "name": "currentTimestamp", "type": "uint256" } ], "name": "SUBSCRIPTION_ENDED", "type": "error" }, { "inputs": [], "name": "SUBSCRIPTION_FEE_EXCEEDS_LIMIT", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "maximum", "type": "uint256" }, { "internalType": "uint256", "name": "current", "type": "uint256" } ], "name": "SUBSCRIPTION_REMAINING_DURATION", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "id", "type": "uint256" } ], "name": "UNSUPPORTED_DATASET", "type": "error" }, { "inputs": [], "name": "UNSUPPORTED_MSG_VALUE", "type": "error" }, { "inputs": [], "name": "UNSUPPORTED_NATIVE_CURRENCY", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "approved", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "Approval", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": false, "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "ApprovalForAll", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" }, { "indexed": true, "internalType": "address", "name": "consumer", "type": "address" } ], "name": "ConsumerAdded", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" }, { "indexed": true, "internalType": "address", "name": "consumer", "type": "address" } ], "name": "ConsumerRemoved", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint8", "name": "version", "type": "uint8" } ], "name": "Initialized", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "validSince", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "validTill", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "paidConsumers", "type": "uint256" } ], "name": "SubscriptionPaid", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "newTrustedForwarder", "type": "address" } ], "name": "TrustedForwarderSourceChanged", "type": "event" }, { "inputs": [], "name": "MAX_SUBSCRIPTION_DURATION_IN_DAYS", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "MAX_SUBSCRIPTION_EXTENSION_IN_DAYS", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "subscription", "type": "uint256" }, { "internalType": "address[]", "name": "consumers", "type": "address[]" } ], "name": "addConsumers", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "approve", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "dataset", "outputs": [ { "internalType": "contract IDatasetNFT", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "datasetId", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "subscription", "type": "uint256" }, { "internalType": "uint256", "name": "extraDurationInDays", "type": "uint256" }, { "internalType": "uint256", "name": "extraConsumers", "type": "uint256" }, { "internalType": "uint256", "name": "maxExtraFee", "type": "uint256" } ], "name": "extendSubscription", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "subscription", "type": "uint256" }, { "internalType": "uint256", "name": "extraDurationInDays", "type": "uint256" }, { "internalType": "address[]", "name": "extraConsumers", "type": "address[]" }, { "internalType": "uint256", "name": "maxExtraFee", "type": "uint256" } ], "name": "extendSubscriptionAndAddExtraConsumers", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "subscription", "type": "uint256" }, { "internalType": "uint256", "name": "extraConsumers", "type": "uint256" } ], "name": "extraConsumerFee", "outputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "feePerConsumerPerDay", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "getApproved", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "dataset_", "type": "address" }, { "internalType": "uint256", "name": "datasetId_", "type": "uint256" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "operator", "type": "address" } ], "name": "isApprovedForAll", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "ds", "type": "uint256" }, { "internalType": "address", "name": "consumer", "type": "address" } ], "name": "isSubscriptionPaidFor", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "forwarder", "type": "address" } ], "name": "isTrustedForwarder", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "ownerOf", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "subscription", "type": "uint256" }, { "internalType": "address[]", "name": "consumers", "type": "address[]" } ], "name": "removeConsumers", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "subscription", "type": "uint256" }, { "internalType": "address[]", "name": "oldConsumers", "type": "address[]" }, { "internalType": "address[]", "name": "newConsumers", "type": "address[]" } ], "name": "replaceConsumers", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "safeTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "safeTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "setApprovalForAll", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "token_", "type": "address" }, { "internalType": "uint256", "name": "feePerConsumerPerDay_", "type": "uint256" } ], "name": "setFee", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "ds", "type": "uint256" }, { "internalType": "uint256", "name": "durationInDays", "type": "uint256" }, { "internalType": "uint256", "name": "consumers", "type": "uint256" }, { "internalType": "uint256", "name": "maxFee", "type": "uint256" } ], "name": "subscribe", "outputs": [ { "internalType": "uint256", "name": "sid", "type": "uint256" } ], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "ds", "type": "uint256" }, { "internalType": "uint256", "name": "durationInDays", "type": "uint256" }, { "internalType": "address[]", "name": "consumers", "type": "address[]" }, { "internalType": "uint256", "name": "maxFee", "type": "uint256" } ], "name": "subscribeAndAddConsumers", "outputs": [ { "internalType": "uint256", "name": "sid", "type": "uint256" } ], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "ds", "type": "uint256" }, { "internalType": "uint256", "name": "durationInDays", "type": "uint256" }, { "internalType": "uint256", "name": "consumers", "type": "uint256" } ], "name": "subscriptionFee", "outputs": [ { "internalType": "address", "name": "token", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "token", "outputs": [ { "internalType": "contract IERC20", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "index", "type": "uint256" } ], "name": "tokenByIndex", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "uint256", "name": "index", "type": "uint256" } ], "name": "tokenOfOwnerByIndex", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "tokenURI", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "transferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ]
60806040523480156200001157600080fd5b506200001c62000022565b620000e3565b600054610100900460ff16156200008f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811614620000e1576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6135f780620000f36000396000f3fe6080604052600436106102045760003560e01c8063572b6c0511610118578063bd1c4e71116100a0578063e55156b51161006f578063e55156b5146105a3578063e6bebb32146105c3578063e985e9c514610602578063f98bd8121461064b578063fc0c546a1461065e57600080fd5b8063bd1c4e7114610536578063c87b56dd1461054d578063cd6dc6871461056d578063d02d70191461058d57600080fd5b806395d89b41116100e757806395d89b41146104ae5780639e02247e146104c3578063a22cb465146104e3578063b88d4fde14610503578063baa80a311461052357600080fd5b8063572b6c051461042e5780636352211e1461044e57806370a082311461046e5780637963041d1461048e57600080fd5b80632101bf931161019b5780633cf32b141161016a5780633cf32b141461039957806342842e0e146103b95780634f6ccce7146103d9578063544754ea146103f95780635620bb691461040e57600080fd5b80632101bf931461032357806323b872dd14610343578063253be384146103635780632f745c591461037957600080fd5b8063095ea7b3116101d7578063095ea7b3146102b857806314eef9dd146102da57806318160ddd146102fb5780631f5efb011461031057600080fd5b806301ffc9a71461020957806302b728ab1461023e57806306fdde0314610276578063081812fc14610298575b600080fd5b34801561021557600080fd5b50610229610224366004612d03565b61067f565b60405190151581526020015b60405180910390f35b34801561024a57600080fd5b5060fc5461025e906001600160a01b031681565b6040516001600160a01b039091168152602001610235565b34801561028257600080fd5b5061028b6106aa565b6040516102359190612d70565b3480156102a457600080fd5b5061025e6102b3366004612d83565b61073c565b3480156102c457600080fd5b506102d86102d3366004612db1565b610763565b005b6102ed6102e8366004612e22565b61088f565b604051908152602001610235565b34801561030757600080fd5b506099546102ed565b6102ed61031e366004612e7d565b6108b3565b34801561032f57600080fd5b506102ed61033e366004612eaf565b6108cc565b34801561034f57600080fd5b506102d861035e366004612ed1565b6109a4565b34801561036f57600080fd5b506102ed61016d81565b34801561038557600080fd5b506102ed610394366004612db1565b6109dc565b3480156103a557600080fd5b506102d86103b4366004612f12565b610a72565b3480156103c557600080fd5b506102d86103d4366004612ed1565b610ad6565b3480156103e557600080fd5b506102ed6103f4366004612d83565b610af1565b34801561040557600080fd5b506102ed601e81565b34801561041a57600080fd5b50610229610429366004612f5e565b610b84565b34801561043a57600080fd5b50610229610449366004612f8e565b610c09565b34801561045a57600080fd5b5061025e610469366004612d83565b610c78565b34801561047a57600080fd5b506102ed610489366004612f8e565b610cd8565b34801561049a57600080fd5b506102d86104a9366004612fab565b610d5e565b3480156104ba57600080fd5b5061028b610dc6565b3480156104cf57600080fd5b506102d86104de366004612f12565b610dd5565b3480156104ef57600080fd5b506102d86104fe366004613033565b610e32565b34801561050f57600080fd5b506102d861051e366004613077565b610e48565b6102d8610531366004612e7d565b610e87565b34801561054257600080fd5b506102ed6101025481565b34801561055957600080fd5b5061028b610568366004612d83565b610e93565b34801561057957600080fd5b506102d8610588366004612db1565b610f07565b34801561059957600080fd5b506102ed60fd5481565b3480156105af57600080fd5b506102d86105be366004612db1565b61106e565b3480156105cf57600080fd5b506105e36105de366004613157565b61120b565b604080516001600160a01b039093168352602083019190915201610235565b34801561060e57600080fd5b5061022961061d366004613183565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b6102d8610659366004612e22565b61128c565b34801561066a57600080fd5b506101015461025e906001600160a01b031681565b60006001600160e01b03198216631e44eae760e01b14806106a457506106a4826112a9565b92915050565b6060606580546106b9906131b1565b80601f01602080910402602001604051908101604052809291908181526020018280546106e5906131b1565b80156107325780601f1061070757610100808354040283529160200191610732565b820191906000526020600020905b81548152906001019060200180831161071557829003601f168201915b5050505050905090565b6000610747826112ce565b506000908152606960205260409020546001600160a01b031690565b600061076e82610c78565b9050806001600160a01b0316836001600160a01b0316036107e05760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b806001600160a01b03166107f2611330565b6001600160a01b0316148061080e575061080e8161061d611330565b6108805760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016107d7565b61088a838361133f565b505050565b600061089d868685856113ad565b90506108aa818585611549565b95945050505050565b60006108c1858585856113ad565b90505b949350505050565b6000816000036108ef5760405163358b0b7760e01b815260040160405180910390fd5b600083815260ff6020526040902060018101544210610930576001810154604051637ba532d760e11b815260048101919091524260248201526044016107d7565b6000620151808260000154836001015461094a9190613201565b6109549190613214565b90506000610966828460020154611672565b91505060006109848387866002015461097f9190613236565b611672565b915050818111610995576000610999565b8181035b979650505050505050565b6109b56109af611330565b826116ae565b6109d15760405162461bcd60e51b81526004016107d790613249565b61088a83838361172c565b60006109e783610cd8565b8210610a495760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107d7565b506001600160a01b03919091166000908152609760209081526040808320938352929052205490565b826000610a7d611330565b9050806001600160a01b0316610a9283610c78565b6001600160a01b031614610ac45760405163acc21a5960e01b81526001600160a01b03821660048201526024016107d7565b610acf85858561189d565b5050505050565b61088a83838360405180602001604052806000815250610e48565b6000610afc60995490565b8210610b5f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107d7565b60998281548110610b7257610b72613296565b90600052602060002001549050919050565b6000610b8f83611965565b6001600160a01b03821660009081526101006020526040812090610bb28261198a565b905060005b81811015610bfd576000610bcb8483611994565b600081815260ff6020526040902060010154909150421015610bf45760019450505050506106a4565b50600101610bb7565b50600095945050505050565b60c95460405163572b6c0560e01b81526001600160a01b038381166004830152600092169063572b6c0590602401602060405180830381865afa158015610c54573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a491906132ac565b6000818152606760205260408120546001600160a01b0316806106a45760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016107d7565b60006001600160a01b038216610d425760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016107d7565b506001600160a01b031660009081526068602052604090205490565b846000610d69611330565b9050806001600160a01b0316610d7e83610c78565b6001600160a01b031614610db05760405163acc21a5960e01b81526001600160a01b03821660048201526024016107d7565b610dbd87878787876119a0565b50505050505050565b6060606680546106b9906131b1565b826000610de0611330565b9050806001600160a01b0316610df583610c78565b6001600160a01b031614610e275760405163acc21a5960e01b81526001600160a01b03821660048201526024016107d7565b610acf858585611549565b610e44610e3d611330565b8383611b54565b5050565b610e59610e53611330565b836116ae565b610e755760405162461bcd60e51b81526004016107d790613249565b610e8184848484611c22565b50505050565b610e8184848484611c55565b6060610e9e826112ce565b6000610eb560408051602081019091526000815290565b90506000815111610ed55760405180602001604052806000815250610f00565b80610edf84611e36565b604051602001610ef09291906132c9565b6040516020818303038152906040525b9392505050565b600054610100900460ff1615808015610f275750600054600160ff909116105b80610f415750303b158015610f41575060005460ff166001145b610fa45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016107d7565b6000805460ff191660011790558015610fc7576000805461ff0019166101001790555b61101a60405180604001604052806013815260200172273ab5b630b49029bab139b1b934b83a34b7b760691b815250604051806040016040528060068152602001652720a4a9aaa160d11b815250611ec9565b6110248383611efa565b801561088a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b6000611078611330565b60fc5460fd546040516331a9108f60e11b81529293506001600160a01b0380851693921691636352211e916110b39160040190815260200190565b602060405180830381865afa1580156110d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f491906132f8565b6001600160a01b031614611125576040516250b83f60e81b81526001600160a01b03821660048201526024016107d7565b6001600160a01b03831661114c5760405163332f9a7560e01b815260040160405180910390fd5b60fc54604051632d5ad3d560e01b81526001600160a01b03858116600483015290911690632d5ad3d590602401602060405180830381865afa158015611196573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ba91906132ac565b6111e2576040516307f5aa0960e21b81526001600160a01b03841660048201526024016107d7565b5061010180546001600160a01b0319166001600160a01b03939093169290921790915561010255565b60008061121785611965565b831580611225575061016d84115b156112555760405163f016b95760e01b81526001600482015261016d6024820152604481018590526064016107d7565b826000036112765760405163358b0b7760e01b815260040160405180910390fd5b6112808484611672565b91509150935093915050565b61129885858484611c55565b8115610acf57610acf858484611549565b60006001600160e01b0319821663780e9d6360e01b14806106a457506106a482611f3c565b6000818152606760205260409020546001600160a01b031661132d5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016107d7565b50565b600061133a611f8c565b905090565b600081815260696020526040902080546001600160a01b0319166001600160a01b038416908117909155819061137482610c78565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006113b885611965565b6113c3610489611330565b156113f5576113d0611330565b60405163fdb7add360e01b81526001600160a01b0390911660048201526024016107d7565b831580611403575061016d84115b156114335760405163f016b95760e01b81526001600482015261016d6024820152604481018590526064016107d7565b826000036114545760405163358b0b7760e01b815260040160405180910390fd5b60006114608585611672565b9150508281111561148457604051639e45baef60e01b815260040160405180910390fd5b61149561148f611330565b82611fbb565b60fe600081546114a490613315565b9182905550600081815260ff602052604090204281559092506114ca866201518061332e565b6114d49042613236565b6001820155600281018590556114f16114eb611330565b84612143565b8054600182015460028301546040805193845260208401929092529082015283907fc0c5f780288600bd422b1277ec0e23da2694f7b048ca78e7c40a05f9848382389060600160405180910390a25050949350505050565b611552836112ce565b600083815260ff602052604090206002810154826115726003840161198a565b61157c9190613236565b11156115c0576002810154826115946003840161198a565b61159e9190613236565b604051630fa1ec2160e41b8152600481019290925260248201526044016107d7565b60005b82811015610acf5760008484838181106115df576115df613296565b90506020020160208101906115f49190612f8e565b90506000611605600385018361215d565b90508015611668576001600160a01b0382166000908152610100602052604090206116309088612172565b506040516001600160a01b0383169088907f4e5aab67fb6878a7c5437d638d002992f2b503107c053f38483f6b294948749390600090a35b50506001016115c3565b610101546101025460009182916001600160a01b0390911690849061169890879061332e565b6116a2919061332e565b915091505b9250929050565b6000806116ba83610c78565b9050806001600160a01b0316846001600160a01b0316148061170157506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff165b806108c45750836001600160a01b031661171a8461073c565b6001600160a01b031614949350505050565b826001600160a01b031661173f82610c78565b6001600160a01b0316146117655760405162461bcd60e51b81526004016107d790613345565b6001600160a01b0382166117c75760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107d7565b6117d4838383600161217e565b826001600160a01b03166117e782610c78565b6001600160a01b03161461180d5760405162461bcd60e51b81526004016107d790613345565b600081815260696020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260688552838620805460001901905590871680865283862080546001019055868652606790945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6118a6836112ce565b600083815260ff60205260408120905b82811015610acf5760008484838181106118d2576118d2613296565b90506020020160208101906118e79190612f8e565b905060006118f860038501836122ab565b9050801561195b576001600160a01b03821660009081526101006020526040902061192390886122c0565b506040516001600160a01b0383169088907f5274c432b5877b38569ae9babd361f86e4b34d0f36aef7f6c61cbba5f185cee190600090a35b50506001016118b6565b8060fd541461132d57604051632383105b60e11b8152600481018290526024016107d7565b60006106a4825490565b6000610f0083836122cc565b6119a9856112ce565b600085815260ff602052604090208382146119d757604051634456f5e960e11b815260040160405180910390fd5b60005b84811015610dbd5760008686838181106119f6576119f6613296565b9050602002016020810190611a0b9190612f8e565b90506000611a1c60038501836122ab565b90508015611a83576001600160a01b038216600090815261010060205260409020611a47908a6122c0565b506040516001600160a01b038316908a907f5274c432b5877b38569ae9babd361f86e4b34d0f36aef7f6c61cbba5f185cee190600090a3611aae565b604051632d7c4b6560e01b8152600481018a90526001600160a01b03831660248201526044016107d7565b858584818110611ac057611ac0613296565b9050602002016020810190611ad59190612f8e565b91506000611ae6600386018461215d565b90508015611b49576001600160a01b038316600090815261010060205260409020611b11908b612172565b506040516001600160a01b038416908b907f4e5aab67fb6878a7c5437d638d002992f2b503107c053f38483f6b294948749390600090a35b5050506001016119da565b816001600160a01b0316836001600160a01b031603611bb55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107d7565b6001600160a01b038381166000818152606a6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611c2d84848461172c565b611c39848484846122f6565b610e815760405162461bcd60e51b81526004016107d79061338a565b611c5e846112ce565b600084815260ff60205260408120600181015490919081908190421015611d0d578615611cbf57600184015442900362278d00811115611cbd57604051637186771960e11b815262278d006004820152602481018290526044016107d7565b505b60006201518085600001548660010154611cd99190613201565b611ce39190613214565b9050611cf3818660020154611672565b865494509250611d0590508882613236565b935050611d14565b4291508692505b61016d831115611d495760405163f016b95760e01b81526001600482015261016d6024820152604481018490526064016107d7565b6000868560020154611d5b9190613236565b90506000611d698583611672565b915050828111611d8c57604051633002614d60e01b815260040160405180910390fd5b82810387811115611db057604051639e45baef60e01b815260040160405180910390fd5b611dbb61148f611330565b50838655611dcc856201518061332e565b611dd69085613236565b600187018190556002870183905586546040805191825260208201929092529081018390528a907fc0c5f780288600bd422b1277ec0e23da2694f7b048ca78e7c40a05f9848382389060600160405180910390a250505050505050505050565b60606000611e43836123fb565b600101905060008167ffffffffffffffff811115611e6357611e63613061565b6040519080825280601f01601f191660200182016040528015611e8d576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611e9757509392505050565b600054610100900460ff16611ef05760405162461bcd60e51b81526004016107d7906133dc565b610e4482826124d3565b600054610100900460ff16611f215760405162461bcd60e51b81526004016107d7906133dc565b611f2a82612513565b611f348282612543565b610e44612590565b60006001600160e01b031982166380ac58cd60e01b1480611f6d57506001600160e01b03198216635b5e139f60e01b145b806106a457506301ffc9a760e01b6001600160e01b03198316146106a4565b6000611f9733610c09565b8015611fa4575060143610155b15611fb6575060131936013560601c90565b503390565b3415611fda57604051631fbeaa8f60e01b815260040160405180910390fd5b61010154611ff3906001600160a01b03168330846125b9565b60fc5460fd5460405163f9c3648960e01b815260048101919091526000916001600160a01b03169063f9c3648990602401602060405180830381865afa158015612041573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061206591906132f8565b6101015460405163095ea7b360e01b81526001600160a01b0380841660048301526024820186905292935091169063095ea7b3906044016020604051808303816000875af11580156120bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120df91906132ac565b5061010154604051635259b9ab60e01b81526001600160a01b0391821660048201526024810184905290821690635259b9ab90604401600060405180830381600087803b15801561212f57600080fd5b505af1158015610dbd573d6000803e3d6000fd5b610e44828260405180602001604052806000815250612613565b6000610f00836001600160a01b038416612646565b6000610f008383612646565b60018111156121ed5760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b60648201526084016107d7565b816001600160a01b0385166122495761224481609980546000838152609a60205260408120829055600182018355919091527f72a152ddfb8e864297c917af52ea6c1c68aead0fee1a62673fcc7e0c94979d000155565b61226c565b836001600160a01b0316856001600160a01b03161461226c5761226c8582612695565b6001600160a01b0384166122885761228381612732565b610acf565b846001600160a01b0316846001600160a01b031614610acf57610acf84826127e1565b6000610f00836001600160a01b038416612825565b6000610f008383612825565b60008260000182815481106122e3576122e3613296565b9060005260206000200154905092915050565b60006001600160a01b0384163b156123f357836001600160a01b031663150b7a0261231f611330565b8786866040518563ffffffff1660e01b81526004016123419493929190613427565b6020604051808303816000875af192505050801561237c575060408051601f3d908101601f1916820190925261237991810190613464565b60015b6123d9573d8080156123aa576040519150601f19603f3d011682016040523d82523d6000602084013e6123af565b606091505b5080516000036123d15760405162461bcd60e51b81526004016107d79061338a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506108c4565b5060016108c4565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061243a5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310612466576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061248457662386f26fc10000830492506010015b6305f5e100831061249c576305f5e100830492506008015b61271083106124b057612710830492506004015b606483106124c2576064830492506002015b600a83106106a45760010192915050565b600054610100900460ff166124fa5760405162461bcd60e51b81526004016107d7906133dc565b606561250683826134cf565b50606661088a82826134cf565b600054610100900460ff1661253a5760405162461bcd60e51b81526004016107d7906133dc565b61132d81612918565b600054610100900460ff1661256a5760405162461bcd60e51b81526004016107d7906133dc565b60fc80546001600160a01b0319166001600160a01b03939093169290921790915560fd55565b600054610100900460ff166125b75760405162461bcd60e51b81526004016107d7906133dc565b565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610e8190859061296c565b61261d8383612a41565b61262a60008484846122f6565b61088a5760405162461bcd60e51b81526004016107d79061338a565b600081815260018301602052604081205461268d575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556106a4565b5060006106a4565b600060016126a284610cd8565b6126ac9190613201565b6000838152609860205260409020549091508082146126ff576001600160a01b03841660009081526097602090815260408083208584528252808320548484528184208190558352609890915290208190555b5060009182526098602090815260408084208490556001600160a01b039094168352609781528383209183525290812055565b60995460009061274490600190613201565b6000838152609a60205260408120546099805493945090928490811061276c5761276c613296565b90600052602060002001549050806099838154811061278d5761278d613296565b6000918252602080832090910192909255828152609a909152604080822084905585825281205560998054806127c5576127c561358f565b6001900381819060005260206000200160009055905550505050565b60006127ec83610cd8565b6001600160a01b039093166000908152609760209081526040808320868452825280832085905593825260989052919091209190915550565b6000818152600183016020526040812054801561290e576000612849600183613201565b855490915060009061285d90600190613201565b90508181146128c257600086600001828154811061287d5761287d613296565b90600052602060002001549050808760000184815481106128a0576128a0613296565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806128d3576128d361358f565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506106a4565b60009150506106a4565b60c980546001600160a01b0319166001600160a01b0383169081179091556040519081527f38dd1fb2d26f08c618b847328db3c9278e3c4c8922fec738f7d8b0a3abc8a5a79060200160405180910390a150565b60006129c1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612bda9092919063ffffffff16565b90508051600014806129e25750808060200190518101906129e291906132ac565b61088a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107d7565b6001600160a01b038216612a975760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107d7565b6000818152606760205260409020546001600160a01b031615612afc5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107d7565b612b0a60008383600161217e565b6000818152606760205260409020546001600160a01b031615612b6f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107d7565b6001600160a01b038216600081815260686020908152604080832080546001019055848352606790915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60606108c4848460008585600080866001600160a01b03168587604051612c0191906135a5565b60006040518083038185875af1925050503d8060008114612c3e576040519150601f19603f3d011682016040523d82523d6000602084013e612c43565b606091505b50915091506109998783838760608315612cbe578251600003612cb7576001600160a01b0385163b612cb75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107d7565b50816108c4565b6108c48383815115612cd35781518083602001fd5b8060405162461bcd60e51b81526004016107d79190612d70565b6001600160e01b03198116811461132d57600080fd5b600060208284031215612d1557600080fd5b8135610f0081612ced565b60005b83811015612d3b578181015183820152602001612d23565b50506000910152565b60008151808452612d5c816020860160208601612d20565b601f01601f19169290920160200192915050565b602081526000610f006020830184612d44565b600060208284031215612d9557600080fd5b5035919050565b6001600160a01b038116811461132d57600080fd5b60008060408385031215612dc457600080fd5b8235612dcf81612d9c565b946020939093013593505050565b60008083601f840112612def57600080fd5b50813567ffffffffffffffff811115612e0757600080fd5b6020830191508360208260051b85010111156116a757600080fd5b600080600080600060808688031215612e3a57600080fd5b8535945060208601359350604086013567ffffffffffffffff811115612e5f57600080fd5b612e6b88828901612ddd565b96999598509660600135949350505050565b60008060008060808587031215612e9357600080fd5b5050823594602084013594506040840135936060013592509050565b60008060408385031215612ec257600080fd5b50508035926020909101359150565b600080600060608486031215612ee657600080fd5b8335612ef181612d9c565b92506020840135612f0181612d9c565b929592945050506040919091013590565b600080600060408486031215612f2757600080fd5b83359250602084013567ffffffffffffffff811115612f4557600080fd5b612f5186828701612ddd565b9497909650939450505050565b60008060408385031215612f7157600080fd5b823591506020830135612f8381612d9c565b809150509250929050565b600060208284031215612fa057600080fd5b8135610f0081612d9c565b600080600080600060608688031215612fc357600080fd5b85359450602086013567ffffffffffffffff80821115612fe257600080fd5b612fee89838a01612ddd565b9096509450604088013591508082111561300757600080fd5b5061301488828901612ddd565b969995985093965092949392505050565b801515811461132d57600080fd5b6000806040838503121561304657600080fd5b823561305181612d9c565b91506020830135612f8381613025565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561308d57600080fd5b843561309881612d9c565b935060208501356130a881612d9c565b925060408501359150606085013567ffffffffffffffff808211156130cc57600080fd5b818701915087601f8301126130e057600080fd5b8135818111156130f2576130f2613061565b604051601f8201601f19908116603f0116810190838211818310171561311a5761311a613061565b816040528281528a602084870101111561313357600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060006060848603121561316c57600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561319657600080fd5b82356131a181612d9c565b91506020830135612f8381612d9c565b600181811c908216806131c557607f821691505b6020821081036131e557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156106a4576106a46131eb565b60008261323157634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156106a4576106a46131eb565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156132be57600080fd5b8151610f0081613025565b600083516132db818460208801612d20565b8351908301906132ef818360208801612d20565b01949350505050565b60006020828403121561330a57600080fd5b8151610f0081612d9c565b600060018201613327576133276131eb565b5060010190565b80820281158282048414176106a4576106a46131eb565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061345a90830184612d44565b9695505050505050565b60006020828403121561347657600080fd5b8151610f0081612ced565b601f82111561088a57600081815260208120601f850160051c810160208610156134a85750805b601f850160051c820191505b818110156134c7578281556001016134b4565b505050505050565b815167ffffffffffffffff8111156134e9576134e9613061565b6134fd816134f784546131b1565b84613481565b602080601f831160018114613532576000841561351a5750858301515b600019600386901b1c1916600185901b1785556134c7565b600085815260208120601f198616915b8281101561356157888601518255948401946001909101908401613542565b508582101561357f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603160045260246000fd5b600082516135b7818460208701612d20565b919091019291505056fea264697066735822122091fe375c1173e972fad765e649435c0fe24d8a496b1efabdd811dd30509ba3e564736f6c63430008120033